Programmieren c++



  • Hallo ich habe gerade probleme bei einer Aufgabe:

    Die allgemeine Lösung eines linearen Gleichungssystems mit zwei Unbekannten x und y in der
    Form
    a1 * x + a2 * y = a3
    b1 * x + b2 * y = b3 (ai, bi reelle Zahlen)
    soll mit Hilfe eines C-Programms ermittelt werden.
    a. Programmentwurf
    Eingabedaten: ai, bi : reell
    Lösungsweg: Der Algorithmus soll folgende Fallunterscheidungen treffen:
    1. Eine oder beide Unbekannten sind nicht vorhanden (z.B. a1 = b1 = 0)
    Ausgabe eines entsprechenden Textes ?kein 2*2-System?
    2. Nennerdeterminante ungleich 0
    Berechnung von x und y sowie entsprechende Ausgabe
    3. Nennerdeterminante gleich 0, Zählerdeterminante ungleich 0
    Ausgabe ?keine Lösung?
    4. Nennerdeterminante gleich 0, Zählerdeterminante gleich 0
    Ausgabe ?beliebig viele Lösungen?
    Ausgabedaten: x,y und/oder entsprechender Text

    In der Aufgabenstellung ist noch ein Lösungsprinzip gegeben:

    Lösung des Gleichungssystems mittels Berechnung der Nenner- und Zählerdeterminanten:
    Nenner-Determinante 😨
    ( a1 * b2 ) - ( a2 * b1 )
    Zähler-Determinante Dx:
    ( b2 * a3 ) - ( a2 * b3 )
    Zähler-Determinante Dy:
    ( a1 * b3 ) - ( b1 * a3 )
    x und y berechnen sich dann:
    x = Dx / D
    y = Dy / D

    Mein Ansatz:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        int ai;
    
        int bi;
    
        cout << " Geben sie die erste Zahl ein !" << endl;
    
        cin >> ai;
    
        cout << "Geben sie die zweite Zahl ein!" << endl;
    
        cin >> bi;
    
        int Nennerdeterminante;
    
        Nennerdeterminante = (ai*bi) - (ai*bi);
    
        int Zaehlerdetdx;
    
        int Zaehlerdetdy;
    
        int x;
    
        int y;
    
        x =  Zaehlerdetdx / Nennerdeterminante;
    
        y = Zaehlerdetdy / Nennerdeterminante;
    
        if( ai = 0 && bi = 0 ) {
    
            cout << " kein 2*2 System " << endl;
    
        }
    
    }
    

    Stimmt der code einigermassen?

    Hoffe das der code nicht völliger quatsch ist.


  • Mod

    Viele Fehler.
    - Deine Eingabedaten sind nicht reell.
    - Du hast die Aufgabe gar nicht verstanden. Denk nochmal nach, wie viele Daten du lesen musst.
    - Fällt dir bei so etwas nicht schon beim Schreiben auf, dass da etwas nicht stimmt? Nennerdeterminante = (ai*bi) - (ai*bi); Was mag da wohl das Ergebnis sein?
    - Wenn die Koeffizienten reell sind, dann sollten die Determinanten auch reell sein.
    - Zeile 24 ff. benutzt du uninitialisierte Variablen
    - Du lässt die ganzen Tests weg, die in der Aufgabenstellung stehen und versuchst gleich das Ergebnis zu berechnen. Die Tests sind aber wichtig!
    - Der eine Test, den du machst, steht an ganz falscher Stelle. Der Code wird von oben nach unten ausgeführt.
    - Dein Test vergleicht nicht (==), er weist zu (=).



  • Wie soll ich denn die eingabedateien reel machen?



  • ...



  • #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        float ai;
    
        float bi;
    
        int a1,a2,a3,b1,b2,b3;
    
        cout << " Geben sie die erste Zahl ein !" << endl;
    
        cin >> ai;
    
        cout << "Geben sie die zweite Zahl ein!" << endl;
    
        cin >> bi;
    
        int Nennerdeterminante;
    
        Nennerdeterminante = (a1*b2) - (a2*b1);
    
        int Zaehlerdetdx;
    
        Zaehlerdetdx = (b2*a3) - (a2*b3);
    
        int Zaehlerdetdy;
    
         Zaehlerdetdy = (a1*b3) - (b1*a3);
    
        int x;
    
        int y;
    
        x =  Zaehlerdetdx / Nennerdeterminante;
    
        y = Zaehlerdetdy / Nennerdeterminante;
    
        if( ai == 0 && bi == 0 ) {
    
            cout << " kein 2*2 System " << endl;
    
        }
    
        if( Nennerdeterminante != 0 ){
    
            cout << x && y << endl;
        }
    
        if( Nennerdeterminante == 0 && Zaehlerdetdx != 0 && Zaehlerdetdy != 0){
    
            cout << " Es gibt keine Loesung ! " << endl;
        }
    
    }
    

    Irgendwas stimmt mit dieser Zeile nicht leute.

    cout << x && y << endl;

    Warum wird hier mir ein Fehler angezeigt?

    Ich hoffe das jetzt meine eigelesenen dateien durch das float jetzt reel sind.

    Muss ich jetzt eigentlich auch das a1,a2,a3 usw. auch einlesen?

    Das ist mir nicht so ganz klar.



  • Chaz schrieb:

    Warum wird hier mir ein Fehler angezeigt?

    weil "&&" ein "logisches und" ist:

    if ( a>0 && b < 42)
    

    Chaz schrieb:

    Muss ich jetzt eigentlich auch das a1,a2,a3 usw. auch einlesen

    wofür benötigst du ai und bi? Kann es sein, dass diese Werte garnicht so direkt im Code auftauchen sollen? Schau dir doch nochmal die Aufgabenstellung an.



  • Eingabedaten: ai, bi : reell

    Steht ja in der AUfgabenstellung .

    EHrlich gesagt ist mir das aus der Aufgabenstellung auch nicht so richtig klar geworden.

    Vielleicht hast du einen tipp für mich?

    weil "&&" ein "logisches und" ist

    Oh ja stimmt das war auch eigentlich blöd von mir .

    Könnte ich anstatt dem && zeichen das || zeichen nehmen?



  • Chaz schrieb:

    Eingabedaten: ai, bi : reell

    Steht ja in der Aufgabenstellung .

    Ja, das steht da so. Kommst du vielleicht drauf, wenn ich dir sage, dass das "i" gemäß der mathematischen Konventionen eigentlich tiefgestellt sein müsste?

    Chaz schrieb:

    Könnte ich anstatt dem && zeichen das || zeichen nehmen?

    Dann hast du ein "logisches oder".

    bool a = true;
    bool b = false;
    
    bool logical_and = a && b; // false
    bool logical_or = a || b;  // true
    

  • Mod

    Chaz schrieb:

    Eingabedaten: ai, bi : reell

    Steht ja in der AUfgabenstellung .

    EHrlich gesagt ist mir das aus der Aufgabenstellung auch nicht so richtig klar geworden.

    Ausführlich: Eingabedaten {a_i,b_ii{1,2,3}}\left\{a\_i, b\_i | i \in \{1,2,3\}\right\}reell.

    Könnte ich anstatt dem && zeichen das || zeichen nehmen?

    Du sollst denken, nicht raten! Was möchtest du an der Stelle ausdrücken, logisch formuliert?



  • Chaz schrieb:

    [code="cpp"]#include <iostream>

    float ai;

    float bi;

    int a1,a2,a3,b1,b2,b3;

    cout << " Geben sie die erste Zahl ein !" << endl;

    cin >> ai;

    cout << "Geben sie die zweite Zahl ein!" << endl;

    cin >> bi;

    int Nennerdeterminante;

    Nennerdeterminante = (a1*b2) - (a2*b1);

    int Zaehlerdetdx;

    Zaehlerdetdx = (b2*a3) - (a2*b3);

    int Zaehlerdetdy;

    Zaehlerdetdy = (a1*b3) - (b1*a3);

    Schau dir mal bitte den Anfang an, du legst hier ne menge Variablen an. Diese haben keine werte. Kann nichts dabei rauskommen.

    Ich denke das "ai" in diesem Fall a 1-3 bedeutet, da du sonst diese Gleichungen nicht lösen kannst

    Sagen wir mal so.

    6 Äpfel und 12 Birnen kosten 30 €
    3 Äpfel und 3 Birnen kosten 9 €

    Die gleichungen

    6x + 12y = 30
    3x + 3y = 9

    Eingabe von 6, 12, 30 und 3,3,9



  • Ich verstehe immer noch nicht so genau . Was soll ich genau mit dem ai und bi machen ?



  • Chaz schrieb:

    Was soll ich genau mit dem ai und bi machen ?

    es nicht verwenden. Wie schon mehrfach gesagt wurde, handelt es sich um eine Kurzschreibweise für a1,a2,a3,b1,b2,b3



  • Also nochmal nehmen wir das Bsp.

    Sagen wir mal so.

    6 Äpfel und 12 Birnen kosten 30 €
    3 Äpfel und 3 Birnen kosten 9 €

    Die gleichungen

    6x + 12y = 30
    3x + 3y = 9

    Somit ergibt sich diese Tabelle

    a1 + a2 = a3
    6  + 12 = 30
    
    b1 + b2 = b3
    3  +  3 = 9
    

    setzen wir das nun ein und entnehmen die Werte der Tabelle oben

    Nenner-Determinante 😨
    ( a1 * b2 ) - ( a2 * b1 )
    ( 6 * 3 ) - ( 12 * 3 ) = -18*-1 = 18
    Zähler-Determinante Dx:
    ( b2 * a3 ) - ( a2 * b3 )
    ( 3 * 30 ) - ( 12 * 9 ) = -18*-1 = 18
    Zähler-Determinante Dy:
    ( a1 * b3 ) - ( b1 * a3 )
    ( 6 * 9 ) - ( 3 * 30 ) = -36*-1 = 36

    x = Dx/D = 18/18 = 1
    y = Dy/D = 36/18 = 2

    Einsetzten in die gleichung

    6 * 1 + 12 * 2 = 30

    6 + 24 = 30

    3 * 1 + 3 *2 = 9

    3 + 6 = 9

    Stimmt also 🙂



  • ai == 0 && bi == 0

    Für diese Zeile habe ich immer noch keine Lösung gefunden , daher ist der fehler immer noch im code.

    Aber ich wollt euch fragen ob jetzt der Anfang des Codes stimmt?

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        int a1,a2,a3,b1,b2,b3;
    
        cout << " Geben sie die erste Zahl ein !" << endl;
    
        cin >> a1;
    
        cout << "Geben sie die zweite Zahl ein!" << endl;
    
        cin >> a2;
    
        cout << " Geben sie die dritte Zahl ein !" << endl;
    
        cin >> a3;
    
        cout << " Geben sie die dritte Zahl ein !" << endl;
    
        cin >> b1;
    
        cout << " Geben sie die dritte Zahl ein !" << endl;
    
        cin >> b2;
    
        cout << " Geben sie die dritte Zahl ein !" << endl;
    
        cin >> b3;
    
        int Nennerdeterminante;
    
        Nennerdeterminante = (a1*b2) - (a2*b1);
    
        int Zaehlerdetdx;
    
        Zaehlerdetdx = (b2*a3) - (a2*b3);
    
        int Zaehlerdetdy;
    
         Zaehlerdetdy = (a1*b3) - (b1*a3);
    
        int x;
    
        int y;
    
        x =  Zaehlerdetdx / Nennerdeterminante;
    
        y = Zaehlerdetdy / Nennerdeterminante;
    
        if( ai == 0 && bi == 0 ) {
    
            cout << " kein 2*2 System " << endl;
    
        }
    
        if( Nennerdeterminante != 0 ){
    
            cout << x && y << endl;
        }
    
        if( Nennerdeterminante == 0 && Zaehlerdetdx != 0 && Zaehlerdetdy != 0){
    
            cout << " Es gibt keine Loesung ! " << endl;
        }
    
    }
    


  • Chaz schrieb:

    ai == 0 && bi == 0

    was willst du hier überhaupt erreichen? ai und bi hast du doch inzwischen rausgeschmissen.


  • Mod

    Aber ich wollt euch fragen ob jetzt der Anfang des Codes stimmt?

    - Werte nicht reell.
    - Offensichtliche Copy&Paste Programmierung 👎 . Dadurch Fehler eingefangen. Guck dir nochmal alles genau an, was du mittels C&P "programmiert" hast.

    • cout << x && y << endl; Offensichtlicher Unsinn, den man selbst ohne Erfahrung schon bei einem einzigen Testlauf sofort entdeckt hätte. ➡ Du hast das Programm nie getestet 👎 .
      - Berechnung der Lösung an der falschen Stelle, bevor festgestellt wurde, ob es überhaupt eine Lösung gibt. (Hier mit int sogar besonders ungünstig, da dadurch das Programm abstürzen kann. Wäre ebenfalls bei einem einfachen Testlauf sofort aufgefallen.)

    ai == 0 && bi == 0

    Für diese Zeile habe ich immer noch keine Lösung gefunden , daher ist der fehler immer noch im code.

    Erinnere dich doch noch mal an deine Schulzeit, was die durch

    1. Eine oder beide Unbekannten sind nicht vorhanden (z.B. a1 = b1 = 0)
    Ausgabe eines entsprechenden Textes ?kein 2*2-System?

    beschriebene Bedingung für den Wert der Determinante bedeutet.



  • #include <iostream>
    #include <cstdlib>
    #include <string>
    
    float getValue(const std::string& ausgabe)
    {
       float input = 0;
       do 
       {
          std::cout << ausgabe << std::endl;
          std::cin >> input;
    
          if (input == 0)
          {
             std::cout << "kein 2*2-System! Enter druecken um erneut wert eingeben zu koennen" << std::endl << std::endl;
             system("PAUSE");
             system("cls");
          }
    
       } while (input == 0);
    
       return input;
    }
    
    int main()
    {
    
       float a1, a2, a3, b1, b2, b3;
    
       a1 = getValue("Geben sie bitte den Wert fuer a1 ein");
       a2 = getValue("Geben sie bitte den Wert fuer a2 ein");
       a3 = getValue("Geben sie bitte den Wert fuer a3 ein");
    
       b1 = getValue("Geben sie bitte den Wert fuer b1 ein");
       b2 = getValue("Geben sie bitte den Wert fuer b2 ein");
       b3 = getValue("Geben sie bitte den Wert fuer b3 ein");
    
       float D = ((a1*b2) - (a2*b1))*-1;
       float Dx = ((b2*a3) - (a2*b3))*-1;
       float Dy = ((a1*b3) - (b1*a3))*-1;
    
       float x = Dx/D;
       float y = Dy/D;
    
       std::cout << "Der Wert fur x = " << x << std::endl
                 << "Der Wert fur y = " << y << std::endl;
    
    	return 0;
    }
    

  • Mod

    CodeBase, du hast auch nicht verstanden, wozu die Bedingungen überhaupt da sind.

    \begin{align*} 0x + 1y &= 0 \\ 1x + 0y &= 0 \end{align*}

    ist ein astreines 2x2 Gleichungssystem.

    Und wozu sollen die -1 gut sein?



  • Ja sry war mein Fehler hab ich übersehen. Die sind dafür da, das wir keine division durch 0 erhalten. Dachte deshalb minus 1 damit wir positive Zahlen bekommen


  • Mod

    CodeBase schrieb:

    Ja sry war mein Fehler hab ich übersehen. Die sind dafür da, das wir keine division durch 0 erhalten. Dachte deshalb minus 1 damit wir positive Zahlen bekommen

    Nein, das war nicht gemeint (das ist aber auch ein Grund für die Abfragen). Ich habe in meinen vorherigen Beitrag noch eine Erläuterung reineditiert, während du schon geantwortet hast.


Log in to reply