Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten



  • Ich möchte die Fibonacci Folge ausgeben und bei falschen Eingaben soll das Programm einfach weiter Einlesen, solange bis eine gültige Eingabe kommt. Also ausschließlich eine Ganzzahl soll eingelesen werden. Bei allen Zahlen außer der 1 Funktioniert es nach meinem Schema. Ich habe viel gegoogelt und leider nichts gefunden, wie ich es mit dem "%*s" hinbekomme.

    #include <stdio.h>

    int main () {
    int number;
    int f1 = 0;
    int f2 = 1;

    scanf("%d", &number);
    
    while(scanf("%d", &number) != 1) {
    	scanf("%*s");
    }
    
    	if(number == 0) {
    		printf("%d\n", f1);
    	}
    	if(number >= 0) {
    		//printf("%d\n%d\n", f1, f2);
    		while((f1+f2) < number) {
    
    			if(f1 == 0) {
    				printf("%d\n%d\n%d\n", f1, f2, f2);
    			} else {
    					printf("%d\n", f1 + f2);
    				}
    				int dummy = f1;
    				f1 = f2;
    				f2 = f2 + dummy;
    
    			}
    		}
    return 0;
    

    }



  • „Funktioniert nicht“ ist keine Fehlerbeschreibung.


  • Mod

    @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    int f1 = 0;
    int f2 = 1;
    […]
    while((f1+f2) < number)

    Wie lange ist das denn kleiner als 1?



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    scanf("%d", &number);   // <----------- hier
    
    while(scanf("%d", &number) != 1) {
    	scanf("%*s");
    }
    

    Du liest 2x ein. Die erste Eingabe benutzt du aber überhaupt nicht (ich habs dir markiert). Du kannst die Zeile einfach löschen, denn im while liest du ja gleich nochmal eine Zahl ein.

    	if(number == 0) {
    		printf("%d\n", f1);
    	}
    	if(number >= 0) {
    

    Wenn deine number null ist, dann ist sie sowohl gleich null als auch größergleich null. Willst du für die 0 wirklich beides ausführen?



  • Ich versuche mal den Fehler zu erklären, wenn ich eine 1 eingebe, kann ich noch ein weiteres mal eine 1 eingeben und dann beendet sich das Programm. Wenn ich aber andere Eingaben in Form von Ganzzahlen eingebe, dann läuft das Programm wie es soll und gibt mir die Fibonacci Folge bis zu der Ziffer an die gewünscht ist.

    Ich habe jetzt die erste scanf funktion mal auskommentiert und nun liest sich nur noch eine 1 ein und dann beendet sich das programm. Alles andere Funktioniert wie gehabt, erstmal danke dafür ☀

    Ich brauche die beiden if funktionen mit 0 drin, weil sich die 0 mindestens einmal ausgeben muss. also egal welche Zahl ich eingebe es soll immer mindestens eine 0 ausgegeben werden.
    Sprich:
    Eingabe = 0 Ausgabe = 0
    Eingabe = 1 Ausgabe = 0 1 1
    Eingabe = 5 Ausgabe = 0 1 1 2 3 5



  • @SeppJ Sorry, ich verstehe nicht ganz was genau du meinst mit "wie lange"?



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    @SeppJ Sorry, ich verstehe nicht ganz was genau du meinst mit "wie lange"?

    Wie oft wird der Schleifenkörper ausgeführt, wenn du '1' eingegeben hast?



  • @manni66 Ich schätze mal er wird ein einziges mal ausgeführt, da sich das Programm sofort beendet sobald ich die 1 eingebe. Oder kein einziges mal, da keine einzige Ausgabe kommt. Ich bin mir nicht wirklich sicher.



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    Ich schätze mal

    Schätzen? Hast du das Programm nicht selber geschrieben?


  • Mod

    Erklär doch mal, was while bedeutet. Angenommen in einem Programm steht

    while(X)
    {
       irgendwas;
    }
    

    Was passiert für welche Werte von X?



  • @manni66 Es wäre Wünschenswert, wenn du mir zur Hilfe kommst anstatt passiv aggressive Fragen zu stellen. Ich Programmiere seit 4 Tagen und hab wie gesagt noch sehr sehr wenig Ahnung davon. Deshalb bitte ich dich ausschließlich zielführende Antworten zu verfassen, oder es bleiben zu lassen. Danke.

    @SeppJ Ja eine while schleife ist so wie ich es verstanden habe, eine Schleife die solange läuft bis ein Abschlusskriterium erreicht ist. Das heißt sie läuft solange wie das Kriterium den Wert "true" hat ansonsten springt sie in die nächste Zeile und die Schleife wird beendet.
    Zu deinem Beispiel: Solange X als wahr gilt, wird die schleife wiederholt.


  • Mod

    Das mag jetzt kleinkariert erscheinen, ist aber wichtig:

    Eine Schleife die solange läuft bis ein Abschlusskriterium erreicht ist.

    Das heißt sie läuft solange wie das Kriterium den Wert "true" hat

    Was geschieht denn nun genau?

    while(X)
    {
       irgendwas;
    }
    

    X ist true, wie oft passiert irgendwas?
    X ist false, wie oft passiert irgendwas?

    Und die Bonusfrage: Was bedeutet das für dein Programm und dein Problem?



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    Deshalb bitte ich dich ausschließlich zielführende Antworten zu verfassen, oder es bleiben zu lassen. Danke.

    Und ab auf die Ignoreliste



  • @SeppJ
    Das heißt sie läuft mindestens ein einziges mal durch.
    x ist true es passiert mindestens einmal irgendwas und maximal x^n
    x ist false es passiert mindestens einmal irgendwas und dann ist die schleife beendet.

    Aber was das für mein Programm bedeutet, da bin ich wirklich überfragt. Ich stehe wie es scheint aufm Schlauch.

    @manni66 Falls ich dich gekränkt habe, war das nicht meine Absicht. Ich bin ein direkter Mensch und ich bin für eine offene und direkte Kommunikation, weil dadurch Probleme sofort kommuniziert werden können. Wenn du mit direkter Konfrontation in form von Kritik nicht umgehen kannst, bitte ich dich keine weiteren Kommentare hier zu Verfassen. Das schafft nur mehr Probleme und ich möchte Probleme lösen und nicht neue schaffen.



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    Es wäre Wünschenswert, wenn du mir zur Hilfe kommst anstatt passiv aggressive Fragen zu stellen.

    Die passive Aggressivität existiert nur in deiner Wahrnehmung. @SeppJ wollte dir helfen, indem er Fragen gestellt hat deren Antworten dich zur Ursache des Fehlers führen würden. Weil das der beste Weg ist Dinge zu lernen.



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    scanf("%d", &number);
    

    Hier liest du eine Zahl und speicherst sie in number.

    while(scanf("%d", &number) != 1) {
        scanf("%*s");
    }
    

    Hier liest du solange bis keine Zahl gelesen wurde.

    if(number == 0) {
        printf("%d\n", f1);
    }
    

    Wenn in number eine null steht gibts du f1 aus.

    if(number >= 0) {
       //printf("%d\n%d\n", f1, f2);
       while((f1+f2) < number) {
    

    Wenn number größer oder gleich null ist kommst du zur while Schleife.



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    Aber was das für mein Programm bedeutet, da bin ich wirklich überfragt. Ich stehe wie es scheint aufm Schlauch.

    int main () {
    int number;
    int f1 = 0;
    int f2 = 1;
    
    number = 1; // Ignorieren wir mal den ganzen scanf Teil - wenn du da 2x 1 Eingibst
                // hat number hier auf jeden Fall den Wert 1
    
    	if(number == 0) {
    		printf("%d\n", f1);
    	}
    	if(number >= 0) {
    		//printf("%d\n%d\n", f1, f2);
    		while((f1+f2) < number) { // <---------------
    

    Setze jetzt an der markierten Stelle die Werte ein die f1, f2 und number hier deiner Meinung nach haben - beim ersten mal wo das Programm an diese Stelle kommt (=vor dem ersten Schleifendurchlauf).
    Wie sieht diese Bedingung dann aus? Und ist sie erfüllt oder nicht?



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    @manni66 Falls ich dich gekränkt habe, war das nicht meine Absicht. Ich bin ein direkter Mensch und ich bin für eine offene und direkte Kommunikation, weil dadurch Probleme sofort kommuniziert werden können. Wenn du mit direkter Konfrontation in form von Kritik nicht umgehen kannst, bitte ich dich keine weiteren Kommentare hier zu Verfassen. Das schafft nur mehr Probleme und ich möchte Probleme lösen und nicht neue schaffen.

    Es geht nicht darum ob du jemanden gekränkt hast. Es geht darum dass du anscheinend recht leicht zu kränken bist - bzw. anderen "passive aggressivität" unterstellst die dir bloss helfen wollten.

    Wenn wir dir jetzt direkt sagen warum dein Programm nicht funktioniert, dann kannst du es verbessern und dann wird es funktionieren. Der Lerneffekt dabei ist aber sehr gering. Der Fehler ist auch ausreichend einfach dass du ihn - mit unserer Hilfe - selbst finden kannst. Das hat @SeppJ versucht. Deine Reaktion darauf war ... die eines Kindes das beleidigt ist weil ihm Dinge nicht mit dem Löffen reingefüttert werden.

    Nachdem du ja für offene Kommunikation bist, solltest du diese Kritik auch abkönnen.
    Da du aber gern offene Kommunikation hast, sage ich dir jetzt auch was ich mir sonst vernkiffen hätte: nämlich dass ich nicht glaube dass du diese Kritik gut aufnehmen wirst.



  • @jonesindiana sagte in Einlesen bis zur ersten gültigen Eingabe und dann soll das Programm starten:

    @SeppJ
    x ist false es passiert mindestens einmal irgendwas und dann ist die schleife beendet.

    Ne!



  • @hustbaer
    Es ging um Manni und nicht um Sepp.


Log in to reply