ein Kapitel zurück                                           ein Kapitel weiter

So wie wir die Arrays jetzt kennen gelernt haben könne wir sie uns als eine GERADE vorstellen. Es ist aber auch möglich Arrays in beliebig viele Dimensionen zu definieren.

int Matrix[4][4];    //Zweidimensional

Hiermit haben wir ein Zweidimensionales Array definiert. Bildlich können sie sich das ganze wie bei einer Tabellenkalkulation vorstellen....



Werte können sie ähnlich übergeben wie bei einem eindimensionalen Array...

int Matrix[4][4] = { {10,20,30,40},
                                {15,25,35,45},
                                {20,30,40,50},
                                {25,35,45,55} };






Wenn sie jetzt zum Beispiel auf des Element mit dem Wert von '40' auf unserer Tabelle zugreifen wollen und den Wert auf 100 ändern wollen machen wir das mittels...

Matrix[2][2]=100;

Somit haben wir den Inhalt von Matrix[2][2] verändert. Hier die neue Tabelle....



Ich wiederhole es nochmals. Lassen sie sich nicht vom Index verwirren. Für den Computer ist 0 nicht Dasselbe wie für uns. Für uns sind 0 Mark eben kein Geld also nichts womit wir rechnen brauchen. Aber für den Computer ist die 0 eine Zahl mit der er genauso Arbeiten muss wie mit jeder anderen Zahl. Daher oben die Wertzuweisung 'Matrix[2][2]=..' anstatt wie Menschlich 'Matrix[3][3]=..'

Auch können sie Mehrdimensionale Arrays so deklarieren...

int Matrix[4][4] = { {0},
                                  {1},
                                  {0,1},
                                  {0,0,1} };


Somit haben alle Arrayfelder die sie nicht initialisiert haben Automatisch den Wert 0....

0 0 0 0
1 0 0 0
0 1 0 0
0 0 1 0


In der Praxis werden mehrdimensionale Arrays eigentlich nur bei verschiedenen Arten von Berechnungen benötigt oder bei 2D-Darstellungen von Grafiken. Also schreiben wir mal ein Beispielprogramm wie man mit einem mehrdimensionalen Array umgehen kann......

/*Download:mdarr1.c*/
#include <stdio.h>
#define VOL1 3
#define VOL2 4

int main()
{
int i,j;
int myarray[VOL1][VOL2]; /*[3][4]*/

for(i=0; i<VOL1; i++)
{
for(j=0; j<VOL2; j++)
{
printf("Wert eingeben für myarray[%d][%d]:",i,j);
scanf("%d",&myarray[i][j]);
}
}

printf("\nAusgabe von myarray[%d][%d]......\n\n",VOL1,VOL2);

for(i=0; i<VOL1; i++)
{
for(j=0; j<VOL2; j++)
{
printf("\t%4d ",myarray[i][j]);
}
printf("\n\n");
}
return 0;
}

Es ist eigentlich genauso wie beim normalen Array. Man muss eben nur auf das Indexfeld achten, damit man da nichts verdreht. Ich habe dieses mal das Programm so geschrieben das die Funktion beim übersetzen sich von selbst erklärt. Ein Tipp damit sie besser damit zurechtkommen : Zeichnen sie sich einfach ein Feld 3x4 auf ein Papier, so wie ich es oben gemacht habe. Wenn man, wie in unserem Beispiel, auf alle Arrays zugreifen will ist man hier auch wieder mit der verschachtelten for - Schleife bestens beraten.

Jetzt wollen wir mal ein etwas umfangreicheres Programm schreiben um noch ein bisschen mehr Einblick in das mehrdimensionale Array zu schauen. Das Programm soll ein kleines Zeitkonto für eine Vorgesetzten sein, womit er sich einige Zahlen anschauen kann, wie lange seine Mitarbeiter arbeiten, Durchschnittsberechnungen.....

Noch ein allgemeiner Tipp zu längeren Programmen oder Programme die in mehreren Objektdateien aufgeteilt sind. Mir hat es immer geholfen erst mal die main() - Funktion zu suchen damit kann man leichter Schritt für Schritt nachvollziehen wie das Programm abläuft. Als zweite Möglichkeit steht Ihnen offen das Programm mit einem Debugger Schritt für Schritt ablaufen zu lassen.

/*Download:mdarr2.c*/
#include <stdio.h>
#define ARBEITER 3
#define TAGE 5

int zeitkonto[ARBEITER][TAGE];

/*-1-Ausgabe der Wochenarbeitszeit je Arbeiter*/

void stundenwoche()
{
int i,j,tmp;
for(i=0; i<ARBEITER; i++)
{
tmp=0;
printf("Wochenarbeitszeit von Arbeiter Nr. %d\n",i+1);
printf("-------------------------------------\n");
for(j=0; j<TAGE; j++)
{
printf("|%d Std.",zeitkonto[i][j]);
tmp+=zeitkonto[i][j];
}
printf("| = Ges. %d Std.\n\n",tmp);
}
}


/*-2-Durchschnittszeiten pro Tag in der Woche je Arbeiter*/

void durchschnitttag()
{
int i,j,tmp;
for(i=0; i<ARBEITER; i++)
{
tmp=0;
printf("Durchschnittszeit pro Tag der Woche von Arbeiter Nr. %d\n",i+1);
printf("-------------------------------------------------------\n");
for(j=0; j<TAGE; j++)
{
tmp+=zeitkonto[i][j];
}
printf("Durchschnitt von Arbeiter %d pro Tag : %d Std/Tag\n\n",i+1,tmp/TAGE);
}
}


/*-3-Durchschnittszeit aller Arbeiter pro Tag*/

void durchschnArbTag()
{
int i,j,tmp;
for(i=0; i<TAGE; i++)
{
tmp=0;
printf("Durchschnittliche Arbeitszeit am Tag %d = ",i+1);
for(j=0; j<ARBEITER; j++)
{
tmp+=zeitkonto[j][i];
}
printf("%d Std.\n\n",tmp/ARBEITER);
}
}


/*-4-Gesamt Stunden aller Arbeiter in der Woche*/

void gesamtaArb()
{
int i,j;
int tmp=0;
printf("Gesamtstunden aller Arbeiter in der Woche\n");
printf("-----------------------------------------\n");
for(i=0; i<ARBEITER; i++)
{
for(j=0; j<TAGE; j++)
{
tmp+=zeitkonto[i][j];
}
}
printf("Gesamtstunden aller Arbeiter in dieser Woche : %dStd.\n",tmp);
}


/*-5-Durchschnittstunden pro Tag in der Woche aller Arbeiter*/

void durchaArbWochpTag()
{
int i,j;
int tmp=0;
printf("Durchschnittliche Arbeitszeit aller Arbeiter/Woche/Tag : ");
for(i=0; i<TAGE; i++)
{
for(j=0; j<ARBEITER; j++)
{
tmp+=zeitkonto[j][i];
}
}
printf("%d",tmp/TAGE/ARBEITER);
}

/*Stundenübersichtes eine einzelnen Arbeiters*/

void extra()
{
int arb,tag;
printf("Welcher Arbeiter : ");
scanf("%d",&arb);
printf("Welcher Tag : ");
scanf("%d",&tag);
printf("Arbeiter Nr.%d hat am Tag %d : ");
printf("%d Stunden gearbeitet!\n\n",zeitkonto[arb-1][tag-1]);
}

/*Hauptfunktion*/

int main()
{
int abfrage;
int i,j;
for(i=0; i<TAGE; i++)
{
printf("\tTag %d in der Woche\n",i+1);
printf("\t-------------------\n\n");
for(j=0; j<ARBEITER; j++)
{
printf("Arbeiter Nr.%d in Std.: ",j+1);
scanf("%d",&zeitkonto[j][i]);
}
}

do{
printf("\n\n");
printf("\t-1- Stundenwoche\n");
printf("\t-2- Durchschnitt/Tag\n");
printf("\t-3- Durchschnitt aller Arbeiter/Tag\n");
printf("\t-4- Stunden aller Arbeiter/Woche\n");
printf("\t-5- Durchschnitt pro Woche aller Arbeiter/Tag\n");
printf("\t-6- Einzelauswahl eines Arbeiters\n");
printf("\t-7- ENDE\n");
printf("\n\tIhre Wahl : ");
scanf("%d",&abfrage);
printf("\n");

switch(abfrage)
{
case 1 : stundenwoche();
break;
case 2 : durchschnitttag();
break;
case 3 : durchschnArbTag();
break;
case 4 : gesamtaArb();
break;
case 5 : durchaArbWochpTag();
break;
case 6 : extra();
break;
default: break;
}
}while(abfrage!=7);

return 0;
}

Auch wenn das Programm recht umfangreich ist haben sie wahrscheinlich gemerkt das die Funktionen immer etwa gleich aufgebaut sind. Nur mussten wir darauf achten das Indexfeld richtig hinzuschreiben. In der Funktion 'void extra()' wird demonstriert wie man gezielt auf ein Array zugreifen kann. Das Programm ist natürlich so wie es hier steht noch lange nicht Wasserdicht bzw. stark Verbesserungswürdig wie eine Fehlermeldung falls eine Zahl größer wie 24 Stunden eingegeben wird. Oder Warnungen wenn ein Arbeiter zuviel arbeitet oder zuwenig, ob ein Arbeiter krank war, oder die Stunden sollten anstatt Integer-Werten als Nachkommawerten Aus.-bzw Eingegeben werden.

Wenn man erst mal Angefangen hat ein Programm zu schreiben kann man nicht mehr aufhören immer mehr hinzuzufügen und zu verbessern. Wenn sie wollen können sie mir ja eine Verbesserte Version von diesem Programm schicken. Ich werde es dann unter Ihrem Namen oder Anonym auf dieser Website veröffentlichen. Ich belasse das Programm jetzt mal so wie es ist den dies hier ist ein Kurs und kein Projekt.

Sie sehen mit dem was sie bis jetzt kennen gelernt haben lässt sich schon einiges Bewerkstelligen. Nur wenn sie jetzt wirklich ein Programm in dieser Art oder eine Datenbank schreiben müssen werden sie noch viel bessere vor allem flexiblere Möglichkeiten kennen lernen. Denn was machen sie jetzt wenn 1 neuer Arbeiter hinzukommt bzw. alle 1 Tag mehr arbeiten müssen? Sicher sie könnten das Array so groß machen damit sie keine Problem damit bekommen können wie z.B. 'zeitkonto[100][7]'. Nur verschenken sie so Speicherplatz und kommen trotzdem wieder in Verlegenheit falls sie jetzt 101 Mitarbeiter haben! Es gibt zwar so manche Tricks die Größe eines Feldindexes etwas flexibler (dynamisch) zu machen, aber was machen sie jetzt wenn sie noch die Wochen dazu mitausgeben wollen und das Jahr. Sicher auch hier währe folgende Möglichkeit gegeben...


int zeitkonto[52][7][5];   //[Woche][Tage][Arbeiter]

Nur was glauben sie was das für eine Speicherverschwendung ist...

52*7*5 *4(int) = 7280 Bytes

und wenn sie die Stundendaten auch noch als float oder double Wert ausgeben wollen wird noch mehr verbraten. Nur soviel dazu, nicht das sie denken Arrays sind das Nonplusultra. Bald werden sie mehr erfahren wie man so etwas viel eleganter bewerkstelligen kann.

Wie sie den Feldindex flexibler machen erfahren sie auch noch im laufe des Kurses. Hier benötigen wir dies vorerst nicht.

Zum Abschluss will ich Ihnen nur noch kurz zeigen wie sie ein dreidimensionales Array definieren...


int dreid[2][3][4]={{{6,7,4,3},{6,4,6,9},{3,4,6,7}},
                    {{7,8,6,4},{5,99,3,5},{4,6,7,8}}};


Hier ist eigentlich nur noch eine geschweifte Klammer mehr hinzugekommen.....

int dreid[][][]= {1.Feldindex{2.Feldindex{3.Feldindex}}};

Wenn sie jetzt zum Beispiel auf die erste Zahl die 6 zugreifen wollen schreiben sie dies so...

dreid[0][0][0]    //erste Zahl 6

...oder wollen sie auf die Zahl 99 zugreifen die hat folgenden Index.....

dreid[1][1][1]    //die Zahl 99

Ich belasse es jetzt hiermit bei den mehrdimensionalen Arrays. Es kann sein das damit so gut wie nie in Berührung kommen werden, aber falls ja wissen sie wenigsten bescheid wie sie damit Arbeiten können.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf