iwie ne endlosschleife



  • andy-ty schrieb:

    Es wurde uns vom Lehrer aufgedrängt uns damit zu beschäftigen deswegen mach ich das auch.

    Es gibt genug, die das nicht machen müssen, sonder freiwillig, deswegen der Hinweis, weil es vielen nicht bewusst ist. Und wenn man dann nur mit cin/cout arbeitet, übergeht man die Ein-/Ausgabemechanisen/Techniken von C (die beinhalten nun mal den Einsatz z.B. fcanf, fgets, puts usw.), das man eigentlich lernen wollte.

    Mir ist bewusst, dass diese "Mischform" oft noch so gelehrt wird

    MfG,

    Probe-Nutzer



  • andy-ty schrieb:

    Und sonst hilft nach der Eingabe ein cin.ignore(cin.rdbuf()->in_avail(), '\n');.

    Das hilft leider nicht.
    Die Schleife wird sowieso ausgelöst.

    Hast es es auch nach der Eingabe platziert?



  • Hast es es auch nach der Eingabe platziert?

    Ja! Ich habe es nach der Ausgabe plaziert.

    ach ja, wie Badestrand schon angedeutet hat: beim eingeben benutz' einen dezimalpunkt, kein komma.

    Ich glaube langsam das ich meine Problemstellung falsch formuliert habe.
    Das ich statt nem Komma ein Punkt verwenden soll ich mir klar.
    Das Problem ist. Wenn ich das Programm einem dahergelaufenem gebe damit er es mal eben kurz ausprobiert. Wird es ganz bestimmt statt nem Punkt ein Komma setzen was dann eine Endlosschleife zur Folge hat.
    Auch wenn ich dort einen Buchstaben schreibe wird nach der Eingabe sofort eine Endloschleife ausgelöst.

    Ich hoffe ihr versteht was ich meine!



  • Also das Puffer leeren klappt eigentlich, da haste irgendwas falsch gemacht. Guckst du hier:

    int main() {
    	double groesse=0.;
    	do {
    		cout << "Bitte tragen Sie Ihre Groesse ein: ";
    		cin >> groesse;
    		cin.ignore(cin.rdbuf()->in_avail(), '\n');
    	}while(groesse < 1.39);
    	cout << "Sie haben " << groesse << " eingegeben!\n";
    }
    


  • _matze schrieb:

    Also das Puffer leeren klappt eigentlich, da haste irgendwas falsch gemacht. Guckst du hier:

    int main() {
    	double groesse=0.;
    	do {
    		cout << "Bitte tragen Sie Ihre Groesse ein: ";
    		cin >> groesse;
    		cin.ignore(cin.rdbuf()->in_avail(), '\n');
    	}while(groesse < 1.39);
    	cout << "Sie haben " << groesse << " eingegeben!\n";
    }
    

    Schreib das Programm doch mal jetzt und tippe bei "Bitte tragen Sie Ihre Groesse ein: " mal ein Komma oder einen Buchstaben!
    Und schon hast du ne Endlosschleife... zumindestens ist das bei mir so!?



  • ...und ohne cin/cout und bit-schiebereien:

    int main()
    {
      double groesse = 0.0;
      while (groesse < 1.39)
      {
        printf ("Bitte tragen Sie Ihre Groesse ein: ");
        scanf ("%lf", &groesse);
        // drain stdin
        {
          int eof;
          eof = scanf("%*[^\n]"); 
          if (eof != EOF)
            scanf("%*c");
        }
      }
      puts ("groesse stimmt");
    }
    

    🙂



  • andy-ty schrieb:

    _matze schrieb:

    Also das Puffer leeren klappt eigentlich, da haste irgendwas falsch gemacht. Guckst du hier:

    int main() {
    	double groesse=0.;
    	do {
    		cout << "Bitte tragen Sie Ihre Groesse ein: ";
    		cin >> groesse;
    		cin.ignore(cin.rdbuf()->in_avail(), '\n');
    	}while(groesse < 1.39);
    	cout << "Sie haben " << groesse << " eingegeben!\n";
    }
    

    Schreib das Programm doch mal jetzt und tippe bei "Bitte tragen Sie Ihre Groesse ein: " mal ein Komma oder einen Buchstaben!
    Und schon hast du ne Endlosschleife... zumindestens ist das bei mir so!?

    Bei mir klappt's. Welchen Compiler benutzt du denn?



  • Basher schrieb:

    ...und ohne cin/cout und bit-schiebereien:

    Uralt, aber immer wieder lustig. 😃



  • oh, es ist passiert, ;fricky heisst jetzt Basher, sollte ich mich vielleicht auch mal registrieren als einer der Sich-nicht-registrieren-wollenden Helfer? Ich bin wieder stark am Überlegen..., nun gut, wir werden sehen..., welche Diskussion mich dazu bringen könnte... 🙂

    MfG,

    Probe-Nutzer



  • Ich bin wieder stark am Überlegen..., nun gut, wir werden sehen..., welche Diskussion mich dazu bringen könnte...

    Ist offtopic, aber was sind denn deine Gründe, nicht registriert zu sein?

    andy-ty schrieb:

    Aber warum sollte goto böse sein?!

    Das ist eine Frage, die von Generationen von Programmierern diskutiert wurde:
    http://en.wikipedia.org/wiki/Considered_harmful

    Was cin angeht: tatsächlich kennen sich die Kollgegen im C++ Forum besser damit aus als zB ich. Habe leider keine Ahnung, wie cin so einen Fehler anzeigt. Hier bekommst du meistens C-Lösungen serviert, wie zB die von Basher. Aber nur keine Scheu: wenn du was über cin wissen willst, frag einfach dort nach!



  • Probe-Nutzer schrieb:

    oh, es ist passiert, ;fricky heisst jetzt Basher

    ...und hat vermutlich spätestens nach der Mittagspause nen Beitragscounter von USHRT_MAX 😃



  • Probe-Nutzer schrieb:

    oh, es ist passiert, ;fricky heisst jetzt Basher, sollte ich mich vielleicht auch mal registrieren als einer der Sich-nicht-registrieren-wollenden Helfer? Ich bin wieder stark am Überlegen..., nun gut, wir werden sehen..., welche Diskussion mich dazu bringen könnte...

    lass es bleiben. ich musste es tun, sozusagen als selbstkasteiung dafür, dass ich mein versprechen gebrochen habe.

    LordJaxom schrieb:

    Probe-Nutzer schrieb:

    oh, es ist passiert, ;fricky heisst jetzt Basher

    ...und hat vermutlich spätestens nach der Mittagspause nen Beitragscounter von USHRT_MAX 😃

    *pssst*!, darauf hoffe ich ja. damit würden sie mir einen grund liefern, wieder der alte ;fricky zu sein, ohne dass ich mein gesicht verliere.
    🙂



  • Basher schrieb:

    ...und ohne cin/cout und bit-schiebereien:

    int main()
    {
      double groesse = 0.0;
      while (groesse < 1.39)
      {
        printf ("Bitte tragen Sie Ihre Groesse ein: ");
        scanf ("%lf", &groesse);
        // drain stdin
        {
          int eof;
          eof = scanf("%*[^\n]"); 
          if (eof != EOF)
            scanf("%*c");
        }
      }
      puts ("groesse stimmt");
    }
    

    🙂

    So und das funktioniert jetzt! Supper! 🙂
    Wenn du mir diesen Code jetzt noch erläuterst dann bin ich supper zufrieden! 😉

    Danke und Gruß
    Andreas



  • andy-ty schrieb:

    Wenn du mir diesen Code jetzt noch erläuterst dann bin ich supper zufrieden

    den code in der mitte hab' ich aus meiner codeschnipselsammlung, woher er ursprünglich stammt, weiss ich auch nicht mehr. er saugt jedenfalls 'stdin' leer, falls noch irgendwas drin ist, ohne zu blockieren. (wenn das erste 'scanf' nicht alles geschluckt hat). vielleicht hilft dir das: http://en.wikipedia.org/wiki/Scanf
    🙂



  • Wenn du mir diesen Code jetzt noch erläuterst dann bin ich supper zufrieden

    Das hat mich manchmal verwirrt, als ich mit C angefangen habe. Eingaben (und Ausgaben) sind gepuffert. Und zwar mit irgendeiner Puffer-Größe, wenn es um eine Datei geht. Wenn es aber um eine Terminal-Eingabe geht, dann wird zeilenweise gepuffert, also die ganze Zeile in den Puffer gelesen, wo man dann mit scanf, getc, etc. soviel herausholen kann, wie man will.

    In Zeile 11 wird versucht, alles bis zum nächsten Zeilenumbruch aus dem Puffer zu holen, wobei auch darauf geachtet wird, daß es vielleicht passieren könnte, daß die der Puffer nicht mit einem Zeilenumbruch endet.



  • µngbd schrieb:

    Das hat mich manchmal verwirrt, als ich mit C angefangen habe.

    die pufferung ist nicht das schlimmste. dass man die puffer nicht so einfach löschen oder abfragen kann, was drin ist, das ist richtig doof.
    🙂


Anmelden zum Antworten