1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C++ lineare Gleichungssysteme lösen

  • henriknikolas
  • 8. März 2014 um 20:26
  • Unerledigt
  • 1
  • 2
  • Jakube
    3
    Jakube
    Mitglied
    Reaktionen
    4
    Punkte
    64
    Beiträge
    12
    • 16. März 2014 um 19:27
    • #21

    Sorry, mein Handy zeigt mir Teile vom Code falsch an.

    Meine Antwort hat dadurch nicht gepasst.

    Einmal editiert, zuletzt von Jakube (16. März 2014 um 19:30)

  • Jakube
    3
    Jakube
    Mitglied
    Reaktionen
    4
    Punkte
    64
    Beiträge
    12
    • 16. März 2014 um 21:26
    • #22

    Ich finde die Idee eine ganze Zeile mittels dem >>-Operator einzulesen generell nicht gut (Ich würde so etwas zumindest selber nicht machen).
    Durch Logging habe ich gesehen, dass ohnehin immer wieder die Zeile gelöscht wird. Außerdem wird die >>-Operation schon aufgerufen, ohne dass man irgendwelche Eingaben macht und im ersten Bruch steht dann ein ganz sonderbarer Wert.

    Ich würde einfach eine Zeile mit cin einlesen. Und dann diese ganz normal verarbeiten. Mein Beispielscode ist sicher nicht der beste, aber weiter möchte ich mich damit auch nicht befassen.

    C
    #include <iostream>#include <math.h>
    #include <sstream>
    using namespace std;
    
    
    
    
    class Bruch
    {
    public:
        int zaehler, nenner;
        Bruch() : zaehler(0), nenner(1) {}
        Bruch(string str) //erzeugt aus den ersten Zeichen einen Bruch
        {
            char tmp;
            stringstream ss;
            ss.str(str);    
    
    
    
    
            ss >> zaehler;
            ss >> tmp;
            if(tmp == '/')
                ss >> nenner;
            else
                nenner = 1;
        }
    };
    
    
    
    
    ostream& operator<<(ostream &s, Bruch b)
    {
            s << b.zaehler << "/" << b.nenner;
            return s;
    }
    
    
    
    
    
    
    
    
    int main()
    {
            const int max = 2;
            Bruch** Matrix = new Bruch*[max];
            for (int i = 0; i < max ; i++)
                    Matrix[i] = new Bruch[max];
            Bruch *Ergebnis = new Bruch[max];
    
    
    
    
            cout << "Bitte geben Sie alle Koeffizienten durch einen Beistrich getrennt an, und drücken Sie nach jeder Zeile Enter"    << endl;
            for (int i = 0; i < max; i++)
            {
            string zeile;
            cin >> zeile;
    
    
    
    
            for (int j = 0; j < max; j++)
                    {
                Matrix[i][j] = Bruch(zeile);
                size_t pos = zeile.find(',');
                zeile = zeile.substr(pos+1);
                    }
            Ergebnis[i] = Bruch(zeile);
        }
    
    
    
    
        for (int i = 0; i < max; i++)
        {
            for (int j = 0; j < max; j++)
                cout << Matrix[i][j] << "\t";
            cout << Ergebnis[i] << endl;
        }
    }
    Alles anzeigen

    Eine mögliche Eingabe wäre jetzt:

    Code
    1/5,2/5,4/3
    2,14/23,36/44

    (habe das Trennungssymbol durch einen Beistrich ersetzt)

    Hoffe das hilft dir weiter.

    P.S. Falls du nicht den ganzen Code posten möchtest, dann entferne doch einfach die uninteressanten Stellen. Z.B. das Lösen des Gleichungssystem hat ja nichts mit deiner Frage zu tun.

  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 22. März 2014 um 10:32
    • #23

    Tut mir Leid, dass ich jetzt erst antworte, aber diese Woche hatte ich sehr viel mit der Schule zu tun, deshalb bin ich gar nicht zum Programmieren gekommen. Ich habe jetzt meine Funktion zum Einlesen etwas verändert, mit den Brüchen einlesen klappt alles wunderbar, nur kann ich jetzt nur Brüche wie 1/2 eingeben und keineZahlen wie 3 oder 0.5. Kannst du mir vielleicht dafür noch einen Tipp geben?!?

    Code
    istream& operator>>(istream &is, Bruch &b)
    {
            char tmp;
            int zaehler;
            unsigned int nenner;
            is >> zaehler;
            is >> tmp;
            if(tmp == '/')
            {
                is >> nenner;
                    b = Bruch(zaehler, nenner);
                return is;
            }
    
    
            is.setstate(std::ios_base::failbit);
            return is;
    }
    Alles anzeigen
  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 26. März 2014 um 17:21
    • #24

    Kann mit keiner helfen? Ich möchte nur dass man bei meiner Bruch Klasse auch zahlen wie 1, 2 ...eingeben kann

  • Jakube
    3
    Jakube
    Mitglied
    Reaktionen
    4
    Punkte
    64
    Beiträge
    12
    • 26. März 2014 um 17:37
    • #25

    Wir wär's mit einem else bei deiner if(tmp==`/`) Abfrage. Wenn es keinen Nenner gibt, dann initialisierst du deinen Bruch einfach mit (zähler,1).

  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 26. März 2014 um 18:09
    • #26

    Die Idee hatte ich zuerst auch, aber es wird ja immer tmp eingelesen. Wenn es jetzt keinen Bruchstrich gibt, gibt es auch kein Nenner, tmp ist also immer das nächste Zeichen des istream. Es wird also immer das nächste Zeichen des darauffolgenden Bruches eingelesen, oder sehe ich das falsch?

  • Jakube
    3
    Jakube
    Mitglied
    Reaktionen
    4
    Punkte
    64
    Beiträge
    12
    • 26. März 2014 um 18:19
    • #27

    Vielleicht kannst du das eine Zeichen wieder zurückschreiben oder zumindest zwischenspeichern.

    Ein einfacher Ausweg wäre aber, dass man nach jeder Eingabe einen Beistrich setzen muss, im Sinn von 1/2, 4, 4/3, 3, ...

  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 26. März 2014 um 19:07
    • #28

    Ja, muss ich mal sehen ob ich noch einen Weg finde um das zurück zu schreiben.

    Einmal editiert, zuletzt von henriknikolas (1. April 2014 um 18:15)

  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 1. April 2014 um 18:18
    • #29

    So jetzt funktioniert das Einlesen als ganze Zahl oder als Bruch sehr gut. Eigentlich ein ziemlich simpler Weg:coolsmile:

    Code
    //Ein- und Ausgabe
    istream& operator>>(istream &is, Bruch &b)
    {
            string ausdruck;
            long long zaehler, nenner;
            is >> ausdruck;
            zaehler = atoi(ausdruck.c_str());
            int pos = ausdruck.find('/');
            if(pos == -1)
            {
                    b = Bruch(zaehler, 1);
                    return is;
            }
            ausdruck.erase(0, pos+1);
            nenner = atoi(ausdruck.c_str());
            b = Bruch(zaehler, nenner);
            return is;
    }
    Alles anzeigen
  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 2. April 2014 um 20:37
    • #30

    Ich brauch noch einmal deine Hilfe. Ich schreibe jetzt an einer Klasse für Gleichungssysteme. Eingabe und Ausgabe funktioniert auch, nur wollte ich noch einen Indexzugriff einbauen. Ich hab aber gesehen, dass es keinen [][] Operator gibt, ich hab dafür auch schon Lösungen im Internet gefunden, aber die funktionierten bei mir nicht so richtig, das liegt wohl wahrscheinlich daran, dass ich es nicht verstanden hab. Meine Klasse sieht so aus:

    Code
    class Gleichungssystem
    {
    public:
    
    
            Gleichungssystem(long long anzahl);
            Gleichungssystem();
            void solve();                                   //Gleichungssystem lösen
            bool kleiner(groesse);                          //Array vergrößern
            bool groesser(groesse);                         //Array verkleinern
            //überladene Operatoren
            //Indexzugriff
    
    
            //Ein- und Ausgabe
            friend istream& operator>>(istream &s, Gleichungssystem &L);
            friend ostream& operator<<(ostream &s, Gleichungssystem L);
    private:
            void tausche(int i, int j);
            void diagonalisieren();
            void einsetzen();
            void read();
            Bruch** Matrix;                                 //Hier werden die Werte gespeichert
            Bruch *Ergebnis;
            long long max;
            bool initialized;
    };
    Alles anzeigen


    Ich möchte jetzt zum Beispiel schreiben können:

    Code
    Gleichungssystem L;
    cin >> L[0][1];


    Weißt du wie ich das hinkriegen kann?

  • henriknikolas
    5
    henriknikolas
    Mitglied
    Punkte
    195
    Beiträge
    36
    • 8. April 2014 um 18:14
    • #31

    Kannst du mir nicht helfen:confused:

  • Jakube
    3
    Jakube
    Mitglied
    Reaktionen
    4
    Punkte
    64
    Beiträge
    12
    • 8. April 2014 um 21:49
    • #32

    Sorry, so im Detail habe ich mich noch nie damit beschäftigt. Müsste selber irgendwo nachlesen und ein paar Dinge ausprobieren, und darauf habe ich im Moment keine Lust.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.
    • 1
    • 2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern