Doppelte Abbruchbedingung



  • Hey Leute eine Fage , wie baut man eine anständige Abbruchbedingung rein?

    do{
    cout << "Zwei positive ganze Zahlen eingeben: ";
    cin >> i1 >> i2;
    
        cout << '(' << i1 << ',' << i2 << ')' << std::endl;
        if( i1 < i2 ) i2 = i2-i1;
    else { tmp = i1; i1 = i2; i2 = tmp-i1; }
    
       n = n + 1; 
    
    cout << n << " Schritte zum ggT " << i1 << std::endl;
    }   
    while(i1 != i2 || n != q);
    
    return 0;
    

    ich möchte direkt in do while noch eine Abbruchbedingung einbauen. Damit nach erneuten Eingabe von zwei Zahlen , der Benutzer mit q aus der Schleife raus kann.Irgendwie geht das ganze schief 😕 😞



  • Hi Helenchen,

    helenchen schrieb:

    Hey Leute eine Fage , wie baut man eine anständige Abbruchbedingung rein?

    He Helenchen, damit wir Dir wirklich helfen können, müssen wir erst mal wissen, was Du wirklich willst.

    1. formatiere Deinene Quelltext so, dass man ihn auch übersichtlich lesen kann (z.B. so wie ich es unten angegeben habe) und beschreibe ggf mit Kommentaren was jeweils soll, und poste eine komplette Funktionseinheit, also ganze Funktion oder nur Teilblock, aber dann ist das return 0 am Ende Unfug.
    2. Und vor allem schreib, was das ganze machen soll. Auch wenn das für mich nicht sehr schmeichelhaft ist, ich weiß nicht, was das ganze soll.

    Irgendwie willst Du wohl den größten gemeinsamen Teiler ausrechnen, zumindest entnehme ich das der Ausgabe "Schritte zum ggT". Ich gehe mal davon aus, dass Du in einer Schleife den ggT ausrechnen willst. Und dann willst Du in einer Schleife jeweils die zwei auszuwertenden Zahlen abfragen. Für mich sind das zwei Schleifen mit einem Test auf Abbruch drin.

    do
    {
      // zwei Zahlen eingeben, 0,0 für Ende
      if // gültige Zahlen erkannt
      {
        do
        {
          // Berechnen
        } while // Berechnung noch nicht fertig -> weiterrechnen in nächster Runde
        // Ergebnis ausgeben
      }
    } while // kein Ende erkannt
    

    Ich formatiere jetzt mal Deinen Quelltext so, dass er etwas übersichtlicher ist.

    do
    {
      cout << "Zwei positive ganze Zahlen eingeben: ";
      cin >> i1 >> i2;
      cout << '(' << i1 << ',' << i2 << ')' << std::endl;
    
      if( i1 < i2 ) 
      {
        i2 = i2-i1;
      }
      else 
      { 
        tmp = i1; i1 = i2; i2 = tmp-i1; 
      }    
      n = n + 1; 
    
      cout << n << " Schritte zum ggT " << i1 << std::endl;
    } while((i1 != i2) || (n != q));   // ich klammere Teilvergleiche immer gerne
    
    return 0;    // Warum, macht nur Sinn, wenn Du ne ganze Funktion angibst.
    

    ich möchte direkt in do while noch eine Abbruchbedingung einbauen. Damit nach erneuten Eingabe von zwei Zahlen , der Benutzer mit q aus der Schleife raus kann.Irgendwie geht das ganze schief 😕 😞

    Ja Helenchen, wir sind bei Deinem Quelltext auch ein wenig "confused"
    kein n angelegt und nicht initialisiert.
    wo kommt q her, auch die anderen Variablen nicht angelegt...
    Wenn Du Deinen Quelltext ordentlich formatierst wirst Du auch erkennen, wo die Probleme liegen. Klares Denken muss sich in klarer Formatierung abbilden.

    Wir wollen dir ja gerne helfen Helenchen, aber mach es uns doch bitte nicht so schwer.
    Komm uns ein bisschen entgegen, und schreib, was Du genau willst und poste möglichst vollständige Blöcke mit ordentlicher Formatierung und einer ausreichendne Beschreibung was Du willst.

    Gruß Mümmel



  • Hi Mümmelchen !! 🙂
    Hier ist genaue Aufgabenstellung:
    a) Ändern Sie den Programmablaufplan des ggT Programms (aus der Vorlesung / Übung) so, dass der Programmablauf nach Abschluss der Berechnung und Ausgabe der Ergebnisse auf Wunsch des Benutzers erneut zur Eingabeaufforderung für die beiden Zahlen zurückkehrt, und alles wieder von vorne losgeht, bis der Benutzer ein q zum Beenden des Programms eingibt.



  • Hi Helenchen,

    leider hast Du nichts geschrieben, wie ggT genau berechnet werden soll. Ich gehe mal davon aus, dass Deine Anweisungen als Schleife laufen sollen, bis die Abbruchbedingung erfüllt ist.

    #include <iostream>
    
    using namespace std;
    
    int main() 
    {
      int i1 = 0, i2 = 0;
      char Ende = 'w';
      do
      {
        int n = 0;
        cout << "Zwei positive ganze Zahlen eingeben, 0, 0 für Ende: ";
        cin >> i1 >> i2;
        cout << '(' << i1 << ',' << i2 << ')' << std::endl;
        if ( ( i1 > 0 ) && ( i2 > 0 ) ) 
        { 
          do
          {
            if( i1 < i2 ) 
            {
              i2 = i2-i1;
            }
            else 
            { 
              tmp = i1; i1 = i2; i2 = tmp-i1; 
            }    
            n++; 
          } while ( i1 != i2 );
          cout << n << " Schritte zum ggT " << i1 << std::endl;
          cout << "Weitermachen? 'w' für weiter, 'q' für Quitt";
          cin >> Ende;
        }
        else
        {
          Ende ='q';
        }
      } while ( Ende != 'q' ); 
    
      return 0;  
    }
    

    Ich hoffe, dass ich alles richtig erkannt habe und dass mein Quelltext funktioniert. (bin eigentlich seit 15 Jahren nur noch Delphi-Programmierer. Das hier mache ich nur mal so als Hobby zwischendurch um nicht alles zu vergessen).

    Die eigentliche Formulierung Deines Profs ist ein Fall für die Altvogeltonne. Der Typ soll erst mal programmieren lernen. Klar kann man auch mit einer kombinierten Eingabe die Werte und/oder die Aussage ob es weitergehen soll erfassen. Aber dann kann man nicht mehr direkt in die Int-Variablen eingeben, sondern muss eine Zeichenkette einlesen und die parsen. Ist leider nichts für Anfänger, denn so ein Parser ist nicht ganz trivial. Bei iener Zeichenkette kann man alles eingeben. Statt zwei Zahlen oder q kann der Nutzer auch "Oma ist doof" eingeben. Wie soll das Programm darauf reagieren.
    Oder man schreibt eine spezielle Eingabefunktion, die jedes Zeichen Echofrei von der Konsole holt, auswertet und wenn zulässig nutzt und als Echo auf der Konsole ausgibt. Ist recht aufwendig, aber die flexibelste Version. Aber eben mit Sicherheit noch nichts für Dich.

    Erzähle mal ein bisschen was über Dich Helenchen, welche Studienrichtung genau, welches Semester, damit wir wissen, wovon wir ausgehen müssen.

    Viel Erfolg wünscht Mümmel



  • muemmel schrieb:

    Hi Helenchen,

    leider hast Du nichts geschrieben, wie ggT genau berechnet werden soll. Ich gehe mal davon aus, dass Deine Anweisungen als Schleife laufen sollen, bis die Abbruchbedingung erfüllt ist.

    #include <iostream>
    
    using namespace std;
    
    int main() 
    {
      int i1 = 0, i2 = 0;
      char Ende = 'w';
      do
      {
        int n = 0;
        cout << "Zwei positive ganze Zahlen eingeben, 0, 0 für Ende: ";
        cin >> i1 >> i2;
        cout << '(' << i1 << ',' << i2 << ')' << std::endl;
        if ( ( i1 > 0 ) && ( i2 > 0 ) ) then
        { 
          do
          {
            if( i1 < i2 ) 
            {
              i2 = i2-i1;
            }
            else 
            { 
              tmp = i1; i1 = i2; i2 = tmp-i1; 
            }    
            n++; 
          } while ( i1 != i2 );
          cout << n << " Schritte zum ggT " << i1 << std::endl;
          cout << "Weitermachen? 'w' für weiter, 'q' für Quitt";
          cin >> Ende;
        }
        else
        {
          Ende ='q';
        }
      } while ( Ende != 'q' ); 
    
      return 0;  
    }
    

    Ich hoffe, dass ich alles richtig erkannt habe und dass mein Quelltext funktioniert. (bin eigentlich seit 15 Jahren nur noch Delphi-Programmierer. Das hier mache ich nur mal so als Hobby zwischendurch um nicht alles zu vergessen).

    Die eigentliche Formulierung Deines Profs ist ein Fall für die Altvogeltonne. Der Typ soll erst mal programmieren lernen. Klar kann man auch mit einer kombinierten Eingabe die Werte und/oder die Aussage ob es weitergehen soll erfassen. Aber dann kann man nicht mehr direkt in die Int-Variablen eingeben, sondern muss eine Zeichenkette einlesen und die parsen. Ist leider nichts für Anfänger, denn so ein Parser ist nicht ganz trivial. Bei iener Zeichenkette kann man alles eingeben. Statt zwei Zahlen oder q kann der Nutzer auch "Oma ist doof" eingeben. Wie soll das Programm darauf reagieren.
    Oder man schreibt eine spezielle Eingabefunktion, die jedes Zeichen Echofrei von der Konsole holt, auswertet und wenn zulässig nutzt und als Echo auf der Konsole ausgibt. Ist recht aufwendig, aber die flexibelste Version. Aber eben mit Sicherheit noch nichts für Dich.

    Erzähle mal ein bisschen was über Dich Helenchen, welche Studienrichtung genau, welches Semester, damit wir wissen, wovon wir ausgehen müssen.

    Viel Erfolg wünscht Mümmel

    Ja der Proff ist wirklich nicht dafür geschaffen ( leider nur er macht Programmieren 1 dieses Semester 😡 ). Ich bin im 4 Semester Bachelor Informatik an einer Hochschule , müsste lange schieben wegen anderer Baustellen, habe nur im 3Semster PAD1 probiert, leider gescheitert ( da die Aufgaben trotz Koferklausur sehr anspruchsvoll waren). Habe erst jetzt nach mehreren C++ Intensivtagen angefangen etwas mehr in der Programmierung zu verstehen 😋 . Also kurz Mümmelchen bin noch in der Anfängerphase 😕



  • if ... then
    

    Neu für mich in C++, Helenchen, muemmelchen, Osterhasi oder auch Nikolausi (https://www.youtube.com/watch?v=bGwOCFMl_Hk).
    Sieht eher wie verkrüppeltes Pascal/Basic aus.



  • Hi Helenchen,

    an welcher Hochschule bist Du denn? Keine Ahnung was PAD1 ist.
    Bei den Klausuren, wo alle Hilfsmittel erlaubt sind ist es meistens so, dass sie einem nichts nützen, oder man dafür keine Zeit hat.
    Mein Hilfsittel der Wahl war da immer:
    1. Alle Fragen aufschreiben, die mir zu dem Thema einfallen,
    2. die Fragen in die richtige Reihenfolge bringen
    3. aus den Fragen Überschriften machen
    4. die Fragen beantworten.
    5. Das ganze noch mit einem Inhaltsverzeichnis und Stichwortverzeichnis ausstatten.
    Kürzen, bis es nicht mehr ohne Informationsverlust weiter zu kürzen geht.
    6. Ausdrucken.

    Danach hastt Du, wenn Du es sorgfältig gemacht hast alles wichtige im Kopf und den Rest als aussagekräftiges Script in Reichweite.
    Gegebenenfalls auch mal ein kurzes Heftchen, in dem wichtiges steht komplett abschreiben. Hilft beim merken.
    Punkt 1-4 können auch beim Beantworten von Fragen in Klausuren helfen.

    Da Du anscheinend bei den grundsätzlichen Herangehensweisen noch Probleme hast, würde ich Dir das Buch Die C-Programmiersprache von Kernighan/Ritchie empfehlen. Ist zwar nicht C++ sondern C aber eigentlich alles auch gültige C++-Programe (alle mit Stroustrups Compiler geprüft) und sehr gut im Erklären, wie man bestimmte Dinge löst.
    Für C++ wirst Du nicht darum herum kommen, Dich durch den dicken Stroustrup durchzubeißen. Und einen Blick in die Scott Meyers sollte danach auch folgen.

    Keine Bange, mit dranbleiben ist das alles zu packen. Zur Hilfe gibts ja das Forum. Aber immer erst mal bei jeder Aufgabe selbst Form reinbringen und versuchen zu begreifen was man von Dir will.

    Ach ja, das if ... then hat sich aus alter Delphi-Gewohnheit reingeschlichen, hab ich aber schon korrigiert.

    Gruß Mümmel



  • muemmel schrieb:

    Ach ja, das if ... then hat sich aus alter Delphi-Gewohnheit reingeschlichen, hab ich aber schon korrigiert.

    Wiedermal:

    Real Programmers Don't Use PASCAL

    (1982)
    http://web.mit.edu/humor/Computers/real.programmers

    Manche Leute haben eine natürliche Affinität zum Programmieren und manche eben nicht. Da helfen auch keine Spickzettel oder ähnliches.



  • Hi EOPOP

    EOPOP schrieb:

    Wiedermal:

    Real Programmers Don't Use PASCAL

    (1982)
    http://web.mit.edu/humor/Computers/real.programmers

    Irgendwie hast Du da nicht zu Ende gelesen. Da stand nichts, dass sie C++ nehmen. Da war eindeutig die Rede von FORTRAN.
    Sicher kann ich mich irren, aber ich würde meinen ältesten Hut verwetten, dass Du noch nie FORTRAN programmiert hast. Ich aber schon!!!
    Ich habe mir meine ersten Programmiersporen damals mit FORTRAN IVund Fortran 77 verdient.
    Also wer ist nun hier der "Echte Programmierer"? 😃 😃 😃
    Im übrigen, wärend C++Programmierer noch über dem Klassendesign schwitzen liefern Delphi-Programmierer meist schon die erste fertige Programm-Version an den Kundne aus. 😃

    Manche Leute haben eine natürliche Affinität zum Programmieren und manche eben nicht. Da helfen auch keine Spickzettel oder ähnliches.

    Ich weiß, eigene Gottgleichheit ist gut fürs Ego, aber Softwareentwicklung ist mittlerweile Handwerk geworden. Anspruchsvolles zwar, aber eben Handwerk. Selbst das Programmieren eines Compilers was zu Backus (Fortran-Entwickler) Zeiten noch an Zauberei grenzte ist mitlerweile solide Handwerksarbeit.

    Und was die natürliche Affinität angeht, die Basis von ALLEM ist immer noch eine solide Beherrschung des Handwerks. Wenn das sitzt und man den Einstiegspunkt gefunden hat und sich durch die Einstiegshürden durchgebissen hat, dann kommt auch irgendwann der Punkt wo es Klick macht im Kopf.

    Gruß Mümmel


Anmelden zum Antworten