Sorry, mein Handy zeigt mir Teile vom Code falsch an.
Meine Antwort hat dadurch nicht gepasst.
Sorry, mein Handy zeigt mir Teile vom Code falsch an.
Meine Antwort hat dadurch nicht gepasst.
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.
#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:
(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.
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?!?
Kann mit keiner helfen? Ich möchte nur dass man bei meiner Bruch Klasse auch zahlen wie 1, 2 ...eingeben kann
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).
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?
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, ...
Ja, muss ich mal sehen ob ich noch einen Weg finde um das zurück zu schreiben.
So jetzt funktioniert das Einlesen als ganze Zahl oder als Bruch sehr gut. Eigentlich ein ziemlich simpler Weg:coolsmile:
//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
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:
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:
Weißt du wie ich das hinkriegen kann?
Kannst du mir nicht helfen:confused:
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.
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!