Probleme mit der Switch Anweisung



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main();
    int zeichen;
    
    switch ( zeichen )
    
        {
    
    case e :
    case E :printf("Englisch")
        break;
    case d :
    case D :printf("Deutsch")
            break;
    case f :
    case F :printf("Französisch")
            break;
        }}
    

    Musterklausur GI 13.06.2017 Seite 3 von 7 GI_Musterklausur_2017.doc Aufgabe 4 (Punktzahl: 10): Schreiben Sie ein Programm, das eine Fallunterscheidung macht, welcher Buchstabe in der Variablen zeichen abgespeichert ist. Abhängig vom Vari- ableninhalt soll eine Bildschirmausgabe erfolgen. Dabei sollen die folgenden Fälle unter- schieden werden.

    Mein Compiler streikt er sei irgendwas sei mit den klammern



  • Hi,

    es gehen 2 {-Klammern zu, aber nur 1 auf. Wenn du deinen Code richtig formatierst, fällt das auch schneller auf.
    Außerdem deklarierst du die main Funktion nur, definierst sie aber nirgends. Es sollte also eher

    int main ()
    {
        // hier kommt dein Code
        return 0;
    }
    

    heißen. Das löst zumindest dein Klammerproblem.

    Es wird danach weitere Fehlermeldungen geben, aber die zu beheben ist dann deine Aufgabe 😉



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main();
    {
    int zeichen;

    switch ( zeichen )
    
        case e :
        case E :printf("Englisch")
            break;
        case d :
        case D :printf("Deutsch")
            break;
        case f :
        case F :printf("Französisch")
            break;
        return 0;
    }
    

    Auch in dieser Form meldet er noch Expected identifier or (



  • Der Compiler sollte dir eigentlich auch sagen, in welcher Zeile der Fehler auftritt... Das hilft oft weiter.

    Es existieren keine Variablen mit den Namen e, E, d, D, f & F. Du fragst diese aber ab. Ist glaube ich nicht dein Ziel.

    Schau dir bitte nochmal Grundlagen an, z.B. welchen Datentyp man für Zeichen verwendet und wie man einzelne Zeichenliterale im Quellcode angibt.



  • Akay2113 schrieb:

    Auch in dieser Form meldet er noch Expected identifier or (

    Lies dir nochmal die Antwort von Boolshit durch, insbesondere den Satz beginnend mit "Außerdem deklarierst du".

    Und dann beim switch möchtest du auf Zeichen wie 'e' testen, nicht auf Variableninhalte wie e .

    Also: Sonderzeichen wie ; und ' sind wichtig.



  • Hallo Akay2113!

    Schau dir mal doch dieses Beispiel an:

    /* 
     * switchtest is free software: you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the
     * Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     * 
     * switchtest is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     * See the GNU General Public License for more details.
     * 
     * You should have received a copy of the GNU General Public License along
     * with this program.  If not, see <http://www.gnu.org/licenses/>.
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*Löscht den Tastaturpuffer um Fehler nach der Eingabe zu vermeiden*/
    void clpuf(void)
     {
     while (getc(stdin) != '\n')
        ;
     }
    
    int main()
    {
     char  zeichen = 'x'; /* mit Wert initialisieren der nicht in Liste ist */
    do
    switch(zeichen)
     {
      default:
    		printf("\nswitch-Test\n");
    		printf("Englisch......e/E\n");
    		printf("Deutsch.......d/D\n");
    		printf("Französisch...f/F\n");
            printf("Ende..........o/e\n");
    		printf("Ihre Wahl: \n");
            scanf("%c", &zeichen);
            clpuf();
    	if (zeichen == 'O') zeichen = 'o';
       	break; 	
    
      case 'e':
      case 'E':
            printf("\nGewählt %c\n", zeichen);
    		printf("Englisch\n");
           zeichen = 'x';
    	break;
     case 'd':
     case 'D':
            printf("\nGewählt %c\n", zeichen);
    		printf("Deutsch\n");
           zeichen = 'x';
        break;
    
     case 'f':
     case 'F':
            printf("\nGewählt %c\n", zeichen);
    		printf("Französisch\n");
    	   zeichen = 'x';	
        break;
     }while(zeichen != 'o');
    
    return EXIT_SUCCESS;
    }
    

    Hier könnte man noch einen Zähler einbauen, der die ungültigen Eingaben
    auflistet und nach einer bestimmten Anzahl von Fehleingaben das Programm
    abbricht.
    Wichtig ist, das du nach der erledigten case-Anweisung die Variable
    "zeichen" auf einen Wert höher als in der List vorhanden zurückstellst, damit
    das Ganze nicht in einer Schleife hängen bleibt.
    Bei Verwendung von getc anstatt scanf tritt übrigens das selbe Problem
    mit den übrig gebliebenen Zeichen im Tastaturpuffer auf.
    kopiere dir vorsichtshalber also die Funktion clpuf, um bei späteren
    Problemen darauf zurück greifen zu können.
    Sieh dir auf mal auch den Unterschied von getc zu fgetc an.

    By the way:

    Hier mal eine kleine Datei mit clpuf() und einen Ersatz für getch()
    den ich irgendwann mal im Netz gefunden habe, funzt auch unter gcc in Linux!

    #ifndef GETCH_H_INCLUDED
    #define GETCH_H_INCLUDED
    
    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
    
    int getch(){
        struct termios oldt, newt;
        int ch;
        tcgetattr( STDIN_FILENO, &oldt );
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt );
        ch = getchar();
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
        return ch;
    }
    
    void clpuf(void)
     {
     while (getc(stdin) != '\n')
        ;
     }
    
    #endif // GETCH_H_INCLUDED
    

Log in to reply