goto Schleife?



  • Hallo liebe Community,

    ich bin noch ein ziemlicher C-Programmierungs Neuling und habe ein kleines Problem.
    Ich soll ein Programm schreiben, das das iterierte Querprodukt einer Zahl berechnet. Meine Idee war eine goto-Schleife. Ich weiß, dass goto ein wenig verpönt ist, aber es ist im Moment meine einzige Idee.

    #include <stdio.h>
    
    int main () {
        int rest, zahl, ziffernsumme;
        ziffernsumme = 1;
    
        printf ("Bitte Zahl eingeben: ");
        scanf ("%d", &zahl);
    
        restart:
    
        if (zahl == 0)
        {
          ziffernsumme = 0;
        }
    
        else if (zahl != 0);
          while (zahl)
    	{
    	  rest = zahl % 10;
    	  ziffernsumme = ziffernsumme * rest;
    	  zahl = zahl /10;
    	}
    
       goto restart;
    
        printf ("Das Querprodukt ist: %d\n", ziffernsumme);
    
    return (0);
    }
    

    Das Programm sagt leider gar nichts mehr nach dem eingeben der Zahl. Ohne goto funktioniert das Programm ohne probleme, gibt aber nur das Querprodukt aus.
    Iterierte QP: 1234 -> 1*2*3*4 = 24 -> 2*4 = 8

    Würde mich freuen, wenn mir jemand zeigt, wo der Fehler bei mir liegt.
    Wenn wer noch eine bessere Lösung hat ohne goto, würde ich mich darüber auch sehr freuen.

    Schonmal vielen Dank!



  • Wie soll denn dein Programm jemals zum printf kommen?

    Und du hast doch schon eine while-Schleife.
    Was spricht dagegen die statt des goto einzusetzten. Oder die do-while-Schleife.

    Du hast

    if (zahl == 0)
     ...  
        else if (zahl != 0); // warum das if? Welche Möglichkeit bleibt denn noch für zahl? Das == 0 hast du beim obigen if.
    ...
    


  • Ok das if nach dem else ist zu viel.
    Ich will ja, dass die while-schleife das querprodukt sich so oft wiederholt, bis es eine einstellige lösung ist.
    wie kann ich denn den befehl schreiben, dass der while befehl nochmal ausgeführt wird?



  • 1.) Querprodukt als Funktion a la: int quer_product(int n) schreiben
    2.) Funktion in einer while-Schleife immer wieder mit der neuen Zahl aufrufen, bis deine Bedingung erfuellt ist.

    Probiere es einfach mal.



  • Woran kannst du denn erkennen, dass du fertig bist?
    (Nimm dein Beispiel von oben)



  • . o O ( goto-schleife.de registrieren geh' ... )



  • Ändert zwar an der Funktion nichts, aber:
    Produkt = Summe 😕 Da sollte man sprechende Bezeichner wählen. 😉



  • Ok das mit dem goto befehl hab ich verworfen..
    Will es jetzt mit einer doppelten while schleife versuchen. Das müsste doch eigentlich klappen oder? So wie ich es habe, passt es aber nicht...

    #include <stdio.h>
    
    int main () {
        int rest, zahl, zwischenprodukt, d;
        zwischenprodukt = 1;
        d = 0;
    
        printf ("Bitte Zahl eingeben: ");
        scanf ("%d", &zahl);
    
        if (zahl == 0)
        {
          zwischenprodukt = 0;
        }
    
        else (zahl != 0);
        while (d >= 10) {
    
        while (zahl) {
    	  rest = zahl % 10;
    	  zwischenprodukt = zwischenprodukt * rest;
    	  zahl = zahl /10;
    	}
        rest = d;
        }
    
        printf ("Das interierte Querprodukt ist: %d\n", zwischenprodukt);
    
    return (0);
    }
    

    Sieht wer den Fehler? Kann man eine doppelte while schleife überhaupt so machen?

    Vielen Dank!



  • Die Variable d wird mit 0 initialisiert und behält diesen Wert bis ans Programmende. Wozu soll die überhaupt gut sein?



  • Hab dann ja am Ende d = rest und in der ersten while steht (d >=10).
    Ich will, dass er so lange die while schleife wiederholt, bis es ein einstelliges Ergebnis hat.
    Aber so wie ich es hier hab geht es jedenfalls nicht.
    Ist denn eine doppelte while schleife überhaupt dafür geeignet? Oder ist das schon der falsche ansatz?



  • TtotheR schrieb:

    Hab dann ja am Ende d = rest

    Nein, du hast rest = d.



  • Dein If-Konstrukt sieht eigentlich wie folgt aus (interessant ab "else"). Ist es das was Du willst?

    if (zahl == 0) 
    {
        ...
    }
    else
    {
        (zahl != 0);
    }
    
    //
    while (...)
        ...
    

    (Tipp 1: Semikolon; Tipp 2: Eine Bedingung nach "else" bewirkt nichts; Tipp 3: Klammerung auch bei nur einem folgenden Statement hilft Anfängern, Fehler zu vermeiden ;))


Anmelden zum Antworten