matrix
-
Hallo zusammen! Ich habe vor kurzem angefangen zu programmieren und bin auf folgendes Problem gestoßen. Ich habe hier eine Matrix [n][n]
#include <iostream> using namespace std; int main() { int i,j; int x=0; int anzahl; cin>>anzahl; //Eingabe 3 int aendern[anzahl], matrix[anzahl][anzahl]; for(int i=0;i<anzahl;i++){ for(int j = 0;j<anzahl;j++){ cout << "A [" << i+1 <<"] ["<< j+1<<"] : "; cin >> matrix[i][j]; }} //Eingabe:1,2,3,4,5,6,7,8,9 for(int i=0;i<anzahl;i++){ for(int j=0;j<anzahl;j++){ cout << matrix[i][j] << " " ;} cout << endl; } //Ausgabe 1 2 3 // 4 5 6 // 7 8 9 for(int i=0;i<anzahl;i++){ cin >> aendern[i];} // 0 0 0 for(x=0;x<anzahl;x++){ for(i=0;i<anzahl;i++){ for(j=0;j<anzahl;j++){ if(j==x){ matrix[i][j] = aendern[x];} }} } for(int i=0;i<anzahl;i++){ for(int j=0;j<anzahl;j++){ cout << matrix[i][j] << " " ;} cout << endl;} //also //Ausgabe 0 0 0 // 0 0 0 // 0 0 0 return 0; }Mein Problem: bei Zeile 29 gib ich werte ein(z.b. 0 0 0 0)
Diese Werte sollen jeweils eine Spalte verändern
z.B//aendern: 0 0 0 //zuerst //0 2 3 //0 5 6 //0 8 9 //dann //1 0 3 //4 0 6 //7 0 9 //zuletzt //1 2 0 //4 5 0 //6 7 0Wie kann man jetzt diese einzelne Matrixe abspeichern, damit ich am Schluss zum Beispiel
cout << a[1]; //0 2 3 //0 5 6 //0 8 9usw. ausgeben kann und die eigentliche Matrix ohne änderungen auch noch behalte. Ich würde es gern mit Feldern, Zeigern oder Referenzen lösen(so weit ist mein wissenstand)
ich hoffe mir kann jemand helfen.danke
-
Hallo!
Um geänderte und unveränderte Werte der Matrixelemente gleichzeitig zu haben,
ist eine zweite Matrix nötig (Deklaration in Zeile 1).int aendern[anzahl], matrix[anzahl][anzahl], matrix2[anzahl][anzahl]; for(int i=0;i<anzahl;i++) { for(int j = 0;j<anzahl;j++) { cout << "A [" << i+1 <<"] ["<< j+1<<"] : "; cin >> matrix[i][j]; matrix2[i][j]=matrix[i][j]; } }Es wird jeweils nach der Eingabe eines Wertes dieser in die zweite Matrix kopiert (Zeile 8).
So hat man eine Kopie und eine Matrix, die verändert werden kann.Gruß, Lothar.
-
freejack schrieb:
Hallo zusammen! Ich habe vor kurzem angefangen zu programmieren [...]
Ok. Ein paar Tipps:
- Definiere Variablen erst dann, wenn Du sie brauchst. Im Idealfall kannst Du sie auch sofort initialisieren.
- Vermeide lange Funktionen. Du kannst die Arbeit sicherlich irgendwie aufteilen. Das Schreiben von eigenen Funktionen gibt Dir die Möglichkeit, Code an anderen Stellen wiederzuverwenden und ihm einen passenden Namen zu geben, der das Lesen des Programms leichter macht.
- Bei Array-Typen müssen die Grenzen zur Compilezeit bekannt sein. Du hast hier keinen legalen C++ geschrieben, da der Wert von 'anzahl' erst zur Laufzeit feststeht. Wenn Dein C++ Buch Dir so etwas wie std::vector erst in späteren Kapiteln erklärt, schmeiß es weg und hol Dir ein vernünftiges, modernes C++ Lehrbuch.Vorschlag:
#include <vector> typedef std::vector<std::vector<int> > int_matrix; int_matrix intmat_eingabe(); void anzeigen(int_matrix const& im); ... int main() { int_matrix m = intmat_eingabe(); anzeigen(m); ... return 0; }freejack schrieb:
[...] Matrixe [...]
Eine Matrix, mehrere Matrizen.
-
krümelkacker schrieb:
Ok. Ein paar Tipps:[..]
Danke für die Tipps.
Wie man eigene Funktionen schreibt kommt erst und ich möchte zuerst noch die Logik verstehen.krümelkacker schrieb:
- Bei Array-Typen müssen die Grenzen zur Compilezeit bekannt sein. Du hast hier keinen legalen C++ geschrieben, da der Wert von 'anzahl' erst zur Laufzeit feststeht. Wenn Dein C++ Buch Dir so etwas wie std::vector erst in späteren Kapiteln erklärt, schmeiß es weg und hol Dir ein vernünftiges, modernes C++ Lehrbuch.
Das der Wert 'anzahl' festehen muss, weiß ich. Aber ich wusste nicht wie man sonst eine n*n Matrix einliest. Aber vielleicht kommt das erst.
lg
-
freejack schrieb:
Das der Wert 'anzahl' festehen muss, weiß ich. Aber ich wusste nicht wie man sonst eine n*n Matrix einliest. Aber vielleicht kommt das erst.
lgMit herkömmlichen Arrays müssten du dich selbst um das dynamische Anfordern von Speicher kümmern. Falls du das mal probieren willst, sind die Stichwörter
new[]unddelete[]. Aber Krümelkacker hat völlig Recht, der einfachere und weniger fehleranfällige Weg iststd::vector(dieser Container erledigt die ganze Arbeit für dich, was das Speicher reservieren und freigeben angeht).
-
freejack schrieb:
Wie man eigene Funktionen schreibt kommt erst und ich möchte zuerst noch die Logik verstehen.
Was genau meinst Du damit? Also mir fällt es schwer, Deinen Code zu lesen, weil er komisch formatiert ist und aus einer einzigen langen Funktion besteht. Mir fehlt da die Aufteilung in verschiedene Funktionen, mit aussagekräftigen Namen. Sonst sitze ich da erstmal und rätsele, was Du bei den einzelnen Schleifen eigentlich machen willst. Schreibst Du eine Funktion "ausgabe" zum Beispiel, dann kann man das natürlich besser einordnen, was darin passieren soll. Der Überblick bei kleineren Funktionen ist auch besser.
freejack schrieb:
Das der Wert 'anzahl' festehen muss, weiß ich. Aber ich wusste nicht wie man sonst eine n*n Matrix einliest. Aber vielleicht kommt das erst.
Da gibt es mehrere Möglichkeiten. std::vector<std::vector<soundso> > ist eine davon. Alternativ könntest Du Dir auch eine eigene, einfach benutzbare Matrix-Klasse schreiben. Aber das wär dann wahrscheinlich schon etwas fortgeschritten. Die Verwendung von Standard-Containern (wie std::vector, std::list, std::map, etc) lege ich Dir aber nahe, so oder so. Wie gesagt, wenn Dein C++ Lehrbuch erst alle C-Mittel durchnudelt und viel später mit solch extrem praktischen C++-Dingen anfängt, dann brauchst Du typischerweise etwas länger, um zum Ziel zu kommen und gewöhnst Dir eventuell sogar einen schlechten Stil an.