Upload
suessmann-weyers
View
105
Download
1
Embed Size (px)
Citation preview
EINI-IEINI-IEinführung in die Informatik Einführung in die Informatik für Naturwissenschaftler und für Naturwissenschaftler und
Ingenieure IIngenieure I
Kapitel 2
Gisbert Dittrich; Claudio Moraga
FBI Unido
2
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
EINI-I
Kapitel 2
Elementare Daten- und
Kontrollstrukturen
3
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Gliederung Kapitel 2Gliederung Kapitel 2
• Elementare Daten- und Kontrollstrukturen:
Je aus Beispielen entwickeln:– In-/Decrement-Operatoren– Getchar– Bedingte Anweisung– Zuweisung– Disjunktion/Konjunktion– Switch - break - continue– Eindimensionale Felder– For-Schleife
• Grammatikergänzung
4
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Lesen und TestenBeispiel: Lesen und Testen
• Problem: Lies Zeichen für Zeichen aus der Eingabe, bis das Endezeichen '@' erscheint. Gelesene Zeichen, die ungleich dem Leerzeichen sind, werden ausgegeben, sofern sie druckbar sind.
Prog-4
5
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Prog-4//// Liest die Eingabe Zeichen fuer Zeichen, bis // das Endzeichen @ erscheint. Jedes gelesene Zeichen// wird ausgegeben.// Demonstriert: Deklaration, Eingabe, // while-Schleife, zusammengesetzte Anweisungen
#include <iostream.h>int main() {
char Ende ='@', c;cin >> c;while (c != Ende) {
cout << "Gelesen: " << c << endl;cin >> c;
}return 0;
}
Ausführen
//
6
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Lesen und TestenBeispiel: Lesen und Testen
• Problem: Lies Zeichen für Zeichen aus der Eingabe, bis das Endezeichen '@' erscheint. Gelesene Zeichen, die ungleich dem Leerzeichen sind, werden ausgegeben, sofern sie druckbar sind.
7
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Lesen und TestenBeispiel: Lesen und Testen
• Die while-Schleife
while < Bedingung > Anweisung;
while < Bedingung > { Anweisung1 ; Anweisung2 ;
....................
AnweisungN ;
}
8
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Lesen und TestenBeispiel: Lesen und Testen
cin >> c;
while (c != Ende) {
cout << "Gelesen: " << c << endl;
cin >> c;
}
Test der Bedingung
Verlassen der while-Schleife,falls die Bedingung falsch ist
Ausführung des Blocks,
falls die Bedingung
wahr ist
{
cout << "Gelesen: " << c << endl;
cin >> c;
}
9
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Test, NegationSprachelemente: Test, Negation
• Der Test einer Bedingung hat den Wert wahr, falls das Resutat von 0 verschieden ist. Das Resultat mit dem Wert 0 wird stets als falsch interpretiert.
• == ist Test auf Gleichheit • != ist Test auf Ungleichheit • Vergleich erfordert Übereinstimmung der Typen.• ! ist Negation in C++, d. h. man kann
c !=Ende auch schreiben als !(c == Ende)
10
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: ZuweisungSprachelemente: Zuweisung
• = ist Zuweisung – a = b weist a den Wert b zu (und gibt den Wert von b als Wert zurück: die Zuweisung hat einen Wert, ist also ein Ausdruck)
– a == b überprüft, ob die Werte von a und b identisch sind.
• Folgen von Anweisungen werden in {..} eingeschlossen und gelten als eine Anweisung.
11
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Zeichen zählenBeispiel: Zeichen zählen
• Erweiterung des vorigen Beispiels:• Möchte zusätzlich Zeichen zählen und die
Anzahl der gelesenen Zeichen ausgeben.• Alle Zeichen werden auch ausgegeben.
Prog-5
12
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Prog-5// Liest die Eingabe Zeichen fuer Zeichen, bis // das Endzeichen @ erscheint. Jedes gelesene Zeichen// und die Gesamtzahl der Zeichen wird ausgegeben.// Demonstriert: Operator ++#include <iostream.h>int main() {
char Ende = '@', c;long int Zaehler; cin >> c; Zaehler = 1;while (c != Ende) {
cout << "Gelesen: " << c << endl;cin >> c; ++Zaehler;
}cout << "Anzahl der gelesenen Zeichen: "
<< Zaehler << "\n";return 0;
}
Ausführen
//
13
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: InkrementierenSprachelemente: Inkrementieren
• ++Zaehler erhöht den Wert der Variablen Zaehler um 1 (ist also gleichwertig mit der Zuweisung Zaehler = Zaehler + 1)
• Variante: Zaehler++– ++Zaehler erhöht Zaehler um 1 und
verwendet der erhöhten Wert (also: Erhöhung vor der Benutzung),
– Zaehler++ verwendet den alten Wert von Zaehler und erhöht Zaehler dann.
• Deswegen also „C++“ !!
14
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: InkrementierenSprachelemente: Inkrementieren
• ++Zaehler heißt Präfix-,
Zaehler++ heißt Postfix-Form
Beispiel:
a=1; b=1; c=1; d=1;cout << ++a << b++ << --c << d--
<< ‘\n' << a << b << c << d;
druckt: 2101
2200
15
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Zeichen zählen 2Beispiel: Zeichen zählen 2
• Erweiterung: möchte zusätzlich Anzahl der Leerzeichen und die Anzahl der Zeilen kennenlernen.– c ist Leerzeichen genau dann, wenn c == ‘ '– c beendet eine Zeile genau dann, wenn c == '\n‘
• Beachte: cin überliest die Leerzeichen, sucht also in der Eingabe nach dem ersten Zeichen , das vom Leerzeichen verschieden ist.
Prog-6
16
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Programm 6#include <iostream.h>#include <stdio.h>int main() {
char Ende = '@', ZeilenEnde = '\n', c;long int Zaehler, ZeilenEndeZaehler = 0;c = getchar(); Zaehler = 1;
while (c != Ende) {
if (c == ZeilenEnde) ZeilenEndeZaehler++;cout << "Gelesen: " << c << endl;c = getchar(); ++Zaehler;
} cout << "Anzahl der gelesenen Zeichen: “; cout << Zaehler ; cout << " (!= Ende: " << --Zaehler << ")\n" << "Anzahl der Zeilen: " << ZeilenEndeZaehler << endl; return 0;}
//
17
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Sprachelemente: getchar()getchar()
• getchar: liest von der Tastatur das nächste Zeichen und gibt es als Wert zurück.
• Technisch: getchar ist eine Funktion ohne Argument – Aufruf muß in C++ mit leerer Argumentliste erfolgen,
also als getchar()
18
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Programm 6#include <iostream.h>#include <stdio.h>int main() {
char Ende = '@', ZeilenEnde = '\n', c;long int Zaehler, ZeilenEndeZaehler = 0;c = getchar(); Zaehler = 1;
while (c != Ende) {
if (c == ZeilenEnde) ZeilenEndeZaehler++;cout << "Gelesen: " << c << endl;c = getchar(); ++Zaehler;
} cout << "Anzahl der gelesenen Zeichen: “; cout << Zaehler ; cout << " (!= Ende: " << --Zaehler << ")\n" << "Anzahl der Zeilen: " << ZeilenEndeZaehler << endl; return 0;}
Ausführen
//
19
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Bedingte Anweisung (einfache Form):
if (Bedingung) {Folge von Anweisungen
}• Dabei Wirkung:
– Auswertung des Ausdrucks "Bedingung" liefert: != 0 (d. h. wahr): Ausführung des Blocks { ... }
– Auswertung des Ausdrucks "Bedingung" liefert: == 0 (d. h. falsch): Ignorieren/Auslassen des Blocks { ... }
20
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Vorsicht:
In Bedingungen wird nicht auf wahr oder falsch getestet, sondern auf:
!= 0 / == 0
21
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Besteht die Folge nur aus einer Anweisung, so können die Klammern { ... } entfallen:
float f = 1.0; if (f) cout << "Bingo!";
druckt Bingo!
22
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Wörter zählenBeispiel: Wörter zählen
• Erweiterung zu Vorigem: – Möchte zusätzlich wissen, wie viele Wörter der Text
enthält.
• Wörter? – Getrennt durch Leerzeichen, Zeilenenden oder
Tabulatoren.
23
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Wörter zählenBeispiel: Wörter zählen
• Also: wenn beim Lesen von c gilt:c == ' ' || c == '\n' || c == '\t'
so bin ich nicht in einem Wort. • Das merke ich mir; ich merke mir auch, wenn
ich ein Wort neu betrete (; dann erhöhe ich den Wortzähler).
Prog-7
24
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Prog-7//// Liest die Eingabe Zeichen fuer Zeichen, bis // das Endzeichen @ erscheint. // Die Anzahl der Zeichen, der Zeilen und// der Woerter wird bestimmt und ausgegeben.// Demonstriert: mehrfache Zuweisung, bedingte Anweisung,// Booleschen Operator ||
#include <iostream.h>#include <stdio.h>int main() {
//const int true = 1, false = 0;char Ende = '@', ZeilenEnde = '\n',
Tab = '\t', LeerZeichen = ' ';char c;long int Zaehler, ZeilenZaehler, WortZaehler; int ImWort = false;Zaehler = WortZaehler = 0;c = getchar ();ZeilenZaehler =1;++Zaehler; 1
25
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Prog-7 (Fortsetzung)while (c != Ende) {
if (c == ZeilenEnde) ZeilenZaehler++;if ( c == LeerZeichen
|| c == ZeilenEnde || c == Tab) ImWort = false;
else if (!ImWort) {ImWort = true; ++WortZaehler;}
c = getchar ();++Zaehler;
}cout << "Anzahl der gelesenen Zeichen: " << Zaehler;cout << " (!= Ende: " << --Zaehler << ")\n"
<< "Anzahl der Zeilen: " << ZeilenZaehler << "\nAnzahl der Woerter: " << WortZaehler << endl;
return 0;} 2
•Ausführen
//
26
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Wörter zählenBeispiel: Wörter zählen
while (c != Ende) {
if (c == ZeilenEnde) ZeilenZaehler++;
if ( c == LeerZeichen ||
c == ZeilenEnde ||
c == Tab)
ImWort = false;
else if (!ImWort) {
ImWort = true;
++WortZaehler;
}
c = getchar();
++Zaehler;
Trenner gesehen keinen
Trenner gesehen,
also in einem Wort
Zeilenende gesehen
nächstes Zeichenerhöhe Zähler
27
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Zuweisung Sprachelemente: Zuweisung
• Die Zuweisung WortZaehler = 0– weist der Variablen WortZaehler den Wert 0 zu– hat den Wert 0 (d. h. den zugewiesenen Wert)
• Die Zuweisung wirkt also nicht nur als Anweisung (, die etwas tut), sondern auch als Ausdruck (, die einen Wert hat).
28
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Zuweisung Sprachelemente: Zuweisung
• Die mehrfache Zuweisung
Zaehler = Wortzaehler = 0
wirkt wie
Zaehler = (Wortzaehler = 0)• Also:
– Auswertung der Zuweisung Wortzaehler = 0
– Zuweisung des resultierenden Werts an die Variable Zaehler
29
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: ZuweisungSprachelemente: Zuweisung
• Auswertung erfolgt also von rechts nach links – a = b = c ist gleichwertig mit a = (b = c)
(„rechtsassoziativ“).– Konsequenz:
der Wert kann weiterverwendet werden.– z.B. a + (b = 3) bewirkt::
• Zuweisung von 3 an die Variable b,
• Erhöhung von a um 3,
• das ist häßlich !!.
30
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: ZuweisungSprachelemente: Zuweisung
• Beispiel: Testen:– if ((c = getchar( )) == Ende)
: Lies das nächste Zeichen, weise es c als Wert zu und (,da dies auch wie ein Ausdruck wirkt, ) teste den Wert von c, etc.
• Das trägt heftig zur Unlesbarkeit mancher Programme bei!
31
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: DisjunktionSprachelemente: Disjunktion
• || ist der „oder“ - Operator („Disjunktion“) ,
dabei ist:
x == y || a == b || e == fgleichwertig mit
(x == y || a == b) || e == f(„linksassoziativ“)
32
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: DisjunktionSprachelemente: Disjunktion
• Auswertung nur solange, bis das Ergebnis feststeht !!Beispiel: – if ( a = = b || e = = (k = r + 1)) cout << k
a b r k e Druck
0 1 17 0 18
0 0 17 0 18
beliebte Fehlerquelle !
18
0
• Analog: && Konjunktion („und“- Operator)
33
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Bedingte Anweisung mit Alternative. Syntaktisch sieht sie so aus:
if (Bedingung) {
Folge_1
}
else {
Folge_2
}
34
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Folge_1, Folge_2 sind Folgen von Anweisun-gen
• Bedeutung: klar.• Falls die Folge nur aus einer einzigen Anwei-
sung besteht, kann { } weggelassen werden. • Diese Anweisungen können wieder eine be-
dingte Anweisung sein (wie im Programmtext)• Folge_1 wird ausgeführt, wenn die Bedingung
wahr, Folge_2 wird ausgeführt, wenn die Bedingung falsch ist
35
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Mehrgliedrige Variante
if (Bed_1) { Folge_1 } else if (Bed_2) {
Folge_2 }
else { Folge_3
}
wird ausgeführt, wenn Bed_1 wahr ist
wird ausgeführt, wenn Bed_1 falsch,
jedoch Bed_2 wahr ist
wird natürlich in allen übrigen Fällen ausgeführt
Bitte besonders beachten !
36
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Bedingte AnweisungSprachelemente: Bedingte Anweisung
• Knifflig:
if1 (Bed_1)if2 (Bed_2) {
Folge_1 }else { Folge_2
}Wohin gehört das else? Zu if1 oder zu if2? Ausprobieren!
37
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Sprachelemente: switch-caseswitch-case
Beispiel: Programmausschnitt
switch (c) {
case 'A':++Zaehler_A;
case 'B':++Zaehler_B;
case 'C':++Zaehler_C;
default:++Zaehler_sonst; }
Vorsicht:
AbschließenVorsicht:
Abschließen
Vorsicht:
Abschließen
38
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Sprachelemente: switch-case-breakswitch-case-break
Beispiel: Programmausschnitt
switch (c) {
case 'A':++Zaehler_A; break;
case 'B':++Zaehler_B; break;
case 'C':++Zaehler_C; break;
default:++Zaehler_ sonst; }
switch-case
39
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
/* switch-caseIllustriert switch-case-break.Zählt die Vorkommen von A, B, C und der sonstigen Zeichen (ohne Trennzeichen). Abschluß durch @.*/
#include <iostream.h>#include <stdio.h>int main() {
char c; int Zaehler_A = 0, Zaehler_B = 0, Zaehler_C = 0, Zaehler_sonst = 0;cin >> c;while (c!= '@') {
switch (c) {case 'A':
++Zaehler_A;break;
case 'B':++Zaehler_B;break;
1
40
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
//(Fortsetzung)
case 'C':++Zaehler_C;break;
default:++Zaehler_sonst;
}; cin >> c;
};cout << "Zähler_A: "<< Zaehler_A << '\n'
<< "Zähler_B: "<< Zaehler_B << '\n' << "Zähler_C: "<< Zaehler_C<< '\n' << "Zähler_sonst: "<< Zaehler_sonst<< '\n';
return 0;} 2
Ausführen
//
41
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Sprachelemente: switch-case-breakswitch-case-break
• switch (x) prüft Wert von x gegen Werte const in:
case const:
• Dabei gilt:• Werte müssen verschieden sein• Werte müssen vom Typ von x sein
– Achtung: Typkonvertierungen beachten !– können über Ausdrücke berechnet werden
• zugehörige Anweisungsfolge abschließen– z.B. durch break– ansonsten werden die nachfolgenden Fälle mit durchlaufen!!
42
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Sprachelemente: Sprachelemente: switch-case-breakswitch-case-break
• break – bewirkt Sprung z.B. aus switch, while, for.
• default– deckt alle nicht aufgeführten Fälle ab.– kann fehlen.
43
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel: Wörter etc. zählenBeispiel: Wörter etc. zählen
• Problem:
Möchte wissen, wie oft die folgendenZeichen vorkommen:– Ziffern (pro Ziffer: wie oft?)– Trennzeichen (d. h. '\t', '\n', ' ‘)– alle anderen
Prog-8
44
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// Prog-8//// Liest die Eingabe Zeichen fuer Zeichen, bis // das Endzeichen @ erscheint. // Die Anzahl der Trennzeichen (Zeilenende, Tab, // Leerzeichen), der Ziffern und aller anderen Zeichen // wird bestimmt und ausgegeben.// Demonstriert: bedingte Anweisung, Felder, for-Schleife//#include <iostream.h>#include <stdio.h>
int main() {char Ende = '@';char ZeilenEnde = '\n', Tab = '\t', LeerZeichen = ' ';char c;long int Zaehler = 0;
long int TrennZeichenZaehler = 0; long int ZiffernZaehler[10];
int i;1
45
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
for (i = 0; i < 10; ++i) ZiffernZaehler[i] = 0;
//// jetzt geht's los: der Text wird gelesen, die// Zaehler werden bestimmt.//c = getchar();while (c != Ende) {
if (c >= '0' && c <= '9')++ZiffernZaehler[c - '0'];
else if (c == LeerZeichen || c == ZeilenEnde || c == Tab)
++TrennZeichenZaehler;else
++Zaehler;c = getchar();}
2
46
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
// // Ausgabe der Ergebnisse
//
cout << "Anzahl der Trennzeichen: " << TrennZeichenZaehler;
for(i = 0; i < 10; ++i) cout << "\nZiffer " << i
<< " wurde " << ZiffernZaehler[i] << "\tmal gelesen";
cout << "\nandere Zeichen: " << Zaehler << endl;
return 0;}
Ausführen
//
47
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
FelderFelder
• int ZiffernZaehler[10];vereinbart ein Feld mit Namen ZiffernZaehler
• das Feld enthält die ganzzahligen Elemente ZiffernZaehler[0]..Ziffernzaehler[9]
Anzahl der Elemente in dem Feld
Beginn bei 0(immer!)
Ende bei Anzahl-1
48
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
FelderFelder
• Konstruktionsmuster: – TT Ara[k] stellt ein Feld Ara mit k Elementen
Ara[0], ..., Ara[k-1]
zur Verfügung, jedes Feldelement ist vom Grundtyp TT
– im Augenblick ist der Grundtyp int
• k kann ein ganzzahliger Ausdruck sein, der zur Zeit der Definition des Feldes bekannt sein muß.
49
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
AnmerkungenAnmerkungen
• c - '0' : – Konvertiert implizit c in eine ganze Zahl: das
Bitmuster wird als Zahl interpretiert, ebenso '0'.– Ergibt: '8'-'0' = 8– Die Konversion wird durch - ausgelöst. (Operatoren
der Subtraktion müssen Zahlen sein).
• Ziemlich unsauber, aber Teil der Magie von C++.
50
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
AnmerkungenAnmerkungen
• Bei ++ZiffernZaehler[c - '0'] passiert also folgendes:– der Wert der zu c gehörenden Ziffer wird ermittelt,
der entsprechende Feldeintrag wird um 1 erhöht.
• c muß einer Ziffer entsprechen• es hätte auch ZiffernZaehler[c - '0']++ heißen können.
51
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Die Die forfor-Schleife-Schleife
• for (A; B; C) { Folge von Anweisungen}– A - Initialisierungsteil: Mit diesem Wert wird
die Folge von Anweisungen am Anfang durchlaufen, (falls B erfüllt).• z. B. Zuweisung eines Anfangswerts an die
"Laufvariable".
Initialisierungs-
teil
Bedingungs-
teilAktionsteil
Schleifenrumpf
52
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Die Die forfor-Schleife-Schleife
– B: Bedingungsteil: wird vor jedem Durch-lauf überprüft. Wenn die Auswertung den Wert falsch ergibt:
Abbruch/Verlassen der Schleife
Wenn die Auswertung den Wert wahr ergibt: 1. Ausführung des Schleifenrumpfs und 2. des Aktionsteils (C).
- C: Aktionsteil: wird bei jedem Durchlauf ausgeführt.
53
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 1: Beispiel 1: forfor-Schleife-Schleife
• for (i = 0; i < 10; i++)
ZiffernZaehler[i] = 0;
initialisiert alle Elemente des Feldes ZiffernZaehler zu 0
• Gleichwertige Formulierung: for (i=0; i<10;)
ZifferZaehler[i++]=0;
54
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 2: Beispiel 2: forfor-Schleife-Schleife
for (;(c=getchar())!= Ende;)
cout <<c;
ist gleichwertig mit
c=getchar();
while (c!=Ende){
cout << c;c=getchar();
}
Initialisierungsteil leer Aktionsteil leer
Überprüfung findet statt
55
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 3: Beispiel 3: forfor-Schleife-Schleife
• A, B oder C können leer sein:
"Preis"frage: for (;;);
tut was ?
Endlosschleife, die nichts tut
56
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 4: Beispiel 4: forfor-Schleife--Schleife-breakbreak
for (;;) {
cin >> c;
if (c >= '0' && c <= '9')
break;
else ++Zaehler;
}
break
57
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
/* BreakIllustriert break, um eine Endlosschleife beim ersten Erscheinen der ersten Ziffer im Eingabestrom zu verlassen.*/
#include <iostream.h>#include <stdio.h>int main() {
int Zaehler = 0;char c;for (;;) {
cin >> c;if (c >= '0' && c<= '9') // Enthält c Ziffer ?
break;else ++Zaehler;
}cout << "Anzahl der Zeichen (ohne Trennzeichen) vor erster Ziffer: " << Zaehler << ‘\n';
return 0;}
//
58
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 5: Beispiel 5: forfor-Schleife--Schleife-continuecontinue
for (i=1; i < 11; i++) {
cin >> c;
if (c >= '0' && c <= '9')
continue;
++Zaehler;
}
continue
59
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
/* ContinueIllustriert continue durch Ausgabe der Anzahl der Zeichen, wobei Trennzeichen und Ziffern nicht gezählt werden, unter den ersten zehn (echten) Zeichen. */#include <iostream.h>#include <stdio.h>int main() {
int Zaehler = 0, i = 0;char c;for (i=1; i < 11; i++) {
cin >> c;if (c >= '0' && c <= '9')// c stellt eine Ziffer dar
continue;++Zaehler;
}cout << "Anzahl der Zeichen (ohne Trennzeichen
und ohne Ziffern) für die ersten 10 Zeichen: " << Zaehler;return 0;
}//
60
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Beispiel 5: Beispiel 5: forfor-Schleife--Schleife-continuecontinue
• continue– läßt den Rest des Rumpfes weg– springt an den Anfang des nächsten Durchlaufs
61
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Expressionsexpression: assignment-expression
/* additive --> assignment- */
more
assignment-expression: conditional-expression
unary-expression assignment-operator assignment-expression
assignment-operator: =
more
constant-expression: conditional-expression
conditional-expression: logical-or-expression
more
logical-or-expression: logical-and-expression
logical-or-expression | | logical-and-expression
62
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Expressionslogical-and-expression: inclusive-or-expression
logical-and-expression & & inclusive-or-expression
inclusive-or-expression: equality-expression
more
equality-expression: relational-expression
equality-expression == relational-expression
equality-expression != relational-expression
relational-expression: additive expression
more
63
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Expressionsadditive-expression: multiplicative-expression
additive-expression + multiplicative-expression
additive-expression - multiplicative-expression
multiplicative-expression: unary-expression
multiplicative-expression * unary-expression
multiplicative-expression / unary-expression
multiplicative-expression % unary-expression
unary-expression: primary-expression
++ unary-expression
more
64
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Expressionsprimary-expression: literal
more
( expression )
name
literal: integer-constant
character-constant
floating-constant
string-literal
boolean literal
boolean literal: false
true
65
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Statementsstatement: labeled-statement
expression-statement
compound-statement
selection-statement
iteration-statement
jump-statement
more
labeled-statement: more
case constant-expression : statement
default : statement
66
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Statementsexpression-statement: expressionopt ; /* ; !!!!!*/
compound-statement: { statement-seqopt }
[statement-seqopt = statement-seq | ]
statement-seq: statement
statement-seq statement
selection-statement: if ( condition ) statement
if (condition ) statement else statement
switch (condition ) statement
condition: expression
more
67
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Statementsiteration-statement: while ( expression ) statement
for ( for-init-statement ; expressionopt ; expressionopt ) statement
more
for-init-statement: expression-statement
more
jump-statement:break ;
continue ;
return expressionopt ;
68
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Ableitungsbeispiel• Aufgabe: Leite ab:
while (c != Ende) {
if (c == Zeilenende)
++Zeilenzaehler;
else break; }
Aufgrund schon vorliegender Erfahrung werden im folgenden mehrere Schritte zusammengefaßt, jedoch noch im Kommentar erwähnt.
69
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Ableitungsbeispiel
Ableitung:statement /* statement: ..|iteration-statement |....*/
iteration-statement
/*iteration-statement: while ( expression ) statement*/
while ( expression ) statement
/* expression: assignment-expression*/
while (assignment-expression) statement
/* assignment --> conditional--> logical-or --> logical-and --> inclusive-or --> equality */
while (equality-expression) statement
/*equality-expression: equality-expression != relational-expression*/
70
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Ableitungsbeispielwhile (equality-expression != relational-expression) statement
/* equality --> relational --> additive --> multiplicative --> unary --> primary --> name*/
while (c != Ende) statement
/* statement-- > compound-statement --> { statement-seqopt }
{ statement-seq } --> { statement } */
while (c != Ende) { statement }
/* statement--> selection- -->
if ( condition ) statement else statement*/
while (c != Ende) { if ( condition ) statement else statement }
/* condition--> expression --> c == Zeilenende */
71
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
Grammatikergänzung Kapitel 2Grammatikergänzung Kapitel 2
• Ableitungsbeispielwhile (c != Ende) { if (c == Zeilenende ) statement else
statement }
/* statement --> expression-st --> expressionopt ; (Semikolon!!!) --> expression; --> assignment-exp.; --> conditional ; --> ...--> multiplicative; --> unary; --> ++ unary ; --> ++ primary ; --> ++ name; --> ++ Zeilenzaehler; */
while (c != Ende) { if (c == Zeilenende ) ++ Zeilenzaehler; else statement }
/* statement --> jump-statement--> break ;*/
while (c != Ende) {
if (c == Zeilenende ) ++ Zeilenzaehler;
else break ;}
72
Kap 2: Elem. Dat.+Kontrollstrukt.Vorl “EINI-I"
13.10.2000
LiteraturergänzungLiteraturergänzung
• Stroustrup, B.: Die C++ ProgrammierspracheAddison-Wesley, 3.Auflage 1998