Lineares Gleichungssystem



  • Hallo,

    ich schreibe ein Prgramm zum Lösen eines einfachen linearen Gleichungssystems.
    Dabei habe ich 2 Terme.
    term1: k*x + l*y = z
    term2: k2*x - l2*y = z2

    Die Koeffizienten (k,l,k2,l2,z,z2) kann der Benutzer definieren.

    Ich hab mir das so vorgestellt.
    1. ich schreibe eine Funktion für die Eingabe der Werte und speichere diese in zwei arrays.
    2. ich schreibe eine Fkt zur Ausgabe
    3. Fkt zur Berechnung eines Terms

    Meine Frage ist nun, wie schaffe ich es, dass ich die Terme einmal zentral definiere und in den Funktionen einfach aufrufen kann ohne diese wieder zu definieren?

    zB bei der 3 Fkt zur Berechnung möchte ich den Array (k,l,z) für den Term2 und den Term2 übergen.

    Ich hab somit nur eine Berechungsfx, die ich für die Berechnung von Term1 und Term2 verwende.

    Ich hoffe ich habs nicht ganz unverständlich ausgedrückt. 😕

    Könnt Ihr mir bitte weiterhelfen?

    Danke!

    Lg, Clementis



  • wie wärs, für jeden Term eine Klasse zu schreiben?



  • brauchst du doch eigtl. gar nicht.

    wenn du z.B. den Term k*x+l*y=z hast speicherst du k,l und z ab und gehst das dann einfach durch.

    bsp ausgabe.

    int kon[3]=[k,l,z];
    char var[2]=['x','y']
    for(int i=0;i<3;i++)
    {
        if(kon[i]!=0)
        {
          if(kon[i]>0)
            cout<<"+";
          else
            cout<<"-";
          cout<<kon[i]<<"*"<<var[i];
        }
    }
    cout<<"="<<kon[3]<<endl;
    

    berechnung funktioniert dann ähnlich. Die Sachen in eine Klasse zu packen und die dann mit der anzahl der variablen zu initialisieren würde dich unabhängig von der anzahl der Terme und Variablen machen.



  • Fuer lineare Gleichungssysteme eignen sich besonders gut Matrizen und Vektoren. Btw. Funktion wird mit Fkt. abgekuerzt.



  • Ich hab momentan keinen Plan.

    Kann mir bitte jemand die Idee vermitteln diese beiden Terme mittels einem Array zu lösen?

    Danke!

    lg, clementis



  • Danke für die Antworten. Mit Klassen kenne ich mich noch nicht so gut aus und Vektoren habe ich noch nicht gelernt. Folgendes habe ich probiert.

    Ich hab nun die Funktion fBerechnungTerm und fEingabeVar geschrieben.
    Beide Fkt werden in main() aufgerufen.
    Bsp
    int iaErg[2] = {};
    iaErg = fBerechnungTerm(iaVa1, iaVa2, iaErg);

    oder

    int iaVa1[3] = {};
    int ilenVa = 3;
    iaVa1 = fEingabeVar(iaVa1, ilenVa);

    Ich bekomme Unmengen von Fehlern. Hier ein paar davon!
    Zeile 3: zu viele Argumente für function »int EingabeVar(int*)
    Zeile 7: no match für »operator>>
    Zeile 31: ungültige Umwandlung von »int*« in »int«

    Meine Idee dahinter.
    1. der User soll die Parameter eingeben. Diese werden in einem array iaVa gespeichert und wieder an main zurück gegeben.

    2. Diese arrays werden an ander funktionen übergeben um zB eine Lösung in fBerechnungTerm zu erhalten. Das Ergebnis soll wieder an main mittels array übergeben werden.

    Bitte um Hilfe!!

    //Auszug aus dem Code
    
    int fEingabeVar(int* iaVa){    //Einlesen der Variablen
    
    	cout << "Bitte geben Sie die Variablen des Terms bekannt.\n Gültig sind ganzzahlige Werte.\n\n";
    	cout << "Geben Sie bitte den x-Koeffizienten ein.\n";
    	cin >> iaVa[0] >> endl;
    	cout << "Geben Sie bitte den y-Koeffizienten ein.\n";
    	cin >> iaVa[1] >> endl;
    	cout << "Geben Sie bitte die Konstante des ersten Terms ein.\n";
    	cin >> iaVa[2]>> endl;
    
    	return iaVar;
    }
    
    int fBerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    
    	int ixErg = 0;
    	int iyErg = 0;
    	const int ilen = 100;
    
    	for(int i=0; x < ilen; ++i){
    		for(int j=0; y < ilen; ++i){
    			if( iaVa1[0] * x + iaVa1[1] * y == iaVal1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVal2[2]){
    				iaErg[0] = x;
    				iaErg[1] = y;
    			}
    		}
    	}
    
    	return iaErg;
    }
    


  • @clementis:
    Von den "grossen Jungs" schreibt keiner "Fx" als Abkürzung für "Funktion" 😉



  • hustbaer schrieb:

    @clementis:
    Von den "grossen Jungs" schreibt keiner "Fx" als Abkürzung für "Funktion" 😉

    Danke, bin schon aufmerksam gemacht worden. Fx wird schon nicht mehr verwendet. 😉



  • Kann mir bitte jemand bei obigen Fehlern behilflich sein, da ich als Anfänger keine Ahnung habe was hier falsch ist.

    Bin dankbar für jeden Hinweis!

    Lg, Clemens



  • zu viele Argumente für function »int EingabeVar(int*)
    
    int fEingabeVar(int* iaVa){    //Einlesen der Variablen
    /*...*/
    }
    
    int iaVa1[3] = {};
    int ilenVa = 3;
    iaVa1 = fEingabeVar(iaVa1, ilenVa); //die Überladung der Fkt existiert nicht
    
    Zeile 7: no match für »operator>>
    

    ohne Code kann ich dir nicht sagen, woran das liegt... dafür aber was anderes:

    int fBerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    
        int ixErg = 0;
        int iyErg = 0;
        const int ilen = 100;
    
        for(int i=0; x < ilen; ++i){ //x? -> endlosschleife!
            for(int j=0; y < ilen; ++i){ //y? -> endlosschleife!
    /*...*/
    }
    
    ungültige Umwandlung von »int*« in »int«
    
    int fBerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    /*...*/
    return iaErg; //er soll einen integer und nicht ein feld davon zurückgeben...
    }
    

    bb



  • Danke für deine Tipps!

    Hier der gesamte Code. Einige Fehler habe ich bereits ausbessern können.

    Diese bleiben mir noch:

    Danke!

    Zeile 8: no match für »operator>>
    Zeiel 14, 30: ungültige Umwandlung von »int*« in »int«
    Zeile 33: zu wenige Argumente für function »void AusgabeTerm(int*, int*)«
    Zeile 56: zu wenige Argumente für function »void AusgabeErgebnis(int*)«
    Zeile 110: expected primary-expression before »=« token
    Unmängen dieser Anmerkungen:
    Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char, _Traits = std::char_traits<char>]

    #include <iostream>
    using namespace std;
    
    int EingabeVar(int iaVa[]){    //Einlesen der Variablen
    
    	cout << "Bitte geben Sie die Variablen des Terms bekannt.\n Gültig sind ganzzahlige Werte.\n\n";
    	cout << "Geben Sie bitte den x-Koeffizienten ein.\n";
    	cin >> iaVa[0] >> endl;
    	cout << "Geben Sie bitte den y-Koeffizienten ein.\n";
    	cin >> iaVa[1] >> endl;
    	cout << "Geben Sie bitte die Konstante des ersten Terms ein.\n";
    	cin >> iaVa[2]>> endl;
    
    	return iaVa;
    }
    
    int BerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    
    	const int ilen = 100;
    
    	for(int x=0; x < ilen; ++x){
    		for(int y=0; y < ilen; ++y){
    			if( iaVa1[0] * x + iaVa1[1] * y == iaVa1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVa2[2]){
    				iaErg[0] = x;
    				iaErg[1] = y;
    			}
    		}
    	}
    
    	return iaErg;
    }
    
    void AusgabeTerm(int* iaVar1, int* iaVar2){
    
    	char cRechOp1 = '+';
    	char cRechOp2 = '+';
    
    	if( iaVar1 < 0 ) cRechOp1 = '-';
    	if( iaVar2 < 0 ) cRechOp2 = '-';
    
    	cout << "Term1:\t" << iaVar1[0] << "x" << cRechOp1 << iaVar1[1] << "y  =   " << iaVar1[2] << endl;
    	cout << "Term2:\t" << iaVar2[0] << "x" << cRechOp2 << iaVar2[1] << "y  =   " << iaVar2[2] << endl;
    	cout << endl;
    
    	return;
    }
    
    void AusgabeParameter(int* iaVar1, int* iaVar2){
    	cout << "Parameter Term1:\t" << iaVar1[0] << "x\t" << iaVar1[1] << "y" << endl;
    	cout << "Parameter Term2:\t" << iaVar2[0] << "x\t" << iaVar2[1] << "y" << endl;
    	cout << endl;
    
    }
    
    void AusgabeErgebnis(int iaErg[]) { cout << "Loesung: x = " << iaErg[0] << "   y = " << iaErg[1] << "\n\n"; }
    
    int main() {
    
    	const int ilenVa = 3;  
    	const int ilenErg = 2; //Anzahl der Variablen im Ergebnis
    	int iaVa1[ilenVa] = {};
    	int iaVa2[ilenVa] = {};
    	int iaErg[ilenErg] = {};
    	int iMenEing = -1;
    
    	while(iMenEing != 0) {
    		cout << endl;
    		cout << "*** Menue ***" << endl;
    		cout << "\tEingabe der Parameter......................<1>" << endl;
    		cout << "\tAnzeigen der gewählten Parameter...........<2>" << endl;
    		cout << "\tAnzeigen der Terme.........................<3>" << endl;
    		cout << "\tLösen der Gleichung........................<4>" << endl;
    		cout << "\tPrgramm beenden............................<0>" << endl;
    
    		switch(iMenEing){
    			case 0: cout << endl;
    					cout << "Prgramm beenden\n";
    					break;
    			case 1: cout << endl;
    					cout << "Eingabe der Parameter\n\n";
    					cout << "*** Term 1 ***\n";
    					iaVa1 = EingabeVar(iaVa1);
    					cout << "*** Term 2 ***n";
    					iaVa2 = EingabeVar(iaVa2);
    					break;
    			case 2: cout << endl;
    					cout << "Anzeigen der gewählten Parameter\n\n";
    					AusgabeParameter(iaVa1, iaVa2);					
    					break;
    			case 3: cout << endl;
    					cout << "Anzeigen der Terme\n\n";
    					AusgabeTerm(iaVa1, iaVa2);					
    					break;
    			case 4: cout << endl;
    					cout << "Lösen der Gleichung\n\n";
    					iaErg = BerechnungTerm(iaVa1, iaVa2, iaErg);
    					AusgabeTerm(iaVa1, iaVa2);
    					AusgabeErgebnis(iaErg);
    					break;
    			default: cout << endl; 
    					 cout << "Ungültige Eingabe\n\n";
    					 break;
    		}
    
    		//Prgramm anhalten und auf Zeicheneingabe warten
    		cout.flush();
    		getchar();
    	}
    
    	return = 0;	
    }
    


  • Hier ein paar mögliche Änderungen, damit du wenigstens mal deine ganzen Fehlermeldungen wegbekommst:

    void EingabeVar(int* iaVa){		// Rückgabetyp geändert, da du sowieso einen Zeiger übergibst 
    
        cout << "Bitte geben Sie die Variablen des Terms bekannt.\n Gueltig sind ganzzahlige Werte.\n\n"; 
        cout << "Geben Sie bitte den x-Koeffizienten ein.\n"; 
        cin >> iaVa[0];				// endl entfernt !!
        cout << "Geben Sie bitte den y-Koeffizienten ein.\n"; 
        cin >> iaVa[1];				// endl entfernt !!
        cout << "Geben Sie bitte die Konstante des ersten Terms ein.\n"; 
        cin >> iaVa[2];				// endl entfernt !!
    }                                  // return entfernt wegen Rückgabetyp void
    
    void BerechnungTerm(int* iaVa1, int* iaVa2, int* iaErg) { 		// Rückgabetyp geändert, da du sowieso Zeiger übergibst 
    
        const int ilen = 100; 
    
        for(int x=0; x < ilen; ++x){ 
            for(int y=0; y < ilen; ++y){ 
                if( iaVa1[0] * x + iaVa1[1] * y == iaVa1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVa2[2]){ 
                    iaErg[0] = x; 
                    iaErg[1] = y; 
                } 
            } 
        } 
    }								// return entfernt wegen Rückgabetyp void
    
    while(iMenEing != 0) { 
            cout << endl; 
            cout << "*** Menue ***" << endl; 
            cout << "\tEingabe der Parameter......................<1>" << endl; 
            cout << "\tAnzeigen der gewaehlten Parameter..........<2>" << endl; 
            cout << "\tAnzeigen der Terme.........................<3>" << endl; 
            cout << "\tLoesen der Gleichung.......................<4>" << endl; 
            cout << "\tProgramm beenden...........................<0>" << endl; 
    		cin >> iMenEing;	// Benutzereingabe hinzugefügt, da sonst Endlosschleife
    
    case 1: cout << endl; 
                        cout << "Eingabe der Parameter\n\n"; 
                        cout << "*** Term 1 ***\n"; 
                        EingabeVar(iaVa1); // Zuweisung entfernt, da Rückgabetyp nun void
                        cout << "*** Term 2 ***n"; 
                        EingabeVar(iaVa2); // Zuweisung entfernt, da Rückgabetyp nun void
                        break;
    
    case 4: cout << endl; 
                        cout << "Loesen der Gleichung\n\n"; 
                        BerechnungTerm(iaVa1, iaVa2, iaErg); // Zuweisung entfernt, da Rückgabetyp nun void
                        AusgabeTerm(iaVa1, iaVa2); 
                        AusgabeErgebnis(iaErg); 
                        break;
    
    return 0;											// '=' entfernt
    }
    


  • Danke, danke, danke für deine Hilfe Mizar!!!
    Das Prgramm läuft!
    lg, clementis



  • Hallo,

    warum wird der Fehler
    »else« ohne vorheriges »if«
    in Zeile 11 ausgegeben?

    Da ist doch ein if??

    Danke für eure Tipps!

    lg, clementis

    void BerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    
    	const int ilen = 100;
    	int iFehler = 1;
    
    	for(int x=1; x <= ilen; ++x){
    		for(int y=1; y <= ilen; ++y){
    			if( iaVa1[0] * x + iaVa1[1] * y == iaVa1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVa2[2])
    				iaErg[0] = x;
    				iaErg[1] = y;
    			else
    				iFehler = 0;
    		}
    	}
    
    	if( iFehler == 0 )  {cout << "Fehler im Wertebereich 1..100\n";}
    }
    


  • clementis schrieb:

    if( iaVa1[0] * x + iaVa1[1] * y == iaVa1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVa2[2]) { // geschwungene Klammer
    				iaErg[0] = x;
    				iaErg[1] = y;
                } // geschwungene Klammer
    			else
    				iFehler = 0;
    


  • weil die klammern fehlen
    wenn du ein if ohne { - Klammern verwendest dann darf nur eine Zeile Code dahinter stehen, die zum If dazugehören soll

    void BerechnungTerm(int iaVa1[], int iaVa2[], int iaErg[]) {
    
        const int ilen = 100;
        int iFehler = 1;
    
        for(int x=1; x <= ilen; ++x){
            for(int y=1; y <= ilen; ++y){
                if( iaVa1[0] * x + iaVa1[1] * y == iaVa1[2] && iaVa2[0] * x + iaVa2[1] * y == iaVa2[2]) {
                    iaErg[0] = x;
                    iaErg[1] = y;
                } else { // diese erneute öffnende Klammer könnte man weglassen, da ja nur eine Zeile code folgt
                    iFehler = 0;
                }
            }
        }
    
        if( iFehler == 0 )  {cout << "Fehler im Wertebereich 1..100\n";}
    }
    

    [edit] uups, etwas zu langsam gewesen 😃 [/edit]



  • Danke für die rasche Antwort!!
    Ich muss noch super viel lernen!
    Danke!
    Clementis



  • blitzmaster schrieb:

    [edit] uups, etwas zu langsam gewesen 😃 [/edit]

    Dafür war deine Antwort ausführlicher :).


Anmelden zum Antworten