kostenloser Webspace werbefrei: lima-city


Grosses Problem.. ka wie angehen :(

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    x**a

    Hallo zuasmmen
    ich habe ein grosses problem!
    als hausaufgaben m?ssen wir mit
    C ein programm schreiben...
    hab aber eine ahnung wies angehen soll.
    ich hoffe ihr k?nnt mir helfen.

    Hier paar angaben:
    - Entwickeln Sie ein Programm, welches Rechenaufgaben aus einer Eingabedatei liest, die Ergebnisse berechnet und zusammen mit den Rechenaufgaben in eine Ausgabedatei schreibt.
    - Die Eingabedatei habe folgendes Format (Beispiel), wobei die anzahl der zeilen beliebig sein darf:
    3+6=
    24/8=
    - Die Ausgabedatei sieht im gegebenen Beispiel dann so aus:
    3+6=9
    24/8=3
    - Es sollen die Grundrechenarten ber?cksichtigt werden.
    - Hinweis: Um eine Rechenaufgabe zu analysieren, lesen Sie mit fscanf in dieser Reihenfolge eine Zahl, ein Zeichen (Rechenoperator) und wieder eine Zahl.

    :confused:

    ?dit by Olliander:
    Doppelposting... Inhalt des 2. Posts:


    also sry wegen doppelpost aber hab was vergessen:

    bis jetzt hab ich:

    #include <stdio.h>

    int main()
    {

    FILE* pDatei; // Identifikation der Datei
    char string[80];

    pDatei = fopen("rechnungen.txt", "r");
    if(pDatei == NULL)
    printf("Fehler beim Oeffnen der Datei\n");

    fscanf(pDatei, "%s", string);
    fclose(pDatei);


    return 0;

    }

    ich hab keinen plan, ob das stimmt.. auf jeden fall ist es sicher noch nicht fertig..
    oder?


    (Anmerkung: Es gibt den "Edit"-Button)

    Beitrag ge?ndert am 27.02.2006 19:54 von olliander
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c******a

    im letzten punkt der aufgabe steht ja das entscheidende -naemlich wie eingelesen werden soll.
    also erst zahl1 dann den operator und dann zahl2:

    fscanf(fp, "%i%c%i", &z1,&op,&z2);

    dann hast du erstmal die beiden zahlen und den operator.

    jetzt musst nur noch den operator zb. mit switch auswerten

    switch (op)
    {
    case '+': res=zahl1+zahl2;
    break;
    //...
    (default nicht vergessen wenn zb. ein falsches zeichen da steht)

    und am ende gibts dann halt nochmal alle 4 zusammen aus:
    printf("%i%c%i=%i\n", z1,op,z2,res);

    infos zu (f)printf() in der msdn:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt_format_specification_fields_.2d_.printf_and_wprintf_functions.asp
  4. s*******1




    switch (op)
    {
    case '+': res=zahl1+zahl2;
    break;
    //...
    (default nicht vergessen wenn zb. ein falsches zeichen da steht)


    Hm w?re das nicht einfacher op einfach zu benutzen statt es abzufragen, hab gerade kein 'c' hier. Aber ich mein das funktioniert auch.

    Sprich:

    res = zahl1 op zahl2;

    bzw.

    res = op(zahl1,zahl2);

    Wei? nicht mehr genau wie das um die Syntax bestellt ist.
    W?rd mich jetzt aber ehrlichgesagt selber interessieren ob das so funktioniert.
  5. c******a

    nein tut es nicht. deswegen auch switch (oder sonnstwie)

    in der datei steht ja auch nur bspw. das zeichen + welches dem ascii wert 43 entspricht sodass in op (char) die zahl 43 steht und mit dieser kann man in c nicht soviel anfangen und direkt in den code zu integrieren ist nicht moeglich da der compiler bereits zur assemblierung des programms wissen muss welche befehle zu verwenden sind
    -also muss man selbst fuer die richtige interpretation von 43 ('+') sorgen.
  6. s*******1

    Echt nicht? Sicher? :confused:

    Hatte eigentlich C etwas schlauer in Erinnerung.

    Es erkennt ja auch schlie?lich den Handgeschriebenen Operanden.
    Vielleicht mit einer Auswertfunktion? Wobei die d?rfte dann intern auch ein switch-case beinhalten... :slant:
  7. c******a

    ok in gewisser weise geht es doch lol:

    double add(int x, int y)
    { return x+y; }

    double sub(int x, int y)
    { return x-y; }

    double mul(int x, int y)
    { return x*y; }

    double div(int x, int y)
    { return (double)x/y; }

    int main()
    {
    double (*optable[])(int,int)={ mul, add, div, sub } ; //reihenfolge wichtig!

    //...

    printf("%g\n", optable[(op-42)%4 + ((op-42>3)?1:0)](z1, z2) );

    //...
    return 0;
    }

    so jetzt blos kein falsches zeichen in die datei schreien sonnst gibts nen speicherzugriffsfehler.
    funktionszeiger sind was tolles....
  8. Autor dieses Themas

    x**a


    im letzten punkt der aufgabe steht ja das entscheidende -naemlich wie eingelesen werden soll.
    also erst zahl1 dann den operator und dann zahl2:

    fscanf(fp, "%i%c%i", &z1,&op,&z2);

    dann hast du erstmal die beiden zahlen und den operator.

    jetzt musst nur noch den operator zb. mit switch auswerten

    switch (op)
    {
    case '+': res=zahl1+zahl2;
    break;
    //...
    (default nicht vergessen wenn zb. ein falsches zeichen da steht)

    und am ende gibts dann halt nochmal alle 4 zusammen aus:
    printf("%i%c%i=%i\n", z1,op,z2,res);

    infos zu (f)printf() in der msdn:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt_format_specification_fields_.2d_.printf_and_wprintf_functions.asp


    cool es hat geklappt :)
    nur:
    jetzt rechnets ja aus: 3+6=9
    wie kann man machen, dass es
    das ganze wiederholt, bis das dateiende
    erreicht wurde?
  9. c******a

    indem du das ganze in ne schleife packst die du solange laufen laesst wie feof(fp) nicht 0 zurueckgibt.
  10. Autor dieses Themas

    x**a

    also ich habs so versucht:
    while ( feof != 0 );

    {
    fscanf(pDatei, "%i%c%i", &z1,&op,&z2); fclose(pDatei);
    switch (op)
    {
    case '+': res=z1+z2;
    break;
    case '-': res=z1-z2;
    break;
    case '*': res=z1*z2;
    break;
    case '/': res=z1/z2;
    }
    printf("%i%c%i=%i \n", z1,op,z2,res);

    dann steht aber:
    end of file found before the left brace '[' at 'fh_rechnen4.c(4)' was matched

    ich denke die bedingung in der schleife ist falsch... oder ist die schleife zu fr?h, bzw zu sp?t geschlossen?
  11. c******a

    feof() ist ne funktion:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_CRT_feof.asp
    hinter dem schleifen kopf schliesst du selbige mit ;
    es sollte while (!feof(fp)) { ... heissen

    ps. default in switch nicht vergessen und bei der division muss noch nach double gecastet werden.

    pps. die datei erst nach der schleife schliessen -sonnst hast du ein problem ;)
  12. Autor dieses Themas

    x**a


    feof() ist ne funktion:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_CRT_feof.asp
    hinter dem schleifen kopf schliesst du selbige mit ;
    es sollte while (!feof(fp)) { ... heissen

    ps. default in switch nicht vergessen und bei der division muss noch nach double gecastet werden.

    pps. die datei erst nach der schleife schliessen -sonnst hast du ein problem ;)


    hmm ok.. wie schleife geht.. aber es ist eine "endlosschleiffe" :D

    ps: ich weis nicht wie ich default in switch machen kann :nosmile:

    (hab das fclose(pDatei); jetzt hinter die schleife gemacht und das break; bei division auch gemacht... also is eigentlich ja nur noch default (was hoffentlich auch die endlosschleiffe stoppt :D))
  13. c******a

    statt case foo: default:
    zeig mal den source habe keine endlosschleife. wie ist die datei aufgebaut?
  14. Autor dieses Themas

    x**a


    #include <stdio.h>

    int main()
    {
    int z1;
    int z2;
    int res;
    int iRueckgabe;
    char op;

    FILE* pDatei; // Identifikation der Datei
    char string[80];

    pDatei = fopen("rechnungen.txt", "r");
    if(pDatei == NULL)
    printf("Fehler beim Oeffnen der Datei\n");


    while (!feof(pDatei))

    {
    fscanf(pDatei, "%i%c%i", &z1,&op,&z2);
    switch (op)
    {
    case '+': res=z1+z2;
    break;
    case '-': res=z1-z2;
    break;
    case '*': res=z1*z2;
    break;
    case '/': res=z1/z2;
    break;
    }
    printf("%i%c%i=%i \n", z1,op,z2,res);
    }

    fclose(pDatei);


    return 0;

    }



    rechnungen.txt:
    3+6=
    24/8=


    das mit dem default hab ich immernochnicht begriffen -.-'


  15. das mit dem default hab ich immernochnicht begriffen -.-'


    ganz einfach ;-)

    switch(bla)
    {
    case 'a': ausf?hrugn; break;
    .
    .
    .

    default: ausf?hrung; break;
    }
  16. Autor dieses Themas

    x**a

    jo jetzt hat alles funktioniert!!
    danke euch beiden
    :cool:

    hier noch der richtige quelltext:

    #include <stdio.h>

    int main()
    {
    FILE* fp;
    int z1, z2;
    char op;
    double res;
    char dummy;

    if ((fp=fopen("rechnungen.txt", "r"))==0)
    {
    fprintf(stderr, "datei konnte nicht geoeffnet werden\n");
    return 1;
    }

    while (1)
    {
    fscanf(fp, "%i%c%i%c", &z1,&op,&z2,&dummy);

    if (feof(fp))
    break;

    switch (op)
    {
    case '+': res=z1+z2;
    break;
    case '-': res=z1-z2;
    break;
    case '*': res=z1*z2;
    break;
    case '/': res=(double)z1/z2;
    break;
    default: break;
    }

    printf("%i%c%i=%g\n", z1,op,z2,res);
    }


    fclose(fp);

    return 0;
    }

    Beitrag ge?ndert am 28.02.2006 18:43 von xera
  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!