Finde den fehler in switch anweisung nicht



  • Verstehe.

    Mit bedingt meinte ich: abhängig von einer if-Verzweigung.
    Aber daran liegt's nicht, weil ohnehin ein break am Ende von case 'M' ist.

    So wie du das beschreibt, denke ich, daß du jedes break; abgesehen vom letzten ersetzen solltest durch goto default;.

    Ach ja:
    Lies beizeiten mal man: indent.



  • TurboELK schrieb:

    printf("\nBitte Matrix A zeilenweise von links nach rechts eingeben");
    	  printf("\nJede eingabe mit 'Enter' bestaetigen");
    	        for (i=0;i<(sa*za);i++){
    				 h=scanf("%f",&A[i]);
    				 fflush(stdin);
    				 
    				 if(A[i]>100 || A[i]<-100 || h==0){
    			       break;		
    				}
    				 
    			}
    

    Das break; springt aus der for Schleife raus, nicht mehr, nicht weniger. Ich schätze mal, dass das dein Problem ist, soweit ich das vom Überfliegen deines Textes ohne den Code unten gelesen zu haben gesehen habe. Ich denke, du versuchst aus dem case rauszuspringen mit dem break, aber das break bezieht sich nur auf die for-Schleife.



  • Vielen Dank, es funktioniert! mit goto, ABER es ist unschön hab ich gelesen.

    feigling hat ins schwarz getroffen ^^...

    Irgendetwas habe ich jedoch mit break nicht verstanden scheinbar.

    warum schmeißt mich das erste break aus dem case und das zweite nicht????

    printf("Bitte Spaltenanzahl von Matrix B eingeben");
          scanf("%i",&sb);
    	    if(sb>5 || sb<0 ){
           break;
    	  }
    	  printf("\nBitte Matrix A zeilenweise von links nach rechts eingeben");
    	  printf("\nJede eingabe mit 'Enter' bestaetigen");
    
    	        while (i<(sa*za)&& h!=2){
    				 h=scanf("%f",&A[i]);
    				 fflush(stdin);
    
    				 if(A[i]>100 || A[i]<-100 || h==0){
    			     h=2;	
    				}
    				i++;
    			}
    			if (h==2){
    				break;
    			}
    


  • Ich denke, du versuchst aus dem case rauszuspringen mit dem break, aber das break bezieht sich nur auf die for-Schleife.

    Zum Beispiel in Zeile 37 (oben).

    Aber das in Zeile 18 (oben) springt aus dem switch hinaus.

    mit goto, ABER es ist unschön hab ich gelesen.

    In einem switch ist es halb so schlimm, weil die Sprungumgebung
    gut abgegrenzt ist.
    Man sollte es aber trotzdem nicht übertreiben.

    Irgendetwas habe ich jedoch mit break nicht verstanden scheinbar.

    Ganz einfach: break springt aus dem übergeordneten switch, oder aus Schleifen.



  • Vielen Dank noch mal für die Mühe es mir klar zu machen, aber noch eben ein Versuch das zu erklähren worauf ich hinaus wolle:

    Ich erkenne eine Unstimmigkeit:

    Wenn break nur aus Schleifen springt: Warum springt break dann aus meinem modifizierten code aus dem letzen Beispiel in Zeile 4 aus dem case und fährt mit dem default fall fort? - er müsste doch wenn er nur aus der schleife springt mit zeile 6 fortfahren.

    Selbst wenn er, falls nach der schleife nur noch der case da ist, aus dem case springen sollte... warum springt er dann in zeile 19 nicht aus dem case, sondern fährt fort?

    Ich sehe keinen unterschied... beide male nur eine if anweisung quasi "vor" dem case



  • Wenn break nur aus Schleifen springt: Warum springt break dann aus meinem modifizierten code aus dem letzen Beispiel in Zeile 4 aus dem case und fährt mit dem default fall fort?

    Das sollte nicht so sein.
    Wenn in einem switch ein break kommt, dann springt es aus ans Ende
    der switch-Anweisung und macht dort weiter.

    Innerhalb des switches sind die cases nichts weiter als gewöhnliche
    Sprungmarken, und keine Blöcke, d.h. man kann gar nicht aus einem case rausspringen.

    ch sehe keinen unterschied... beide male nur eine if anweisung quasi "vor" dem case

    if ist egal. Relevant für break sind: while, for, do-while und switch.

    Ich seh' aber auch gerade den Fehler nicht.
    Da erkennt man schon, warum Sprunganweisungen so verschrien sind.
    Wenn man (so wie du) nicht ganz sauber einrückt, hat man's noch
    viel schwieriger.

    Poste doch einfach ein reduziertes Beispiel mit einem kompletten switch,
    dann werde ich mich schon zurechtfinden.



  • Ha --- ich hab ihn!!!.. der Lutscher!!! 😉

    naja bzw. wohl eher ich. Er springt aus dem switch raus,geht wegen while direkt wieder rein und überspringt mein scanf einfach-- daher tritt default fall ein..

    Danke



  • Warum nicht so?

    Matrizenmulti()
    {
        int sa, za, sb;
        int i;
        int h;
        do
        {
            printf("Bitte Spaltenanzahl ( max > 5 ) von Matrix A eingeben");
            scanf("%i",&sa);
        }
        while (sa>5 || sa<0 );
        do
        {
            printf("Bitte Zeilenanzahl ( max > 5 ) von Matrix A eingeben");
            scanf("%i",&za);
        }
        while (za>5 || za<0 );
        do
        {
            printf("Bitte Spaltenanzahl ( max > 5 ) von Matrix B eingeben");
            scanf("%i",&sb);
        }
        while (sb>5 || sb<0 );
        printf("\nBitte Matrix A zeilenweise von links nach rechts eingeben");
        printf("\nJede eingabe mit 'Enter' bestaetigen");
        for (i=0;i<(sa*za);i++)
        {
            do
            {
                h=scanf("%f",&A[i]);
                fflush(stdin);
            }
            while (A[i]>100 || A[i]<-100 || h==0);
    
        }
        printf("\nBitte Matrix B zeilenweise von links nach rechts eingeben");
        printf("\nJede eingabe mit 'Enter' bestaetigen");
        for (i=0;i<(za*sb);i++)
        {
            do
            {
                scanf("%f",&B[i]);
                fflush(stdin);
            }
            while (B[i]>100 || B[i]<-100);
        }
        clrscr();
        Matr_C(pc,pa,pb,sa,sb);
        Matr_Ausgabe (za, sb, pc);
        fflush(stdin);
        printf("\n\n\t'Enter' Druecken um zum Hauptmenue zu gelangen");
        getchar();
        clrscr();
    }
    
    int Menu()//stan**** Menü
    {
        char Taste;
        int quitmark;
        do
        {
            clrscr();
            printf("\n\n");
            printf("\t *_*_*_*_* Willkommen im Matrizenmultiplikationsprogramm *_*_*_*_* \n\n");
            printf("\t Bitte druecken Sie\n");
            printf("\t (m) um zwei Matrizen A und B miteinander zu Multiplizieren\n");
            printf("\t (b) um zu Beenden\n");
    
            scanf("%c", &Taste);
            fflush(stdin);
            switch (Taste) //Fallunterscheidung, je nach eingabe
            {
            case'm':
            case'M':
                Matrizenmulti();
                break;
            case'b':
            case'B':
                quitmark = 1;
                break;
            default:
            {
                clrscr();
                printf("\n\n\tSie haben eine Fehleingabe getaetigt:");
                printf("\n\n\t'Enter' Druecken um zum Hauptmenue zu gelangen");
                getchar();
            }
            }
    
        }
        while (quitmark==1);
    }
    

    Da kannst du sicher auch noch einiges optimieren.
    Einiges musst du sogar ergänzen und eventuell ändern⚠

    Aber die Fehler werden schon mal näher bei der Eingabe abgefangen.

    Und diese vielen break sind nun auch weniger 😃
    Und der Tip goto, musste das hier sein 😕

    MfG f.-th.



  • Und der Tip goto, musste das hier sein 😕

    Ja.



  • hey cool, danke


Anmelden zum Antworten