Matrix erstellen
-
Hallo Leute,
bin neu hier und habe erst vor kurzem mit C++ angefangen und nutzen das Programm von Microsoft Visual C++ 2008 Express Edition.Ich möchte nun eine Matrix erstellen. Ich will den kompletten Code selber erstellen. Ich habe lediglich(vorerst hehe) nur eine Frage:
also meine erste Frage ist, wie kann ich ein array erstellen, dessen länge vom Benutzer bestimmt wird? Ich möchte den Benutzer fragen, wieviele Spalten die Matrix haben soll, darauf soll das array spalten[] die länge haben, die der Benutzer möchte. Anschließend soll die nächste Fragen nach der Anzahl der Zeilen gefragt werden, daraufhin soll auch hier das entsprechende array zeilen[] vom benutzer bestimmt werden.
Kurzum
Wie kann ich ein Array erstellen, dessen länge der Benutzer bestimmt?
Danke schonmal für eure Hilfe.
-
Freeza schrieb:
Kurzum
Wie kann ich ein Array erstellen, dessen länge der Benutzer bestimmt?
new[] ist da sehr gut.
aber das macht dann eigentlich nur ein eindimensionales array.
für die zweidimensionalität wäre es dann vermutlich das beste, du würdest die echte arrayposition aus x und y selber berechnen.
aber das speicherverwalten und das matrix-zeug sollte getrennt werden. deswegen mach erstmal nur eins.
entweder eine matrix-klasse, die std::vector zum datenhalten benutzt, oder eine eigene klasse für 1d-arrays, die du später dann in der matrix-klasse benutzen wirst.
-
Hi,
danke für die Antwort.
Problem ist das ich es nicht nutzen darf. Das Programm wird mit abgenommen und bewertet dafür muss ich wissen, was ich da gemacht habe. Des Weiteren dürfen wir nur das nutzen, was wir bisher selber hatten. Ich sage mal so, wir haben gerade erst das Thema Array begonnen. Kann ich nicht folgendes machen?int anzahlZelen[];
int anzahlSpalten[];
cout<<"Bitte gib den Wert der Zeilen und anschließend den Wert der Spalten ein: ";
cin>>anzahlZeilen[];
cin>>anzahlSpalten[];
int matrix[];
matrix[]=anzahlZeilen[i]+anzahlSpalten[i]Das Thema ist für mich noch nicht so leicht. Ich habe nämlich nicht so richtig den Anlauf im Kopf.
-
//int anzahlZelen[]; //nee, die anzahl ist ja noch kein array int anzahlZelen; //int anzahlSpalten[]; //dito int anzahlSpalten; cout<<"Bitte gib den Wert der Zeilen und anschließend den Wert der Spalten ein: "; cin>>anzahlZeilen; cin>>anzahlSpalten; //int matrix[]; //nee int* matrix=new int[anzahlSpalten*anzahlZeilen]; //aua, aber ist das einfachste //und dann statt matrix[x][y]=5; matrix[x+anzahlSpalten*y]=5;
-
volkard schrieb:
... //und dann statt matrix[x][y]=5; matrix[x+anzahlSpalten*y]=5;
guck diesen Teil verstehe ich schon nicht
-
Freeza schrieb:
volkard schrieb:
... //und dann statt matrix[x][y]=5; matrix[x+anzahlSpalten*y]=5;
guck diesen Teil verstehe ich schon nicht
das ist ja auch der schwierigste.
mal angenommen, wie haben 3 spalten und 2 zeilen.[0][0][0] [0][0][0]
und ich schreibe mal fortlaufend zahlen rein.
[0][1][2] [3][4][5]
das sind zugleich die indizes, wie das array im speicher liegt, nämlich so
[0][1][2][3][4][5]
wenn ich jetzt das element in der zweiten spalte und der zweiten zeile ansteuern will, dann muß ich zeilenindexspaltenzahl+spaltenindex rechnen.
23+2=5also für jedesmal, wo der zeilenindex um eins erhäht wird, springe ich um 3 auf einmal weiter. und dann springe ich noch für den zeilenindex innerhalb der zeile bis zum ziel.
-
???
schwer für mich zu verstehen wenn ich ehrlich bin. Kann das nicht ganz nachvollziehen.Muss allerdings die Matrix nur Ausgeben mehr nicht
-
Freeza schrieb:
???
schwer für mich zu verstehen wenn ich ehrlich bin. Kann das nicht ganz nachvollziehen.Lies dir das einfach ein paar mal druch, was volkard geschrieben hat und mach dir selbst ein paar Gedanken darüber, dann verstehst du das Prinzip.
Kleiner Tipp: Du kannst dir das auch so vorstellen, als, wenn du Bier in einem Bierkasten zählen sollst. Da zählst du ja auch nicht jede einzelne Flasche, sondern zählst eine Reihe, dann multiplizierst du das mit der Anzahl vollen Reihen und am Schluss addierst du noch die einzelnen dazu. Genau dasselbe Prinzip.
-
drakon schrieb:
Freeza schrieb:
???
schwer für mich zu verstehen wenn ich ehrlich bin. Kann das nicht ganz nachvollziehen.Lies dir das einfach ein paar mal druch, was volkard geschrieben hat und mach dir selbst ein paar Gedanken darüber, dann verstehst du das Prinzip.
Kleiner Tipp: Du kannst dir das auch so vorstellen, als, wenn du Bier in einem Bierkasten zählen sollst. Da zählst du ja auch nicht jede einzelne Flasche, sondern zählst eine Reihe, dann multiplizierst du das mit der Anzahl vollen Reihen und am Schluss addierst du noch die einzelnen dazu. Genau dasselbe Prinzip.ich verstehe dein Beispiel mit dem Bier
danke. Aber ich verstehe nicht, warum ich am Ende noch was dazuaddieren soll. Wie meinst du das?
-
Okay, mal ganz langsam.
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]Wieviele Kästen sind das? Einzeln zählen? Nein, einfach Länge * Breite wie beim Flächeninhalt berrechnen. 5 * 5 = 25.
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][0][0][0][0]Wieviele Kästen? Na 5 * 4 + 1, das + 1 ist das letzte in der nicht vollen Reihe. So gehts deinem Heap-Array auch.
-
Ad aCTa schrieb:
Okay, mal ganz langsam.
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]Wieviele Kästen sind das? Einzeln zählen? Nein, einfach Länge * Breite wie beim Flächeninhalt berrechnen. 5 * 5 = 25.
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][1][1][1][1]
[1][0][0][0][0]Wieviele Kästen? Na 5 * 4 + 1, das + 1 ist das letzte in der nicht vollen Reihe. So gehts deinem Heap-Array auch.
jop läuft das ist mir auch klar. Aber ich verstehe nicht, was es mit dem 1. Beispiel im Code zutun hat. Das ist mir im Code nicht klar. Das Beispiel mit den einsen hier ist ja plausibel. Einen anderen Ansatz?
-
volkard schrieb:
... //int matrix[]; //nee int* matrix=new int[anzahlSpalten*anzahlZeilen]; //aua, aber ist das einfachste ...
Sag mal ist dein int* ist dieser * ein Pointer? Ich kann damit nicht arbeiten. wofür brauche ich das?
-
Freeza schrieb:
jop läuft das ist mir auch klar. Aber ich verstehe nicht, was es mit dem 1. Beispiel im Code zutun hat. Das ist mir im Code nicht klar. Das Beispiel mit den einsen hier ist ja plausibel. Einen anderen Ansatz?
Lies doch volkards früheren Post solange, bis du ihn verstehst. Er berechnet damit den Index, wenn er nur die Spalte und Zeile kennt.
Freeza schrieb:
Sag mal ist dein int* ist dieser * ein Pointer? Ich kann damit nicht arbeiten. wofür brauche ich das?
Ja, das ist ein Zeiger. Warum solltest du damit nicht arbeiten können? Zeiger brauchst du unter anderem zur dynamischen Speicherverwaltung. Übrigens solltest du den Speicher, den du mit
new
anforderst, mitdelete
wieder freigeben (respektive mitdelete[]
beinew[]
wie hier).Aber mal ehrlich, bist du sicher, dass du eine Matrixklasse schreiben sollst, obwohl ihr scheinbar nicht einmal Arrays richtig behandelt habt, von
new
ganz zu schweigen?
-
Hey also ich habe da mal etwas versucht:
int anzahlZeilen=0; int anzahlSpalten=0; do { cout<<"Bitte Geben Sie die Anzahl der Zeilen ein: "; cin>>anzahlZeilen; }while(anzahlZeilen>4); do { cout<<"Bitte geben Sie die Anzahl der Spalten ein: "; cin>>anzahlSpalten; }while(anzahlSpalten>4); int* matrix = new int[anzahlZeilen*anzahlSpalten];
Ist das soweit richtig? Also wenn ich 5 eingebe wiederholt er die Schleife schonmal *freu*. Wie kann ich denn nun für die eingegebenen Zeilen und Spalten die einzelnen Werte eingeben lassen? Die Eingaben dürfen ja schließlich nicht länger laufen als das Array ja auch ist. Wie kann ich das umsetzen? Danke schonmal für eure Hilfe.
-
Zum Beispiel, indem du die Anzahl Zeilen und Spalten in Variablen speicherst. Dann kannst du mit einer (oder zwei) For-Schleife(n) solange Werte einlesen, wie du die Anzahl Zeilen respektive Spalten noch nicht überschritten hast.
Und wie gesagt: Wenn du das dynamische Array nicht mehr benötigst, schreibe
delete[] matrix;
-
Nexus schrieb:
Zum Beispiel, indem du die Anzahl Zeilen und Spalten in Variablen speicherst. Dann kannst du mit einer (oder zwei) For-Schleife(n) solange Werte einlesen, wie du die Anzahl Zeilen respektive Spalten noch nicht überschritten hast.
Und wie gesagt: Wenn du das dynamische Array nicht mehr benötigst, schreibe
delete[] matrix;
Hey sorry... aber hier habe ich nur Bahnhof verstanden. Wie genau soll ich was anstellen? das dynamische Array? Nein ich glaube das kann ich nicht löschen? ich benötige es doch, da ich es am Ende ja ausgeben soll.
-
Freeza schrieb:
Nein ich glaube das kann ich nicht löschen? ich benötige es doch, da ich es am Ende ja ausgeben soll.
Lies genau. Ich sagte, du solltest es freigeben, wenn du es nicht mehr benötigst. Und doch, irgendwann kommt dieser Zeitpunkt - spätestens bei Programmende.
Freeza schrieb:
Hey sorry... aber hier habe ich nur Bahnhof verstanden. Wie genau soll ich was anstellen? das dynamische Array?
Ich weiss nicht, wie viel Wert das hat, wenn ich das nochmals erkläre. Es haben in diesem Thread schon viele Leute versucht, dir die Thematik beizubringen. Vielleicht schläfst du darüber und schaust dir die Posts morgen nochmals an, dann verstehst du bestimmt mehr.
-
guten Morgen.
aus welchem Grund funktioniert das hier denn nicht?for(i=0;i<anzahlZeilen<i++) { cout<<"Bitte geben Sie den Wert für a1"<<anzahlZeilen+1<<"ein:"; cin>>anzahlZeilen[i]; }
das ist mein Code bisher:
int anzahlZeilen=0; int anzahlSpalten=0; int i,j; do { cout<<"Bitte Geben Sie die Anzahl der Zeilen ein: "; cin>>anzahlZeilen; }while(anzahlZeilen>4); do { cout<<"Bitte geben Sie die Anzahl der Spalten ein: "; cin>>anzahlSpalten; }while(anzahlSpalten>4); for(i=0;i<anzahlZeilen<i++) { cout<<"Bitte geben Sie den Wert für a1"<<anzahlZeilen+1<<"ein:"; cin>>anzahlZeilen[i]; } int* matrix = new int[anzahlZeilen*anzahlSpalten];
Aber warum kann die for Schleife nicht funktionieren?
Schwer das programmieren
-
Freeza schrieb:
guten Morgen.
aus welchem Grund funktioniert das hier denn nicht?for(i=0;i<anzahlZeilen<i++) { cout<<"Bitte geben Sie den Wert für a1"<<anzahlZeilen+1<<"ein:"; cin>>anzahlZeilen[i]; }
"Funktioniert nicht" ist keine gute Fehlermeldung. Normalerweise würd man dich jetzt sitzen lassen bis du die erste Fehlermeldung des Compilers postest. In diesem Fall ists allerdings leicht: Schau dir mal Zeichen für Zeichen deinen for-Schleifen Kopf an und vergleiche ihn mit den Schleifenköpfen aus deinem Buch/Tutorial.
Und dann nimm dir einen Tip zu Herzen: sei nicht so geizig mit den Leerzeichen, die machen den Quellcode einiges lesbarer und hätten dafür gesorgt dass dein Fehler viel einfacher zu finden gewesen wäre.Freeza schrieb:
Schwer das programmieren
So ganz ohne Grips gehts sicher nicht, aber so schwer ists nun auch wieder nicht. Man darf nur nicht erwarten dass gleich alles auf anhieb klappt wie man es sich vorstellt.
-
Wieso verdammt willst du überhaupt dafür Arrays benutzten? Eine eigene Klasse geht tausend mal besser!