Fehlerkorrektur in einer switch anweisung...need help



  • hallo
    ich habe ein kleines problem
    wir haben ein programm geschrieben zur matrizenmanipulation
    über ein menü wählt man die gewünschte aufgabe
    nun will ich in das menü bei den jeweiligen rechnungen eine fehlerabfrage mit reinbastelt(da man bei den rechnungen immer auf die dimensionen der matrizen achten muss)
    ich will es so machen das falls ein fehler aufgetreten ist man eine meldung bekommt und dann wieder mit der eingabe der rechnung von vorne beginnt
    nur weis ich nicht genau wie ich das anstellen soll

    hier mal die switch anweisung

    int wahl=1;
    int fehler;
    
    while(wahl != 0)
    {
    wahl=menue();                                  //Menü aufruf
    
    switch(wahl)
         {
    case 1:
    {
    P_matrix<double> m1,m2,erg;
    
    cout<<"Matrizenaddition:"<<endl<<endl;
    
    cout<<"Sie können die Werte pro Zeile direkt nacheinander durch Leerzeichen oder Tab getrennt eingeben"<<endl;
    cout<<"Wenn Sie fertig mit der eingabe sind drücken Sie einfach Enter ohne neue Werte einzugeben"<<endl<<endl;
    
    cout<<"Bitte geben Sie die erste Matrix ein"<<endl<<endl;
    
    eingabe(m1,fehler);
    
    cout<<m1<<endl;            
    
    cout<<"Bitte geben Sie die zweite Matrix ein,welche mit der ersten Matrix addiert werden soll"<<endl;
    
    eingabe(m2,fehler);
    
    if(m1.get_spalten() != m2.get_spalten()  || m1.get_zeilen() != m2.get_zeilen() )
    {
    cout<<"Die beiden Matrizen müssen für diese rechnung das selbe format haben!Bitte wiederholen Sie ihre eingabe"<<endl;
    
    }
    else
    {
    cout<<"das Ergebniss der Addition lautet :"<<endl;  
    erg = m1+m2;                     
    cout<<erg<<endl;
    }   
    }                                   
    break;
    
    case 2:
    {   
    P_matrix<double> m1,m2,erg; 
    
    cout<<"Matrizenmultiplikation:"<<endl<<endl;
    
    cout<<"Sie können die Werte pro Zeile direkt nacheinander durch Leerzeichen oder Tab getrennt eingeben"<<endl;
    cout<<"Wenn Sie fertig mit der eingabe sind drücken Sie einfach Enter ohne neue Werte einzugeben"<<endl<<endl;
    
    cout<<"Bitte geben Sie die erste Matrix ein"<<endl<<endl;
    
    eingabe(m1,fehler);
    
    cout<<"Bitte geben Sie die zweite Matrix ein,welche mit der ersten Matrix multipliziert werden soll"<<endl;
    
    eingabe(m2,fehler);
    
    cout<<"das Ergebniss der Multiplikation lautet :"<<endl; 
    
    erg = m1*m2;
    
    cout<<erg<<endl;
    }              
    break; 
    
    case 3:
    {
    P_matrix<double> m,v,erg; 
    
    cout<<"Matrizenmultiplikation mit einem Vektor:"<<endl<<endl;
    
    cout<<"Sie können die Werte pro Zeile direkt nacheinander durch Leerzeichen oder Tab getrennt eingeben"<<endl;
    cout<<"Wenn Sie fertig mit der eingabe sind drücken Sie einfach Enter ohne neue Werte einzugeben"<<endl<<endl; 
    
    cout<<"Bitte geben Sie die erste Matrix ein"<<endl<<endl;
    
    eingabe(m,fehler);
    
    cout<<"Bitte geben Sie den Vektor ein mit welchem mit die Matrix multipliziert werden soll"<<endl;
    cout<<"Geben Sie der werte entweder per leerzeichen oder Tab getrennt ein oder Zeilenweise mit Enter getrennt"<<endl;
    
    eingabevect(v);
    
    cout<<"Das Ergebniss der Multiplikation mit dem Vektor lautet :"<<endl; 
    
    erg = m*v;
    
    cout<<erg<<endl;
    }                                             
    break;
    
                        case 4:
    {                   P_matrix<double> m1,m2;
    
                        cout<<"test"<<endl;
    
                        cout<<m1.get_zeilen()<<endl;
                        m1>>nz;
                          cout<<m1.get_zeilen()<<endl;
                          m1.zeile_entfernen();
                           cout<<m1.get_zeilen()<<endl;                   
                          }                  
                             break; 
    
                        case 5:
                             break;
    
    case 6:
    {
    P_matrix<double> m;
    
    cout<<"Determinantenberechnung:"<<endl<<endl;
    
    cout<<"Sie können die Werte pro Zeile direkt nacheinander durch Leerzeichen oder Tab getrennt eingeben"<<endl;
    cout<<"Wenn Sie fertig mit der eingabe sind drücken Sie einfach Enter ohne neue Werte einzugeben"<<endl;
    cout<<"Achten Sie darauf das die Determinante nur für eine n x n Matrix berechnet werden kann!"<<endl<<endl;
    
    cout<<"Bitte geben Sie die Matrix ein"<<endl<<endl;
    
    eingabe(m,fehler);
    
    m.set_determinante();
    
    cout<<"Die Determinante lautet: "<<m.get_determinante()<<endl;
    }
    break;
    
    default:
    cout<<"Bitte geben sie eine gültige Auswahl ein!"<<endl<<endl;
    ; 
         }
    }
    

    hat wer ne idee wie ich dann sofort wieder in die switch anweisung reinkomme
    P.S. in case 1 is schon ein ansatz

    mfg



  • 1. dass kannst du mit exceptions regeln. google stichwort: "c++ exceptions"
    2. vllt wäre es sinnvoll(wegen der übersichtlichkeit) die case statements nochmal in Funktionen auszulagern (ist aber geschmacksache)
    3. garantiert wäre es sinnvoll dir einen guten Formatierungsstil angewöhnen. Wenn du das in einem halben jahr nochmal raushohlst, fragst du dich vllt. sowiso was du dir da im einzelnen gedacht hast und ein "zero-einrück" look ist da nicht förderlich 😉



  • Quelltext aufräumen. Die Einrückungen sind grauenvoll. Die einzelnen Rechenarten kannst du der Übersichtlichkeit halber besser in seperate Funktionen packen.

    Da das Programm oder Teile davon (wenn ich es richtig verstanden habe) wiederholt werden, bieten sich hier Schleifen an.

    Pseudo (ungetestet)

    enum Auswahl { Addition, Multiplikation };
        // Enums erhöhen die Lesbarkeit deutlich gegenüber "magic-numbers"
    
    bool ausfuehren = true;
    do {
    
        // ... Programm/Programmteil ausführen, solange Bedingung erfüllt,
        //  mindestens jedoch ein mal (fußgesteuert).
    
        Auswahl auswahl = hauptMenue();
    
        switch(auswahl) {
        case Addition:
            additionsUnterprogramm();
                // ggf. mit Rückgabewerten arbeiten oder Exceptions
            break;
        case Subtraktion:
            multiplikationsUnterprogramm();
            break;
        }
    
    } while(ausfuehren);
    

    Grüße... Heiko



  • bwbg schrieb:

    Quelltext aufräumen. Die Einrückungen sind grauenvoll. Die einzelnen Rechenarten kannst du der Übersichtlichkeit halber besser in seperate Funktionen packen.

    hab ich doch gesagt *posts über die 100 drück* 😉



  • eigentlich arbeite ich auch mit einrücken...nur das mach ich immer wenn ich dann mit allem fertig bin..bin ja noch in der testphase,da siehts bei mir immer so wüst aus 😉
    werd eure vorschläge mal testen



  • Braineater schrieb:

    eigentlich arbeite ich auch mit einrücken...nur das mach ich immer wenn ich dann mit allem fertig bin..bin ja noch in der testphase,da siehts bei mir immer so wüst aus 😉

    Gerade am Anfang ist Übersichtlichkeit doch wichtig. Verwende halt nen anständigen Editor.


Anmelden zum Antworten