WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Schon wieder ein Problem...mehrdim. Arrays, Zeiger (http://www.wcm.at/forum/showthread.php?t=116585)

Groovy 24.11.2003 21:02

Schon wieder ein Problem...mehrdim. Arrays, Zeiger
 
Tjo wie ihr seht hab ich wieder ein Problem mit dem programmieren.... :rolleyes:

Name, Matrikelnr von mehreren Studenten sollen in mehrdimensionalen Arrays eingetragen werden.
Dabei werden die Matnr + Namen (in der Reihenfolge der Matnr) mit Hilfe des Bubble Sort Algorithmus sortiert und ausgegeben.

Die Namen werden irgendwie mit dem Pointer an die Matrikelnr. zugeordnet und da bin ich am scheitern... :(
Ich weiss nicht einmal wie man Pointer verwendet.
In der Vorlesung wurde nicht einmal ein einziges Wort über Pointer erwähnt. :motz:

Die Halbe Sache hab ich schon erledigt also das Sortieren nach Matnr.

Code:

#include<iostream.h>

void bubble(int iArray[], int );


int main()

{
const int x=5;

int matnr[x];


/* ???
const int s=2;

int matnr[x][s];
cout<<"Geben sie den Namen des Studenten ein:";
cin>>name[i];

???
*/

for(int j=0; j<x; j++){
cout<<"Geben Sie die Matnr ein"<<endl;

cin>>matnr[j];
}
bubble(matnr,x);


}

void bubble(int iArray[], int x) {



for(int i = 0; i < x; i++) {

  for(int j = 0; j < (x - 1); j++) {
    if(iArray[j] > iArray[j + 1]) {
      int iTemp = iArray[j];
      iArray[j] = iArray[j + 1];
      iArray[j + 1] = iTemp;}
        }   
}
for(int z=0; z<x; z++)
cout<<iArray[z]<<endl;
}


Also das einzige was mir fehlt ist die Eingabe und die Ausgabe der Namen die zu der Matnr gehört.

kikakater 24.11.2003 21:20

Du sollst ein Zeigerfeld (Pointerarray) sortieren und nicht die Daten !

Es geht schneller ein Feld über 4 Bytes Zeigeradressen (eine 32 Bit Adresse) zu sortieren, als die Datensatz Blöcke a 100 Bytes.

Code:

struct S_student {
char nachname[30],vorname[20],adresse[40],plz[8],ort[35];
long gebdat /* JJJJMMTT */
 ,matnr;
};

struct S_student gd_student[100],*gp_student[100];

for(i=0;i<100;i++)
{
 gp_student[i]= &gd_student[i];
}

/*

 und jetzt über gp_student[i]->matnr auf die Matrikelnummer zugreifen sowie
mittels lokaler Zeigervariable lp_student einen Austausch der Adressen vornehmen,
die Daten bleiben am ursprünglichen Ort.

*/

lp_student= gp_student[i];
gp_student[i]= gp_student[j];
gp_student[j]= lp_student;

/* es wurden nur Adressen vertauscht, Danke für's Gehirn einschalten :) */

Die Ausgabe erfolgt nicht etwa über:

gd_student[i].<member>
sondern über
gp_student[i]-><member>

/* für alle i von 0 bis zur Anzahl der Studenten - 1 (die Anzahl der Studenten ist jedenfalls / muss jedenfalls sein <= 100) */

g steht übrigens für global
l für lokal
das d für daten
das p für pointer

mfg Kikakater

sagi 24.11.2003 21:22

Der Knackpunkt liegt in dem Fall bei
Zitat:

sollen in mehrdimensionalen Arrays eingetragen werden
Student1:
Name: array[0][0]
Matnr: array[0][1]

Student2:
Name: array[1][0]
Matnr: array[1][1]

...

Das Array dient in diesem Fall als einfachere Form einer Datenstruktur. Beim Verlgeichen der Matrikelnummer verwendest du array[x][1] aber beim Sortieren sortierst du array[x] (Den kompletten Datansatz)

mfg

c.

kikakater 24.11.2003 21:26

Zitat:

Original geschrieben von sagi
Der Knackpunkt liegt in dem Fall bei

Student1:
Name: array[0][0]
Matnr: array[0][1]

Student2:
Name: array[1][0]
Matnr: array[1][1]

...

Das Array dient in diesem Fall als einfachere Form einer Datenstruktur. Beim Verlgeichen der Matrikelnummer verwendest du array[x][1] aber beim Sortieren sortierst du array[x] (Den kompletten Datansatz)

mfg

c.

Wo gibt es eine Erwähnung von Doppel [] ?

Er hat matnr [][] auskommentiert, Array[][] kommt gar nirgends vor *super* :confused: :confused: :confused: :confused: :confused: :confused: :confused:

sagi 25.11.2003 11:19

Zitat:

Wo gibt es eine Erwähnung von Doppel [] ?
im Wort _mehrdimensional_

und ob ich das array nun "matnr" oder "array" nenne ist eignetlich egal, oder?

Groovy 25.11.2003 11:44

Ja, genau so hab ich's gemeint...
Ich habs nur auskommentiert weil ich nicht wusste wie ich das anwenden sollte, naja trotzdem hab ich's hingekriegt. ;)

Naja aber ohne Zeiger halt...

Code:

#include<iostream.h>

void bubble(int iArray[][2], int);


int main()

{

int x;

cout<<"Anzahl der Studenten:"<<" ";
cin>>x;                              //xAnzahl der Studenten
int mat[x][2], temp;                //2 Spalten
char name[x][100];                  //name bis 100 Zeichen lang




for(int j=0; j<x; j++){
cout<<"Geben Sie die Matnr ein:"<<" ";
cin>>mat[j][0];                      //Eingabe der matnr und name in den Feldern
mat[j][1]=j;
cout<<"Geben Sie den Namen ein:"<<" ";
cin>>name[j];
}

bubble(mat,x);        //bubble Aufruf

 for (int j=0; j<x; j++)
  {
    cout <<  mat[j][0] <<" ";
    temp=mat[j][1];
    cout << name[temp] << endl; 
  }

}

void bubble(int iArray[][2], int x) {  //bubble sort Funktion


for(int i = 0; i < x; i++) {

  for(int j = 0; j < (x - 1); j++) {
    if(iArray[j][0] > iArray[j + 1][0]) {
       
      int iTemp = iArray[j][0];
      iArray[j][0] = iArray[j + 1][0];   
      iArray[j + 1][0] = iTemp;
     
      iTemp = iArray[j][1];
      iArray[j][1] = iArray[j + 1][1];
      iArray[j + 1][1] = iTemp;
      }
       
    } 

  }
}


kikakater 25.11.2003 12:27

Verbesserungsvorschlag:

Es reicht matnr[][1] zu sortieren (den Index).


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag