Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zahlen addieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.12.2008, 20:39 Uhr
~Gast111
Gast


Hallo

ich würde gerne eine Datei auslesen wo steht

a xxx xxxx xxx 124 xxx
b xxx 542.45 xxx
c xxx xxx 35
a xxx xxx 123.21
b ...
c ...
a xxx 185
.
.
.

Ich will jetzt alle a mit a, b mit b und c mit c addieren. Dabei soll er bei den a auch die Integer Zahlen extra addieren und die float Zahlen extra addieren.

Ich habe es geschafft die Zahlen zu addieren wenn sie an zweiter Stelle stehen. Wenn sie aber irgendwo in der Zeile stehen weiß ich nicht weiter.

Ebenfalls ist es ein Problem nur die Integer und nur die Float Zahlen zu addieren. Es wandelt die Integer Zahlen Automatisch in Float Zahlen um.

Wie würde so ein Programm ausschauen.

MFG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2008, 09:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Vom Prinzp her kommt es darauf an wie du etwa einliest.

Deine Beschreibung erklärt nicht so ganz vollständig wie die Zeilen die du einliest organisiert sind.

Beispiel


C++:
a xxx xxxx xxx 124 xxx


Was genau sind die x'se? Zeichen die keine Zahlen sind? Oder anders herum gefragt wie kannst du erkennen wo eine Zahl beginnt und wie willst du mit den Fällen umgehen in denen mehr als eine Zahl steht.

Bevor du da was implementieren kannst, musst du dir erstmal gedanken machen was für Fälle auftreten können und wie du mit denen umgehst bzw umgehen willst.

Zu deinem Integerproblem. Vom Prinzip her kannst du das direkt casten (also mit (int) ) und der Nachkommaanteil verschwindet...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2008, 18:37 Uhr
~Gast111
Gast


Die x sind irgendwelche Wörter und somit sollen die Zahlen in der Zeile gefunden werden. Den Fall dass mehrere Zahlen vorkommen will ich mal weglassen.

Ich habe mal zwei Fälle. Der erste Fall funktioniert nicht und der zweite nimmt immer nur die zweite Zahl. Ich suche aber eine einfachere Lösung.

C++:
int main(int argc, char *argv[])
{
    FILE *pfile;
    char string[150];
    float n;
    int i;
    int a;
    int length;

    a=0;
    n=0;

    pfile= fopen(argv[1],"r");


    if (pfile != NULL)
    {
        while (!feof(pfile))
        {

            /* buchstabe=fgetc(pfile);

             if(isdigit(buchstabe)!=0)
             {
                 if((n=atof(buchstabe))!=0)
                 printf("Float: %f", n);
                 if((i=atoi(buchstabe))!=0)
                 printf("Int.: %d",i);
             }*/


            fgets(string, 150, pfile);
            length=strlen(string);
            //+printf("%d\n",length);

            for (a=0; a<length; a++)
            {
                if (isdigit(string[a]) != 0)
                {
                   if ((n=atof(string))!=0)
                    {
                        printf("Float: %f\n", n);
                    }
                    else if ((i=atoi(string))!=0)
                    {
                    printf("Int.: %d\n",i);
                    }
                }
            }
        }
    }
    else
    {
        printf("Datei '%s' konnte nicht geöffnet werden", argv[1]);
        exit(1);
    }

    fclose(pfile);
    return 0;

}




C++:
int main(int argc, char *argv[])
{
    FILE *file;
    char character [50];
    char *string;
    double i;
    double aa;
    double bb;
    double cc;
    double dd;

    i=0;
    aa=0;
    bb=0;
    cc=0;
    dd=0;



    file=fopen(argv[1], "r");

    if (file != NULL)
    {
        while (!feof(file))
        {
            fgets(character, 50, file);
            if (character[0]== '#')
            {
                continue;
            }
            string=strtok(character," ");
          

            while ( (string = strtok (NULL, " ")) != NULL)
            {
                i=atof(string);

                if (strcmp(character, "aa")==0)
                {
                    aa=aa+i;
                  
                }

                if (strcmp(character, "bb")==0)
                {
                    bb=bb+i;
                  
                }

                if (strcmp(character, "cc")==0)
                {
                    cc=cc+i;
                  
                }


                if (strcmp(character, "dd")==0)
                {
                    dd=dd+i;
                  
                }


            }

        }

        printf("aa= %f\n",aa);
        printf("bb= %f\n",bb);
        printf("cc= %f\n",cc);
        printf("dd= %f\n\n",dd);
        printf("TOTAL: %f\n", aa+bb+cc+dd);






    }
    else
    {
        printf("Cant open the file '%s'", argv[1]);
    }

    fclose(file);

    return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.12.2008, 19:05 Uhr
~Gast111
Gast


War denn die Frage so schwer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.12.2008, 20:05 Uhr
0xdeadbeef
Gott
(Operator)


Denkfehler im ersten Beispiel: N ist eine Teilmenge von R. Integer sind logisch Fließkommazahlen, nur wird halt das fließende Komma nicht benutzt. Wenn du wissen willst, ob eine eingelesene Fließkommazahl ein Integer ist, prüfe, ob trunc(x) == x.

Im zweiten Beispiel kann ich jetzt auf den ersten Blick nur sehen, dass du den !feof(foo)-Fehler machst - Das eof-Bit wird erst gesetzt, wenn einmal über das Dateiende hinaus gelesen wird. Üblicherweise schreibt man da

C++:
while(fgets(character, 50, file))


...und dass du halt die oben beschriebenen Zahlentypen nicht auseinanderhältst, wie du es scheinbar willst.

Nachtrag: Ich bin mir der Unterschiede von Integern und Fließkommazahlen in der Implementierung bewusst. Die sind allerdings an dieser Stelle erstaunlich egal.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.12.2008 um 20:07 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: