Keine Ausgabe!



  • Hi Leute!

    Ich muß für die Uni ein kleines Prog schreiben, bei den man eine Zahl eingibt und die durch einen bestimmten Algorhytmus geschliffen wird, so lange bis das Ergebhnis "1" rauskommt.

    Wenn das bei mir der Fall ist, wird die eingegebene Zahl um 1 erhöht und alles beginnt von vorn.

    Jetzt wollen wir wissen (der Prof und die Studenten), bei welcher Zahl zum ersten mal das Zwischenergebniss "1000" rauskommt.

    Und genau bei diesem Punkt will mir mein Prog keine Ausgabe machen.

    Der Quelltext:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {

    int Zahl;
    Zahl=StrToInt (Edit1->Text);

    for (Zahl>1;;){
    if (Zahl%2==0){Zahl=Zahl/2;
    Memo1->Lines->Add(IntToStr(Zahl));
    Form1->Edit1->Text=IntToStr(Zahl);
    }

    else {Zahl=Zahl*3+1;
    Memo1->Lines->Add(IntToStr(Zahl));
    Form1->Edit1->Text=IntToStr(Zahl);
    }

    if (Zahl==1){
    Zahl=StrToInt (Edit2->Text);
    Zahl++;
    Form1->Edit1->Text=IntToStr (Zahl);
    Form1->Edit2->Text=IntToStr (Zahl);
    }

    if (Zahl==1000){
    Label1->Caption=StrToInt (Edit2->Text);

    }

    }
    }

    Wenn ich keine for Schleife verwende, und jedes mal den Button1 drücke, dann funktionieren alle Ausgaben.

    Ja.. also, wer hat eine Ahung, wo der Fehler liegt?

    DANKE!
    Ce|ine



  • Hallo

    zuerstmal benutz beim Posten von Code hier im Forum die CPP-Tags. Außerdem würde korrektes Einrücken der Zeilen auch die Lesbarkeit erhören.

    Zum Thema :

    for (Zahl>1;;)
    

    Schau dir doch nochmal die Definition der Syntax für For-Schleifen an, und an welcher Stelle die Abbruchbedingung stehen soll.
    Warum nimmst du keine while-Schleife?

    bis bald
    akari



  • Erstens solltest du deinen Quelltext sinnvoll einrücken und in CPP-Tags einschließen, damit man auch etwas erkennen kann.

    Zweitens sehen die Bedingungen der for()-Schleife irgendwie falsch aus (bzw. die Abfrage "Zahl>1" ist als Initialisierungsanweisung für die Schleife nutzlos).

    Drittens: Wovon hängt es eigentlich ab, ob du ein "Form1->" zum Zugriff deiner Steuerelemente verwendest oder nicht?

    Vierten: Was wird denn nicht ausgegeben? Nur der Teil im "if(Zahl==100)"-Zweig? oder gar keine Werte? (im letzteren Fall kann es sein, daß dein Programm zu beschäftigt ist mit Rechnen, um die neuen Werte darzustellen)



  • Sorry, ich nutze das Forum nur ganz selten, da bin ich nicht immer mit allen Geflogenheiten vertraut 🙄

    Es scheint, daß das Prog zu beschäftigt ist.

    Die Fragen:

    1. es werden alle Zahlen ausgegeben, aber eben jene, die ich eigentlich ermitteln will, nicht angezeigt (also:

    Edit2->Text=IntToStr (Zahl);
    

    und dadurch auch:

    Label1->Caption=StrToInt (Edit2->Text);
    

    2. Form1-> usw. ist nicht notwendig,aber stört auch nicht

    Gibt es eine Möglichkeit, das irgendwie zu drosseln?

    (CPU: AMD Athlon 64 X2: 2x 2.22 GHz, der Taskmanager von XP zeigt es als "Keine Rückmeldung" während der Ausführung an)

    MfG

    Ce|ine



  • Hallo

    Ja dein Programm ist in einer Endlosschleife, weil die Abbruchbedingung deiner For-Schleife an der falschen Stelle steht
    das sollte also so aussehen :

    for (;Zahl>1;)
    


  • Das hier

    Label1->Caption=StrToInt (Edit2->Text);
    

    ist auch irgendwie Unsinn. Es reicht

    Label1->Caption = Edit2->Text;
    


  • Und was die Ausgabe betrifft: Während die Schleife läuft werden, wie von CStoll schon angedeutet, keine visuellen Updates der Form und der darauf befindlichen Komponenten vorgenommen. Um das zu erzwingen packst du ein Application->ProcessMessages(); an strategischer Stelle in die Schleife.



  • bin zwar noch ein c++ noob, aber ich glaube, dass man hier das "Form1->" weglassen kann.

    Form1->Edit1->Text=IntToStr (Zahl);
    

    😋


Anmelden zum Antworten