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



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



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


Anmelden zum Antworten