Student mit Anfängerproblemen / Hilfe bei Aufgaben



  • Hey,

    zunächst, ich weiß nicht ob Fragen nach Hilfe bei Aufgaben unseres Informatikpratikums hier erwünscht ist. Falls nicht, sorry, löscht den Thread, sagst mir und es ist gut.
    Ich frage nicht nach Lösungen zu den Aufgaben die wir im Informatik Praktikum bekommen haben, ich frage nur nach Hilfestellungen/Tipps.

    Kurze Frage vorweg: Die Console braucht immer um die 10 sek unter Vista zum öffnen. Gibts ne Möglichkeit das zu beschleunigen (am Sys solls nicht liegen).

    Nun zun den eig. Fragen:

    Bin im ersten Semester Mechatronik, hab Informatik Vorlesung & Info. Praktikum. Wir programmieren mit C - Visual Studio 6.0 (an der FH) / 2008 (daheim da Vista).

    Ich hab beim Thema programmieren komplett bei 0 angefangen - überhaupt keine Ahnung davon.

    Bis jetzt haben wir kennen gelernt:

    Variablen & Datentypen
    Entscheidungen (if-else, switch-case, goto)
    Schleifen (while, do-while, for, break, continue)
    "Alle Operatoren" (zum. das Skript haben wir erhalten)
    Zeichenketten, Arrays, Einführung in Zeiger (nur Skript - noch keine Vorlesung)

    Komme im Momemt bei den letzten zwei Praktikumsaufgaben nicht weiter::

    1. Text mit 5 Auswahlmöglichkeiten. Bei richtiger Wahl -> Bestätigung. Bei falscher Wahl -> Benachrichtigung + Aufforderung zur erneuten Wahl.

    Lösung: switch-case für die char-Eingabe, goto für falsche Eingabe
    Problem: es wird zweimal bei falscher Eingabe der default Befehl ausgegeben (Bild s.u.)

    Programm:

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
    
        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("%c", &X);
    
           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;
    }
    

    Problem:

    http://i36.tinypic.com/2nqfjgg.jpg

    So falls es ok ist und mir jemand helfen möchte werd ich später auch noch mein zweites Problem posten.

    Danke im Voraus,

    Gruß



  • ändere deine default-zeile in:

    default: goto marke;
    

    dann sollte es klappen.
    🙂



  • Hmm. Komisch.
    Bei mir:

    I:\dev\labor\testing>main.exe
    ********** Telefonverzeichnis **********
    
    E = Neuen Eintrag einfuegen
    L = Eintrag loeschen
    S = Telefonnummer suchen
    A = Alle Eintraege anzeigen
    B = Programm beenden
    
    Bitte waehlen Sie
    B
    Ihre Wahl: Programm beenden
    
    I:\dev\labor\testing>
    

    Gcc, Windows XP.
    Seltsam.



  • Ahh, X, nicht B. 🙄
    In dem Fall hat er natürlich recht.



  • fricky schrieb:

    dann sollte es klappen.

    Hehe.
    Bei mir klappts nicht.
    Also, im Zeifel auf die sichere Seite:

    printf("Bitte waehlen Sie\n");
        marke:
        fflush(stdin); // <--------
        scanf("%c", &X);
    

    🙂



  • ändere deine default-zeile in:

    default: goto marke;

    dann sollte es klappen.

    default muss auch printf ausgeben, gibts ne Möglichkeit das zu verbinden?



  • ray schrieb:

    ändere deine default-zeile in:

    default: goto marke;

    dann sollte es klappen.

    default muss auch printf ausgeben, gibts ne Möglichkeit das zu verbinden?

    klar ... aber wie wär's denn, wenn du jetzt einfach mal ein C-Tutorial machst, solange bis das C-Buch da ist, dass du dir jetzt sofort bestellen wirst.

    Hier der Tipp:

    default:
        printf("bla");
        goto marke;
    


  • klar ... aber wie wär's denn, wenn du jetzt einfach mal ein C-Tutorial machst, solange bis das C-Buch da ist, dass du dir jetzt sofort bestellen wirst.

    Heute ganz freundlich?

    Deinen Tip verstehe ich ehrlich gesagt nicht.
    Also nochmals mit Nachdruck:
    man: fflush





  • Xantus schrieb:

    klar ... aber wie wär's denn, wenn du jetzt einfach mal ein C-Tutorial machst, solange bis das C-Buch da ist, dass du dir jetzt sofort bestellen wirst.

    Hier der Tipp:

    default:
        printf("bla");
        goto marke;
    

    Ja dann nenn mir mal den Unterschied zw. meiner und deiner Version des default Befehls.

    Heute ganz freundlich?

    Is egal, des is normal dass es paar Leute gibt die sich besonders halten wenn sie auch mal was wissen ^^.

    Also nochmals mit Nachdruck:
    fflush

    Problem is, wir kennen fflush (noch) nicht müssen es aber lösen können. Wie wenn man in Mathe ne quad. Gleichung lösen muss und die Mitternachtsformel nicht kennt quasi ;).



  • Naja, hab schon öfter gelesen, daß das nasal deamon ist.
    Aber bis heute hat's halt immer geholfen, und ich weiß nix andres.

    Müßte man da zu Fuß den Puffer leeren?



  • Versuch mal:

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
        char[80] eingabe;        // <---- 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
        X = eingabe[0];            // <----- neu
    
           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;
    }
    


  • flamer schrieb:

    Aber bis heute hat's halt immer geholfen, und ich weiß nix andres.

    Es führt zu undefiniertem Verhalten, wie du sicher gelesen hast. Dass es sich wie erwartet verhalten hat ist entweder implementationsbedingt oder Zufall. Man sollte sich nicht drauf verlassen.

    Formatiertes *direktes* einlesen ist eigentlich nie sinnvoll, ganze Zeilen sind immer die bessere Alternative, aus denen man dann immer noch mit sscanf extrahieren kann.

    #define LINELEN 256
    char buf[LINELEN];
    /* ... */
    fgets(buf, LINELEN, stdin);
    sscanf(buf, "%c", &c);
    

    Das sollte dein fflush(stdin); Problem sauberer lösen. Nicht vergessen fgets auf NULL als return-Wert zu prüfen sowie den return-Wert von sscanf (in diesem Fall 1).
    Und eine do-while-Schleife sind zudem auch schöner aus eine goto-Lösung. Probier's aus. Und lass dir was sagen von jemandem, der auch mal was weiß 🙄 der sich im Gegensatz zu dir auch um Probleme kümmert und sich nicht um Arbeit mit der Ausrede "hatten" wir noch nicht gedrückt" drückt - hast du dich so auch durch deine Schulzeit geschlagen?



  • Öhm wann hab ich gesagt dass ich Informatik studier und warum der Unterton? Musste dick auftragen im Inet :P? Bis jetzt kam von allen außer dir was Hilfreiches.

    [quote=Belli]Versuch mal: [/quote]

    Edit: Ich tests nochmal 😉



  • Belli schrieb:

    Versuch mal:

    #include <stdio.h>
    
    int main () {
    
        char X, E, L, S, A, B;
        char[80] eingabe;        // <---- neu
    }
    

    Das muß natürlich:

    char eingabe[80];

    heißen!



  • ray schrieb:

    Öhm wann hab ich gesagt dass ich Informatik studier und warum der Unterton? Musste dick auftragen im Inet :P? Bis jetzt kam von allen außer dir was hilfreiches.

    Pardon, mein Fehler, ich meinte natürlich dein Praktikum.
    Und nein, ich muss nicht dick auftragen. Und wenn du eine saubere Lösung als nicht hilfreich erachtest, ist das dein Problem. Nur weil ich dir keinen ganzen Source gebe...tze... 😉



  • Jetzt kommt doch der gleiche Fehler nochmal:
    http://i38.tinypic.com/6pnk2h.jpg
    http://i38.tinypic.com/2b7b6x.jpg



  • Xantus schrieb:

    Pardon, mein Fehler, ich meinte natürlich dein Praktikum.
    Und nein, ich muss nicht dick auftragen. Und wenn du eine saubere Lösung als nicht hilfreich erachtest, ist das dein Problem. Nur weil ich dir keinen ganzen Source gebe...tze... 😉

    Joa dann denkste erstmal nach bevor du postest und liest wie du selbst in deiner sig geschrieben hast ge? Kann ja nicht jeder der krasse Coder sein wie du, vorallem würd ich ja sonst nicht hier posten.

    Ich hab nicht nach ner sauberen Lösung sondern nach ner Hilfe auf meinem Wissensstand gefragt - deine "saubere" Lösung ist nicht hilfreich was wohl offensichtlich ist. Aber glücklicherweise geben sich sonst alle bisschen mehr Mühe und helfen - ohne dick aufzutragen und sich großzutun ;).



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



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


Anmelden zum Antworten