Student mit Anfängerproblemen / Hilfe bei Aufgaben



  • ray schrieb:

    Das kann nicht sein!!!

    ... joa das ist mir auch aufgefallen. Was aber Fakt ist, ist dass ich keine Ahnung hab, wie ichs in Griff bekomm.

    Das einzige Problem ist, dass mir der default Befehl bei falscher Eingabe zweimal Ausgegeben wird - sonst nichts. Ich kann mir wirklich nicht vorstellen, dass ich um das zu fixen mehr lernen muss als im Skript steht, wirklich nicht.

    Ach, es gibt mehr unfähige Lehrer und Praktikumsleiter, als du dir vorstellen kannst.
    Machs mit fgets in Verbindung mit sscanf - Code siehe oben 😉 und die Fehlerausgabe sollte nur noch einmal erscheinen.

    Aber hier nochmal:

    char buf[80];
    fgets(buf, 80, stdin);
    sscanf(buf, "%c", &X);
    

    sscanf gehört zur selben Familie wie scanf, nur dass es eben nicht von stdin liest, sondern aus einem string.



  • Tim schrieb:

    Ganz wilde Spekulation, aber ich glaube du benutzt die Variable X ohne sie vorher zu initialisieren.

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂



  • ~fricky schrieb:

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂

    Das war das Problem, ich hab eingabe anstelle von x in scanf stehn gehabt. Habs gefixed, jedoch mit dem selben Ergebnis wie zu Beginn, doppelte default Ausgabe.

    Xantus schrieb:

    ...

    Dann werd ichs mal doch so machen - auch wenn ich nicht so weiß was ich da mach 😃 - bin mal gespannt was der Dozent dazu und zu der Aufgabe ansich sagt, wenn ich ihn frag wie denn seine Lösung lautet.



  • du könntest auch folgendes tun:
    1. nimm dein original-progrämmchen (das vom ersten beitrag)
    2. tausch deine 'scanf'-zeile gegen diese zeile:

    do scanf ("%c", &X); while (X == '\n');
    

    3. ausprobieren...
    🙂



  • Yeah ne do while schleife und ich hab mir die ganze Zeit überlegt wie ich sie einbaun könnt! Danke dir, ich machs mal.

    Und siehe da, es funzt, ein riesen Dank an dich.



  • [quote="ray"]

    ~fricky schrieb:

    er macht scanf ("%c", ... , dann ist nix zufälliges mehr drin.
    und Bellis code setzt sie auf eingabe[0] .
    🙂

    Das war das Problem, ich hab eingabe anstelle von x in scanf stehn gehabt. Habs gefixed, jedoch mit dem selben Ergebnis wie zu Beginn, doppelte default Ausgabe.

    Dann hast Du sicher nicht den Parameter von %c auf %s geändert.

    Frickys Lösung funktioniert, solange Du nicht mehr als eine Stelle eingibst, zB dürfte die Eingabe von XB eine falsche Reaktion auslösen.
    Um das ganz sicher zu machen, müsstest Du einmal nach X einlesen, und dann in einer Schleife bis '\n' in einen Dummy-char.



  • XB soll ja im Prinzip eine falsche Eingabe sein. Von daher bin ich damit schon recht zufrieden, dennoch vielen Dank für alle Lösungen, ich werd mal weiterhin an ner Kopie bisschen dran rumspielen, um die Sachen zu verwirklichen die du und andere genannt haben.

    Dickes Danke nochmal, werd bestimmt mal wieder posten (hätt im Prinzip ne neue Aufgabe - aber will auch nich nerven und fang nochmal an des Skript zunächst zu studieren 😉 ).



  • Wenn ich mich nicht irre, wird Frickys Lösung aber nicht als falsche Eingabe erkannt, sondern eine falsche Reaktion auslösen, nämlich die Reaktion auf eine Eingabe B.
    Wenn Du das nicht willst, aber die Eingabe trotzdem als falsch behandeln willst, wird es aufwendiger.
    Du müsstest dann doch entweder zu meinem Vorschlag zurückkehren, oder einem anderen, der eine ganze Zeile einliest, die Länge der Eingabe prüfen (ungleich 1 --> falsche Eingabe), und erst, wenn Du verifiziert hast, daß nur ein Zeichen eingegeben wurde, weiter wie gehabt.



  • Kauderwelsch - nochmal deutlich:
    Eingabe von XB wird bei Frickys Lösung eine falsche Reaktion auslösen, probier es einfach aus.



  • Stimmt habs grad getestet.



  • Also dann so: (Diesmal hab ich's selbst getestet :-))

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
        char eingabe[80];        // <---- neu
    
        printf("********** Telefonverzeichnis **********\n\n");
        printf("E = Neuen Eintrag einfuegen\n");
        printf("L = Eintrag loeschen\n");
        printf("S = Telefonnummer suchen\n");
        printf("A = Alle Eintraege anzeigen\n");
        printf("B = Programm beenden\n\n\n");
    
        printf("Bitte waehlen Sie\n");
        marke:
        scanf("%s", &eingabe);     // <----- geändert BITTE %s STATT %c BEACHTEN
        X = eingabe[0];            // <----- neu
        if(strlen(eingabe) != 1)
           X = 'X';                // <----- Stringlänge ungleich 1, Fehler provozieren
    
           switch (X) {
    
            case ('E'): printf("Ihre Wahl: Neuen Eintrag einfuegen\n");
                break;
            case ('L'): printf("Ihre Wahl: Eintrag loeschen\n");
                break;
            case ('S'): printf("Ihre Wahl: Telefonnummer suchen\n");
                break;
            case ('A'): printf("Ihre Wahl: Alle Eintraege anzeigen\n");
                break;
            case ('B'): printf("Ihre Wahl: Programm beenden\n");
                break;
            default: {printf("Eingabe nicht korrekt. Ihre Wahl:\n"); goto marke;}
                break;
    
        }
        printf("\n");
        return 0;
    }
    


  • Ich post doch nochma schnell mit der mmN besten Lösung, die ich einem C++ Tutorial entnommen hab, das ich mir immo nebenher geb.

    Wie wir sehen, kommen wir gar nicht zum Eingeben eines zweiten Zeichens. Der Tastaturpuffer wird bei der ersten Eingabe mit zwei Zeichen gefüllt, a und ENTER. Das Zeichen ENTER wird mit ASCII-Code 10 (Line Feed lf) wiedergegeben. Um das Problem zu umgehen, ist es möglich die Eingabe ENTER in einer zweiten Variable abzufangen, sodass der Tastaturpuffer geleert wird.

    http://www.c-howto.de/tutorial-benutzerinteraktion-tastatureingaben.html

    Programmcode demnach:

    #include <stdio.h>
    
    void main () {
    
        char x, temp;
    
        printf("********** Telefonverzeichnis **********\n\n");
        printf("E = Neuen Eintrag einfuegen\n");
        printf("L = Eintrag loeschen\n");
        printf("S = Telefonnummer suchen\n");
        printf("A = Alle Eintraege anzeigen\n");
        printf("B = Programm beenden\n\n\n");
    
        printf("Bitte waehlen Sie\n");
    
        do {        
    
           scanf("%c%c", &x, &temp);
    
           switch (x) {
    
            case ('E'): printf("Ihre Wahl: Neuen Eintrag einfuegen\n");
                break;
            case ('L'): printf("Ihre Wahl: Eintrag loeschen\n");
                break;
            case ('S'): printf("Ihre Wahl: Telefonnummer suchen\n");
                break;
            case ('A'): printf("Ihre Wahl: Alle Eintraege anzeigen\n");
                break;
            case ('B'): printf("Ihre Wahl: Programm beenden\n");
                break;
            default: printf("Eingabe nicht korrekt. Ihre Wahl:\n"); 
                break;
    
        }
        }
    
        while (x != 'E' && x != 'L' && x != 'S' && x != 'A' && x != 'B');
        printf("\n");
    }
    

    Wirklich die beste Lösung da nichts neues gelernt wird und es nichtmal ne Zeile Code in Anspruch nimmt.

    Danke an alle anderen Lösungsvorschläge,

    Grüße



  • Super. Gib mal ABC (oder ähnlich, mehrere Zeichen) ein.



  • Joa aber das wird mal absolut nicht erwartet, das zu fixen. Es ist der erste Monat im ersten Semester im Fach Informatik, also locker bleiben 🙂


Anmelden zum Antworten