EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio...
-
Upload
gottlieb-reddin -
Category
Documents
-
view
136 -
download
1
Transcript of EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio...
EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und
Ingenieure IIngenieure I
Kapitel 4
Claudio Moraga; Gisbert Dittrich
FBI Unido
2
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
9.11.2000
Gliederung Kapitel 4Gliederung Kapitel 4
• Vereinbarungen + Gültigkeit
– Vorweg: Beispiel Längste Zeile bestimmen + ...– Vereinbarungen– Gültigkeit– Namensanalyse– Zwiebelschalen– Statische Variablen
3
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
9.11.2000
Beispiel: Längste Zeile bestimmenBeispiel: 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ültigkeitVorl “EINI-I"
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 <iostream.h>#include <stdio.h>
int LiesZeile(char [] , int );void Kopiere(char [] , char [] );
// Es folgt das Hauptprogramm und die zwei Funktionen
// Funktionsprototypen
5
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
9.11.2000
main() {const int LaengsteLaenge = 1000;int len, maxLaenge = 0;char Zeile[LaengsteLaenge], LaengsteZeile[LaengsteLaenge];
// Berechnunglen = 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ültigkeitVorl “EINI-I"
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ültigkeitVorl “EINI-I"
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ültigkeitVorl “EINI-I"
9.11.2000
Beispiel: lokale VariablenBeispiel: 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ültigkeitVorl “EINI-I"
9.11.2000
Anmerkungen zum ProgrammAnmerkungen 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ültigkeitVorl “EINI-I"
9.11.2000
ZeichenkettenZeichenketten
• 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ültigkeitVorl “EINI-I"
9.11.2000
ZeichenkettenZeichenketten
• 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ültigkeitVorl “EINI-I"
9.11.2000
BeispieleBeispiele
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 Zeichenkettenach kopiert.
Vereinbare im folgenden Null als '\0':
13
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
int laenge (char q[]) { int i = 0;while (q[i] != Null) i++;return i;
}
Berechnet die Länge der als Argument übergebenen Zeichenkette.
BeispieleBeispiele
14
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
int isLower(char); // Funktionsprototypvoid 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 denentsprechenden Großbuchstaben.
BeispieleBeispiele
15
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
hierbei:
int isLower(char c) {
return ((c >= 'a') && (c <= 'z'));
}
Die Funktion isLower überprüft, ob ein Buchstabe ein Kleinbuchstabe ist
Beispiele Beispiele
16
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
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)
BeispieleBeispiele
17
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
Vergleich Z_Ketten
Beispiele (Forts.)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ültigkeitVorl “EINI-I"
9.11.2000
// K4-P2: Vergleich zweier Zeichenketten// // Demonstriert den Vergleich zweier Zeichenketten
#include <iostream.h>
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ültigkeitVorl “EINI-I"
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ültigkeitVorl “EINI-I"
(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 ?-OperatorDer ?-Operator
21
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
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 ?-OperatorDer ?-Operator
22
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
Vereinbarungen von NamenVereinbarungen 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ültigkeitVorl “EINI-I"
int x;
const double z = 3.3;
sind Definitionen, denn Speicherplätze und ggf. Werte werden dadurch festgelegt.
VereinbarungenVereinbarungen
24
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
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.
VereinbarungenVereinbarungen
25
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
Sichtweise des CompilersSichtweise 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ültigkeitVorl “EINI-I"
Gültigkeit von Dekls und DefsGü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ültigkeitVorl “EINI-I"
Gültigkeit etc. 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ültigkeitVorl “EINI-I"
• Beispiel: Programm-Stücke in 4 Dateien 2 abgespeichert– Hauptprogramm: längste Zeile– Funktion LiesZeile– Funktion Kopiere– Fkt-Prototypen
Beispiel: GültigkeitBeispiel: Gültigkeit
29
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
längste_Zeile.cpplängste_Zeile.cpp
const int LaengsteLaenge = 1000;char Zeile[LaengsteLaenge], LaengsteZeile[LaengsteLaenge];int LLaenge = LaengsteLaenge;
int main() {int len, maxLaenge = 0;
...}
Definition;in der
gesamtenDatei
sichtbar
Definition;lokal fürmain
30
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
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.cppKopiere.cpp
31
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
int LiesZeile() {const char Null = '\0',
Ende = '@', ZeilenEnde = '\n';
char c; int i;
extern int LLaenge;extern char Zeile[];
...}
lokallokal
extern
LiesZeile.cppLiesZeile.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ültigkeitVorl “EINI-I"
NamensanalyseNamensanalyse
• 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ültigkeitVorl “EINI-I"
Zwiebelschalen 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ültigkeitVorl “EINI-I"
Zwiebelschalen (Bild)Zwiebelschalen (Bild)
#include <iostream.h>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ültigkeitVorl “EINI-I"
Statische VariablenStatische 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 VariablenBeispiel:
36
Kap 4: Vereinbarungen + GültigkeitVorl “EINI-I"
Statische VariablenStatische 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ültigkeitVorl “EINI-I"
9.11.2000
//K4-P4: Statische Variable//// Demonstriert statische Variable//#include <iostream.h>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ültigkeitVorl “EINI-I"
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