Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido

Ähnliche Präsentationen


Präsentation zum Thema: "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido"—  Präsentation transkript:

1 EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de

2 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 2 9.11.2000 Gliederung Kapitel 4 Vereinbarungen + Gültigkeit –Vorweg: Beispiel Längste Zeile bestimmen +... –Vereinbarungen –Gültigkeit –Namensanalyse –Zwiebelschalen –Statische Variablen

3 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 3 9.11.2000 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

4 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 4 9.11.2000 // K4-P1: Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das Endzeichen @ erscheint. // Die laengste Zeile wird ausgegeben (bei mehreren // Kandidaten, die erste). // Demonstriert: Konstanten, Funktionen #include int LiesZeile(char [], int ); void Kopiere(char [], char [] ); // Es folgt das Hauptprogramm und die zwei Funktionen // Funktionsprototypen

5 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 5 9.11.2000 main() { const int LaengsteLaenge = 1000; int len, maxLaenge = 0; char Zeile[LaengsteLaenge], LaengsteZeile[LaengsteLaenge]; // Berechnung len = LiesZeile(Zeile, LaengsteLaenge); while (len > 0) { if (len > maxLaenge) { maxLaenge = len; Kopiere(Zeile, LaengsteZeile); } len = LiesZeile(Zeile, LaengsteLaenge); } // // Ausgabe der Ergebnisse // cout<< "die laengste Zeile hat " << maxLaenge << " Zeichen, sie lautet:\n" << LaengsteZeile << endl; }

6 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 6 9.11.2000 // Erste Funktion int LiesZeile(char s[], int lim) { char c; int i=0; const char Ende = '@', ZeilenEnde = '\n', Null = '\0'; c = getchar(); // Initialisierung für while-Schleife // // Verarbeitung "normaler" Zeichen in einer Zeile // while (i < lim - 1 && c != Ende && c != ZeilenEnde) { s[i] = c; ++i; c = getchar(); } s[i] = Null; return i; }

7 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 7 9.11.2000 // Zweite Funktion 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 } Ausführen

8 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 8 9.11.2000 Beispiel: lokale Variablen int LiesZeile(char [], int); void Kopiere(char [], char []); main() { const int LaengsteLaenge = 1000; int len, maxLaenge = 0; char Zeile[LaengsteLaenge]; char LaengsteZeile[LaengsteLaenge]; while (...) {... } cout <<... << endl;... } lokal

9 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 9 9.11.2000 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.

10 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 10 9.11.2000 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.

11 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 11 9.11.2000 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

12 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 12 9.11.2000 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]; } Effekt: die Zeichenkette von wird in die Zeichenkette nach kopiert. Vereinbare im folgenden Null als '\0':

13 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 13 int laenge (char q[]) { int i = 0; while (q[i] != Null) i++; return i; } Berechnet die Länge der als Argument übergebenen Zeichenkette. Beispiele

14 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 14 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

15 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 15 hierbei: int isLower(char c) { return ((c >= 'a') && (c <= 'z')); } Die Funktion isLower überprüft, ob ein Buchstabe ein Kleinbuchstabe ist Beispiele

16 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 16 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

17 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 17 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

18 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 18 9.11.2000 // K4-P2: Vergleich zweier Zeichenketten // // Demonstriert den Vergleich zweier Zeichenketten #include int strcmp(char[], char[]);// Funktionsprototyp main() { char s[] = "Alberich", t[] = "Albert"; if (strcmp(s, t) < 0) cout << "s ist:\t" << s << endl << "t ist:\t" << t << endl << "\ts ist lexikographisch kleiner als t << endl; cout << "\nist \"1\" kleiner als \"a\"? " << (strcmp("1", "a")? "ja": "nein") << endl; }

19 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 19 9.11.2000 /* Programm der Funktion strcmp zum Vergleich von zwei Zeichenketten */ int strcmp(char s[], char t[]) { int i = 0; while (s[i] == t[i]) if (s[i++] == '\0') return (0); return (s[i] - t[i]); } Ausführen

20 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 20 (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

21 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 21 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

22 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 22 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

23 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 23 int x; const double z = 3.3; sind Definitionen, denn Speicherplätze und ggf. Werte werden dadurch festgelegt. Vereinbarungen

24 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 24 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

25 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 25 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.

26 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 26 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.

27 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 27 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!].

28 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 28 Beispiel: Programm-Stücke in 4 Dateien 2 abgespeichert –Hauptprogramm: längste Zeile –Funktion LiesZeile –Funktion Kopiere –Fkt-Prototypen Beispiel: Gültigkeit

29 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 29 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

30 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 30 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

31 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 31 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[];... }

32 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 32 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

33 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 33 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

34 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 34 Zwiebelschalen (Bild) #include int c = -568; int main() { cout << "c zum ersten " << c << endl; float c = 1024.567; { cout << "\tc zum zweiten " << c << endl; char c[] = "ganz innen"; cout << "\t\tc jetzt: " << c << endl; } cout << "\tc jetzt wieder: " << c << endl; }

35 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 35 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:

36 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 36 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)

37 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 37 9.11.2000 //K4-P4: Statische Variable // // Demonstriert statische Variable // #include void demoStatisch(); // Funktionsprototyp int Global = 9; main() { int i; for(i=0; i < 3; ++i) { cout <<"\nDurchlauf i = "<< i << " :"; demoStatisch(); } Global++; cout << "\nGlobal in main: " << Global << endl; }

38 Kap 4: Vereinbarungen + Gültigkeit Vorl EINI-I" 38 9.11.2000 void demoStatisch() { static Statisch = 9; int nurLokal = 9; // Erinnerung: cout <<"Durchlauf i = "<< i << " :" cout << "\nGlobal in demoStatisch: " << Global << endl; Global++; cout << "\tStatisch in demoStatisch: " << Statisch << endl; Statisch++; cout << "\t\tnurLokal in demoStatisch: " << nurLokal << endl; nurLokal++; } Ausführen


Herunterladen ppt "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido"

Ähnliche Präsentationen


Google-Anzeigen