C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Problem bei der Initialisierung/Ansprache 2-dimensionaler Ar

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Marc F. Neininger
Guest





PostPosted: Sun Feb 20, 2005 8:07 pm    Post subject: Problem bei der Initialisierung/Ansprache 2-dimensionaler Ar Reply with quote



Hi,

ich soll ein Programm schreiben, das mit Matrizen rechnen
(addieren/multiplizieren) kann. Das Programm soll mit dem C++ Compiler
von Borland nachher kompiliert werden.

Vorgabe ist auch, das Teil mit dynamischen Arrays arbeiten zu lassen.
Kompilierung klappt. Allerdings komme ich nicht in die zweite Dimension.
Das Programm schreibt mir immer genau eine Spalte und das wars dann. Sad
Könnt Ihr mir bitte einen Tipp geben, wo genau sich der Knoten in meinem
Kopf befindet??

Danke.

Marc
P.S.: Unten kommt erst der relevante Auszug aus dem Programm und nach
einem weiteren Schnipp das komplette Programm, falls es jemand
kompilieren will.

<============SCHNIPP=========================
#include #include <iomanip.h>
#include <conio.h>

int SpaltenA,ZeilenA,SpaltenB,ZeilenB;
int *A,*B,*C;
char Rechenoperation;

void eingabe() {
char Eingabetext [20];
cout << "nBitte geben Sie die Spaltenanzahl der ersten Matrix an: ";
cin >>SpaltenA;
cout << "Bitte geben Sie die Zeilenanzahl der ersten Matrix an: ";
cin >>ZeilenA;
cout << "Die Matrix wird " << SpaltenA << "x" << ZeilenA << " Zellen
gross.n";
A = new int[ZeilenA,SpaltenA];
for (int Zeile = 0; Zeile < ZeilenA; Zeile++) {
for (int Spalte=0; Spalte < SpaltenA; Spalte++) {
cout << "Wert fuer A" << Spalte << "," << Zeile << ": ";
cin >> Eingabetext;
A[Spalte,Zeile] = atoi(Eingabetext);
cout << "Adresse: " <<&B[Spalte,Zeile]<<"n";
}
}
....
}


<============SCHNIPP2=========================
KOMPLETTE QUELLE
#include #include <iomanip.h>
#include <conio.h>

int SpaltenA,ZeilenA,SpaltenB,ZeilenB;
int *A,*B,*C;
char Rechenoperation;

void eingabe() {
char Eingabetext [20];
cout << "nBitte geben Sie die Spaltenanzahl der ersten Matrix an: ";
cin >>SpaltenA;
cout << "Bitte geben Sie die Zeilenanzahl der ersten Matrix an: ";
cin >>ZeilenA;
cout << "Die Matrix wird " << SpaltenA << "x" << ZeilenA << " Zellen
gross.n";
A = new int[ZeilenA,SpaltenA];
for (int Zeile = 0; Zeile < ZeilenA; Zeile++) {
for (int Spalte=0; Spalte < SpaltenA; Spalte++) {
cout << "Wert fuer A" << Spalte << "," << Zeile << ": ";
cin >> Eingabetext;
A[Spalte,Zeile] = atoi(Eingabetext);
cout << "Adresse: " <<&B[Spalte,Zeile]<<"n";
}
}

cout << "nBitte geben Sie die Spaltenanzahl der zweiten Matrix an: ";
cin >>SpaltenB;
cout << "Bitte geben Sie die Zeilenanzahl der zweiten Matrix an: ";
cin >>ZeilenB;
cout << "Die Matrix wird " << SpaltenB << "x" << ZeilenB << " Zellen
gross.n";
B = new int[ZeilenB,SpaltenB];
for (int Zeile=0; Zeile for (int Spalte=0; Spalte cout << "Wert fuer B" << Spalte << "," << Zeile << ": ";
cin >> Eingabetext;
B[Spalte,Zeile] = atoi(Eingabetext);
// cin >> B[Spalte,Zeile];
cout << "Adresse: " <<&B[Spalte,Zeile]<<"n";
}
}
}

void addition() {

// Pruefung der beiden Matrizen auf Gleichheit, da ansonsten eine
Addition unmoeglich ist.
if (SpaltenA != SpaltenB || ZeilenA != ZeilenB) {
cout << "Die Dimension der beiden Matrizen ist ungleich.nKeine
Addition moeglich.n";
}

else {
//Initialisierung der Ergebnismatrix
C = new int[SpaltenA,ZeilenA];

//Feldweise Addition der beiden Matrizen
for (int Zeile=0; Zeile for (int Spalte=0; Spalte C[Spalte,Zeile] = A[Spalte,Zeile]+B[Spalte,Zeile];
}
}
cout << "Addition durchgefuehrt.n";

// Ausgabe des Ergebnisses
for (int Zeile=0; Zeile for (int Spalte=0; Spalte cout << C[Spalte,Zeile] << " ";
}
cout << "n";
}
}
}

void ausgabe() {
cout << "nAusgabe der Matrix A: n";
for (int Spalte=0; Spalte < SpaltenA; Spalte++) {
for (int Zeile = 0; Zeile < ZeilenA; Zeile++) {
//cout << "Wert fuer A" << Spalte << "," << Zeile << ": "<<
A[Spalte,Zeile] << "n";
cout.width(Cool;
cout.fill(' ');
cout << A[Spalte,Zeile];
}
cout << "n";
}
cout << "nAusgabe der Matrix B: n";
for (int Spalte=0; Spalte < SpaltenB; Spalte++) {
for (int Zeile = 0; Zeile < ZeilenB; Zeile++) {
//cout << "Wert fuer B" << Spalte << "," << Zeile << B[Spalte,Zeile]
<< "n";
cout.width(Cool;
cout.fill(' ');
cout << B[Spalte,Zeile] << " ";
}
cout << "n";
}
}

void multiplikation() {
if (ZeilenB != SpaltenA) {
cout << "Spaltenanzahl von A ungleich Zeilenanzahl von B.nKeine
Multiplikation moeglich.n";
}
C = new int[ZeilenA,SpaltenB];
}

void main() {
cout << "Programm zur Rechnung mit Matrizenn";
cout << "Bei diesem Programm geben Sie die";
cout << "Bitte wählen Sie, wie Sie mit den Matrizen rechnen wollen:n";
cout << "Matrizenaddition (a) |Multiplikation (m)| Ausgabe (o)|
Programmende (e)";
do {
cout<<"n a|m|o|e:";
switch(Rechenoperation=getch()) {
case 'a': /*Matrizenaddition*/
cout << "Addition zweier Matrizenn";
eingabe();
addition();
ausgabe();
break;
case 'm': /*Matrizenmultiplikation*/
cout << "Multiplikation zweier Matrizenn";
eingabe();
multiplikation();
ausgabe();
break;
case 'o': /*Ausgabe*/ ;
ausgabe();
break;
case 'e': /*Programmende*/ ;
break;
default : cout<< "Bitte geben Sie "a","m", oder "e" ein.n";
break;
}
}
while(Rechenoperation!='e');
cout << "nProgrammendenEinen schoenen Tag noch!nn";
}

//Ende Matrix.cpp

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Sun Feb 20, 2005 11:05 pm    Post subject: Re: Problem bei der Initialisierung/Ansprache 2-dimensionale Reply with quote



Marc F. Neininger wrote:

Quote:
Hi,

ich soll ein Programm schreiben, das mit Matrizen rechnen
(addieren/multiplizieren) kann. Das Programm soll mit dem C++ Compiler
von Borland nachher kompiliert werden.

Vorgabe ist auch, das Teil mit dynamischen Arrays arbeiten zu lassen.
Kompilierung klappt. Allerdings komme ich nicht in die zweite Dimension.
Das Programm schreibt mir immer genau eine Spalte und das wars dann. Sad
Könnt Ihr mir bitte einen Tipp geben, wo genau sich der Knoten in meinem
Kopf befindet??

Danke.

Marc
P.S.: Unten kommt erst der relevante Auszug aus dem Programm und nach
einem weiteren Schnipp das komplette Programm, falls es jemand
kompilieren will.

============SCHNIPP=========================
#include <iostream.h
#include

Diese beiden Header sind seit einigen Jahren veraltet und sollten nicht mehr
verwendet werden. Bei manchen neueren Compilern sind sie nicht einmal mehr
dabei, also wäre dein Programm nur noch kompatibel zu veralteten Compilern.

Quote:
#include
int SpaltenA,ZeilenA,SpaltenB,ZeilenB;
int *A,*B,*C;
char Rechenoperation;

void eingabe() {
char Eingabetext [20];
cout << "nBitte geben Sie die Spaltenanzahl der ersten Matrix an: ";
cin >>SpaltenA;
cout << "Bitte geben Sie die Zeilenanzahl der ersten Matrix an: ";
cin >>ZeilenA;
cout << "Die Matrix wird " << SpaltenA << "x" << ZeilenA << " Zellen
gross.n";
A = new int[ZeilenA,SpaltenA];

Das tut nicht das, was du vielleicht vermutest. Du verwendest den
Komma-Operator, der zuerst beide Argument evaluiert, dann durch den Wert
des rechten ersetzt wird. Der Wert des linken wird verwofen. Die obige
Zeile wird damit äquivalent zu:

A = new int[SpaltenA];

Das dürfte auch das von dir beschriebene Phänomen erklären, da sich dieser
Fehler durch das komplette Programm zieht.

Quote:
for (int Zeile = 0; Zeile < ZeilenA; Zeile++) {
for (int Spalte=0; Spalte < SpaltenA; Spalte++) {
cout << "Wert fuer A" << Spalte << "," << Zeile << ": ";
cin >> Eingabetext;

Was, wenn der Benutzer mehr als 19 Zeichen eingibt?

Quote:
A[Spalte,Zeile] = atoi(Eingabetext);

atoi ist eine schlechte Wahl, da es keine Möglichkeit bietet, zu überprüfen,
ob die Konvertierung erfolgreich war. Besser strtol, aber wieso liest du
nicht direkt von cin in den Integer, so wie du es bei ZeilenA und SpaltenA
auch getan hast?

Quote:
cout << "Adresse: " <<&B[Spalte,Zeile]<<"n";
}
}
...
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Sun Feb 20, 2005 11:06 pm    Post subject: Re: Problem bei der Initialisierung/Ansprache 2-dimensionale Reply with quote



"Marc F. Neininger" <marc (AT) champagnierle (DOT) de> wrote:

Quote:
Hi,

ich soll ein Programm schreiben, das mit Matrizen rechnen
(addieren/multiplizieren) kann. Das Programm soll mit dem C++ Compiler
von Borland nachher kompiliert werden.

Vorgabe ist auch, das Teil mit dynamischen Arrays arbeiten zu lassen.
Kompilierung klappt. Allerdings komme ich nicht in die zweite Dimension.
Das Programm schreibt mir immer genau eine Spalte und das wars dann. Sad
Könnt Ihr mir bitte einen Tipp geben, wo genau sich der Knoten in meinem
Kopf befindet??

Ja. C++ ist kein PASCAL ;-)

1)

Ein Element eines zweidimensionalen Arrays wird mit a[i][j]
und nicht mit a[i,j] spezifiziert. In PASCAL bedeutet beides dasselbe
aber in C und C++ etwas voellig verschiedenes. Deine Syntax ist leider
legal - deshalb wurde sie auch compiliert - sie tut aber etwas voellig
Sinnloses. x[3,4] hat dieselbe Wirkung wie x[4]....

2)

Ein dynamisch angelegtes zweidimensionales Array kann nicht an einem
int* aufgehaegt werden, wenn es mit der Syntax a[i][j] angesprochen
werden soll.

3)

In C und C++ koennen keine mehrdimensionalen Arrays angelegt werden,
wenn ausser der ersten noch weitere Dimensionen zur Compilierzeit
unbekannt sind und das Array mit der Syntax a[i][j][...] angesprochen
werden soll.

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marc F. Neininger
Guest





PostPosted: Mon Feb 21, 2005 4:12 am    Post subject: Re: Problem bei der Initialisierung/Ansprache 2-dimensionale Reply with quote

Horst Kraemer schrieb:

Quote:
1)

Ein Element eines zweidimensionalen Arrays wird mit a[i][j]
und nicht mit a[i,j] spezifiziert. In PASCAL bedeutet beides dasselbe
aber in C und C++ etwas voellig verschiedenes. Deine Syntax ist leider
legal - deshalb wurde sie auch compiliert - sie tut aber etwas voellig
Sinnloses. x[3,4] hat dieselbe Wirkung wie x[4]....
Stuempt. Hab' ich am eigenen Leib erfahren. Uebrigens kam mir die Syntax

auch furchtbar spanisch vor. Allerdings habe ich die verworrene Syntax
dem Compiler zugeschrieben. :-(

Quote:
2)

Ein dynamisch angelegtes zweidimensionales Array kann nicht an einem
int* aufgehaegt werden, wenn es mit der Syntax a[i][j] angesprochen
werden soll.
Mit was fuer einem Zeiger dann? intint* ??


Quote:
3)

In C und C++ koennen keine mehrdimensionalen Arrays angelegt werden,
wenn ausser der ersten noch weitere Dimensionen zur Compilierzeit
unbekannt sind und das Array mit der Syntax a[i][j][...] angesprochen
werden soll.
ARGL! Sollte das etwa heissen, dass die Aufgabe mit den gegebenen

Parametern nicht loesbar ist? Wie wuerdest Du/Ihr das denn dann loesen?

Dankeschoen erstmal. Ich schau' mal, dass ich das verdaut kriege.
Schreck in der Morgenstunde :-/

Marc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marc F. Neininger
Guest





PostPosted: Mon Feb 21, 2005 9:47 am    Post subject: Re: Problem bei der Initialisierung/Ansprache 2-dimensionale Reply with quote

Marc F. Neininger schrieb:
Quote:
Horst Kraemer schrieb:

.....
2)

Ein dynamisch angelegtes zweidimensionales Array kann nicht an einem
int* aufgehaegt werden, wenn es mit der Syntax a[i][j] angesprochen
werden soll.

Mit was fuer einem Zeiger dann? intint* ??

Hier soll eigentlich noch ein Smilie hin. Der ist mir allerdings beim
Lesen heute morgen (leider) erst mal in der Tastatur steckengeblieben.
Wink
.....

Es wuerde sich dann wohl anbieten, das Teil als ein einzelnes Array mit
[Zeile*Spalten] Elementen zu initialisieren. Und dann eine Struktur
(kein struct) drueberlegen...

Marc

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Mon Feb 21, 2005 11:29 am    Post subject: Re: Problem bei der Initialisierung/Ansprache 2-dimensionale Reply with quote

Marc F. Neininger wrote:

Quote:
Horst Kraemer schrieb:

1)

Ein Element eines zweidimensionalen Arrays wird mit a[i][j]
und nicht mit a[i,j] spezifiziert. In PASCAL bedeutet beides dasselbe
aber in C und C++ etwas voellig verschiedenes. Deine Syntax ist leider
legal - deshalb wurde sie auch compiliert - sie tut aber etwas voellig
Sinnloses. x[3,4] hat dieselbe Wirkung wie x[4]....
Stuempt. Hab' ich am eigenen Leib erfahren. Uebrigens kam mir die Syntax
auch furchtbar spanisch vor. Allerdings habe ich die verworrene Syntax
dem Compiler zugeschrieben. Sad

Aus der Tatsache, daß der Compiler etwas akzeptiert, kann man nicht
schließen, daß es auch korrekt ist oder auch tatsächlich das tut, was
gewünscht ist.

Quote:
2)

Ein dynamisch angelegtes zweidimensionales Array kann nicht an einem
int* aufgehaegt werden, wenn es mit der Syntax a[i][j] angesprochen
werden soll.
Mit was fuer einem Zeiger dann? intint* ??

int (*)[k];

Wobei k eine Konstante sein muß.

Quote:
3)

In C und C++ koennen keine mehrdimensionalen Arrays angelegt werden,
wenn ausser der ersten noch weitere Dimensionen zur Compilierzeit
unbekannt sind und das Array mit der Syntax a[i][j][...] angesprochen
werden soll.
ARGL! Sollte das etwa heissen, dass die Aufgabe mit den gegebenen
Parametern nicht loesbar ist? Wie wuerdest Du/Ihr das denn dann loesen?

Prinzipiell kann man sagen, daß es in C++ mehrdimeinsionale Arrays überhaupt
nicht gibt. Man kann allerdings Arrays erzeugen, deren Elemente wieder
Arrays sind.
Es gibt mehrere Lösungen. Du kannst ein eindimensionales Array verwenden und
die Zeilen-/Spalenrechnerei selbst machen, etwa so:

//erzeugen
int* p = new int[Zeilen * Spalten];

//Zugriff
p[a + Spalten * b] = irgendwas;

//Zerstören
delete [] p;

Eine weitere Möglichkeit ist, ein Array aus Zeigern zu verwenden und jeden
dieser Zeiger dann wieder auf ein eigenes Array zeigen zu lassen. Der
Vorteil ist, daß du auf Elemente mit der gewohnten Syntax zugreifen kannst,
dafür wird aber die Allokation und Deallokation etwas umständlicher, und
die Daten sind intern nicht mehr wie in einem "mehrdimensionalen" Array
gespeichert. Das sieht dann grob so aus:

//Erzeugen
int** p = new int*[Zeilen];
for (int i = 0; i < Zeilen; ++i)
p[i] = new int[Spalten];

//Zugriff
p[a][b] = irgendwas;

//Zerstören
for (int i = 0; i < Zeilen; ++i)
delete [] p[i];
delete [] p;

Eine weitere Möglichkeit ist die Verwendung von std::vector statt Arrays. Da
kannst du auch wieder beide Möglichkeiten Verwenden (vector eigener Indexberechnung oder vector<vector.

Quote:
Dankeschoen erstmal. Ich schau' mal, dass ich das verdaut kriege.
Schreck in der Morgenstunde :-/

Ach, nicht gleich verzweifeln.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.