Mehrfachpointer, verschiedene datentypen?
-
Hey also ich habe folgende Aufgabe bekommen:
"Speichern Sie die Namen von n Schülern in einem c-string, desweiteren sollen mündliche Noten(max. 10) und schriftliche Noten(max. 3) dem Schüler zugeordnet werden. Zu lösen ist diese Aufgabe mit Mehrfachpointern. Eingabe und Ausgabe des Namen + Noten selbstverständlich auch. Dies soll desweiteren per dyn. Speicher erfolgen."Hier mein bisheriger Quelltext für den Namen:
char **ptr = new char*[size]; for (i=0; i<size; ++i) { ptr[i] = new char[20]; }
Nun zu meinen Fragen:
1. Wie erstelle ich daraus einen Mehrfachpointer mit 4-facher Rangordnung
2. Es ist normalerweise ja nicht möglich in einem char Pointer int (für die Noten zu speichern) Hat jemand eine Idee zur lösung der aufgabe?PS: Es MUSS mit Mehrfachpointern gehen, NICHT mit klassen/strukturen...
Vielen Dank für eure Hilfe
-
warum solltest du noten nich in chars speichern können
char val = 5; char val_array[6] = { 1,2,3,4,5,6 };
was verstehst du unter vierfacher rangordnung?
char****
oder
char[][][][]
-
Jo klar geht das ^^ gibt es aber eine möglichkeit char Arrays und int arrays per pointer zu "verlinken" ? nein oder?
btw: weißt du vielleicht den quelltext für nen 4-fachpointer mit namen + 2 notentypen?
EDIT: Quasi das am ende ptr[][][][] dabei rauskommt...
Es sollen ausserdem Notenpunkte sein also von 1-15 und char speichert ja nur eine stelle
-
wie verlinken?
is nich gerade hübsch aber meinst du sowas?char* ptr[2] = {NULL,NULL}; int val[2]= {100,200}; ptr[0] = ( char* ) &val[0]; ptr[1] = ( char* ) &val[1]; int read_val[2] = { *( int* ) ptr[0], *( int* ) ptr[1] };
-
char **ptr = new char*[3*size]; for (i=0; i<3*size; i+=3) { ptr[i] = new char[20]; ptr[i+1] = new char[1]; ptr[i+2] = new char[1]; }
Du kannst in einem Char ja entweder eine Zahl zwischen 0 und 255 speichern oder du nimmst einfach das Zeichen '1', '2', ...
Bzw du nimmst char[2] und speicherst es als "1", "2" (0-terminierter String) und beim Ausgeben machst du:cout << "Name: " << ptr[i] << "\tS-Note: " << ptr[i+1] << "\tM-Note : " << ptr[i+2] << endl;
und da wieder ne Schleife drum wie oben.
so far
Phil
EDIT1/2: Tippfehler
-
del me
-
nope mhm vielleicht versuch ich mal anders ranzugehen
also:char **ptr = new char*[size]; for (i=0; i<size; ++i) { ptr[i] = new char[20]; }
erstellt ja nen 2-dim. Array > ptr[][]
wie muss ich diesen Quelltext umändern um einen 4-dim. Array hinzubekommen - siehe aufgabenstellung?!
also > ptr[][][][];
-
int i,j,k; int size = 10; char**** ptr; ptr = new char*** [size]; for ( i = 0; i < size; i++ ) ptr[i] = new char** [size]; for ( i = 0; i < size; i++ ) for ( j = 0; j < size; j++ ) ptr[i][j] = new char* [size]; for ( i = 0; i < size; i++ ) for ( j = 0; j < size; j++ ) for ( k = 0; k < size; k++ ) ptr[i][j][k] = new char [size];
-
ACidernie schrieb:
Es sollen ausserdem Notenpunkte sein also von 1-15 und char speichert ja nur eine stelle
Wenn du es als Zeichen ausgibst ja, als Wert stehen aber 256 Zahlen zur Verfuegung.
pli schrieb:
cout << "Name: " << ptr[i] << "\tS-Note: " << ptr[i+1] << "\tM-Note : " << ptr[i+2] << endl;
aendern in
cout << "Name: " << ptr[i] << "\tS-Note: " << (int)ptr[i+1][0] << "\tM-Note : " << (int)ptr[i+2][0] << endl;
und schon gehts.
-
thx Sovok sieht super aus ^^
glaub damit kann ich was anfangen, wenn ich noch probs hab poste ich hier wieda rein...EDIT: mhm ich glaub es is doch viel zu viel speicher reserviert ^^
ich brauch ja z.b. bei 5 namen max. 20 zeichen also5*20 = 100 zeichen + 5*10 mündl. notenpunkte = 50 + 5*3 schriftl. Notenpunkte = 15 = 165 zeichen...
aber wenn ich nun > ptr[5][20][10][3] = ptr[Anzahl][Zeichen][mündl.][schriftl.]
zuordne sind das doch viel zu viel oder irre ich mich?
-
So also ich wollte nun den Namen speichern und habe folgendes Problem...
Hier erstmal der Quelltext...int main() { int i,j,k,l; int size = 5; char**** ptr; ptr = new char*** [size]; for ( i = 0; i < size; i++ ) ptr[i] = new char** [20]; for ( i = 0; i < size; i++ ) for ( j = 0; j < 20; j++ ) ptr[i][j] = new char* [10]; for ( i = 0; i < size; i++ ) for ( j = 0; j < 20; j++ ) for ( k = 0; k < 10; k++ ) ptr[i][j][k] = new char [3]; for ( i = 0; i < size; i++ ) for ( j = 0; j < 20; j++ ) for ( k = 0; k < 10; k++ ) for ( l = 0; l < 3; l++ ) { ptr[i][j][k][l] = '\0'; } for ( i = 0; i < size; i++ ) for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ ) { ptr[i][j][0][0] = cin.get(); } for ( i = 0; i < size; i++ ) for ( j = 0; j < 20; j++ ) { cout<<ptr[i][j][0][0]; } getchar(); return 0; }
in
for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
überprüfe ich ja ob Enter gedrückt wurde allerdingt kommt eine fehlermeldung beim ausführen... änder ich jedoch [j-1] in [j] gehts, jedoch ist ja so der sinn "entstellt"
-
for ( j = 0; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ )
denk mal über den ersten durchlauf nach
ptr[i][-1][0][0] != '\n';
natürlich gibt das n fehler... kannst ja ned auf index -1 zugreifen
-
ahh vielen dank für die schnelle hilfe ^^
-
##include <iostream.h> #include <conio.h> void clear(); int main() { int i,j,k,l; int size_sch=1, size_mdl=1, size_sfl=1,Summe_mdl=0,Summe_sfl=0; char**** ptr; ptr = new char*** [size_sch]; for ( i = 0; i < size_sch; i++ ) ptr[i] = new char** [20]; for ( i = 0; i < size_sch; i++ ) for ( j = 0; j < 20; j++ ) ptr[i][j] = new char* [size_mdl]; for ( i = 0; i < size_sch; i++ ) for ( j = 0; j < 20; j++ ) for ( k = 0; k < size_mdl; k++ ) ptr[i][j][k] = new char [size_sfl]; for ( i = 0; i < size_sch; i++ ) for ( j = 0; j < 20; j++ ) for ( k = 0; k < size_mdl; k++ ) for ( l = 0; l < size_sfl; l++ ) { ptr[i][j][k][l] = '\0'; } i=0; while(i<size_sch) { clear(); clrscr(); cout<< i+1 << ". Name: "; for ( j = 1; j < 20 && ptr[i][j-1][0][0] != '\n'; j++ ) ptr[i][j][0][0] = cin.get(); clear(); for( k = 0; k < size_mdl; k++ ) { clear(); cout<< k+1 << ". Notenpunkte mündl.: "; cin>>ptr[i][0][k][0]; } clear(); for( l = 0; l < size_sfl; l++ ) { clear(); cout<< l+1 << ". Notenpunkte schriftl.: "; cin>>ptr[i][0][0][l]; } i++; } cout<< endl<<endl; i=0; while(i<size_sch) { for ( j = 1; j < 20; j++ ) cout<< ptr[i][j][0][0]; for( k = 0; k < size_mdl; k++ ) { cout<< endl << ptr[i][0][k][0]<<endl; } for( l = 0; l < size_sfl; l++ ) { cout<<ptr[i][0][0][l]<<endl; } i++; } getchar(); return 0; } void clear() { cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); }
nun folgendes problem:
bei der ausgabe der mündl. note gibt er immer die schriftliche aus...
is ja klar weil einma die beiden fälle gleich sind... aber ka wie ich das umschreibe
-
-.-