Aufgaben zu Mehrdimensionalen C-Arrays
-
Mein Buch hat jetzt einige Übungsaufgaben zu Mehrdimensionalen C-Arrays.
Ich würde gerne wissen, ob ich richtig an die Aufgaben rangegangen bin, und wenn nicht, würde ich gerne ein paar Tipps bekommen, aber niemals eine fertige Lösung bitte
Außerdem geh ich auf keine edv-Schule oder so, ich mach das ganze aus Eigeninteresse, es handelt sich nicht um Hausaufgaben.5.1: *(kosten+i) und kosten[i] sind äquivalent. Anstatt (kosten+i) könnte man genausogut (kosten+i) schreiben, das Ergebnis der Addition wäre das gleiche. Ist es dann richtig, dass die Schreibweise kosten[i] äquivalent ist zu kosten[i]?
A: Nein, denn mit kosten[i] greift man auf das i'te Element von Kosten zu, und bei i[kosten] greift man auf das kosten'te Element von i zu.5.2: Geben sie den für matrix[2][3] benötigten Speicherplatz in Byte an, wenn sizeof(int) als 4 angenommen wird. An Welcher Bytenummer beginnt das Element matrix[i][j] relativ zum Beginn des Arrays?
A: Der benötigte Speicherplatz für matrix[2][3] ist (2*3)*4 = 24 Bytes. Letzteres versteh ich irgendwie nicht? Was ist mit "Bytenummer" gemeint?5.3: Schreiben sie die Multiplikation zweier Matrizen a[n][m] * b[p][q]. Das Ergebnis soll in einer Matrix c[r][s] stehen. Welche Vorraussetzungen gelten für die Zeilen- und Spaltenzahlen n, m, p, q, r, s?
A: Wie ist das gemeintSoll hier nur die Zahl a[n][m] mit b[p][q] multipliziert werden oder wie ist das gemeint? Ich versteh die Aufgabenstellung nicht
5.4: Schreiben sie zur Ausgabe von dreidimensionalen Arrays eine template-Funktion tabellenausgabe3d(typ tabelle, size_t n). (Templates sind zwar kein C, aber das Kapiteltopic sind nunmal C-arrays, also wohin damit? :D)
A:template<typename typ> void tabellenausgabe3d(typ tabelle, size_t n) { const size_t SPALTEN = sizeof tabelle[0] / sizeof tabelle[0][0]; const size_t WAS = sizeof tabelle[0][0] / sizeof tabelle[0][0][0]; for(size_t i = 0; i < n; ++i) { for(size_t j = 0; j < SPALTEN; ++j) { for(size_t k = 0; k < WAS; ++k) { cout << tabelle[i][j][k] << " "; } } cout << "\n"; } cout << "\n"; }
Funktioniert auch einwandfrei.
Ich würde mich über Antworten freuen^^
-
Incocnito schrieb:
5.1: *(kosten+i) und kosten[i] sind äquivalent. Anstatt (kosten+i) könnte man genausogut (kosten+i) schreiben, das Ergebnis der Addition wäre das gleiche. Ist es dann richtig, dass die Schreibweise kosten[i] äquivalent ist zu kosten[i]?
A: Nein, denn mit kosten[i] greift man auf das i'te Element von Kosten zu, und bei i[kosten] greift man auf das kosten'te Element von i zu.Ich nehmen mal an, die Frage war, ob kosten[i] äquivalent ist zu i[kosten]. In dem Falle ist die Antwort: Doch!
kosten[i] == * (kosten+i) == *(i+kosten) == i[kosten]
Aber schreib das nicht so in richtigen Programmen!5.2: Geben sie den für matrix[2][3] benötigten Speicherplatz in Byte an, wenn sizeof(int) als 4 angenommen wird. An Welcher Bytenummer beginnt das Element matrix[i][j] relativ zum Beginn des Arrays?
A: Der benötigte Speicherplatz für matrix[2][3] ist (2*3)*4 = 24 Bytes. Letzteres versteh ich irgendwie nicht? Was ist mit "Bytenummer" gemeint?Das erste ist richtig. Das zweite meint dies: Mal eindimensional gedacht: Sei int array[3] und sizeof(int)==4 Bytes. Dann ist array[0] am Anfang des Arrays. array[1] ist 4 Bytes weiter. array[2] ist 4 Bytes hinter array[1] und 8 Bytes hinter array[0]. Verstanden?
5.3: Schreiben sie die Multiplikation zweier Matrizen a[n][m] * b[p][q]. Das Ergebnis soll in einer Matrix c[r][s] stehen. Welche Vorraussetzungen gelten für die Zeilen- und Spaltenzahlen n, m, p, q, r, s?
A: Wie ist das gemeintSoll hier nur die Zahl a[n][m] mit b[p][q] multipliziert werden oder wie ist das gemeint? Ich versteh die Aufgabenstellung nicht
Damit ist Matrizenmultiplikation im mathematischen Sinne gemeint. Die formale Definition kannst du auf Wikipedia oder in Mathebformelsammlungen nachlesen. Wenn du das nie im Matheunterricht hattest, wirst du dich damit aber schwer tun.
5.4: Schreiben sie zur Ausgabe von dreidimensionalen Arrays eine template-Funktion tabellenausgabe3d(typ tabelle, size_t n). (Templates sind zwar kein C, aber das Kapiteltopic sind nunmal C-arrays, also wohin damit? :D)
A:template<typename typ> void tabellenausgabe3d(typ tabelle, size_t n) { const size_t SPALTEN = sizeof tabelle[0] / sizeof tabelle[0][0]; const size_t WAS = sizeof tabelle[0][0] / sizeof tabelle[0][0][0]; for(size_t i = 0; i < n; ++i) { for(size_t j = 0; j < SPALTEN; ++j) { for(size_t k = 0; k < WAS; ++k) { cout << tabelle[i][j][k] << " "; } } cout << "\n"; } cout << "\n"; }
Funktioniert auch einwandfrei.
Sieht auch richtig aus. Ich hoffe, das Buch macht klar, dass C-Arrays in C++ eher unüblich sind. Ist aber gut, sie mal gesehen zu haben.
-
Eerstmal danke für die Antwort!
Upps bei erstens hab ich mich vertippt, die Frage lautet richtig:
[...]Ist es dann richtig, dass die Schreibweise i[kosten] äquivalent ist zu kosten[i]?
5.2 leuchtet jetzt auch ein, Bytenummer ist mal wieder ein kompliziertes Wort für eine einfache Sache^^ Jo, hab ich jetzt verstanden, ist ja logisch.
Matrizenmultiplikation? Matheunterricht? Fehlanzeige. Hatte ich noch nie, momentan sind wir in der 9. Klasse auf dem Gymnasium(!) bei dem popeligen Thema "Sinussatz" und "Wurzelgesetze" usw. Gut, dann lasse ich das außen vor.
Und noch zu 5.4:
Ich hab da jetzt const int WAS = ... stehen. Die Bezeichnung Spalte ist klar, zeile auch - aber was ist dann das dritte in der Matrix? Zeile, Spalte und ...?
-
Incocnito schrieb:
Matrizenmultiplikation? Matheunterricht? Fehlanzeige. Hatte ich noch nie, momentan sind wir in der 9. Klasse auf dem Gymnasium(!) bei dem popeligen Thema "Sinussatz" und "Wurzelgesetze" usw. Gut, dann lasse ich das außen vor.
Ja, da hilft die formale Definition auch herzlich wenig, da du vermutlich auch ein Summenzeichen nie gesehen hast. Prinzipiell ist das zwar popelig einfach zu rechnen, aber das ganz allgemein hinzuschreiben benötigt einiges mehr an Abstraktion als man in der 9. Klasse hat.
Und noch zu 5.4:
Ich hab da jetzt const int WAS = ... stehen. Die Bezeichnung Spalte ist klar, zeile auch - aber was ist dann das dritte in der Matrix? Zeile, Spalte und ...?Dafür gibt es kein Wort. Zumindest keines das ich kenne, also wenn es eines gäbe, wäre es nicht verbreitet. Verbreitete Bezeichnungen wären x,y,z für 3D-Matrizen. Oder i,j,k,... wenn man mehr Dimensionen hat. Oder wenn man ganz allgemein arbeitet natürlich mit Nummern i1 bis iN.
-
Okay, gut zu wissen das es kein Wort gibt.
Ich werde wohl bei DIM1 - DIMx bleiben, so wie es mein Buch zu pflegen verwendet, wenn ich denn überhaupt mal wieder C-Arrays verwenden sollte - Vectoren sind ja um einiges bequemer..
Also, danke für die schnellen Antworten