iwie ne endlosschleife



  • Hallo,

    andy-ty schrieb:

    vor so ca. 4 wochen hab ich angefangen mit C!

    Dann beschäftige dich doch bitte nicht mit C++-Code.

    MfG,



  • Probe-Nutzer schrieb:

    Hallo,

    andy-ty schrieb:

    vor so ca. 4 wochen hab ich angefangen mit C!

    Dann beschäftige dich doch bitte nicht mit C++-Code.

    MfG,

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



  • andy-ty schrieb:

    wenn ich also 1.3 eintippe geht alles ganz normal von statten... wenn ich aber 1,3 eintippe haut er mit ne endlosschleifen rein.

    Im Englischen heißt es halt "1.3". Vielleicht kann man da was mit 'ner Locale machen (damit "1,3" angenommen wird), da kenne ich mich aber nicht groß aus.
    Und sonst hilft nach der Eingabe ein cin.ignore(cin.rdbuf()->in_avail(), '\n'); .



  • fricky schrieb:

    ^^nimm besser scanf oder fgets/strtod usw. dieses ich weiss nicht, was dieses 'cin' für seltsame dinge macht, wenn die eingabe absolut nicht passt.

    Halte dich nobel zurück! Ja keinen Streit vom Zaun brechen, dann muss der Hauptmann der Gegenseite die Signatur behalten; was mir sehr lieb wäre.

    Und zwölf Monate lang können wir anderen ruhig ein bißchen mehr bashen, dann gleicht sich alles wieder aus.
    🙂

    andy-ty:
    Das muss leider ins C++ Forum. Warum leider? Weil du dort gar nicht über cin diskutieren würdest, sondern nur darüber, ob goto böse ist.



  • ^^nimm besser scanf oder fgets/strtod usw. dieses ich weiss nicht, was dieses 'cin' für seltsame dinge macht, wenn die eingabe absolut nicht passt.

    Wie kann ich denn hier scanf oder fgets verwenden?

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

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

    Das muss leider ins C++ Forum. Warum leider? Weil du dort gar nicht über cin diskutieren würdest, sondern nur darüber, ob goto böse ist.

    Da magst du wohl recht haben.
    Aber warum sollte goto böse sein?!



  • andy-ty schrieb:

    ^^nimm besser scanf oder fgets/strtod usw. dieses ich weiss nicht, was dieses 'cin' für seltsame dinge macht, wenn die eingabe absolut nicht passt.

    Wie kann ich denn hier scanf oder fgets verwenden?

    float size;
    ...
    scanf ("%f", &size);
    ...
    

    IMHO ist fgets in diesem Falle etwas umständlich.



  • andy-ty schrieb:

    ^^nimm besser scanf oder fgets/strtod usw. dieses ich weiss nicht, was dieses 'cin' für seltsame dinge macht, wenn die eingabe absolut nicht passt.

    Wie kann ich denn hier scanf oder fgets verwenden?

    so z.b.

    double groesse;
    scanf ("%lf", &groesse);
    

    andy-ty schrieb:

    Aber warum sollte goto böse sein?!

    isses nicht, das wird nur oft erzählt. angeblich macht 'goto' programme immer unübersichtlich, was natürlich quatsch ist.
    dein beispiel ist zwar auch kein argument für 'goto', aber das ist ja nicht der eigentliche fehler. ach ja, wie Badestrand schon angedeutet hat: beim eingeben benutz' einen dezimalpunkt, kein komma.
    🙂



  • goto ist (meistens) böse, weil dadurch die Lesbarkeit des Codes leidet. Außerdem lässt sich fast alles auch viel besser mit Schleifen lösen. Es gibt imho aber auch Fälle, wo ich ein goto nicht schlimm finde.



  • 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.
    🙂


Anmelden zum Antworten