Innerhalb von while() Abbruch erzwingen



  • while(room[i] != "exit" || ram[i] != "exit" || cpu[i] != "exit" || bios[i] != "exit" ||
              net[i] != "exit" || sound[i] != "exit" || hdisc[i] != "exit" || graph[i] != "exit" ||
              dev[i] != "exit" || ddev[i] != "exit" || invnr[i] != "exit" || accept != "exit")
        {
          cout << "  Raum: ";
          cin  >> room[i];
          cout << "  RAM: ";
          cin  >> ram[i];
          cout << "  CPU: ";
          cin  >> cpu[i];
          cout << "  BIOS: ";
          cin  >> bios[i];
          cout << "  Netzwerkkarte: ";
          cin  >> net[i];
          cout << "  Soundkarte: ";
          cin  >> sound[i];
          cout << "  Fesplatte: ";
          cin  >> hdisc[i];
          cout << "  Grafikkarte: ";
          cin  >> graph[i];
          cout << "  Laufwerk: ";
          cin  >> dev[i];
          cout << "  Diskettenlaufwerk: ";
          cin  >> ddev[i];
          cout << "  Inventarnummer: ";
          cin  >> invnr[i];
          cout << "  Das war es auch schon! \x94 \bberpr\x81 \bfen Sie bitte noch einmal die eingegebenen Daten. 
                     Sollte die Eingabe richtig sein dr\x81 \bcken Sie nun bitte eine beliebige Taste + Enter. Sollte dies nicht 
                     zutreffen geben Sie stattdessen \"exit\" ein. " << endl;
          cout << "  ---------->  ";
          cin  >> accept;
        }
    

    Nun zum Problem: Nach aktuellem Stand würde die Schleife erst alle Bedingungen entgegennehmen dann die Anweisungen ausführen und sich anschließend beenden (wenn eine bedingung zutrifft). Wenn ich eine do-while-Schleife benutze steh ich so blöd da wie vorher. Ich müsste also irgendwie erzwingen können, dass nach jeder Eingabe auf Eintreten einer der Bedingungen geprüft wird. Also ich hoff ja, dass ich grad wieder nur ein Brett vor dem Kopf hab und es eigentlich ganz simpel is. Ich bedanke mich auf jeden Fall schonmal im voraus.

    P.S.: Ich kann doch bestimmt den Bedingungswirrwar in der Klammer auf ein erträgliches Maß reduzieren oder?



  • Versuch's mal mit 'break' (damit verlässt du die Schleife sofort und ohne Umwege).



  • warum überprüfst du eigentlich alle eingaben auf "exit"? im info-text steht doch, dass man ganz am ende exit eingeben soll, um rauszukommen. also reicht vom konzept her

    while(accept != "exit") ...
    


  • thordk schrieb:

    warum überprüfst du eigentlich alle eingaben auf "exit"? im info-text steht doch, dass man ganz am ende exit eingeben soll, um rauszukommen. also reicht vom konzept her

    while(accept != "exit") ...
    

    Das kann ich dir sagen :). Ich wolle schauen wie die Schleife funktioniert; heißt: ob das Abbrechen an jeder Stelle funktioniert, aber so gesehen ist es natürlich Quatsch.

    Wo soll ich break denn hinsetzen?

    EDIT: Was du nicht sehen konntest: es gibt vorher noch einen Info-Text der sagt, dass man an jeder Stelle beenden kann und so ist es auch angedacht also ich denk um die Bedingungen komm ich nicht herum.



  • supern0va schrieb:

    Wo soll ich break denn hinsetzen?

    So gesehen reicht eigentlich die Überprüfung von accept aus. Aber wenn du es unbedingt wissen willst - das break gehört dorthin, wo du aus der Schleife rausspringen willst (am besten hinter einem if() versteckt):

    while(...)
    {
      cout << "  Raum: ";
      cin  >> room[i];
      if(room[i]=="exit") break;
      ...
    }
    


  • CStoll schrieb:

    supern0va schrieb:

    Wo soll ich break denn hinsetzen?

    So gesehen reicht eigentlich die Überprüfung von accept aus. Aber wenn du es unbedingt wissen willst - das break gehört dorthin, wo du aus der Schleife rausspringen willst (am besten hinter einem if() versteckt):

    while(...)
    {
      cout << "  Raum: ";
      cin  >> room[i];
      if(room[i]=="exit") break;
      ...
    }
    

    genau da liegt aber das "Problem". Wenn ich des so hinter jede Eingabe setze ist das glaub ich nicht der Sinn der Sache.



  • Wenn du nach jeder Eingabe die Chance haben willst, die Schleife zu verlassen, musst du nach jeder Eingabe ein break setzen (oder soll der Compiler raten, wann er die Schleife beenden darf und wann nicht?)



  • Das würd ich ihm doch niemals zumuten 🙂 . Ich dachte nur, dass man das evtl. etwas übersichtlicher gestalten kann. Aber wenn nicht dann muss ich mich wohl damit zufrieden geben.....



  • ob das wirklich übersichtlicher ist, bin ich nicht ganz sicher, aber eventuell könntest du so etwas machen:

    string lastinput="";
    while(lastinput!="exit")
    {
      string* values[]={&(room[i]),&(ram[i]),...,&accept};
      string output[]={"Raum","Ram",...,"bitte 'exit' eingeben, wenn die Daten OK sind."};
      int valct = sizeof(values)/sizeof(values[0]);
      for(int i=0;i<valct&&lastinput!="exit";++i)
      {
        cout<<output[i]<<":";
        cin>>lastinput;
        *values[i]=lastinput;
      }
    }
    


  • Danke für den Vorschlag!

    Mir ist auch noch ne Möglichkeit eingefallen die das ganze immerhin übersichtlicher gestaltet.

    Ich hab if und break in ne Funktion verfrachtet, sodass ich jetzt nen schönen Einzeiler hab.

    Manchmal macht man das Leben halt komplizierter als es eh schon ist 🙄. Danke trotzdem nochmal an dich.


Anmelden zum Antworten