Matrix Eingabemaske



  • Moin erstmal.

    Ich benötige ein wenig Hilfe bei einer Eingabemaske einer Matrix.
    Und zwar soll die Matrix so eingegeben, dass sowohl nur relle Zahlen, als auch kompexe Zahlen, als auch Büche eingegeben werden können.
    Das ganze soll mit Klassen geschehen.

    Es dient dafür, das ich Matrixoperationen durchführen kann, z.B Multiplikation, Inversin, Determinanten, ...
    mittels Ableitungen und und und

    Da ich eigentlich nicht so in c++ bewandert bin, eigentlich gar nicht 😞 , frage ich euch, ob ihr mir bei diesem Projekt helfen könnt, auch das ich mich dadurch ein wenig in C++ zurechtfinden kann. 😉

    Danke schon einmal für eure Mühen

    MfG
    HugoEA



  • Guten Morgen.

    Wie bewandert bist du denn, hast du schonmal nen hello world geschrieben ?



  • naja, bewandert
    hatte mal vor ein paar Jahren Pascal gehabt, mit Java geht es einigermassen, dann gibt es bei mir noch Webprogrammierung mit PHP/Html/CSS und ein wenig JS.

    Also ein "Hello World" bekomme ich noch zusammen.

    Mein Problem besteht eher im Verständniss von C++.
    Wir haben es jetzt fast ein Semester.
    Und ich verstehe das mit den Klassen einfach nicht, wie z.B. mit der Eingabe.
    Also, man hat 1ne Eingabe, da kann man 3 unterschiedliche Typen eingeben und weiterrechen, das ist mir zu hoch.



  • Nagut und was verstehst du unter Eingabemaske ? Sowas ist meist ne grafische Oberfläche und ist vom Betriebssystem abhängig.
    Oder willst du die Komplexen Zahlen in der Konsole eingeben ?



  • Ich denke mal in beiden Fällen kommst du nicht drum herum, die Zahlen für die Matrix erst einmal als einen String einzulesen und dann zu prüfen, ob es ne Komplexe Zahl ist.

    Ne bessere Lösung fällt mir im Moment nicht ein.



  • Oder vielleicht noch im Falle der Eingabe über Konsole Realteil und Imaginärteil getrennt.

    Ansonsten verfügt die C++ Bibliothek über eine Klasse mit Komplexen Zahlen.
    Die Klasse hat auch überladene Operatoren für die gängisten Rechenarten mit diesen komplexen Biestern.

    Dann müsstest du dich noch genauer ausdrücken, wie deine Aufgabenstellung aussieht, ob z.B. die Matrixoperationen als Methoden in einer Klasse gekapselt werden sollen usw.

    Starthilfe:

    #include <iostream>
    #include <complex>
    using namespace std;
    
    int main()
    {
    	complex < double > cpx1( 1.0, 1.0 );
    	complex < double > cpx2;
    
    	cpx2 = cpx1;
    	cout << cpx2;
    
    	cpx2 *= 2;
    	cout << cpx2;
    
    	return 0;
    }
    

    Gruß,
    p.



  • das ganze soll in der Shell/CMD laufen
    Eingabemaske, ich habe es mir so gedacht gehabt, weil es ja c++ angeblich können soll, dass das prog automatisch an der eingabe erkennt, ob es eine Koplexe Matrix werden soll, oder nur eine "Normale"

    z.B. kann man es ja so machen, das man von vornherein ausgeht, das es komplexe Zahlen sind, die man eingibt (a+jb)
    jetzt kann man ja z.B. den Imaginärteil weglassen.
    Wenn man in der Matrix nur reelle Anteile hat, braucht man ja keine Komplexe Multiplikation, bzw. Division, was die ganze Sache schon vereinfacht.
    Andersherum wird es ja schon zu einer Komplexen Matrix, wenn man nur eine Komplexe Zahl eingibt.

    Implementieren Sie ein System zur algebraischen Behandlung von Matrizen.
    Folgende Operationen sollen realisiert werden
    • Matrix-Multiplikation
    • Vektor-Multiplikation
    • Gauß-Elimination (Lösung von linearen Gleichungssystemen)
    • Deteminantenberechnung
    • Matrix-Inversion
    • Eigenwert- und Eigenvektor-Berechnung (numerisch)
    Implementieren Sie das System so, daß Matrizen verschiedener Dimension,
    auch nicht-quadratische behandelt werden können (für das Eigenwert- und
    Eigenvektor-Problem sind die Matrizen als quadratisch vorausgesetzt). Sehen
    Sie verschiedene Typen von Matrizen vor (reele, komplexe). Implementieren
    sie die Ein- und Ausgabefunktionen für das System.

    Das ist die eigentliche Aufgabenstellung.

    Mein Part hierbei ist die Eingabe zu realisieren, die Determinantenberechnung und die Matrix-Inversion, da die Inversion ja schon die Determinantenberechnung beinhaltet.



  • Ja gut und wie sehen deine bisherigen Bemühungen aus ? ( Quellcode ) Hast du schon geschafft, eine Zahl einzulesen und diese in der Konsole auszugeben ?



  • jup, also die Eingabe einer Matrix , bzw, einer Komplexen Zahl in der Form a_+ib habe ich schon (Haben wir in einer Übung gemacht), aber zusammen bekomme ich es nicht.

    #include <iostream>
    using namespace std;
    
    int main()
      {
      const int max_dim=12; // Maximale Dimension
      typedef double matrix[max_dim][max_dim]; // neuer Typ matrix
    
      matrix testmatrix;
      int dim_zeilen, dim_spalten, zeile, spalte;
      char q; // Damit das Konsolen-Fenster nicht schliesst
    
      do 
      {
        cout << "#Zeilen und #Spalten (min. 1, max. " << max_dim << "): ";
        cin >> dim_zeilen >> dim_spalten;
      } 
      while ((dim_zeilen < 1 || dim_zeilen > max_dim) || (dim_spalten < 1 || dim_spalten > max_dim));
    
      // Eingabe
      for(zeile=0; zeile<dim_zeilen; ++zeile) 
      {
        cout << "Matrix[" << zeile+1 << "][1.." << dim_spalten << "] ? ";
        for(spalte=0; spalte<dim_spalten; ++spalte)
        cin >> testmatrix[zeile][spalte];
      }
      cout << endl;
    
      // Ausgabe
      cout << "Ihre Matrix:" << endl;
      for (zeile=0; zeile<dim_zeilen; ++zeile) 
      {
        for (spalte=0; spalte<dim_spalten; ++spalte)
        cout << testmatrix[zeile][spalte] << '\t';
        cout << endl;
      }
    
      cout << "'q' zum Beenden eingeben." << endl;
      do 
        q=cin.get(); 
      while(q != 'q'); // 'q' eingeben zum Beenden des Programms
    
      return (0);
    }
    

    und dieses Bsp habe ich zur ein, bzw. ausgabe von Kompl. Zahlen

    #include <cstdlib>
    #include <iostream>
    #include "cplcl.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
      complex a;
    
      cout << "Gib eine komplexe Zahl ein (x +i*y): ";
      cin >> a;
      cout << "a = " << a << endl;
      system("PAUSE");
      return (0);
    }
    

    cplcl.h:

    using namespace std;
    class complex 
    {
          private:
                 double re, im; // Real-, Imaginaerteil
          public:
                 complex () // Konstruktor
               {
                    re = 0.0;
                    im = 0.0;
               };
          friend istream& operator >> (istream& is, complex& z);
          friend ostream& operator << (ostream& os, const complex& z);
    };
    

    cplcl1.cpp

    #include <iostream>
    #include "cplcl.h"
    using namespace std;
    // Einagbe von komplexen Zahlen
    istream& operator >> (istream& is, complex& z)
    {
    	char c[3];
    	is >> z.re >> c[0] >> c[1] >> c[2]; 
    	if (!(c[0] == '+' && c[1] == 'i' && c[2] == '*')) 
        {
    		cerr << "Input error complex" << std::endl;
            system("PAUSE");
    		exit(1);
    	} 
        else 
        {
    		is >> z.im;
    	}
    	return is;
    }
    
    // Ausgabe von komplexen Zahlen
    ostream& operator << (ostream& os, const complex& z)
    {
    	os << z.re << "+i*" << z.im;
    	return os;
    }
    


  • Aaaaach sooo, ihr sollt eine eigene Klasse für die Komplexen Zahlen schreiben.

    Naja, da solltest du wohl erstmal einen anderen Namen für die Klasse wählen, weil der Name complex bereits vergeben ist und es daher zu Konflikten kommen kann.

    ... aber zusammen bekomme ich es nicht.

    Angenommen, du nennst deine Klasse my_complex und die zugehörige Headerdatei my_complex.h, dann kannst du deine Klasse mit

    #include my_complex.h
    

    in dein main-Programm einbinden.

    Oki doki und dann kannst du in deinem main-Programm
    diese Zeile: typedef double matrix[max_dim][max_dim];
    rausschmeisen und ersetzen mit:
    my_complex testmatrix[max_dim][max_dim];
    Damit erzeugst du eine Matrix mit Objekten deiner my_complex Klasse und
    kannst sie mit Ihhalt füllen.

    Die Zeile: matrix testmatrix;
    Kann dann ganz rausfliegen.

    Gruß, p.



  • moin
    naja, hier mal ein Teil des Bewertungsprinzips:

    Objektorientierte Realisierung (20 Prozent):
    --------------------------------------------
    durchgängig Klassen verwendet, Problem in mehreren Klassen abgebildet

    sinnvolle Datenkapselung (z. B. interne Daten einer Klasse als private deklariert, Zugriffsmethoden implementiert)

    Vererbung sinnvoll verwendet

    generische Programmierung (Templates) sinnvoll verwendet

    Laufzeitfehler sinnvoll behandelt (Exception-handling)

    Verständlichkeit der Implementierung (20 Prozent)
    -------------------------------------------------
    aussagekräftige Bezeichner für Typen, Variablen, Funktionen und
    Klassen verwendet

    Datenstrukturen einfach gehalten

    Programm-Code angemessen kommentiert

    Verschachtlungstiefe in Auswahlen (if, switch) und Schleifen (while dowhile,
    for) gering, keine Sprünge

    Sinnvolle, schmale Schnittstellen bei Klassen und Funktionen, lose
    Kopplung

    kurze Funktionsimplementierung, Funktionalität auf viele Funktionen
    aufgeteilt



  • Na dann mal toi toi toi und ran an die Tasten 🙂

    In Sachen Templates, Exceptions usw. helfen dir hier die Profis sicherlich gern weiter, denn diesbezüglich sind meine Kenntnisse nicht so doll.

    Gruß,
    p.



  • juhu, die Eingabe es geht 😮
    habe aber noch etwas, und zwar, sollen auch nur relle eingaben gemacht werden können, also nicht nur komplexe zahlen
    wie funktioniert das?
    weil wenn ich jetzt nur relle zahlen eingeben möchte, meckert das programm und beendet???



  • Hi,
    supie das es funzt !

    Das das Programm bei der Eingabe reeller Zahlen meckert ist kein Wunder, denn das hast du ihm mit unten stehender Anweisung beigebracht:
    ...
    if (!(c[0] == '+' && c[1] == 'i' && c[2] == ''))*
    ...

    Sinnvoll wäre da, für den Imaginärteil Null zuzulassen, dann ist es ja eine reelle Zahl. 🙂

    Gruß,
    p.



  • wäre es nicht besser, die Fehlerausgabe:

    cerr << "Input error complex" << std::endl;
    system("PAUSE");
    exit(1);
    

    umzuschreiben in:

    z.im=0;
    

    oder funktioniert das so nicht?



  • Ja, warum nicht, das ist deine freie Wahl.
    Ich finde es jedoch übersichtlicher, wie es der 'große Bruder' macht, also die
    Klasse complex der C++ Bibliothek.
    Eine Zahl mit Imaginärteil gleich Null sieht dann so aus: ( Re, 0 )

    Das ist natürlich dir überlassen wie du das möchtest.



  • habe es mal ausprobiert 😉

    geht leider nicht so richtig

    #Zeilen und #Spalten (min. 1, max. 12):2 2
    Matrix[1][1..2] ? 1 2
    3 4
    5 6
    7 8
    Matrix[2][1..2] ? 3 4
    5 6
    7 8
    9 0
    
    Ihre Matrix:
    1+i*0   5+i*0
    3+i*0   7+i*0
    'q' zum Beenden eingeben.
    

    gibt es eine Übersicht zu der Klasse?



  • Geh doch mal eine Seite zurück, da ist doch das kleine "Starthilfe" Beispiel.
    Die Übersicht gibts, bestimmt auch in deiner Kompiler-Bibliothek.



  • ja, hi. das zitat aus der aufgabenstellung kommt mir aber seeeeeeehr bekannt vor 😃 du studierst nicht REIN zufällig an der FH jena oder? u wenn doch hattet ihr scho präsentation?


Anmelden zum Antworten