ARRAY oder FELD oder VEKTOR

195
ARRAY oder FELD oder VEKTOR

description

ARRAY oder FELD oder VEKTOR. Aufgabe :. Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. int main(){ int a; int b; int c; //. - PowerPoint PPT Presentation

Transcript of ARRAY oder FELD oder VEKTOR

Page 1: ARRAY  oder FELD oder VEKTOR

ARRAY

oder

FELD

oder

VEKTOR

Page 2: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden.

Page 3: ARRAY  oder FELD oder VEKTOR

int main(){ int a; int b; int c; //...

Page 4: ARRAY  oder FELD oder VEKTOR

printf("1.Zahl eingeben\n");scanf("%d", &a);fflush(stdin);

printf("2.Zahl eingeben\n");scanf("%d", &b);fflush(stdin);

printf("3.Zahl eingeben\n");scanf("%d", &c);fflush(stdin); printf("umgekehrt: %d %d %d",

c, b, a);

Page 5: ARRAY  oder FELD oder VEKTOR

return 0;}

Page 6: ARRAY  oder FELD oder VEKTOR

SchreibaufwendigeLösung !

Was ist der Nachteil ?

Page 7: ARRAY  oder FELD oder VEKTOR

keine "nächste" Variable:a b c

Warum nicht mit Schleife lösbar ?

Page 8: ARRAY  oder FELD oder VEKTOR

Man benötigt:Eine Variable, die aus mehreren Zellen (Elementen) besteht und deshalb gleichzeitig mehrere Werte speichern kann.Dies ist eine indizierte Variable, ein sogenanntes Feld (Array, Vektor).

Page 9: ARRAY  oder FELD oder VEKTOR

13 17 19 23 27

Der Index der ersten Zelle (Element) ist 0Die Feldlänge ist 5

0 1 2 3 4

Page 10: ARRAY  oder FELD oder VEKTOR

C-Syntax

Page 11: ARRAY  oder FELD oder VEKTOR

int v[3];

Datentyp: Jede Zelle hat den gleichen Datentyp

Variablenname

Länge des Feldes: KONSTANTE !!!

Diese Feldlänge ist eine Konstante und muß dem Compiler bei der Übersetzung des Programms bekannt sein.

Sie kann NICHT während des Programmlaufs (z.B. durch den Anwender über Tastatur) verändert werden !!!

Page 12: ARRAY  oder FELD oder VEKTOR

v[2]=19;

int main(){

? ? ?? ? 19

v[0]=17; 17 ? 19v[1]=13; 17 13 19x=2; 17 13 19

? ?

v x y

v[x]=23; 17 13 23y=v[1]; 17 13 23v[x]=y; 17 13 13

? ?? ?? ?2 ?2 ?2 132 13

int v[3],x,y;

Page 13: ARRAY  oder FELD oder VEKTOR

int main(){ int len; scanf("%d",&len); fflush(stdin); int v[len]; v[len-2]=123; return 0; }

Weil Feldlänge len eine Konstante sein muß !!

Warum ist dieses Programm syntaktisch falsch ? (Compiler meldet einen Fehler)

Page 14: ARRAY  oder FELD oder VEKTOR

int main(){ int v[3]; v[3]=56;

Dies kann schwer erkennbare Fehler nach sich

ziehen. Siehe später !

Warum macht diese Anweisung Probleme ?

Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 4. Zelle des Feldes !

Page 15: ARRAY  oder FELD oder VEKTOR

// 12 = 3*Speicher(int)

int main(){ int v[3]; size_t erg;

erg = sizeof(v);

// Welchen Wert hat erg ?

Liefert Speicherplatzbedarf einer Variable.

return 0;

}

Page 16: ARRAY  oder FELD oder VEKTOR

Initialisierung bei der Deklaration int zahlen[4]={23,7};

double d[4]={1.4,7.3,2,4};

23 7 ? ?

1.4 7.3 2.0 4.0

Page 17: ARRAY  oder FELD oder VEKTOR

int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0;}

// mit VC++ 6.0 kompiliert.// Ausgabe auf Bildschirm:// 20

Warum macht diese Anweisung Probleme ?

Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 5. Zelle des Feldes w !

Page 18: ARRAY  oder FELD oder VEKTOR

int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0;}

Arbeitsspeicher -Ausschnitt

w[0] 0100 500104 600108 700112 100116

...

w[1]w[2]

...

v[0]v[1]

Der Teil des Speichers, in dem diese Variablen gespeichert werden, nennt man den STACK.Er „wächst“ in Richtung der kleineren Adressen. Welche Variablen werden also hier ab dieser Adresse hintereinander abgespeichert?

20

r 0096 ?

Adresse Inhalt

Page 19: ARRAY  oder FELD oder VEKTOR

int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0;}

Arbeitsspeicher -Ausschnitt

w[0] 0100 500104 600108 700112 100116

...

w[1]w[2]

...

v[0]v[1]

Was wird also in r gespeichert und auf dem Bildschirm ausgegeben?

20

r 0096 ?

w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1].

Adresse Inhalt

Page 20: ARRAY  oder FELD oder VEKTOR

int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0;}

Arbeitsspeicher -Ausschnitt

w[0] 0100 500104 600108 700112 100116

...

w[1]w[2]

...

v[0]v[1] 20

r 0096 20

Was wird also in r gespeichert und auf dem Bildschirm ausgegeben?

w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1].

Adresse Inhalt

Page 21: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Drei über Tastatur eingegebene Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

Page 22: ARRAY  oder FELD oder VEKTOR

int main(){ int i; // Zähler int v[3]; // Feld i=0; while(i<3){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

Page 23: ARRAY  oder FELD oder VEKTOR

printf("Zahlenausgaben\n"); i=2; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0;}

Page 24: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Verändern Sie das letzte Programm so, daß 10 über Tastatur eingegebene Zahlen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

Page 25: ARRAY  oder FELD oder VEKTOR

int main(){ int i; int v[10]; i=0; while(i<10){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

hier muß eine Änderung gemacht werden

hier muß eine Änderung gemacht werden

Page 26: ARRAY  oder FELD oder VEKTOR

printf("Zahlenausgaben\n"); i=9; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0;}

hier muß eine Änderung gemacht werden

Welchen Nachteil haben diese vielen Änderungen für den Programmierer ?

Der Programmierer kann eine zu tätigende Änderung

einfach übersehen.

Page 27: ARRAY  oder FELD oder VEKTOR

Deswegen ist es besser mitsogenannten Konstanten zu arbeiten.

(Die Feldlänge muß eine Konstante sein !)

Page 28: ARRAY  oder FELD oder VEKTOR

int main(){ int v[10]; ...

int main(){ const int LEN = 10; int v[LEN];

Elegantere Möglichkeit:

Länge des Feldes v ist eine Konstante !Kann während des Programmlaufs NICHT mehr verändert werden.

LEN=LEN+1; // Fehler

Empfehlung:Konstanten mit

Großbuchstaben schreiben !

Page 29: ARRAY  oder FELD oder VEKTOR

Eine Konstante kann man als eine schreibgeschützte Variable auffassen.(Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

Page 30: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Benutzen Sie beim letzten Programm statt der Feldlänge 10 eine Konstante.

Page 31: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 10;

int i; int v[LEN]; i=0; while(i<LEN){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

falls die Feldlänge z.B. auf 100 verändert werden soll, muß der Programmierer nur noch die 10

durch die 100 ersetzen (eine einzige Änderung machen).

Page 32: ARRAY  oder FELD oder VEKTOR

printf("Zahlenausgaben\n"); i= LEN-1; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0;}

Page 33: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Verändern Sie das C-Programm so, dass der Anwender die Anzahl der einzugebenden Zahlen festlegen kann.

Page 34: ARRAY  oder FELD oder VEKTOR

int main(){ int i; int v[100]; int anz; // Anzahl

do{  printf("Anz. eing.\n"); scanf("%d", &anz); fflush(stdin); } while((anz>100)||(anz<=0));

Page 35: ARRAY  oder FELD oder VEKTOR

printf("Zahleneingaben\n"); i=0;

while(i<=anz-1){ printf("Zahleingabe:\n"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

Page 36: ARRAY  oder FELD oder VEKTOR

printf("Zahlenausgabe\n"); i=anz-1;

while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0;}

Page 37: ARRAY  oder FELD oder VEKTOR

Besser mit einer Konstante...

Page 38: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 100; int i; int v[LEN]; int anz; // Anzahl

do{  printf("Anz. eing.\n"); scanf("%d", &anz); fflush(stdin); } while((anz>LEN)||(anz<=0));

Page 39: ARRAY  oder FELD oder VEKTOR

printf("Zahleneingaben\n"); i=0;

while(i<=anz-1){ printf("Zahleingabe:\n"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

Page 40: ARRAY  oder FELD oder VEKTOR

printf("Zahlenausgabe\n"); i=anz-1;

while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0;}

Page 41: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Bestimmen Sie das Maximum und das Minimum der in der vorigen Aufgabe eingegebenen Zahlen.EVA beachten !!

Page 42: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 100; int i; int anz; int v[LEN]; int max; int min;

// Programm von vorher ...

Page 43: ARRAY  oder FELD oder VEKTOR

i = 0; max = v[0]; min = v[0]; do{ if(v[i]>max) max = v[i]; if(v[i] < min) min = v[i]; i=i+1; } while(i<anz); printf("Maxim. = %d\n", max); printf("Minim. = %d\n", min); return 0;}

Page 44: ARRAY  oder FELD oder VEKTOR

Strings (Zeichenketten)

Page 45: ARRAY  oder FELD oder VEKTOR

Strings sind Felder mit dem Datentyp char.

'M' 'E' 'S' 'K' ...

Beispiel:

Wie wird dies in C++ realisiert ?

Page 46: ARRAY  oder FELD oder VEKTOR

int main(){

v[0]='M';v[1]='E';v[2]='S';v[3]='K';

printf("%s",v);

}// Was wird ausgegeben ?

Woher kennt printf das Ende des Strings ?

v[4]='\0';

char v[100];Gibt Zeichenkette aus

return 0;

Page 47: ARRAY  oder FELD oder VEKTOR

Zeichenkette beenden mit:ASCII-Zeichen mit Wert 0 Dieses Zeichen bezeichnet man als Zeichen '\0'

im Gegensatz zum Zeichen '0' mit dem ASCII-Wert 48.

Page 48: ARRAY  oder FELD oder VEKTOR

Ausgabe eines string:printf mit dem Formatierungszeichen %s

printf gibt so lange Zeichen aus, bis es an das Zeichen \0 kommt !

Page 49: ARRAY  oder FELD oder VEKTOR

Eingabe eines string:scanf mit dem Formatierungszeichen %s Eingabe wird durch ENTER beendet und eingelesene Zeichenkette automatisch mit \0 abgeschlossen (beendet)

Page 50: ARRAY  oder FELD oder VEKTOR

Bemerkung:Das Drücken der ENTER-Taste zum Beenden der Eingabe eines Zeichens oder einer Zeichenkette veranlasst, dass noch der ASCII-Wert 10 in den Tastaturpuffer geschrieben wird.

Page 51: ARRAY  oder FELD oder VEKTOR

Dieser wird durch scanf("%c",...);oderscanf("%s",...);

nicht automatisch aus dem Tastaturpuffer entfernt.Siehe folgendes Beispiel:

Page 52: ARRAY  oder FELD oder VEKTOR

int main(){ char u; char str[20];

printf("Name eingeben\n"); scanf("%s",&str);

printf("Zeichen eingeben\n"); scanf("%c",&u);

return 0;}

fflush(stdin);

fflush(stdin);

Welchen Wert hat u ?

Das 1. scanf verschiebt die vom Anwender eingegebene Zeichenkette vom Tastaturpuffer in str. Das sich dann noch im Tastaturpuffer

befindliche ENTER (ASCII-Code 10) verschiebt das 2.scanf in u.

Deswegen:Nach jedem scanf den

Tastaturpuffer löschen mit:

Page 53: ARRAY  oder FELD oder VEKTOR

Bemerkung:Aus Platzgründen ist es möglich, dass fflush(stdin);in dieser und den folgenden Präsentationen weggelassen wird !

Page 54: ARRAY  oder FELD oder VEKTOR

Initialisierung bei der Deklaration

char v[5]="karl";

char f[5]={'M','a'};'M' 'a' '\0'

'k' 'a' 'r' 'l' '\0'

oder auch möglich:

? ?

Page 55: ARRAY  oder FELD oder VEKTOR

Durch jede dieser Initialisierungen wird automatisch, ohne Zutun des Programmierers, die Zeichenkette mit '\0' abgeschlossen.

Page 56: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Der Vorname und der Nachname einer Person soll in einem Programm eingegeben werden. Die Initialen sollen dann in einem Feld gespeichert und ausgegeben werden.

Page 57: ARRAY  oder FELD oder VEKTOR

Hinweis:scanf("%s", ...) benutzen

Page 58: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 20; char vorname[LEN]; char nachname[LEN]; char kuerzel[3];

Page 59: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s",&vorname);fflush(stdin);printf("Nachn. eingeben\n");scanf("%s",&nachname);fflush(stdin);kuerzel[0] = vorname[0];kuerzel[1] = nachname[0];kuerzel[2] = '\0';printf("Initialen: %s\n", kuerzel);return 0;}

Page 60: ARRAY  oder FELD oder VEKTOR

Alternative Möglichkeit, die Initialen des Feldes kuerzel auszugeben:

Page 61: ARRAY  oder FELD oder VEKTOR

...i=0;while(i<2){ printf("%c", kuerzel[i]); i=i+1;}

Ist bei dieser Lösung nötig, dass das Feld kuerzel die Feldlänge 3 hat ? Wenn nein, welche Feldlänge würde genügen?

Es würde genügen, als Feldlänge 2 zu nehmen. Allerdings könnte man dann das Feld nicht mehr mit '\0' terminieren.

Welchen Nachteil hätte dies ?

Man könnte die Funktion printf mit %s nicht mehr benutzen, um den Inhalt des Feldes auszugeben.

Page 62: ARRAY  oder FELD oder VEKTOR

Es wird nicht geprüft, ob das Feld groß genug ist, die Zeichenkette aufzunehmen

Was ist der Nachteil dieses Programms ?

Page 63: ARRAY  oder FELD oder VEKTOR

Aufgabe:Ergänzen Sie das vorige Programm so, dass es nicht mehr Zeichen einlesen, wie das Feld aufnehmen kann.Verwenden Sie bei der Eingabe scanf("%c",...) und

beachten Sie ...

Page 64: ARRAY  oder FELD oder VEKTOR

... daß bei der Eingabe einer Zeichenkette nach dem

Drücken der ENTER-Taste das Zeichen mit dem ASCII-Wert 10 im

Tastaturpuffer steht.

Page 65: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 5; const char ENTER = 10;

// Schleife nicht beenden int beenden = 0; int i; char vorname[LEN]; char nachname[LEN]; char kuerzel[3]; char temp; i = 0; printf("Vorname eingeben\n");

Page 66: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

Page 67: ARRAY  oder FELD oder VEKTOR

fflush(stdin); return 0;

// analoges mit nachname}

Page 68: ARRAY  oder FELD oder VEKTOR

Aufgabe:

1) Angenommen, der Anwender hat im letzten Programm als Vorname Udo eingegeben. Was macht das Programm im Einzelnen ?

Page 69: ARRAY  oder FELD oder VEKTOR

Besprechung des Programms für die Eingabe Udo:

Was steht nach dieser Eingabe im Tastaturpuffer ?

U d o 10

ASCII-Wert 10

Page 70: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

Welche Werte haben die Variablen beenden, temp, i, vorname nach Ausführung der jeweils folgenden Befehle ?

Page 71: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: i: beenden:

Page 72: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 0beenden: 0

? ? ? ? ?

Page 73: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 0beenden: 0

? ? ? ? ?

U ASCII-Wert 10

0 4

Page 74: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 0beenden: 0

? ? ? ? ?

Page 75: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 0beenden: 0

U ? ? ? ?

Page 76: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 0beenden: 0

U ? ? ? ?

Page 77: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 1beenden: 0

U ? ? ? ?

Page 78: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ui: 1beenden: 0

U ? ? ? ?

Page 79: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: U i: 1 beenden: 0

U ? ? ? ?

Page 80: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

U ? ? ? ?

Page 81: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

U ? ? ? ?

d ASCII-Wert 10

41

Page 82: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

U ? ? ? ?

Page 83: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

U d ? ? ?

Page 84: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

U d ? ? ?

Page 85: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 2beenden: 0

U d ? ? ?

Page 86: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 2beenden: 0

U d ? ? ?

Page 87: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: d i: 2 beenden: 0

U d ? ? ?

Page 88: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 2beenden: 0

U d ? ? ?

Page 89: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 2beenden: 0

U d ? ? ?

o ASCII-Wert 10

42

Page 90: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 2beenden: 0

U d ? ? ?

Page 91: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 2beenden: 0

U d o ? ?

Page 92: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 2beenden: 0

U d o ? ?

Page 93: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 3beenden: 0

U d o ? ?

Page 94: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: oi: 3beenden: 0

U d o ? ?

Page 95: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: o i: 3 beenden: 0

U d o ? ?

Page 96: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 0

U d o ? ?

Page 97: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 0

U d o ? ?

ASCII-Wert 10

ASCII-Wert 10

43

Page 98: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 0

U d o ? ?

Page 99: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 0

U d o \0 ?

Page 100: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 0

U d o \0 ?

Page 101: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 1

U d o \0 ?

Page 102: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 1

U d o \0 ?

Page 103: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: 10i: 3beenden: 1

U d o \0 ?

Page 104: ARRAY  oder FELD oder VEKTOR

Aufgabe:

2) Angenommen, der Anwender hat im letzten Programm als Vorname Edgar eingegeben und es wäre:const int LEN = 3;Was macht das Programm im Einzelnen ?

Page 105: ARRAY  oder FELD oder VEKTOR

Besprechung des Programms für die Eingabe Edgar:

Was steht nach dieser Eingabe im Tastaturpuffer ?

E d g a r 10

ASCII-Wert 10

Page 106: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

Welche Werte haben die Variablen beenden, temp, i, vorname nach Ausführung der jeweils folgenden Befehle ?

Page 107: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: i: beenden:

Page 108: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 0beenden: 0

? ? ?

Page 109: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 0beenden: 0

? ? ?

E ASCII-Wert 10

0 2

Page 110: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 0beenden: 0

? ? ?

Page 111: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 0beenden: 0

E ? ?

Page 112: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 0beenden: 0

E ? ?

Page 113: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 1beenden: 0

E ? ?

Page 114: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: Ei: 1beenden: 0

E ? ?

Page 115: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: E i: 1 beenden: 0

E ? ?

Page 116: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

E ? ?

Page 117: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

E ? ?

d ASCII-Wert 10

21

Page 118: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

E ? ?

Page 119: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

E d ?

Page 120: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 1beenden: 0

E d ?

Page 121: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 2beenden: 0

E d ?

Page 122: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: di: 2beenden: 0

E d ?

Page 123: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: d i: 2 beenden: 0

E d ?

Page 124: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 0

E d ?

Page 125: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 0

E d ?

g ASCII-Wert 10

22

Page 126: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 0

E d ?

Page 127: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 0

E d \0

Page 128: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 0

E d \0

Page 129: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 1

E d \0

Page 130: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 1

E d \0

Page 131: ARRAY  oder FELD oder VEKTOR

do{ scanf("%c", &temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } }while (beenden == 0); printf("Vorn. = %s\n", vorname);

vorname: temp: gi: 2beenden: 1

E d \0

Page 132: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Machen Sie das gleiche wie in der vorigen Aufgabe.Benutzen Sie aber statt scanf die Funktion _getch().Holen Sie sich Infos zu dieser Funktion in der Hilfe von MS VC++

Page 133: ARRAY  oder FELD oder VEKTOR

Hinweise zu _getch():1) liest ein Zeichen ein (über Tastatur)2) bringt es nicht auf den Bildschirm (ohne Echo)3) beim Beenden (mit ENTER) der Eingabe des Zeichens wird 13 in den Tastaturpuffer geschrieben.

Page 134: ARRAY  oder FELD oder VEKTOR

#include "stdafx.h"#include <conio.h>

// gleich geht es weiter ...

Page 135: ARRAY  oder FELD oder VEKTOR

int main(){ const int LEN = 5; const char ENTER = 13;

// Schleife nicht beenden int beenden = 0; int i; char vorname[LEN]; char nachname[LEN]; char kuerzel[3]; int temp; i = 0; printf("Vorname eing.\n");

Page 136: ARRAY  oder FELD oder VEKTOR

do{ temp = _getch(); // kein Echo printf("%c",temp); if ((temp == ENTER) ||(i == LEN-1)){ vorname[i] = '\0'; beenden = 1; } else{ vorname[i] = temp; i = i+1; } } while (beenden == 0); printf("\n = %s\n", vorname);

Page 137: ARRAY  oder FELD oder VEKTOR

return 0;}

Page 138: ARRAY  oder FELD oder VEKTOR

Tipp:Mit scanf kann man auch die maximale Anzahl der Zeichen angeben, die gelesen werden sollen:

char v[100];scanf("%4s",&v);

Diese Zahl (hier 4) gibt die maximale Anzahl Zeichen

an, die von scanf verarbeitet werden.

Page 139: ARRAY  oder FELD oder VEKTOR

Die 4 kann leider nicht durch eine const-Konstante ersetzt werden. Dies muß durch eine define-Konstante gemacht werden:

Page 140: ARRAY  oder FELD oder VEKTOR

#define LEN "4"

int main(){ char v[100]; scanf("%" LEN "s",&v); return 0;}

Bevor der Compiler das Programm übersetzt, ersetzt vorher der sogenannte Präprozessor jede mit define definierte Konstante durch den entsprechenden Wert, hier also LEN durch die Zeichenkette 4.

C interpretiert hintereinander kommende Zeichenketten, wie z.B. "%" "4" und "s" als eine Zeichenkette "%4s".

Page 141: ARRAY  oder FELD oder VEKTOR

Diese Lösung ist nicht möglich:Der Präprozessor nimmt innerhalb von Zeichenketten keine Ersetzungen vor.

#define LEN "4"

int main(){ char v[100]; scanf("%LENs",&v); return 0;}

Page 142: ARRAY  oder FELD oder VEKTOR

Weiterer Tipp:Mit scanf kann man auch festlegen, ab welchen Zeichen die Eingabe beendet wird:

char v[100];scanf("%[^xy]",&v);

liest solange Zeichen ein, bis ein x oder y auftaucht.

(x bzw. y wird nicht mehr eingelesen)

Page 143: ARRAY  oder FELD oder VEKTOR

Mehrdimensionale Felder

Page 144: ARRAY  oder FELD oder VEKTOR

ZweidimensionaleFelder

Page 145: ARRAY  oder FELD oder VEKTOR

Merke:In der Programmiersprache C fasst man ein zweidimensionales Feld als eindimensionales Feld auf, dessen einzelne Zellen (Elemente) aus eindimensionalen Feldern bestehen.

Page 146: ARRAY  oder FELD oder VEKTOR

Beispiel

Page 147: ARRAY  oder FELD oder VEKTOR

Dieses zweidimensionale Feld besteht aus 3 Zellen.

Jede dieser Zellen ist wiederum ein eindimensionales Feld, das

aus 4 Zellen besteht.

Page 148: ARRAY  oder FELD oder VEKTOR

int v[3][4];

Datentyp der Elemente: Jede Zelle hat den gleichen Datentyp

Variablenname des Feldes

Anzahl der Elemente in der 1. Dimension:Das Feld besteht aus 3 eindimensionalen Feldern.

Anzahl der Elemente in der 2. Dimension:Jede Zelle des eindimensionalen Feldes besteht

wiederum aus 4 Zellen.

Page 149: ARRAY  oder FELD oder VEKTOR

int v[3][4];

49 52 73 6943 27 42 6712 11 37 89

v[1][2] = 13;

Welche Stelle wird verändert ?

v[0]

v[1]

v[2]

besteht hier z.B. aus:

besteht hier z.B. aus:

besteht hier z.B. aus:

Page 150: ARRAY  oder FELD oder VEKTOR

int v[3][4];

49 52 73 6943 27 13 6712 11 37 89

v[1][2] = 13;

Wieviel Speicher benötigt die Variable v ?

= 3 · 4 · Speicherbedarf (int)

Page 151: ARRAY  oder FELD oder VEKTOR

Initialisierung bei der Deklaration int v[3][4]={{12,11,37,89}, {43,27,42,67}, {49,52,73,69} };

49 52 73 6943 27 42 6712 11 37 89v[0]

v[1]

v[2]

Page 152: ARRAY  oder FELD oder VEKTOR

Problem:In einem Formular (z.B. EK-Steuerformular) sollen alle (eindimensionalen) Felder ausgefüllt werden.Dies geschieht durch eine Eingabefunktion, von der man nicht weiß, ob sie die Eingabe mit '\0' beendet.

Page 153: ARRAY  oder FELD oder VEKTOR

Alle Zellen aller Felder vorher mit '\0' auffüllen !

Frage:Was ist zu tun, dass zu 100 % garantiert ist, dass am Feldende aller Felder '\0'steht ?

Page 154: ARRAY  oder FELD oder VEKTOR

Warum ist dies bei einem grossen Formular für den Programmierer sehr aufwendig (bei z.B. 100 Feldern) ?

Page 155: ARRAY  oder FELD oder VEKTOR

Weil man dazu bei z.B. 100 eindimensionalen Feldern 100 FOR-Anweisungen benötigt oder eine FOR-Anweisung, in der 100 eindimensionale Felder benötigt (bearbeitet) werden müssen, wie z.B:

Page 156: ARRAY  oder FELD oder VEKTOR

...for(i=0;i<100;i++){ v0[i]='\0'; v1[i]='\0'; v2[i]='\0'; //... v99[i]='\0';}

viel Schreibaufwand

Page 157: ARRAY  oder FELD oder VEKTOR

Wie kann man dies programmtechnisch einfacher machen ?

Mit einem zweidimensionalen Feld.

Page 158: ARRAY  oder FELD oder VEKTOR

Aufgabe:

Schreiben Sie ein Programm, das alle Zellen in einem zweidimensionalen Feld mit '\0' belegt.

Page 159: ARRAY  oder FELD oder VEKTOR

int main(){ const int ZANZ = 3; const int SANZ = 13;

int i, j; char formular [ZANZ][SANZ];

for (i=0; i<ZANZ; i++){ for (j=0; j<SANZ; j++){ formular[i][j] = '\0'; } } return 0;}

Page 160: ARRAY  oder FELD oder VEKTOR

for (i=0; i<ZANZ; i++){ for (j=0; j<SANZ; j++){ formular[i][j] = '\0'; } }

formular[0]

formular[1]

formular[2]

\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

Page 161: ARRAY  oder FELD oder VEKTOR

AUFGABEGenauso wie in einem vorigen Programm soll der Vorname und der Nachname einer Person in einem Programm eingegeben (mit scanf("%s",...), wobei vorausgesetzt wird, daß das Feld groß genug ist, die Zeichenketten aufzunehmen) und gespeichert werden. Daraus sollen dann die Initialen berechnet, gespeichert und ausgegeben werden. Dies soll durch ein zweidimensionales Feld realisiert werden.

Page 162: ARRAY  oder FELD oder VEKTOR

int main(){ const int ZANZ = 3; const int SANZ = 13;

char formular [ZANZ][SANZ];

Page 163: ARRAY  oder FELD oder VEKTOR

Im Folgenden soll angenommen werden, dass als Vorname "Dieder" und als Nachname "Kaulitz" eingegeben wird.

Page 164: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ?

Was macht dies Anweisung?

Das zweidimensionale Feld besteht aus den 3 Zellen: formular[0] bis formular[2], wobei jede Zelle ein

eindimensionales Feld ist. Dehalb muss bei scanf als Formatierung %s benutzt werden.

Page 165: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

D i e d e r \0 ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ?

Was macht dies Anweisung?

Page 166: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

D i e d e r \0 ? ? ? ? ? ?

K a u l i t z \0 ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ?

Was macht dies Anweisung?

Page 167: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

D i e d e r \0 ? ? ? ? ? ?

K a u l i t z \0 ? ? ? ? ?

D ? ? ? ? ? ? ? ? ? ? ? ?

Was macht dies Anweisung?

Page 168: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

D i e d e r \0 ? ? ? ? ? ?

K a u l i t z \0 ? ? ? ? ?

D K ? ? ? ? ? ? ? ? ? ? ?

Was macht dies Anweisung?

Page 169: ARRAY  oder FELD oder VEKTOR

printf("Vorname eingeben\n");scanf("%s", &formular[0]);printf("Nachname eingeben\n");scanf("%s", &formular[1]);

// Initialen schreibenformular[2][0] = formular[0][0];formular[2][1] = formular[1][0];formular[2][2] = '\0';

formular[0]

formular[1]

formular[2]

D i e d e r \0 ? ? ? ? ? ?

K a u l i t z \0 ? ? ? ? ?

D K \0 ? ? ? ? ? ? ? ? ? ?

Page 170: ARRAY  oder FELD oder VEKTOR

printf("Vorname = %s\n", formular[0]);printf("Nachname = %s\n", formular[1]);printf("Initialen = %s\n", formular[2]);return 0;} // Ende mainWar diese Anweisung in der letzten Folie unbedingt nötig ?

formular[2][2] = '\0';

Page 171: ARRAY  oder FELD oder VEKTOR

formular[2][2] = '\0'; printf("Initialen = %s\n", formular[2]);

Ja, wenn die Ausgabe wie hier mit der Formatierung %sgemacht wird !

Page 172: ARRAY  oder FELD oder VEKTOR

for(i=0;i<2;i++) printf("%c",formular[2][i]);

Bei Ausgabe mit printf("%c",... )ist dies dagegen nicht nötig.Wie gibt man aber die Zeichenkette damit aus ?

Der Programmierer muß aber die Länge (=2) der Initialen-Zeichenkette kennen

Page 173: ARRAY  oder FELD oder VEKTOR

Aufgabe:

In einem Probeformular sollen folgende Voreinträge für Vornamen, Nachnamen und Initialen (zu Demo-Zwecken) gemacht werden:ErikaMustermannWie wird das programmtechnisch gemacht ?

Page 174: ARRAY  oder FELD oder VEKTOR

int main(){ char f[3][13]= {{'M','u','s','t','e','r','m','a','n','n'}, {'E','r','i','k','a'}};

// oder:char f[3][13]={"Mustermann","Erika"};

Die Zeichenketten "Mustermann" und "Erika" werden jeweils automatisch durch '\0' beendet. Da die Zelle f[2] hier nicht angegeben wurde, wird für sie automatisch der leere String "" (eine Zeichenkette die nur aus der '\0' besteht) angenommen.

M u s t e r m a n n \0 ? ?

E r i k a \0 ? ? ? ? ? ? ?

\0 ? ? ? ? ? ? ? ? ? ? ? ?

f[0]

f[1]

f[2]

Welche Werte haben die Zellen des Feldes f ?

Besser mit Konstanten arbeiten !!

Page 175: ARRAY  oder FELD oder VEKTOR

DreidimensionaleFelder

Page 176: ARRAY  oder FELD oder VEKTOR

Merke:In der Programmiersprache C fasst man ein dreidimensionales Feld als eindimensionales Feld auf, dessen einzelne Zellen (Elemente) aus zweidimensionalen Feldern bestehen.

Page 177: ARRAY  oder FELD oder VEKTOR

int v[3][4][5];

49 52 73 6943 27 42 6712 11 37 89

v[0][2][3] = 18;

18

Welche Stelle wird verändert ?

Page 178: ARRAY  oder FELD oder VEKTOR

int v[3][4][5];v[0][2][3] = 18;

Wieviel Speicher benötigt die Variable v ?

= 3 · 4 · 5 · Speicherbedarf (int)

Page 179: ARRAY  oder FELD oder VEKTOR

VierdimensionalesFeld

Beispiel

Page 180: ARRAY  oder FELD oder VEKTOR

Temperatur-Erfassung an einer Wetterstation über

folgende Zeitdauer:

- 10 Jahre- Monatlich- Täglich- Stündlich

Page 181: ARRAY  oder FELD oder VEKTOR

Wie kann man diese Daten "geschickt" anordnen, so

dass leicht darauf zugegriffen werden kann ?

Page 182: ARRAY  oder FELD oder VEKTOR

double v[10][12][31][24];

t = v[2][11][30][23];

Wieviel Grad hat es im 3. Jahr am Jahreswechsel (Silvester)?Wie weist man dies der Variablen t zu ?

Wie wird auf den "darauffolgenden Datensatz“ zugegriffen

t = v[3][0][0][0];

Page 183: ARRAY  oder FELD oder VEKTOR

double v[10][12][31][24];

Wieviel Speicher benötigt die Variable v ?

= 10·12·31·24 · Speicherbedarf (double)

Page 184: ARRAY  oder FELD oder VEKTOR

Welchen "Nachteil" hätte es, wenn man statt des vierdimensionalen Feldes die Daten in einem eindimensionalen Feld verwalten würde?

Page 185: ARRAY  oder FELD oder VEKTOR

Man müsste sich viel mehr Gedanken darüber machen (überlegen), wo (welcher Index ?) z.B. die Temperatur (Grad) im 3. Jahr am Jahreswechsel (Silvester) abgespeichert ist.

Page 186: ARRAY  oder FELD oder VEKTOR

Beispiel

Page 187: ARRAY  oder FELD oder VEKTOR

double v[10][12][31][24];ist ein eindimensionales Feld, dessen Zellen aus dreidimensionalen Feldern besteht.

Wo kann dann z.B. der Wert V[9][3][8][5]In einem eindimensionalem Feld abgelegt werden?

Page 188: ARRAY  oder FELD oder VEKTOR

double v[10][12][31][24];ist ein eindimensionales Feld, dessen Zellen aus dreidimensionalen Feldern besteht.Wie kann z.B. V[9][3][8][5]in einem eindimensionalem Feld abgelegt werden?

Page 189: ARRAY  oder FELD oder VEKTOR

double v[10][12][31][24];ist ein eindimensionales Feld, dessen Zellen aus dreidimensionalen Feldern besteht.V[9][3][8][5]Ist also das 10. dreidimensionale Paket.Also belegen die schon davor liegenden 9 dreidimensionale Pakete der Länge 12*31*24 einen Speicher von 9*12*31*24 Speichereinheiten (SE)(Speichereinheit = Speicherplatz für double)

Page 190: ARRAY  oder FELD oder VEKTOR

V[9][3][8][5]Nach diesen 9*12*31*24 SE wird nun das dreidimensionale PaketV[.][3][8][5]abgelegt. Dieses ist ein eindimensionales Feld, dessen Zellen aus zweidimensionalen Feldern besteht.

Page 191: ARRAY  oder FELD oder VEKTOR

V[.][3][8][5]Ist also das 4. zweidimensionale Paket.Also belegen die schon davor liegenden 3 zweidimensionale Pakete der Länge 31*24 einen Speicher von 3*31*24 SE. Also insgesamt:9*12*31*24 + 3*31*24 SE

Page 192: ARRAY  oder FELD oder VEKTOR

Nach diesen 9*12*31*24 + 3*31*24 SEwird nun das zweidimensionale PaketV[.][.][8][9]abgelegt. Dieses ist ein eindimensionales Feld, dessen Zellen aus zweidimensionalen Feldern besteht.

Page 193: ARRAY  oder FELD oder VEKTOR

V[.][.][8][5]ist also das 9. eindimensionale Paket.Also belegen die schon davor liegenden 8 eindimensionale Pakete der Länge 24 einen Speicher von 8*24 SE. Also insgesamt:9*12*31*24 + 3*31*24 + 8*24 SE

Page 194: ARRAY  oder FELD oder VEKTOR

Nach diesen 9*12*31*24 + 3*31*24 + 8*24 SE wird nun das eindimensionale Paket (Feld)V[.][.][.][9]abgelegt. Diese ist ein eindimensionales Feld.

Page 195: ARRAY  oder FELD oder VEKTOR

V[.][.][.][5]ist also das 6. eindimensionale Paket (= Zelle)Also belegt dieses mit dem zuvor berechneten Speicher insgesamt:9*12*31*24 + 3*31*24 + 8*24 + 6 SEDa ein Feld bei 0 beginnt, könnte man also einen Wert wie z.B. V[9][3][8][5] in einem eindimensionalen Feld v1 speichern:v1[9*12*31*24 + 3*31*24 + 8*24 + 5] = V[9][3][8][5]