C-Tutorials.de Logo

zum Inhaltsverzeichnis

C Tutorial: Eindimensionale und mehrdimensionale Arrays


Jetzt kannst du eigentlich alle Grundlegenden Dinge. Alles was jetzt kommt, macht den Code kürzer, übersichtlicher und einfacher.

Eindimensionale Arrays:

Arrays dienen dazu, zusammengehörige Variablen gleichen Typs zusammenzufassen. Hier die Definierung und Initialisierung eines Arrays:

int Lottozahlen[6] = {3,37,12,1,49,8};

Grundsätzlich ist es so, dass ein Array einen Datentyp und einen Namen hat. Danach folgt allerdings eine öffnende eckige Klammer '[' die Anzahl der „Elemente“, welche dieses Array hat, eine schließende eckige Klammer ']', ein '=', eine öffnende geschweifte Klammer '{' und jetzt werden hier den einzelnen „Untervariablen“ hier Werte zugewiesen. Zum Schluss folgt die schließende geschweifte Klammer '}'. Jede Variable ist zur nächsten durch ein Komma ',' getrennt.
Dann machst du das Semikolon ';' direkt nach der schließenden geschweiften Klammer '}'.
Bei der Initialisierung des Arrays musst du entweder allen „Untervariablen“ einen Wert zuweisen oder gar keiner.
Du musst unbedingt darauf achten, das alle „Untervariablen“ des Arrays den selben Datentyp haben! Verschiedenen Datentypen sind nicht erlaubt!

Jetzt weißt du zwar, wie man ein Array Definiert und Initialisiert, aber nicht wie man daraus ließt oder gar schreibt. Zuerst das Lesen:

#include <stdio.h>

int main ()
{
int Lottozahlen[6] = {3,37,12,1,49,8};

  printf("Die Lottozahlen:\n");
  printf("%i ",Lottozahlen[0]);
  printf("%i ",Lottozahlen[1]);
  printf("%i ",Lottozahlen[2]);
  printf("%i ",Lottozahlen[3]);
  printf("%i ",Lottozahlen[4]);
  printf("%i",Lottozahlen[5]);

  /* Alternativ wäre auch
  printf("%i %i %i %i %i %i",Lottozahlen[0],Lottozahlen[1],Lottozahlen[2],Lottozahlen[3],Lottozahlen[4],Lottozahlen[5]);
  möglich gewesen */

  getch();
}

Alles funktioniert so wie bei jeder anderen Variablen auch, nur das man bei einem Array zuerst den Namen des Arrays und in den in den eckigen Klammern '[ ]' dann die wievielte Element ausgelesen werden soll. An dieser Stelle musst du ganz besonders aufpassen! Das für den Menschen erste Element, in der Reihe der Element, ist für den Computer das nullte. Das heißt hier musst du immer bei 0 anfangen zu zählen! Deshalb ist in diesem Fall auch das fünfte und nicht das sechste Element das letzte.
Aber nun zum Schreiben in ein Array:

#include <stdio.h>

int main ()
{
int Lottozahlen[6];

  Lottozahlen[0] = 3;
  Lottozahlen[1] = 37;
  Lottozahlen[2] = 12;
  Lottozahlen[3] = 1;
  Lottozahlen[4] = 49;
  Lottozahlen[5] = 8;

  printf("Die Lottozahlen:\n");
  printf("%i ",Lottozahlen[0]);
  printf("%i ",Lottozahlen[1]);
  printf("%i ",Lottozahlen[2]);
  printf("%i ",Lottozahlen[3]);
  printf("%i ",Lottozahlen[4]);
  printf("%i",Lottozahlen[5]);

  /* Alternativ wäre auch
  printf("%i %i %i %i %i %i",Lottozahlen[0],Lottozahlen[1],Lottozahlen[2],Lottozahlen[3],Lottozahlen[4],Lottozahlen[5]);
  möglich gewesen */

  getch();
}

Eine Zuweisung, wie bei jeder anderen Variablen auch. Nur das wie beim lesen auch in den eckigen Klammern '[ ]' das Element angegeben wird, in welches geschrieben wird. Auch hier ist das erste Element wieder das nullte!
Grundsätzlich solltest du beim Lesen, sowie beim Schreiben in ein Array darauf achten, dass du nicht in undefinierte Elemente schreibst bzw. ließt. Das kann (bzw. wird in den meisten Fällen) einen Programmabsturz zur Folge haben!

Aufgabe 1:

Für diese Aufgabe, brauchst du 4 neue Funktion. Die erste heißt 'rand()'. Sie liefert eine Zufallszahl. Doch bevor du 'rand()' ausführst, musst du mit der Funktion 'srand()' der 'rand()'-Funktion einen neuen Startwert zuweisen, weil 'rand()' sonst immer die selben „Zufallszahlen“ in der selben Reihenfolge zurück gibt. 'srand()' musst du dann allerdings immer eine andere (Ganz-)zahl übergeben. Das erreichst du, indem du 'srand()' einfach den Rückgabewert der Funktion 'timeGetTime()' übergibst. Diese Funktion gibt die Laufzeit des Betriebssystems seit dem letzten Start in Millisekunden zurück. Für 'rand()' musst du den Header 'stdlib.h' (standard library) und für für 'timeGetTime()' 'windows.h' einbinden.

Weil das jetzt vielleicht ein bisschen viel Text ohne Beispielcode war, hier ein Programm, dass immer eine Zufallszahl zwischen 0 und 9 ausgibt:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main ()
{
  srand(timeGetTime()); //srand den Rückgabewert von timeGetTime übergeben

  printf("%i",rand() % 10); //Die Zufallszahl wird mit Modulo verrechnet
  //Zahl, duch die Modulo gerechnet wird -1 ist die Zahl, die als höchstes herauskommen kann.

  getch();
}

Hier ist sie nun, deine Aufgabe zu eindimensionalen Arrays: Schreibe ein Programm, das dir mithilfe der rand-Funktion 6 Lottozahlen generiert, in ein Array speichert und dann aus dem Array wieder ausließt und ausgibt. Das speichern der Zufallszahlen macht an dieser Stelle wenig Sinn, man könnte sie auch einfach gleich ausgeben. Den Sinn erhält die Sache in Aufgabe 2. Tipp: for-Schleife(n) nicht vergessen ;). Lösung:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main ()
{
int Lottozahlen[6];
int i;

  srand(timeGetTime()); //neuen Startwert zuweisen

  for(i=0;i<6;i++)
    {
      Lottozahlen[i] = (rand()%49)+1; //rand() liefert auch 0 zurück. Darum +1
    }
  /*Den Code in der Schleife, könnte man auch für alle 6 Zahlen extra
  in den Code schreiben, aber genau für soclhe Sachen gibts Schleifen!*/

  printf("Die Lottozahlen:\n");
  for(i=0;i<6;i++)
    {
      printf("%i ",Lottozahlen[i]);
    }
  //Auch hier hätte man alles extra schreiben können.
  getch();
}

Aufgabe 2:

Du hast vielleicht gemerkt, dass das Programm aus Aufgabe 1 manchmal zwei Mal oder öfters die selbe Lottozahl zurück gibt. Das kannst du so nicht auf dir sitzen lassen und deshalb darfst du den Code von Aufgabe 1 so erweitern, das eine Überprüfung stattfindet, ob die Zahl schon mal gezogen wurde, bevor dem Element die Zufallszahl zugewiesen wird. Lösung:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main ()
{
int Lottozahlen[6] = {0,0,0,0,0,0}; /*jetzt ist eine Initialisierung notendig,
weil sonst etwas bei der Überprüfung schief gehen könnte*/
int i;
int TempZahl = 0;

  srand(timeGetTime());

  for(i=0;i<6;i++)
    {
      while(TempZahl == Lottozahlen[0] || TempZahl == Lottozahlen[1] || TempZahl == Lottozahlen[2]
        || TempZahl == Lottozahlen[3] || TempZahl == Lottozahlen[4] || TempZahl == Lottozahlen[5])
      {
          TempZahl = (rand()%49)+1;
        }
      Lottozahlen[i] = TempZahl;
    }

  printf("Die Lottozahlen:\n");
  for(i=0;i<6;i++)
    {
      printf("%i ",Lottozahlen[i]);
    }

  getch();
}

Zweidimensionale und mehrdimensionale Arrays:

Ein Array kann nicht nur eine dimension an Elementen enthalten, sondern es sich auch mehrere Dimensionen möglich. Jede Dimension hat allerdings die selbe Anzahl an Elementen. Definirung und Initialisierung eines zweidimensinalen Arrays:

int Positionen[3][2] = {{8,4},{9,4},{7,5}};

Wie du vielleicht siehst, gibt es hier 2 Diemnsionen, die erste Dimension hat 3 Elemente, wobei jedes Element wieder ein Array ist und 2 Elemente enthält
Lesen und Schreiben funktioniert genauso wie bei den eindimensionalen Arrays. Beispiel um den Wert "9" aus dem oben gezeigten zweidimensionalen Array auszulesen:

printf("%i",Positionen[1][0]);

Das heißt, auch hier wird bei 0 angefangen zu zählen.
Ein Beispiel für ein dreidimensionales Array:

int Positionen[4][3][2] = {{{8,4},{9,4},{7,5}},
                                        {{8,4},{7,5},{9,4}},
                                        {{9,4},{8,4},{7,5}},
                                        {{7,5},{9,4},{8,4}}};

Theoretisch kannst du das mit den Dimensionen bis unendlich treiben, allerdings wird es für uns Menschen mit der vierten Dimension schwer. Das hängt damit zusammen, dass wir auch nur in drei Dimensionen sehen können.

Aufgabe 3:

Für diese Aufgabe, brauchst du etwas, das dir den Curser in der Konsole an eine bestimmte Stelle setzt, das du dort etwas ausgeben kannst. Dazu kopierst du dir einfach diesen Code zwischen die includes und 'int main ()':

void gotoxy(int x, int y)
{
COORD position;

  position.X = x;
  position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}

Mehr dazu in einem späteren Teil, in welchem ich Unterprogramme erklären werde. Jetzt kannst du, indem du in deinem Code 'gotoxy(X,Y);' schreibst anstelle des X und Y einen Wert (bzw. eine Variable/Array) eintragen und der Curser wird an diese Position gesetzt. 0,0 liegt links oben in der Ecke. 79,24 rechts unten in der Ecke. Das heißt die Konsole ist 80 Zeichen breit und 25 Zeichen hoch.
Jetzt sollst du aus diesem zweidimensionalen Array die x und y Position auslesen, den Curser an diese Stelle Positionieren und an dieser Stelle ein Zeichen deiner Wahl ausgeben:

int Positionen[9][2] = {{10,4},{9,4},{8,4},{7,5},{7,6},{7,7},{8,8},{9,8},{10,8}};

Lösung:

#include <stdio.h>
#include <windows.h>

void gotoxy(int x, int y)
{
COORD position;

  position.X = x;
  position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}

int main ()
{
int Positionen[9][2] = {{10,4},{9,4},{8,4},{7,5},{7,6},{7,7},{8,8},{9,8},{10,8}};
int i;

  for(i=0;i<9;i++)
    {
      gotoxy(Positionen[i][0],Positionen[i][1]); //Curser nacheinander an die Positionen ausrichten
      printf("#"); //Zeichen deiner Wahl
      Sleep(350);
      /*Diese Funktion, welche in 'windows.h' deklariert ist,
      lässt den Computer, in diesem Fall, 350 Millisekungen warten.*/
    }

  getch();
}

zum Inhaltsverzeichnis