Wieso Syntax Error?



  • Hallo,
    im folgenden Programm wird in der untenstehenden Do-While Schleife bei der Inkrementrierung x=x+1; immer "Syntax Error before x" ausgegeben. Lösche ich die Zeile, schreibt der Compiler keinerlei Fehlermeldungen. Ich muss aber inkrementieren da sonst Endlosschleife. Woran liegt das. For und while Schleife funzt, aber wir sollen das als do-while zum laufen bringen:

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    
    main()
    {
    float a,b,c,x1,x2,p,q,rad;
    float x,y;
    
    printf("L”sung der Gleichung a*x^2+b*x+c=0\n\n");
    printf("Bitte Parameter eingeben\n");
    printf("a:  "); scanf("%f",&a);
    printf("b:  "); scanf("%f",&b);
    printf("c:  "); scanf("%f",&c);
    
    p=b/a; q=c/a;
    rad=p*p/4-q;
    
    if (rad>=0) {
       x1=-p/2+sqrt(rad);
       x2=-p/2-sqrt(rad);
       printf("x1=%8.2f\nx2=%8.2f\n",x1,x2);
       }
    else {
       printf("Komplexe Wurzeln\n");
       }
    getch();
    
    printf("     x        y\n  _________________\n");
    
    x=-10;
    do
    printf("%8.2f   %8.2f\n",x,a*x*x+b*x+c);
    x=x+1;
    while(x<=10);
    
    getch();
    }
    


  • mach nach dem 'do' eine --> {
    und vor dem 'while' eine --> }
    🙂



  • Zur Erklärung: Im Rumpf einer Schleife (auch die do-while) darf nur jeweils eine Anweisung stehen - du hast dort zwei (die printf() und das "x=x+1;"). Und um solche Situationen zu erfassen, verwendet man Verbund-Anweisungen (der gesamte Block zwischen { und } kann als einzelne Anweisung verwendet werden).

    PS: In dem Beispiel hätte ich noch eine Alternative, die aber schon unter "wie schreibe ich möglichst unleserliche Programme" fallen könnte:

    do
      printf(...),//man beachte - dies ist kein Semikolon
      x=x+1;
    while(x<=10);
    


  • weiveil verbund anweisungen kann ich hintereinander hängen?



  • Soviele wie du willst - auf Wunsch auch ineinander verschachtelt. (wobei der Standard afair erlaubt, daß der Compiler eine Obergrenze der Verschachtelungen setzt)



  • Ok, hatte es dann doch rausgefunden. Das steh in meinem Buch falsch erklärt. Wußte das bei Schleifen mit mehreren Anweisung {} gesetzt sein muss und bei einer Anweisung wegglassen werden kann.

    In dem Buch steht ab

    do
    Anweisungen
    while

    anstatt

    do
    { Anweisungen}
    while

    Danke euch allen.



  • ragnar79 schrieb:

    In dem Buch steht ab

    do
    Anweisungen
    while

    anstatt

    do
    { Anweisungen}
    while

    Danke euch allen.

    Da steht aber bestimmt
    do
    Anweisung
    while

    Also zwischen do und while immer genau eine Anweisung;
    wobei diese eine Anweisung eben auch eine Verbundanweisung sein kann.



  • ragnar79 schrieb:

    Ok, hatte es dann doch rausgefunden. Das steh in meinem Buch falsch erklärt. Wußte das bei Schleifen mit mehreren Anweisung {} gesetzt sein muss und bei einer Anweisung wegglassen werden kann.

    Imho sollte man die Klammern eh immer setzen. Es hilft mehr als es schadet.


Log in to reply