Programmablaufplan



  • Ich muss ein Programm schreiben wie im Bild beschrieben.
    Jedoch hab ich da meine Schwierigkeiten mit der while-Schleife.

    Ich weiß nicht wie und wo ich die setzen soll sodass mein Programm bei einer anderen Eingabe die Schleife solange wiederholt bis es das erforderliche eingegeben wird

    Mein Code:

    #include <iostream>
    using namespace std;

    int main()

    {
    char start;
    int zahl = 0;
    bool ja = 1;

    cout << "Start Programmerstellungsprozess - Bitte start eingeben" << endl;
    cin >> start;

    switch (start){

    case '1':
    cout << "Source Code editieren" << "/nSource Code kompilieren" << endl;
    cout << "Kompilierung fehlerfrei ?" << endl;
    break;

    case '2' :
    cout << "Programm ausführen, Softwaretest" << endl;
    cout << "Programm funktional richtig?" << endl;
    break;

    case '3':
    cout << "Source-Code Review machen" << endl;
    cout << "Gute Source-Code-Qualität?" << endl;
    break;

    }

    system("pause");
    return 0;
    }

    Hoffe ihr könnt mir helfen.

    Anbei der Ablaufplan :
    http://fs5.directupload.net/images/151121/hyamz3jj.png



  • Na um die Benutzereingabe

    do
    {
        cout << "Start Programmerstellungsprozess - Bitte start eingeben" << endl; 
        cin >> start;
    }
    while (start < 1 || start > 3);
    

  • Mod

    Oh, ja! Codeentwicklung wie anno 1975! So war das in meinem allerersten Programmierbuch. Und danach komischerweise in keinem der neueren Bücher mehr 😉

    Bei solch einer Vorgabe würde ich gar keine Schleife setzen, schließlich hat der Zeichner des Bildes auch keine Schleife eingezeichnet. Daher voll rein mit goto, als wäre es noch der Sommer 1968*:

    edit: Version 2, ganz ohne Tricks, damit volkard zufrieden ist 🙂

    #include <iostream>
    
    int main()
    {
      char choice;
    
     label1:
      std::cout << "Source-Code editieren.\nSource-Code compilieren.\nCompilierung fehlerfrei?\n";
      std::cin >> choice;
      if (choice == 'y' || choice == 'Y')
        goto label2;
      else goto label1;
    
     label2:
      std::cout << "Programm ausführen, Softwaretest.\nProgramm funktional richtig?\n";
      std::cin >> choice;
      if (choice == 'y' || choice == 'Y')
        goto label3;
      else goto label2;
    
     label3:
      std::cout << "Source-Code Review machen.\nGute Source-Code-Qualität?\n";
      std::cin >> choice;
      if (choice == 'y' || choice == 'Y')
        goto ende;
      else goto label1;
    
     ende:;
    }
    

    Falls dies aus irgendeinem Grunde nicht erwünscht sein sollte :p :
    Strukturen der Art

    label1:
      irgendwas;
      if (bedingung)
        goto label2;
      else goto label1;
     label2:
    

    lassen sich auch schreiben als

    do
    {
      irgendwas;
    } while (!bedingung)
    

    Achtung: Der letzte Block entspricht nicht dieser Struktur, stattdessen entspricht das Gesamtprogramm auch dieser Struktur, und die if-Anweisung im letzten Block ist die Abbruchbedingung des Superblocks.

    ~Disclaimer: Sämtliche Deppenleerzeichen und -bindestriche sind der Vorgabe entnommen. Ich möchte nicht mit ihnen in Verbindung gebracht werden~

    PS: Wie man seinen Beitrag lesbar formatiert

    *: Tatsächlich wurde "Goto considered harmful" aber schon im März '68 veröffentlicht.



  • Nee, nee.

    label3:
      std::cout << "Source-Code Review machen.\nGute Source-Code-Qualität?\n";
      std::cin >> choice;
      if (choice == 'y' || choice == 'Y')
        goto ende;
      else goto label1;
    
     ende:;
    }
    


  • Hin und wieder ein goto ist doch seit 2002 wieder erlaubt.


  • Mod

    volkard schrieb:

    Hin und wieder ein goto ist doch seit 2002 wieder erlaubt.

    Dann muss ich meine alten Kenntnisse wohl wieder auffrischen. Mal gucken, ob mein altes Programmierbuch noch im Regal der Bücherei steht. Würde mich nicht wundern, wenn die Computerabteilung immer noch so aussieht wie 1992.

    Alternativ tut's bestimmt auch ein italienisches Kochbuch.

    Nee, nee.

    Ja, da hatte ich auch ein schlechtes Gewissen, als ich so trickste. War klar, dass du das sofort siehst. 🙂
    Habe das mal korrigiert, damit der Threadersteller auch beim letzten Block einfacher den Zusammenhang von goto zu while-Schleifen sieht.



  • SeppJ schrieb:

    Dann muss ich meine alten Kenntnisse wohl wieder auffrischen.

    Du hast anscheinend echt goto-Defizite.
    Zum Beispiel haste schon meinen Code falsch kopiert. Man kann doch nur Anweisungen belabeln.

    ende:;
    

    lölchen.


  • Mod

    Wieder so ein Ding, dass man zwar irgendwie mal gewusst hat, aber nie braucht und daher vergessen hat, wenn man es dann doch mal braucht. Tatsächlich ist mir dieser Fehler sogar erst vor ein paar Wochen das letzte Mal passiert und ich habe es seitdem trotzdem wieder vergessen.



  • Ersteinmal vielen Dank für die ganzen Antworten.
    Jedoch hab ich wohl dieses kleine aber wichtige Detail vergessen.
    goto ist leider untersagt 😕

    Also müsste mit while arbeiten

    Mein problem besteht darin das wenn ich eine if-anweisung benutze weiß ich nicht was ich als else schreiben soll damit ich aus der schleife raus und ins nächste label gehen kann bzw. die if-anweisung solange gefragt wird bis ich ja eingebe.

    wie bei goto-anweisung. da kann man ja einfach if(bedingung) else goto label x



  • @SeppJ,volkard
    Ihr habt wieder den 🤡 vergessen



  • mc52 schrieb:

    Ersteinmal vielen Dank für die ganzen Antworten.
    Jedoch hab ich wohl dieses kleine aber wichtige Detail vergessen.
    goto ist leider untersagt 😕

    Dann soll der Lehrer anständige Problemstellungen geben und nicht einen hingemalten Goto-Unfug aus den 70-ern.

    mc52 schrieb:

    Also müsste mit while arbeiten.

    Da gibts noch das break als das goto des kleinen Mannes und continue als sein Freund.

    #include <iostream>
    
    int main()
    {
        char choice;
    
        do
        {
            std::cout << "Source-Code editieren.\nSource-Code compilieren.\nCompilierung fehlerfrei?\n";
            std::cin >> choice;
            if (choice != 'n' and choice != 'N')
                continue;
    
            std::cout << "Programm ausführen, Softwaretest.\nProgramm funktional richtig?\n";
            std::cin >> choice;
            if (choice != 'n' and choice != 'N')
                continue;
    
            std::cout << "Source-Code Review machen.\nGute Source-Code-Qualität?\n";
            std::cin >> choice;
            if (choice != 'n' and choice != 'N')
                continue;
    
        }while(false);
    }
    


  • volkard schrieb:

    }while(false);
    }
    

    Dafür wird der Lehrer aber kein Verständnis haben.

    Er wird deshalb lieber so schwachsinnige Lösungen sehen wie

    #include <iostream>
    
    int main()
    {
        char choice;
    
        do
        {
            do
            {
                do
                {
                    std::cout << "Source-Code editieren.\nSource-Code compilieren.\nCompilierung fehlerfrei?\n";
                    std::cin >> choice;
                }
                while(choice != 'n' and choice != 'N');
                std::cout << "Programm ausführen, Softwaretest.\nProgramm funktional richtig?\n";
                std::cin >> choice;
            }
            while(choice != 'n' and choice != 'N');
            std::cout << "Source-Code Review machen.\nGute Source-Code-Qualität?\n";
            std::cin >> choice;
        }
        while(choice != 'n' and choice != 'N');
    }
    

    . Schwachsinnig deshalb, weil sie viel viel viel schwieriger zu lesen ist als die goto- oder continue-Lösung.

    Und am liebsten hat er halbschwachsinnige Lösungen wie

    #include <iostream>
    
    int main()
    {
        char choice;
    
        do
        {
            std::cout << "Source-Code editieren.\nSource-Code compilieren.\nCompilierung fehlerfrei?\n";
            std::cin >> choice;
            if (choice != 'n' and choice != 'N')
                continue;
    
            std::cout << "Programm ausführen, Softwaretest.\nProgramm funktional richtig?\n";
            std::cin >> choice;
            if (choice != 'n' and choice != 'N')
                continue;
    
            std::cout << "Source-Code Review machen.\nGute Source-Code-Qualität?\n";
            std::cin >> choice;
        }
        while(choice != 'n' and choice != 'N');
    }
    

    . Erst dem geübten Auge fällt auf, daß die drei Bedingungen zwar das gleiche machen, aber nicht gleich dastehen, also der Code stinkt.



  • Guten Abend,

    also ich habe mein Programm Grund auf überarbeitet.
    Es scheint zu funktionieren - zumindest tut es das was ich erwartet habe.

    Jedoch bin ich nicht so ganz zufrieden mit dem Programm

    Habt ihr Verbesserungsvorschläge. Wie kann ich das Programm noch "effizienter" gestalten ?

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	char start, eingabe = '/0';
    	int zahl = 0;
    	bool ja = 1;
    
    	do{
    		cout << "Start Programmerstellungsprozess - Bitte start eingeben" << endl;
    		cin >> eingabe;
    		if (eingabe == 'j')
    		{
    			cout << "Source Code editieren" << "\nSource Code kompilieren" << endl;
    			cout << "Kompilierung fehlerfrei ?" << endl;
    			cin >> eingabe;
    		}
    		if (eingabe == 'j')
    		{
    			cout << "Progamm ausfuhren, Softwaretest" << "\nProrgramm funktional richtig? " << endl;
    			cin >> eingabe;
    		}
    		if (eingabe == 'j')
    		{
    			cout << "Source-Code Review machen" << "\nGute Source-Code-Qualitat?" << endl;
    			cin >> eingabe;
    			if (eingabe == 'j')
    			{
    				cout << "Programmende" << endl;
    			}
    		}
    	} while (eingabe != 'j');
    
    	system("pause");
    	return 0;
    }
    

    Mit freundlichen Grüßen



  • mc52 schrieb:

    Habt ihr Verbesserungsvorschläge.

    Die drei Blöcke sehen nicht gleich aus. Der untere ist so anders. Wegen der Programmende-Ausgabe. Aber mudd sie denn wirklich dort sein? Nee, sie kann doch auch hinter dsie Riesenschleife. Dann sähen die gleichen Sachen gleicher aus, ach, das wäre schön.

    Und die Startausgabe kann vor die Schleife. Aber um genau zu sein erzeugen die Ovalen Knoten im PAP gar keinen Code unds diese beiden Ausgaben soll es nicht geben.

    Und die erste Frage (obs Programm gestartet wurde), ist schlicht falsch. Die steht nicht im Bildchen.


Anmelden zum Antworten