ARRAY oder FELD oder VEKTOR

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Aufgabe: Wie stellt man eine for-Schleife durch eine while-Schleife dar ?
Funktionen.
Forschungszentrum caesar
Verzweigung oder bedingte Anweisung Weiter mit PP.
Zusammenfassung der Vorwoche
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
SWITCH - Anweisung.
SWITCH - Anweisung.
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Funktionen.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
WHILE - Anweisung.
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Programmier-sprache C Weiter mit PP..
WHILE - Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
FOR Anweisung.
Felder sortieren. Aufgabe: Die Zahlen eines Feldes sollen der Größe (zuerst die kleinste Zahl) nach sortiert werden.
Der Präprozessor. Bevor der Compiler das Programm in Maschinencode übersetzt (nur dieser kann von der CPU, dem Herz des Computers, bearbeitet werden)
Fehler-Management.
DO...WHILE Anweisung.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
DO...WHILE Anweisung.
ARRAY oder FELD oder VEKTOR
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung
PKJ 2005/1 Stefan Dissmann Zusammenfassung der Vorwoche Variable stehen für (einen) Wert, der sich im Programmablauf ändern kann. Variablen besitzen einen.
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Wichtige Fachausdrücke in C
Einführung in die Programmiersprache C 1
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Präsentation C Tutorium von Daniel J. Nowak Folie 1 C Tutorium.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester
3. Lineare Befehle 3.1 Die Ausgabefunktion
Programmieren in C Grundlagen C 2
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Informatik Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholugnsanweisungen 3. Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholungsanweisungen.
Einführung in die Programmiersprache C 2
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Verzweigung oder bedingte Anweisung. Aufgabe: Ein Autofahrer tankt sein Auto voll und schreibt den Kilometerstand auf (drei- stelliger Tageszähler).Wenn.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Java Programme nur ein bisschen objektorientiert.
FOR Anweisung. Aufgabe : Ausgabe aller ganzen Zahlen von 0 bis 100 auf dem Bildschirm.
Konstruktoren.
ARRAY oder FELD oder VEKTOR
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
 Präsentation transkript:

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; //...

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);

return 0; }

Schreibaufwendige Lösung ! Was ist der Nachteil ? Schreibaufwendige Lösung !

keine "nächste" Variable: a  b  c Warum nicht mit Schleife lösbar ? keine "nächste" Variable: a  b  c

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).

Der Index der ersten Zelle (Element) ist 0 13 17 19 23 27 1 2 3 4 Der Index der ersten Zelle (Element) ist 0 Die Feldlänge ist 5

C-Syntax

int v[3]; 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 !!! Länge des Feldes: KONSTANTE !!! Variablenname Datentyp: Jede Zelle hat den gleichen Datentyp

int main(){ v x y ? ? ? ? ? ? ? 19 ? ? v[2]=19; 17 ? 19 ? ? v[0]=17; int v[3],x,y; ? ? ? ? ? ? ? 19 ? ? v[2]=19; 17 ? 19 ? ? v[0]=17; 17 13 19 ? ? v[1]=13; 17 13 19 2 ? x=2; 17 13 23 2 ? v[x]=23; 17 13 23 2 13 y=v[1]; 17 13 13 2 13 v[x]=y;

int main(){ int len; scanf("%d",&len); fflush(stdin); int v[len]; return 0; } Warum ist dieses Programm syntaktisch falsch ? (Compiler meldet einen Fehler) Weil Feldlänge len eine Konstante sein muß !!

Dies kann schwer erkennbare Fehler nach sich ziehen. Siehe später ! int main(){ int v[3]; Warum macht diese Anweisung Probleme ? v[3]=56; Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 4. Zelle des Feldes ! Dies kann schwer erkennbare Fehler nach sich ziehen. Siehe später !

int main(){ int v[3]; size_t erg; erg = sizeof(v); Liefert Speicherplatzbedarf einer Variable. // Welchen Wert hat erg ? // 12 = 3*Speicher(int) return 0; }

Initialisierung bei der Deklaration int zahlen[4]={23,7}; 23 7 ? ? double d[4]={1.4,7.3,2,4}; 1.4 7.3 2.0 4.0

// Ausgabe auf Bildschirm: 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; } Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 5. Zelle des Feldes w ! Warum macht diese Anweisung Probleme ? // mit VC++ 6.0 kompiliert. // Ausgabe auf Bildschirm: // 20

Arbeitsspeicher -Ausschnitt 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 Adresse Inhalt ... r 0096 ? w[0] 0100 50 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? w[1] 0104 60 w[2] 0108 70 v[0] 0112 10 v[1] 0116 20 ...

Arbeitsspeicher -Ausschnitt 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 Adresse Inhalt ... r 0096 ? w[0] 0100 50 w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1]. w[1] 0104 60 w[2] 0108 70 v[0] 0112 10 v[1] 0116 20 Was wird also in r gespeichert und auf dem Bildschirm ausgegeben? ...

Arbeitsspeicher -Ausschnitt 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 Adresse Inhalt ... r 0096 20 w[0] 0100 50 w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1]. w[1] 0104 60 w[2] 0108 70 v[0] 0112 10 v[1] 0116 20 Was wird also in r gespeichert und auf dem Bildschirm ausgegeben? ...

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

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; }

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

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 !!

printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; } 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

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.

Deswegen ist es besser mit sogenannten Konstanten zu arbeiten. (Die Feldlänge muß eine Konstante sein !)

Empfehlung: Konstanten mit Großbuchstaben schreiben ! int main(){ int v[10]; ... Länge des Feldes v ist eine Konstante ! Kann während des Programmlaufs NICHT mehr verändert werden. Elegantere Möglichkeit: int main(){ const int LEN = 10; int v[LEN]; Empfehlung: Konstanten mit Großbuchstaben schreiben ! LEN=LEN+1; // Fehler

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

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

printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; } 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).

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

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

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));

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

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

Besser mit einer Konstante...

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));

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

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

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

int main(){ const int LEN = 100; int i; int anz; int v[LEN]; int max; int min; // Programm von vorher ...

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; }

Strings (Zeichenketten)

Strings sind Felder mit dem Datentyp char. Beispiel: 'M' 'E' 'S' 'K' ... Wie wird dies in C++ realisiert ?

int main(){ char v[100]; v[0]='M'; v[1]='E'; v[2]='S'; v[3]='K'; Gibt Zeichenkette aus char v[100]; v[0]='M'; Woher kennt printf das Ende des Strings ? v[1]='E'; v[2]='S'; v[3]='K'; v[4]='\0'; printf("%s",v); return 0; } // Was wird ausgegeben ?

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.

Ausgabe eines string: printf mit dem Formatierungszeichen %s printf gibt so lange Zeichen aus, bis es an das Zeichen \0 kommt !

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

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.

Dieser wird durch scanf("%c",...); oder scanf("%s",...); nicht automatisch aus dem Tastaturpuffer entfernt. Siehe folgendes Beispiel:

Nach jedem scanf den Tastaturpuffer löschen mit: int main(){ char u; char str[20]; printf("Name eingeben\n"); scanf("%s",&str); printf("Zeichen eingeben\n"); scanf("%c",&u); return 0; } Deswegen: Nach jedem scanf den Tastaturpuffer löschen mit: 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.

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

Initialisierung bei der Deklaration char f[5]={'M','a'}; 'M' 'a' '\0' ? ? oder auch möglich: char v[5]="karl"; 'k' 'a' 'r' 'l' '\0'

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

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.

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

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

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

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

Welchen Nachteil hätte dies ? ... 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.

Was ist der Nachteil dieses Programms ? Es wird nicht geprüft, ob das Feld groß genug ist, die Zeichenkette aufzunehmen

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 ...

... daß bei der Eingabe einer Zeichenkette nach dem Drücken der ENTER-Taste das Zeichen mit dem ASCII-Wert 10 im Tastaturpuffer steht.

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");

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);

fflush(stdin); return 0; // analoges mit nachname }

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

U d o 10 Besprechung des Programms für die Eingabe Udo: Was steht nach dieser Eingabe im Tastaturpuffer ? ASCII-Wert 10 U d o 10

printf("Vorn. = %s\n", vorname); Welche Werte haben die Variablen beenden, temp, i, vorname nach Ausführung der jeweils folgenden Befehle ? 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);

printf("Vorn. = %s\n", vorname); vorname: temp: i: beenden: 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: U i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: U i: 0 beenden: 0 4 U ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: U i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: U i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: U i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: U i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: U i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: U i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: d i: 1 beenden: 0 4 d 1 ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); U ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: o i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: o i: 2 beenden: 0 4 o 2 ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); U d ? vorname: temp: o i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: o i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: o i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: o i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: o i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: o i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: 10 i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: 10 i: 3 beenden: 0 4 ASCII-Wert 10 3 ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); U d o ? vorname: temp: 10 i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o \0 ? vorname: temp: 10 i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o \0 ? vorname: temp: 10 i: 3 beenden: 0 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);

printf("Vorn. = %s\n", vorname); U d o \0 ? vorname: temp: 10 i: 3 beenden: 1 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);

printf("Vorn. = %s\n", vorname); U d o \0 ? vorname: temp: 10 i: 3 beenden: 1 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);

printf("Vorn. = %s\n", vorname); U d o \0 ? vorname: temp: 10 i: 3 beenden: 1 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);

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 ?

E d g a r 10 Besprechung des Programms für die Eingabe Edgar: Was steht nach dieser Eingabe im Tastaturpuffer ? ASCII-Wert 10 E d g a r 10

printf("Vorn. = %s\n", vorname); Welche Werte haben die Variablen beenden, temp, i, vorname nach Ausführung der jeweils folgenden Befehle ? 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);

printf("Vorn. = %s\n", vorname); vorname: temp: i: beenden: 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 0 beenden: 0 2 E ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 0 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: E i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: d i: 1 beenden: 0 2 d 1 ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: d i: 1 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: d i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: g i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: g i: 2 beenden: 0 2 g 2 ASCII-Wert 10 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);

printf("Vorn. = %s\n", vorname); d ? vorname: temp: g i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d \0 vorname: temp: g i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d \0 vorname: temp: g i: 2 beenden: 0 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);

printf("Vorn. = %s\n", vorname); d \0 vorname: temp: g i: 2 beenden: 1 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);

printf("Vorn. = %s\n", vorname); d \0 vorname: temp: g i: 2 beenden: 1 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);

printf("Vorn. = %s\n", vorname); d \0 vorname: temp: g i: 2 beenden: 1 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);

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++

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.

#include "stdafx.h" #include <conio.h> // gleich geht es weiter ...

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");

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);

return 0; }

Tipp: Mit scanf kann man auch die maximale Anzahl der Zeichen angeben, die gelesen werden sollen: Diese Zahl (hier 4) gibt die maximale Anzahl Zeichen an, die von scanf verarbeitet werden. char v[100]; scanf("%4s",&v);

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

char v[100]; scanf("%" LEN "s",&v); return 0; } #define LEN "4" 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. #define LEN "4" int main(){ char v[100]; scanf("%" LEN "s",&v); return 0; } C interpretiert hintereinander kommende Zeichenketten, wie z.B. "%" "4" und "s" als eine Zeichenkette "%4s".

char v[100]; scanf("%LENs",&v); return 0; } #define LEN "4" 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; }

Weiterer Tipp: Mit scanf kann man auch festlegen, ab welchen Zeichen die Eingabe beendet wird: liest solange Zeichen ein, bis ein x oder y auftaucht. (x bzw. y wird nicht mehr eingelesen) char v[100]; scanf("%[^xy]",&v);

Mehrdimensionale Felder

Zweidimensionale Felder

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

Beispiel

Dieses zweidimensionale Feld besteht aus 3 Zellen. Jede dieser Zellen ist wiederum ein eindimensionales Feld, das aus 4 Zellen besteht.

int v[3][4]; Anzahl der Elemente in der 2. Dimension: Jede Zelle des eindimensionalen Feldes besteht wiederum aus 4 Zellen. Anzahl der Elemente in der 1. Dimension: Das Feld besteht aus 3 eindimensionalen Feldern. Variablenname des Feldes Datentyp der Elemente: Jede Zelle hat den gleichen Datentyp

Welche Stelle wird verändert ? int v[3][4]; besteht hier z.B. aus: besteht hier z.B. aus: v[1][2] = 13; besteht hier z.B. aus: Welche Stelle wird verändert ? 12 11 37 89 v[0] 43 27 42 67 v[1] 49 52 73 69 v[2]

Wieviel Speicher benötigt die Variable v ? int v[3][4]; Wieviel Speicher benötigt die Variable v ? v[1][2] = 13; = 3 · 4 · Speicherbedarf (int) 12 11 37 89 43 27 13 67 49 52 73 69

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

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.

Frage: Was ist zu tun, dass zu 100 % garantiert ist, dass am Feldende aller Felder '\0'steht ? Alle Zellen aller Felder vorher mit '\0' auffüllen !

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

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:

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

Wie kann man dies programmtechnisch einfacher machen ? Mit einem zweidimensionalen Feld.

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

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;

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

AUFGABE Genauso 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.

int main(){ const int ZANZ = 3; const int SANZ = 13; char formular [ZANZ][SANZ];

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

Was macht dies Anweisung? printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; 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. ? formular[0] formular[1] ? ? formular[2]

Was macht dies Anweisung? printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; Was macht dies Anweisung? D i e d r \0 ? formular[0] formular[1] ? ? formular[2]

Was macht dies Anweisung? printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; Was macht dies Anweisung? D i e d r \0 ? formular[0] formular[1] K a u l i t z \0 ? ? formular[2]

Was macht dies Anweisung? printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; Was macht dies Anweisung? D i e d r \0 ? formular[0] formular[1] K a u l i t z \0 ? D ? formular[2]

Was macht dies Anweisung? printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; Was macht dies Anweisung? D i e d r \0 ? formular[0] formular[1] K a u l i t z \0 ? D K ? formular[2]

printf("Vorname eingeben\n"); scanf("%s", &formular[0]); printf("Nachname eingeben\n"); scanf("%s", &formular[1]); // Initialen schreiben formular[2][0] = formular[0][0]; formular[2][1] = formular[1][0]; formular[2][2] = '\0'; D i e d r \0 ? formular[0] formular[1] K a u l i t z \0 ? D K \0 ? formular[2]

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

formular[2]); formular[2][2] = '\0'; printf("Initialen = %s\n", Ja, wenn die Ausgabe wie hier mit der Formatierung %s gemacht wird !

for(i=0;i<2;i++) printf("%c",formular[2][i]); Bei Ausgabe mit 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 for(i=0;i<2;i++) printf("%c",formular[2][i]);

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

M u s t e r m a n \0 ? E i k Besser mit Konstanten arbeiten !! int main(){ char f[3][13]= {{'M','u','s','t','e','r','m','a','n','n'}, {'E','r','i','k','a'}}; Besser mit Konstanten arbeiten !! 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. Welche Werte haben die Zellen des Feldes f ? // oder: char f[3][13]={"Mustermann","Erika"}; M u s t e r m a n \0 ? E i k f[0] f[1] f[2]

Dreidimensionale Felder

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

12 11 37 89 43 27 42 67 49 52 73 69 int v[3][4][5]; Welche Stelle wird verändert ? v[0][2][3] = 18; 18 12 11 37 89 43 27 42 67 49 52 73 69

Wieviel Speicher benötigt die Variable v ? int v[3][4][5]; v[0][2][3] = 18; Wieviel Speicher benötigt die Variable v ? = 3 · 4 · 5 · Speicherbedarf (int)

Vierdimensionales Feld Beispiel

Temperatur-Erfassung an einer Wetterstation über folgende Zeitdauer: - 10 Jahre - Monatlich - Täglich - Stündlich

Wie kann man diese Daten "geschickt" anordnen, so dass leicht darauf zugegriffen werden kann ?

Wie wird auf den "darauffolgenden Datensatz“ zugefriffen double v[10][12][31][24]; Wieviel Grad hat es im 3. Jahr am Jahreswechsel (Sylvester)? Wie weist man dies der Variablen t zu ? t = v[2][11][30][23]; Wie wird auf den "darauffolgenden Datensatz“ zugefriffen t = v[3][0][0][0];

Wieviel Speicher benötigt die Variable v ? double v[10][12][31][24]; Wieviel Speicher benötigt die Variable v ? = 10·12·31·24 · Speicherbedarf (double)

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

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

Beispiel

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?

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?

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)

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

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

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

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

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.

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 SE Da 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]