EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Gliederung Kapitel 4 Vereinbarungen + Gültigkeit –Vorweg: Beispiel Längste Zeile bestimmen +... –Beispiel: Aufteilen auf 4 Dateien 1 –Vereinbarungen –Gültigkeit –Beispiel: Aufteilen auf 4 Dateien 2 –Namensanalyse –Zwiebelschalen –Statische Variablen
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Beispiel: Längste Zeile bestimmen Problem: Möchte in unserem Text die längste Zeile kennenlernen und mit ihrer Länge ausgeben. Längste Zeile bestimmen
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Beispiel: lokale Variablen int LiesZeile(char [], int); void Kopiere(char [], char []); int main() { const int LaengsteLaenge = 1000; int len, maxLaenge = 0; char Zeile[LaengsteLaenge]; char LaengsteZeile[LaengsteLaenge]; while (...) {... } cout <<... << endl;... } lokal
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Anmerkungen zum Programm Die formalen Parameter s[ ], von[ ], nach[ ] in LiesZeile/Kopiere sind als Felder gekennzeichnet, deren Länge erst beim Aufruf durch den aktuellen Parameter bekannt gegeben wird. Das ist praktisch: Bei der Vereinbarung einer Funktion muß die Länge eines Feldes, falls es als Parameter übergeben wird, noch nicht bekannt sein. Damit kann man Funktionen allgemeiner schreiben.
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Zeichenketten Bei Feldern mit dem Grundtyp char ist letztes Zeichen stets das Zeichen ' \0' [Konvention!]. Eine Zeichenkette wort mit genau n Buch- staben sollte dann so vereinbart werden: char wort[n+1]; Es sollte dann gesetzt werden wort[n] = '\0'. cin, cout können auf ganzen Zeichenketten arbeiten. cin überliest '\t', '\n' sowie Leerzeichen.
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Zeichenketten Konstante Zeichenketten werden in ".." notiert –Bsp.: const char t[ ] = "aha, sagte er"; "a" vs. 'a' : – "a" ist eine Zeichenkette der Länge 1, –'a' ist ein Zeichen, '\0' fehlt ! a\0
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Beispiele void Kopiere(char von[], char nach[]) { int i = 0; const char Null = '\0'; while (von[i] != Null) { nach[i] = von[i]; ++i; } nach[i] = von[i]; // Hier wird das Ende-Zeichen gesetzt } Effekt: die Zeichenkette von wird in die Zeichenkette nach kopiert. Vereinbare im folgenden Null als '\0':
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 9 int laenge (char q[]) { int i = 0; while (q[i] != Null) i++; return i; } Berechnet die Länge der als Argument übergebenen Zeichenkette. Beispiele
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 10 int isLower(char); // Funktionsprototyp void ToUpper (char s[ ]) { char c, Null = '\0'; int i = 0; c = s[i]; while (c!= Null) { if(isLower(c)) s[i] = c - 'a' + 'A'; i++; c = s[i]; } } ersetzt jeden Kleinbuchstaben durch den entsprechenden Großbuchstaben. Beispiele
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 11 hierbei: int isLower(char c) { return ((c >= 'a') && (c <= 'z')); } Die Funktion isLower überprüft, ob ein Buchstabe ein Kleinbuchstabe ist Beispiele
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 12 void concat (char s[],char t[],char r[]) { int off, i=0; const char Null ='\0'; while ((r[i] = s[i]) != Null) i++; off = i; i = 0; while ((r[off+i] = t[i])!= Null) i++; } Verkettet (Konkateniert) s und t zu r (d. h. nach concat ("123", "abc", g) hat g die Zeichenkette "123abc" zum Inhalt) Beispiele
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 13 Vergleich Z_Ketten Beispiele (Forts.) Vergleiche von Zeichenketten mit strcmp, wobei der Vergleich lexikographisch durchgeführt wird –also wie im Lexikon: Abraham steht for Bebra, Eigenheit steht vor Eigensinn Programm
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 14 (a ? b : c) ist ein Ausdruck mit a != 0: Wert b a == 0: Wert c Also: y = ( x > 0 ? 3 : 7); ist gleichwertig zu if ( x > 0) y = 3; else y = 7; Der ?-Operator
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 15 y = ( x > 0 ? ( z < 7? 17 : z + 7) : x - 9) ist gleichwertig zu if (x > 0){ if ( z < 7) y = 17; else y = z + 7; } else y = x - 9; Kompakte Schreibweise. Lesbarkeit? Der ?-Operator
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 16 Beispiel: Programm-Stücke in 4 Dateien abgespeichert –Hauptprogramm:längste Zeile –Funktion LiesZeile –Funktion Kopiere –Fkt-Prototypen Beispiel: Zerlegung in 4 Dateien 1
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich Beispiel: Zerlegung in 4 Dateien 1 Verbindung der Dateien über Linker:
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 18 Vereinbarungen von Namen Man unterscheidet in C++ für Namen die Deklaration von der Definition: –Deklaration: informiert den Compiler über den Typ einer Variablen –Definitionen: informiert den Compiler über Speicherplätze, Werte etc
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 19 int x; const double z = 3.3; sind Definitionen, denn Speicherplätze und ggf. Werte werden dadurch festgelegt. Vereinbarungen
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 20 extern float x; ist eine Deklaration: x ist vom Typ float, aber an anderer Stelle definiert: weder Speicherbereich noch ein Wert werden an dieser Stelle festgelegt. Der Name wird lediglich mit seinem Typ bekanntgemacht, u.a. damit der Compiler seine korrekte Verwendung überprüfen kann. Vereinbarungen
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 21 Sichtweise des Compilers Information darüber, welche Art von Speicherbereich die Variable x einnehmen wird: das geschieht in der Deklaration für x Zuweisung des Speicherbereichs für x: das geschieht in der Definition für x ein Name kann nur einmal definiert, aber oft deklariert werden.
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 22 Gültigkeit von Dekls und Defs Gültigkeit bedeutet: Bezug auf eine sichtbare Definition. Jede Variable muß vor ihrer Benutzung definiert sein. Preisfrage: wann ist eine Definition sichtbar? –Die Regeln zur Sichtbarkeit bestimmen, wann eine Benutzung an eine Definition gebunden ist.
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 23 Gültigkeit etc. Definitionsbereiche sind: –Funktionsdefinitionen für lokale Variablen –Dateien Dateien sind Namensräume: Alle dort definierten Variablen sehen die Definition –Extern: mit extern kann auf Namen Bezug genommen werden, die in anderen Dateien definiert sind [in Dateien, nicht in den Funktionen!].
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 24 Beispiel: Programm-Stücke in 4 Dateien 2 abgespeichert –Hauptprogramm: längste Zeile –Funktion LiesZeile –Funktion Kopiere –Fkt-Prototypen Beispiel: Gültigkeit
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 25 void Kopiere() { const char Null = '\0'; int i=0; extern char Zeile[], LaengsteZeile[]; while (Zeile[i] != Null) { LaengsteZeile[i] = Zeile[i]; ++i; } LaengsteZeile[i] = Zeile[i]; } Kopiere.cpp
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 26 int LiesZeile() { const char Null = '\0', Ende = ZeilenEnde = '\n'; char c; int i; extern int LLaenge; extern char Zeile[];... } lokal extern LiesZeile.cpp int LiesZeile() { const char Null = '\0', Ende = ZeilenEnde = '\n'; char c; int i; extern int LLaenge; extern char Zeile[];... } int LiesZeile() { const char Null = '\0', Ende = ZeilenEnde = '\n'; char c; int i; extern int LLaenge; extern char Zeile[];... }
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 27 längste_Zeile.cpp const int LaengsteLaenge = 1000; char Zeile[LaengsteLaenge], LaengsteZeile[LaengsteLaenge]; int LLaenge = LaengsteLaenge; int main() { int len, maxLaenge = 0;... } Definition; in der gesamten Datei sichtbar Definition; lokal für main
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 28 Namensanalyse LaengsteZeile : –definiert in der Datei für das Hauptprogramm ( main ) also dort mit Speicherplatz versehen –als extern deklariert in der Datei Kopiere.cpp also dort als Name bekannt len : lokal für main ZeilenEnde : lokal für LiesZeile
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 29 Zwiebelschalen Namen können innerhalb von Funktionen an beliebiger Stelle definiert werden, –{...} stellen dann Blöcke dar, die ineinander geschachtelt sind. Regel: von innen nach außen beim Ermitteln der jeweils gültigen Definition. Beispiel: Zwiebelschalen
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 30 Zwiebelschalen (Bild) int c = -568; int main() { cout << "c zum ersten " << c << endl; float c = ; { cout << "\tc zum zweiten " << c << endl; char c[] = "ganz innen"; cout << "\t\tc jetzt: " << c << endl; } cout << "\tc jetzt wieder: " << c << endl; }
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 31 Statische Variablen Mittelding zwischen globalen und lokalen Variablen: –lokale Variablen leben nur, wenn die Funktion, in der sie deklariert sind, aktiv ist. –statische Variablen leben während der gesamten Laufzeit des Programms, sind aber nur innerhalb ihres Definitionsbereichs zugreifbar. –globale Variablen sind überall im Programm zugreifbar. Statische Variablen Beispiel:
Kap 4: Vereinbarungen + GültigkeitVorl EINI-I"Prof. Dr. G. Dittrich 32 Statische Variablen Unterschied zu lokalen Variablen: –statische Variablen behalten ihren Wert zwischen zwei Aufrufen, –lokale Variablen werden bei jedem Aufruf neu angelegt (der letzte Wert geht daher verloren)