Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Arrays (Eigenschaften)

Ähnliche Präsentationen


Präsentation zum Thema: "Arrays (Eigenschaften)"—  Präsentation transkript:

1 Arrays (Eigenschaften)
Arrays oder Felder dienen zur Speicherungen mehrer Variablen des gleichen Typs Sie belegen einen zusammenhängenden Speicherblock Alle Variablen werden über einen gemeinsamen Namen (dem Feldnamen) und einen Index (beginnend bei 0) angesprochen

2 Arraydefinition datentyp name[konstante];
Beispiel: char buchst[26]; Eindimensionales Array vom Typ char mit 26 Elementen. Die Elemente können nun über buchst[0] bis buchst[25] angesprochen werden. Bei der Definition eines Arrays muss die Größenangabe eine Konstante sein.

3 Größe eines Arrays - sizeof
Die Größe (Speicherbedarf) eines Feldes ergibt sich aus Anzahl der Elemente * Größe eines Elementes Die Größe von Datenelementen kann mit dem Operator sizeof ermittelt werden. Beispiel: double werte[1000]; printf(“%d“, sizeof(werte)); liefert 8000

4 Keine Indexprüfung Vorsicht: C prüft nicht eine allfällige Indexüberschreitung. Beispiel: int a[100]; Nach der obigen Felddefinition sind Zuweisungen der Form a[100] = 20; a[200] = 30; a[-3] = 50; möglich! Man überschreibt dabei fremde Speicherbereiche. Bei einem Array mit n Elementen stehen die Elemente mit den Indizes 0, 1, ..., n-1 zur Verfügung. Ein Feld mit n Elementen kann sauber wie folgt abgearbeitet werden: for(i=0; i<n; i++) a[i] = ...;

5 Arrays Beispiel 1 Ein Feld von 100 Integerwerten ist mit zufälligen dreistelligen Zahlen zu füllen. Anschließend ist der größte Zufallswert zu bestimmen und anzuzeigen. int a[100], i, max; for(i=0; i<100; i++) a[i] = rand()% ; max = a[0]; for(i=1; i<100; i++) if(a[i] > max) max = a[i]; printf(“Der groesste Wert des Feldes ist %d\n.“, max);

6 Übung 5_1 Simulieren Sie eine Wurfserie von Würfen mit je drei Würfeln. Die absoluten Häufigkeiten der Augenzahlen sind in einem geeigneten Feld zu speichern. Anschließend ist die Häufigkeitsverteilung graphisch darzustellen.

7 Initialisierung eines Arrays
Ein Array kann bei der Definition auch initialisiert werden. In diesem Fall kann die Größenangabe entfallen. Dann ist die Anzahl der Feldelemente gleich der Anzahl der Initialisierer: int a[] = {1,4,9,16,25,36,49,64,81,100}; Werden zuwenig Initialisierer angegeben, so werden die restlichen Elemente mit Nullen aufgefüllt. int b[5] = {1,2}; erzeugt folgendes Feld: b[0]=1; b[1]=2; b[2]=0; b[3]=0; b[4]=0;

8 Arrays und Zeiger 1 Der Name eines Arrays ist ein konstanter Zeiger auf das erste Feldelement. int a[5] = {1,2,3,4,5}; *a bedeutet nichts anderes als a[0] a a[0] a[1] a[2] a[3] a[4]

9 Zeigeroperationen Folgende Operationen sind mit Zeigern erlaubt:
Addition eines Integerwertes n (nicht mit void-Pointern): Erhöhung der Adresse um n * sizeof(Zeigertyp) Subtraktion eines Integerwertes n (nicht mit void-Pointern): Verminderung der Adresse um n * sizeof(Zeigertyp) Subtraktion zweier Zeiger des gleichen Typs (nicht mit void-Pointern) Vergleiche zweier Zeiger mit <, <=, >, >=, ==, !=

10 Arrays und Zeiger 2 Allgemein gilt also: a[i] ist nichts anderes als *(a+i) a a+1 a+2 a+3 a+4 a[0] a[1] a[2] a[3] a[4]

11 Arrays und Zeiger 3 Das folgende Beispiel addiert die in einem Array abgespeicherten Werte mit Hilfe von Zeigerzugriffen: double f[100], *pd, summe = 0.0, n = 100; // Initialisierung des Feldes pd = f; // pd zeigt auf f[0] while(n--) { summe += *pd; pd++; }

12 Felder als Funktionsparameter
Bei der Übergabe eines Feldes an eine Funktion wird immer nur die Anfangsadresse des Feldes übergeben. Konsequenz: auf Grund der Adresse kann die Funktion nicht entscheiden, wie groß das Feld ist. Es ist also immer auch die Länge des Feldes mitzuübergeben: int f[100]; function(f, 100); function(f, sizeof(feld)/sizeof(feld[0])); /*----Äquivalente Funktionsprototypen----*/ void function(int *a, int n); void function(int a[], int n);

13 Arrays Beispiel 2 (Bubblesort)
Schreiben Sie eine Funktion, die ein Integerfeld von n Elementen aufsteigend sortiert. Verwenden Sie den Sortieralgorithmus Bubblesort. void bubblesort(int *a, int n) { int i, j, h; for(i=1; i<n; i++) for(j=0; j<n-i; j++) if(a[j]>a[j+1]) { h = a[j]; a[j] = a[j+1]; a[j+1] = h; } }

14 Zweidimensionale Arrays
Bei eindimensonalen Arrays wird jedes Element über einen Index angesprochen, bei m-dimensionalen Array über m Indizes. Zweidimensionale Arrays (Tabellen oder Matrizen): datentyp arrayname[zeilen][spalten]; Beispiel: int tabelle[5][4]; Die Abarbeitung erfolgt über verschachtelte for-Schleifen: int z, s; for(z=0; z<5; z++) for(s=0; s<4; s++) tabelle[z][s] = z + s;

15 Zweidimensionale Arrays
Ein zweidimensionales Array ist prinzipiell ein eindimensionales Array, dessen Elemente wieder eindimensionale Arrays (die Zeilen der Tabelle) sind. Dies sieht man schön bei folgender Art der Initialisierung: int f[2][3] = { {1,2,3} , {4,5,6}}; f[0] = {1,2,3}; f[1] = {4,5,6};

16 Zweidimensionale Arrays
Treten zweidimensionale Arrays als formale Parameter auf, so sind folgende Funktionsprototypen äquivalent: void ausgabe(int matrix[8][10], int zeilen); void ausgabe(int matrix[][10], int zeilen); void ausgabe(int (*matrix)[10], int zeilen); Die dritte Schreibweise verdeutlicht, dass es sich bei matrix um einen Zeiger auf int-Arrays der Größe 10 handelt. Mit matrix++ wird um die Größe eines Feldes der Länge 10, also um eine Zeile weitergeschaltet.

17 Übung 5_2 Eine Matrix der maximalen Größe 20 mal 20 ist mit Zufallswerten (1-10) zu füllen und anschließend auszugeben. Danach sind die Zeilen der Matrix aufsteigend nach ihrer Zeilensumme zu sortieren. Die sortierte Matrix ist wieder auszugeben.

18 Strings (Eigenschaften)
Strings (Zeichenketten) sind char-Arrays, deren Inhalt mit dem Zeichen ‘\0‘ (binäre Null abgeschlossen ist. Stringkonstante sind mit Anführungszeichen “...“ zu klammern, z.B. “Ich lerne C“ Es gibt einen String ohne Inhalt, den Leerstring ““

19 Deklaration und Initialisierung
char s[5] = “abcd“; ‘a‘ ‘b‘ ‘c‘ ‘d‘ ‘\0‘ Hier wird Speicherplatz für 5 Charakters bereitgestellt. char *s = “abcd“; Hier wird nur ein Zeiger auf char definiert, der (zunächst) auf das Stringliteral “abcd“ zeigt.

20 sprintf, sscanf Die Bibliotheksfunktionen sprintf und sscanf gestatten formatierte Schreibe- und Lesefunktionen auf bzw. von Strings int sprintf( char *buffer, const char *format [, argument] ... ); int sscanf( const char *buffer, const char *format [, argument ] ... ); Prototypen in stdio.h Der erste Parameter gibt dabei den String an, auf den geschrieben bzw. von dem gelesen wird.

21 Konsole IO mit Strings char * gets(char *s); <stdio.h> dient zum Lesen eines Strings von stdin Dabei wird das abschließende ‘\n‘ als ‘\0‘ im String gespeichert. int puts(char *s); <stdio.h> dient zum Schreiben eines Strings auf stdout Dabei wird das abschließende ‘\0‘ als ‘\n‘ geschrieben.

22 Umgehung von scanf Mit Hilfe der vorgestellten Funktionen kann man nun das unsichere scanf umgehen. Das folgende Beispiel liest 3 Integers und setzt sie zu einer Uhrzeit im Format hh:mm:ss zusammen: char ein[130], zeit[31]; // Eingabestring char *text = “Uhrzeit“; int h, m, s; printf(“Eingabe im Format h,m,s --> „); gets(ein); test = sscanf(ein,“%2d,%2d,%2d“, &h, &m, &s); // Weitere Prüfungen sprintf(zeit, “%s: %02d:%02d:%02d“, text,h,m,s); puts(zeit);

23 Wichtige Stringfunktionen 1
In string.h sind die Prototypen vieler für das Arbeiten mit Strings nützlicher Funktionen definiert. Z.B: size_t strlen( const char *string ); Bestimmt die inhaltliche Länge von string char *strcpy( char *strDestination, const char *strSource ); Kopiert den String strSource nach strDestination char *strcat( char *strDestination, const char *strSource ); Hängt den String strSource an strDestination an

24 Wichtige Stringfunktionen 2
int strcmp( const char *string1, const char *string2 ); Vergleicht die Strings string1 und string2 lexikographisch. Rückgabewert < 0, wenn string1 < string2 Rückgabewert 0, wenn string1 = string2 Rückgabewert > 0, wenn string1 > string2 Variante: stricmp char *strstr( const char *string, const char *strCharSet ); Prüft, ob der String strCharSet im String string enthalten ist und liefert die Adresse der ersten Übereinstimmung, sonst NULL

25 Übung 5_3 Schreiben Sie die Funktionen strlen, strcat strcmp selbst sowie eine Funktion strreverse und testen Sie in einem geeigneten Hauptprogramm.

26 Übung 5_4 Es sind maximal 10 Zeilen Text (max 80 Zeichen Länge) von stdin zu lesen, zu sortieren und wieder auszugeben. Weiters sind jene Strings nocheinmal auszugeben, die einen einzulesenden Teilstring enthalten.


Herunterladen ppt "Arrays (Eigenschaften)"

Ähnliche Präsentationen


Google-Anzeigen