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



  • @jonesindiana
    Ja. 🤦♂ Sorry, mein Fehler!

    Und bitte schau dir auch meine anderen Beiträge an. Damit solltest du zumindest die Frage beantworten können wie die Bedingung while((f1+f2) < number) beim 1. Mal aussieht.

    Dass eine while Schleife kein einziges Mal ausgeführt wird wenn die Bedingung gleich von Anfang an false hab ich ja schon geschrieben. Das ist aber auch OK, daran musst du nichts ändern. Probier auch mal was dein Programm für die Eingaben 5 und 6 eingibt.



  • @Belli Stimmt ups, da passiert dann garnix! aber die Schleife läuft trotzdem ein einziges mal durch oder nicht?

    @hustbaer
    Ich war und bin nicht gekränkt, ich sehe nur nicht wieso diese Frage weiterhelfen sollte. Ist es nicht egal wer den Code geschrieben hat? Solange ich den code einigermaßen verstehe oder eben auch nicht, spielt das "wer" keine Rolle. Oder übersehe ich da etwas? Ich bin offen für Kritik und bedanke mich für deine offene Kommunikation.

    Es kam dir vielleicht so vor, dass ich gekränkt war aber wirklich. War und bin ich nicht. Diese Frage ist für mich nur nicht zielführend. Ich bin froh, dass du mir offen und ehrlich sagst wie du das siehst, dann kann ich nämlich an meinem Verhalten arbeiten und mich weiter entwickeln. Nur so kann ich ein besserer Programmierer werden 😃

    zu deinem anderen Beitrag: Den schau ich mir nun an



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

    @hustbaer
    Ich war und bin nicht gekränkt, ich sehe nur nicht wieso diese Frage weiterhelfen sollte. Ist es nicht egal wer den Code geschrieben hat?

    OK. Zwei Dinge dazu.

    1. War mein Fehler, ich dachte das war auf die Frage von @SeppJ bezogen. Weil ich wieder mal nicht aufmerksam genug gelesen habe. Wie gesagt, sorry!

    2. Wer den Code geschrieben hat ist nicht ganz egal. Wenn du den Code selbst geschrieben hast, dann musst du notwendigerweise irgend eine Vorstellung davon haben was er deiner Meinung nach tun sollte. Du musst ja irgend einen Plan gehabt haben. Wenn du uns das Beschreibst, dann können wir dir sagen wo genau dein Denkfehler liegt. Wenn du den Code dagegen nicht selbst geschrieben hast, dann ist es möglich dass du überhaupt keine Vorstellung davon hast was er evtl. tun sollte/könnte. Wenn du dir das dann aber überlegst und uns dann auch beschreiben kannst, dann reicht das auch. In dem Fall ist es dann also wirklich egal.


  • Mod

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

    Ist es nicht egal wer den Code geschrieben hat? Solange ich den code einigermaßen verstehe oder eben auch nicht, spielt das "wer" keine Rolle. Oder übersehe ich da etwas? Ich bin offen für Kritik und bedanke mich für deine offene Kommunikation.

    Was manni meinte ist andersrum: Wenn das dein Code ist, dann musst du ihn 100% verstehen. Ein Computer nimmt alles, was man ihm sagt, ganz genau wortwörtlich. Darum darf man beim Programmieren nicht herumraten und hoffen, dass das schon einigermaßen passt. Es wird nie passen. Daher ist es natürlich ganz essentiell, dass du solche Dinge verstehst, wie zum Beispiel eine while-Schleife genau funktioniert. Oder wenn du es nicht weißt, dann musst du wenigstens genau erklären können, was du denkst, was es tut, damit man eventuelle Falschvorstellungen korrigieren kann. Hat ja auch ganz ok geklappt in diesem Thread; am Ende konnten wir dir ja entlocken, was du denkst, was while tut, und dich aufklären.

    Uraltes Zitat hier aus dem Forum, das heute genauso gilt wie zu der Zeit als es geschrieben wurde:
    @c-rackwitz sagte in RTFM! oder warum dir keiner helfen will...:

    Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.



  • @hustbaer
    Kein ding! jeder macht mal Fehler, wie man sieht ich ja eben auch. Dann habe ich das ganze wirklich falsch verstanden und muss mich bei @manni66 entschuldigen. Dann habe ich mich wirklich wie ein Kind verhalten und das ist einfach unnötig und absolut garnicht zielführend. Danke für die nette Richtigstellung ohne gezanke, das respektiere ich sehr.

    Zu deinem anderen Beitrag:
    Wie schon oben erwähnt, alle anderen eingaben Funktionieren genau so wie es gewünscht ist. Das heisst bei
    Eingabe = 0 Ausgabe = 0
    Eingabe = 1 Ausgabe = 0 1 1 --> !
    Eingabe = 5 Ausgabe = 0 1 1 2 3 5
    Eingabe = 6 Ausgabe = 0 1 1 2 3 5

    und genau so soll es auch laufen. Nur die 1 ist mein Problem.
    Also wenn ich 1 eingebe ist das ja dann False aber wie komme ich dann dazu, dass 1 true ist und nur ganzzahlen eingelesen werden können 🤔

    Also die Bedingung für die eingesetzten Werte von f1 f2 und number wären ja ((0+1) < 1) also ist die Bedingung nicht erfüllt. Da 1 nicht kleiner als 1 ist.

    @SeppJ Da hast du recht, ich verstehe dann wohl nicht alles zu 100% sonst hätte ich den Fehler bereits entdeckt. Ich komme wirklich nicht drauf.. wie eben Erwähnt, muss ich meine Aussage wohl revidieren und entschuldigen. Habe ihm eine Nachricht schicken wollen aber dazu keine Berechtigung, möchte das nicht so stehen lassen auch wenn er/sie ein Stranger für mich ist. Vielleicht sieht er es ja hier.


  • Mod

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

    Wie schon oben erwähnt, alle anderen eingaben Funktionieren genau so wie es gewünscht ist. Das heisst bei
    Eingabe = 0 Ausgabe = 0
    Eingabe = 1 Ausgabe = 0 1 1 --> !
    Eingabe = 5 Ausgabe = 0 1 1 2 3 5
    Eingabe = 6 Ausgabe = 0 1 1 2 3 5

    und genau so soll es auch laufen. Nur die 1 ist mein Problem.

    Hast du das überhaupt mal getestet? Bei 5 gibt dein Programm 0 1 1 2 3 aus, nicht 0 1 1 2 3 5.



  • @SeppJ Ups das war mein Fehler, ich habe die 5 ausversehen rein geschrieben, sorry!


  • Mod

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

    @SeppJ Ups das war mein Fehler, ich habe die 5 ausversehen rein geschrieben, sorry!

    Dann ist jetzt halt die Frage: Willst du Zahlen "bis" oder "bis einschließlich" deiner Obergrenze ausgeben? Und weitergehend, wie man diese Bedingung im Code formuliert.



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


Anmelden zum Antworten