Problem mit while - Schleife



  • shivan schrieb:

    Naja bei meinem Editor sind irgendwie die Tabs unkonsistent, ich benutze DevC++.. 🙂
    Aber wenn nur das mit der Länge der Einzüge nicht stimmt, bin ich ja noch beruhigt! 😃

    Hat man hier die Möglichkeit Dateien an einen Comment anzuhängen?

    Nein, aber du kannst sie bei einem Freehoster hochladen 👍



  • shivan schrieb:

    Bei Zeile 12 und 13 hab ich keine Einzüge gemacht, den Code hab ich da auch nur erstmal vorübergängig geschrieben um etwas auszuprobieren.

    Ich öffne in meinem Code oft mehrere (3 oder 4) geschwungene Klammern miteinander, ist das schlimm?

    So könnte man einrücken. Extrembeispiel:

    if (...)
    {
        if (...)
        {
            do
            {
                DoSomething1();
    
                if (...)
                {
                    for (...)
                    {
                        // ...
                        DoSomething2();
                    }
                }
            } while (...);
        }
    
        DoSomething3();
    }
    


  • Freehoster? Wie funktioniert das genau?



  • 3 bis 4 geöffnete Klammern sollten noch lesbar sein.
    Du hast bei deinem Beispiel aber schon mindestens 4 geöffnet.

    Warum nimmst du den DEV?
    Hast du schon mal den Code::Blocks mit z.B. mit dem MinGW oder einem anderen Compiler getestet? Da kannst du deinen Quelltext, auch nachträglich, mit 2 oder 3
    Mausklicks formatieren.

    MfG f.-th.



  • Nein, den hab ich noch nie getestet.
    Ich benutze DevC++, weil wir den in der Schule benutzen und ich mich dran gewöhnt hab, doch ich werde mir den andern auch mal angucken. Wichtig ist mir nur, das er Freeware ist.



  • Ich habe hier meinen Source Code raufgeladen: http://ul.to/v47xr7

    Ich muss meine Aussage von vorhin korrigieren, ich habe viel mehr als 3, 4 Klammern gleichzeitig geöffnet!

    Vielleicht könnt ihr es mal angucken und sagen, was ihr davon haltet und was ich verbessern kann.

    Zudem hab ich noch ein Problem, meine Addition bzw. Subtraktion Funktion im Programm gibt ganz komische Zahlen aus, hat aber vorhin tadellos funktioniert, obwohl ich nichts daran verändert hab.

    Kann sich das jemand anschauen? Wär wirklich nett, denn ich weiss nicht mehr weiter 😞

    Addition:

    Zeile 512

    Subtraktion:

    Zeile 551

    MfG Shivan



  • Ich hab doch kürzlich wo gelesen, dass DevC++ ziemlich schlecht ist.
    Ich würd dir Code::Blocks empfehlen oder Visual C++ die Express-Edition.

    Wobei ich mehr zu Code::Blocks tendiere:

    Code::Blocks: http://www.chip.de/downloads/Code-Blocks_32146961.html

    VC++: http://www.microsoft.com/germany/express/download/downloaddetails.aspx?p=vcpp

    Lg Mentras



  • Danke dir, dann werd ich gleich mal Code::Blocks ausprobieren!
    Ich finde persönlich finde DevC++ auch nicht wirklich gut, obwohl ich keine Vergleiche habe, da erst mit dem und dem normalen Windows Editor C++ programmiert habe.



  • Code::Blocks macht mir auf jedenfall schon einen ganz guten Eindruck, vorallem dass er die Zusammenhänge der Klammern anzeigt und sie sich ausblenden lassen.

    Danke nochmals! 🙂



  • Du solltest dir unbedingt Funktionen genauer anschauen. In deinem Code ist so viel Code, der sich wiederholt. Das macht ihn natürlich unnötig lang.
    Die Gotos machen den Code schließlich noch unübersichtlicher.

    Warum dein Code nicht so funktioniert, wie du das willst, lässt sich wegen des sehr unübersichtlichen Codes auch nicht so einfach sagen.



  • Außerdem solltest du fflush(stdin) nicht aufrufen. Soweit ich weiß, ist das Resultat undefiniert. Es kann also alles mögliche passieren. Auch solltest du versuchen deine Variablen so lokal wie möglich zu halten.



  • Wie schon geschrieben, hab ich ein Problem mit meiner Addition und Subtraktion Funktion, ich habe mir gedacht, dass es mehr Sinn macht, den Code hier zu posten.

    Addition

    if(rechnerauswahl == 1)
                {
                 system("cls");
                 cout << " Addition"<<endl;
                 cout << "----------"<<endl;
                 cout << " Bitte geben Sie die Anzahl der Summanden ein: ";
                 cin  >> anzahl;
                 cout <<endl;
    
                 for (int i=1; i<=anzahl; i++)
                 {
                  cout<<" "<< i <<". Summand eingeben: ";
                  cin>>eingabezahl;
                  loesung+=eingabezahl;
                 }
    
                 cout <<endl;
                 cout<<" Resultat: "<<loesung<<endl;
                 cout <<endl;
                 do{
                 cout << " M"<<oe<<"chten Sie noch noch eine Umrechnung durchf"<<ue<<"hren? (j/n)"<<endl;
                 cout << " Dr"<<ue<<"cken Sie H um zum Hauptmen"<<ue<<" zur"<<ue<<"ck zu kehren.";
                 cin >> wiederholen;
                 cout << endl;
                 if(wiederholen == 'j' || wiederholen == 'J')
                 {
                  goto berechnungen;         //Sprung zu berechnungen
                 }
                 if(wiederholen == 'h' || wiederholen == 'H')
                 {
                  goto hauptmenue;
                 }
                 else if(wiederholen == 'n' || wiederholen == 'N')
                 {
                  danke();
                 }
                }while(wiederholen != 'h' && wiederholen != 'H' && wiederholen != 'j' && wiederholen != 'J' && wiederholen != 'n' && wiederholen != 'N');
             }
    

    Das einzig Neue ist die do while Schleife in Zeile 20 bzw. 37, doch das sollte ja die Funktionsweise des Rechners nicht beeinflussen.

    Beispiel einer Ausgabe des Programms:

    Addition
    ----------
    Bitte geben Sie die Anzahl der Summanden ein: 5

    1. Summand eingeben: 100
    2. Summand eingeben: 100
    3. Summand eingeben: 100
    4. Summand eingeben: 100
    5. Summand eingeben: 100

    Resultat: 540

    Möchten Sie noch noch eine Umrechnung durchführen? (j/n)
    Drücken Sie H um zum Hauptmenü zurück zu kehren.

    Manchmal funktioniert er, manchmal nicht.



  • Wo wird die Variable loesung initalisiert? Ohne Initalisierung kann diese Variable jeden Wert haben ==> Ergebnis undefiniert.



  • BBBB schrieb:

    Du solltest dir unbedingt Funktionen genauer anschauen. In deinem Code ist so viel Code, der sich wiederholt. Das macht ihn natürlich unnötig lang.
    Die Gotos machen den Code schließlich noch unübersichtlicher.

    Warum dein Code nicht so funktioniert, wie du das willst, lässt sich wegen des sehr unübersichtlichen Codes auch nicht so einfach sagen.

    Danke für deine Tipps, doch wie kann ich schlussendlich den Code kürzer fassen? Die einzige Möglichkeit, die mir so spontan einfällt ist Structs, doch die hab ich integriert wos mir möglich war.



  • BBBB schrieb:

    Wo wird die Variable loesung initalisiert? Ohne Initalisierung kann diese Variable jeden Wert haben ==> Ergebnis undefiniert.

    Sie ist eine globale Variable und wird am Anfang der Funktion main() definiert.



  • Quatsch, sie wird vor dem Menü des Rechners, wo man Addition Subtraktion ... auswählen kann deklariert.



  • shivan schrieb:

    BBBB schrieb:

    Wo wird die Variable loesung initalisiert? Ohne Initalisierung kann diese Variable jeden Wert haben ==> Ergebnis undefiniert.

    Sie ist eine globale Variable und wird am Anfang der Funktion main() definiert.

    Ja, sie ist global. Aber manchmal auch lokal. Doch einen Wert hast du ihr nie zugewiesen (initalisiert). Ausnahme bei rechnerauswahl == 3 .

    Probier doch mal:

    if(rechnerauswahl == 1)
    {
       loesung = 0;
       // der übrige Code...
    }
    

    Das selbe gilt auch für die anderen Fälle. Dort sollte der Fehler also (manchmal) auch auftreten.



  • Ich hab die Variablen jetzt lokal gemacht, aber nicht initialisiert. Nicht initialisierte Variablen haben ja den Wert 0, dies sollte ja aufs gleiche rauskommen wie loesung = 0;



  • shivan schrieb:

    Ich hab die Variablen jetzt lokal gemacht, aber nicht initialisiert. Nicht initialisierte Variablen haben ja den Wert 0, dies sollte ja aufs gleiche rauskommen wie loesung = 0;

    Nein, das ist eben nicht der Fall!

    C/C++ ist nicht Visual Basic 😉

    Die Variable wird nicht automatisch initalisiert. Das heißt sie kann jeden beliebigen Wert haben. Das ist sozusagen Zufall und damit undefiniert.



  • 1. globale variablen weden mit einem startwert (meist 0) initialisiert. lokale variablen werden nicht initialisert, sofern sie keinen standardkonstruktor haben, was bei den integrierten typen nicht der fall ist.
    2. du musst variablen, sofern sie nicht in der schleife deklariert werden, bei jedem neuen schleifendurchlauf auf 0 setzen


Anmelden zum Antworten