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



  • @SeppJ Zahlen bis einschließlich meiner Obergrenze. Bsp.:

    Ich gebe 23 ein und als letzte Zahl kommt 21 raus, wenn ich 21 eingebe, ist die höchste Zahl ebenfalls 21.



  • Hier:

    #include <stdio.h>
    
    int main() {
        int number;
        int f1 = 0;
        int f2 = 1;
    
        puts("Endzahl eingeben");
        while (scanf("%d", &number) != 1) {
            scanf("%*s");
        }
    
        puts("Fibonacci");
        while (f1 <= number) {
            printf("%d ", f1);
    
            int sum = f1 + f2;
            f1 = f2;
            f2 = sum;
        }
        puts("");
    }
    

    Kein einziges if wird benötigt.


  • Mod

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

    @SeppJ Zahlen bis einschließlich meiner Obergrenze. Bsp.:

    Ich gebe 23 ein und als letzte Zahl kommt 21 raus, wenn ich 21 eingebe, ist die höchste Zahl ebenfalls 21.

    Letzteres ist ja derzeit nicht der Fall, wie du an der 5 gesehen hast, und auch an der 21 leicht ausprobieren kannst. Denn deine Annahme zur while-Schleife, dass sie noch einmal läuft wenn die Bedingung false wird, waren schließlich nicht korrekt.

    Abgesehen vom eigentlichen Problem mit der while-Schleife, das nun ja klar sein sollte (Du kommst zurecht mit den Hinweisen?) solltest du nochmal deine Testmethoden hinterfragen. Schließlich hast du hier gleich mehrmals behauptet, dass dein Programm für alle Zahlen über 1 funktioniert, und insbesondere die 5 und 21 benannt, für die es aber objektiv nicht wie gewünscht funktioniert. Gutes Testen/Ausprobieren ist auch so ein Geheimtipp, den man als Anfänger unterschätzt: Hättest du das mit der 5 und der 21 beim Testen bemerkt, hättest du einen guten Hinweis auf das eigentliche Problem gehabt. Stattdessen hast du dich auf die 1 versteift, die eigentlich gar nichts besonderes ist.



  • Ich habe noch einmal etwas gegoogelt und bin auf die Lösung gekommen.
    Um bis einschließlich der Obergrenze die Werte auszugeben habe ich in der while schleife das < zeichen zu einem <= geändert.

    Um die 1 auch als wahren wert anzusehen habe ich jetzt in der oberen while schleife folgendes geschrieben:

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

    Ich habe mittlerweile viele verschiedenste Möglichkeiten ausprobiert und es hat die gewünschten Ergebnisse erzielt.

    Ich bedanke mich bei allen die mir auf meinem Weg zur Lösung geholfen haben und wünsche euch noch einen schönen Tag!

    Mein Code sieht wie folgt aus:

    #include <stdio.h>

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

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

    }



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

    Um die 1 auch als wahren wert anzusehen habe ich jetzt in der oberen while schleife folgendes geschrieben:
    while(!scanf("%d", &number)) {
    scanf("%*s");
    }

    Da entsteht das Problem aber nicht.
    Der Rückgabewert von scanf (auf den sich das != 1 bzw jetzt das ! bezieht) ist etwas ganz anderes als der Inhalt von number.



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

    Um bis einschließlich der Obergrenze die Werte auszugeben habe ich in der while schleife das < zeichen zu einem <= geändert.

    Bingo! 👍

    Und nimm dir zu Herzen was @SeppJ geschrieben hat:

    (...) solltest du nochmal deine Testmethoden hinterfragen. Schließlich hast du hier gleich mehrmals behauptet, dass dein Programm für alle Zahlen über 1 funktioniert, und insbesondere die 5 und 21 benannt, für die es aber objektiv nicht wie gewünscht funktioniert. (...)

    Speziell wenn dir jemand empfielt mal bestimmte Eingaben auszurpobieren. Den Tip mal 5 und 6 zu probieren hab ich schliesslich nicht ohne Grund geschrieben 😉 Und generell macht es natürlich Sinn auch von selbst verschiedene "edge cases" bzw. "corner cases" auszuprobieren.
    4, 5 und 6 wären hier so "edge cases" - sie liegen auf bzw. um die Grenze herum wo sich irgendwas ändern sollte.



  • @jonesindiana
    Bitte schau dir auch an wie man in Markdown (=was das Forum hier verwendet zum Formatieren von Beiträgen) formatiert, speziell Code.

    https://www.markdownguide.org/basic-syntax/#code-blocks
    https://www.markdownguide.org/extended-syntax/#fenced-code-blocks
    und
    https://www.markdownguide.org/basic-syntax/#code



  • @hustbaer Ich habe beide Werte also 5 und 6 ausprobiert und sie haben mir die gewünschten Ergebnisse ausgegeben, Vorher schon, also schon bevor ich hier rein geschrieben habe und nach Hilfe gefragt habe. Deshalb habe ich das ja auch betont, dass ich nur bei der 1 Probleme hatte. Ich verstehe jetzt nicht ganz was du meinst 🤔

    Danke für die Infos, das werde ich safe machen ☺

    @DirkB Könntest du mir das noch einmal erklären? Ich verstehe nicht ganz was du meinst. 😕



  • @jonesindiana
    Dein Programm hat bei 5 die Folge 0 1 1 2 3 ausgegeben.
    Du hast aber geschrieben es würde die Folge 0 1 1 2 3 5 ausgeben.
    Das meinte ich.



  • @jonesindiana

    int result = scanf("%d", &number);

    result gibt an, wieviel Daten erfolgreich gelesen wurden.
    Du hast einen Formatspecifier, also kann auch nur einer gelesen werden.
    1 bedeutet, dass in number eine Zahl abgelegt wurde.
    0 bedeutet hier, dass ein Fehler auftrat (keine Ziffern im Eingabestrom)
    Es kann aber auch der Zustand EOF zurück gegeben werden.
    Der Wert davon ist auch ungleich Null.


Log in to reply