C++ Beginner Hilfe bzgl. Schleifen gesucht

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

      C++ Beginner Hilfe bzgl. Schleifen gesucht

      C++ Beginner Hilfe bzgl. Schleifen gesucht
      Heyho stagetwo,
      da ich auf einem Informationstechnischen Gymnasium muss ich mit C++ programmieren.
      Ich muss im moment ein Programm zu Rechteckberechnung machen und Schleifen benutzen.
      Aber ich stecke leider fest, es klappt zwar, dass das Programm den Flächeninhalt oder den Umfang berechnet.
      Ich schaffe es nur nicht, nach einer Fehlermeldung durch eine falsche Eingabe, auf eine neue Eingabe zu kommen.
      goto dürfen wir leider nicht benutzen :)

      Am besten ihr schaut euch das mal selber an:
      Spoiler anzeigen

      Quellcode

      1. #include <cstdlib>
      2. #include <iostream>
      3. using namespace std;
      4. int main(int argc, char *argv[])
      5. {
      6. //Deklarationen
      7. int izahl, iflaeche, ibreite, ilaenge, iumfang;
      8. //Menuesteuerung
      9. printf("\t\t\t Rechtecksberechnungen!!!\n");
      10. printf("Als erstes, geben Sie bitte die Laenge und Breite ihres Rechtecks ein\n");
      11. printf("Die Laenge: ",ilaenge);
      12. scanf("%i",&ilaenge);
      13. printf("Die Breite: ",ibreite);
      14. scanf("%i",&ibreite);
      15. system("cls");
      16. printf("\t Nun waehlen Sie den Operator aus:\n");
      17. printf("'1' fuer die Berechnung des Flaecheninhalts\n");
      18. printf("'2' fuer die Berechnung des Umfangs\n");
      19. printf("'3' fuer das Beenden des Programms\n");
      20. printf("Ihre Eingabe: ");
      21. scanf("%i",&izahl);
      22. system("cls");
      23. //Berechnungen
      24. do
      25. {
      26. //Erste IF Verzweigung
      27. if (izahl == 1)
      28. {
      29. printf("\t\t\t Berechnung des Flaecheninhalts\n");
      30. printf("Der Flaecheninhalt betraegt: %i cm\n", ilaenge*ibreite);
      31. break;
      32. }
      33. //Zweite IF Verzweigung
      34. if (izahl == 2)
      35. {
      36. printf("\t\t\t Berechnung des Umfangs\n");
      37. printf("Der Umfang betraegt: %i cm\n",2*(ilaenge+ibreite));
      38. break;
      39. }
      40. //Dritte IF Verzweigung
      41. if (izahl == 3)
      42. {
      43. return 0;
      44. }
      45. //Fehler Verzweigung
      46. else ((izahl < 1) *ODER* (izahl > 3));
      47. {
      48. printf("Falsche Eingabe, versuchen Sie es erneut!\n");
      49. }
      50. }
      51. while ((izahl== 1)|| (izahl == 2)|| (izahl == 3));
      52. system("PAUSE");
      53. return EXIT_SUCCESS;
      54. }
      Alles anzeigen


      Bei der Menüsteuerung werden nur die Zahlen 1-3 angenommen, wenn ich aber die 4 eingebe soll das Programm mich nochmal zur Eingabe lassen.
      Wenn mir jemand helfen würde, wäre ich ihm sehr dankbar! :)

      mfg
      __RyD3R__
      Starcraft 2
      Liga: Diamant (1vs1) EU
      Spezies: Terraner
      Name: Ryder
      Code: 682
      Das kannst du locker flockig mit einer Schleife lösen. Einfach durchloopen, solange die Bedingung

      Quellcode

      1. (izahl < 1) || (izahl > 3)
      erfüllt ist.

      BTW:
      - using namespace std; ist zu vermeiden
      - printf("Die Laenge: ",ilaenge); Du verwendest ilaenge, ohne das ilaenge eine vernünftige Initialisierung besitzt
      - scanf_s benutzen, oder gleich std::cin gepaart mit std::cout
      - SYSTEM()-Calls gilt es ebenso zu vermeiden. Der Kompatibilität wegen. Abhilfe schafft hier std::cin.get() oder getchar()
      - Die if-Abfragen kannst du durch switch-case ersetzen. Ich glaube, es lohnt sich ab ca. 3 Abfragen, bin mir mit der Zahl aber nicht ganz sicher. Der Performance schadet es jedenfalls nie :P

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Euphi ()

      using namespace std ist meiner meinung nach nur im header zu vermeiden, in der cpp ist es ok, natürlich immer je nach kontext. aber sobald eine klasse so groß wird, dass es nicht mehr einwandfrei ist, sollte man eh zwei klassen daraus machen, siehe clean code etc.

      mach nen try-catch block in deine schleife, dann sollte das weitergehen. entweder du gibst ne ordentliche meldung aus, was immer gut ist, oder du verschluckst den fehler, was in dem minibeispiel von dir nicht so schlimm ist.
      Dieser Beitrag wurde noch nie editiert, zuletzt von »hangman« (Heute , 13:37)






      Skill ist, wenn Luck zur Gewohnheit wird
      Hi, danke für die Antworten :)
      Ich verstehe aber leider irgendwie nicht wie ich zurück auf den Scanf Befehl komme bei einer falschen Eingabe.
      Gibt es dafür extra einen Befehl außer goto? Was hat es mit return auf sich?
      Edit: Mit switch-case wär das natürlich auch möglich, aber ich würde es gerne mal so versuchen :)
      Starcraft 2
      Liga: Diamant (1vs1) EU
      Spezies: Terraner
      Name: Ryder
      Code: 682
      Wage nicht mal daran zu denken, zu denken goto wäre eine denkbare Lösung (oder so ? xD). Dann kommt die richtige Lösung von ganz alleine :)

      Wie wärs mit ein bischen Pseudocode?

      Quellcode

      1. tue {
      2. eingabe_lesen()
      3. eingabe_prüfen()
      4. } solange (eingabe nicht ok)
      5. eingabe_verarbeiten()

      Im Falle einer falschen Eingabe wird der Eingabevorgang wiederholt denn die Schleife wird ja nicht verlassen. Erst wenn die Eingabe ok ist, wird die Verarbeitung des Wertes gestartet.
      Hi,
      es scheitert an der Umsetzung ich weiß nicht wieso ich es nicht hinkriege :help:
      Ist das überhaupt möglich bei dem bereits geschrieben Programm von mir?
      Oder habe ich da schon einen Fehler gemacht damit ich nicht mehr bei einer falschen Eingabe zur erneuten Eingabe komme?
      mfg
      __RyD3R__
      Starcraft 2
      Liga: Diamant (1vs1) EU
      Spezies: Terraner
      Name: Ryder
      Code: 682

      Quellcode

      1. int izahl = 0;
      2. // scanf blablabla Zahl einlesen
      3. while((izahl< 1) || izahl > 3)){
      4. // Eingabe falsch, neu einlesen
      5. // scanf blablablabla
      6. }
      7. // Eingabe ist nun kleiner 1 und grösser 3 -> weiterfahren
      8. switch(izahl)
      9. {
      10. case 1:
      11. // printf etc mit Zahl == 1
      12. break;
      13. case 2:
      14. break;
      15. case 3:
      16. break;
      17. }
      Alles anzeigen


      Edith meint:
      Wenn du wirklich deine Variante mit einer Quadrillion If-Abfragen implementieren möchtest.
      Du brauchst beim else keine Bedingung anhängen, nur wenn das else ein else if ist.