Programmiersprachen Einführung in C Gliederung

Werbung
Gliederung Programmiersprachen
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Programmiersprachen
Einführung in C
Teil 5: Kontrollstrukturen
Prof. Dr. Jörg Schwenk
Lehrstuhl für Netz- und Datensicherheit
Von der Maschinensprache zu C
Die Struktur von C-Programmen
Variable und Datentypen in C
Bildschirm Ein-/Ausgabe
Kontrollstrukturen
Funktionen
Programmierstil, Programmierrichtlinien
Felder u. Zeichenketten
Ausdrücke
Arbeiten mit Dateien
Strukturen, Aufzählungstypen
Zeiger
Enums, Strukturen und Unions
Speicherklassen
Optional: Vertiefung einiger Themen
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
Kontrollstrukturen
Verzweigung mit IF
ƒ Ohne Kontrollstrukturen:
ƒ
allgemeine Formen bedingter Anweisungen
if
ƒ lineare Programme
ƒ sequentielle Ausführung der Anweisungen
ƒ
( <Bedingungsausdruck> )
Behandlung von Anweisungsfolgen
// Einzelanweisung
// Einzelanweisung
// Einzelanweisung
if ( <Bedingungsausdruck> )
<Anweisungsfolge>
{
if ( <Bedingungsausdruck> )
<Anweisungsfolge>
{
// Anweisungsfolge in { ... }
}
ƒ Abhilfe
ƒ Anweisungen für die bedingte Ausführung von Anweisungsblöcken
ƒ Verzweigung und Mehrfachverzweigung, Kaskadierung von Bedingungen
ƒ Wiederholungsanweisungen für die wiederholte Ausführung von
Anweisungsblöcken
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
)
<Anweisung> ;
else
<Anweisung> ;
keine Reaktion auf äußere und innere Bedingungen möglich
keine Ausnahmebehandlung / Fehlerbehandlung möglich
starrer Ablauf, keine Wiederholungen
Parametrisierung eingeschränkt
arme Algorithmen-Schemata für Programmentwurf
Kontrollstrukturen
( <Bedingungsausdruck>
<Anweisung> ;
if
ƒ Probleme:
ƒ
ƒ
ƒ
ƒ
ƒ
2
3
Beispiele für Fallunterscheidungen
// Anweisungsfolge in { ... }
}
else {
<Anweisungsfolge>
}
Kontrollstrukturen
// Anweisungsfolge in { ... }
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
4
Beispiel: Zahlenklassifizieren
void main ()
{
const int zehn = 10;
int wert = 0;
ƒ Schleichwegfahrt: Pirckheimerstr. Fahrt Richtung Osten, wenn
Tageszeit zwischen 7 und 19 Uhr und Fußgängerampel auf rot,
dann fahre Schleichweg, sonst fahre geradeaus.
printf(”\ngib eine Zahl ein : ”);
scanf("%d", &wert);
ƒ Abbruchbedingungen für Eingaben: noch eine Diskette
formatieren ?
ƒ Entscheidungen über Variablenwerte
ƒ Steuerung technischer Vorgänge: Wenn Vorlauftemp. unter Soll,
dann öffne Mischer
ƒ wenn Vorlauf-Temp. nicht höher als Zimmer-Temp. + 5° und
Rücklauf zwischen Vorlauf und Vorlauf - 2°, dann Umwälzpumpe
aus
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
}
5
if ( wert == zehn ){
// falls Wert gleich (Vorsicht !!)
printf(”der Wert ist zehn ”);
}
else {
// andernfalls überprüfe, ob
if ( wert > zehn ){
printf(” Der Wert ist größer als zehn ”);
}
else {
// falls das auch nicht gilt
printf("Der Wert ist kleiner als zehn ”);
}
}
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
6
1
Beobachtungen (bei großer
Schachtelungstiefe)
Vergleiche und logische Operatoren
ƒ Vergleichsoperatoren und logische Operatoren liefern als
Ergebnis ...
ƒ Große Schachtelung führt schnell zur Unübersichtlichkeit
ƒ Einrückung im Programmtext ermöglicht Überblick
ƒ Strukturierung durch Verteilen auf mehrere Funktionen fördert
Übersichtlichkeit
ƒ Falls möglich auf switch-Anweisung (später) ausweichen
ƒ Achtung beim Test: im Extremfall Verdoppelung der
Programmpfade mit jeder neuen Entscheidungsebene
Anzahl der
(Schachtelungsebene)
ƒ
ƒ
Programmpfade:
max. 2Schachtelungstiefe
ƒ Vergleichsoperatoren
ƒ
ƒ
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
7
in C++ Wahrheitswerte (Datentyp: bool),
in C jedoch einfach einen Zahlenwert, welcher entsprechend
interpretiert wird
wahr
/
falsch
true
/
false
≠0
/
0
(interne Realisierung)
gleich |ungleich |kleiner als |größer als |kleiner oder gleich |größer
oder gleich
==
!=
<
>
<=
>=
Vergleiche haben geringere Auswertepriorität als arithmetische
Operatoren
if (i < lim-1) --> if (i < (lim-1)) // wie erwartet!
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
8
Vergleiche und logische Operatoren
Verwendung von Bedingungen
ƒ Besonderheit in C/C++
ƒ Beispiele
ƒ
ƒ
ƒ
ƒ
Jeder Ausdruck kann als Wahrheitswert interpretiert werden
Daher:
if (3*x/12) zulässig; In Abhängigkeit von x wird
verzweigt
Insbesondere:if ( x = 12 ) ebenfalls zulässig; Konsequenzen???
Wertzuweisung hat niedrigere Priorität als Vergleichsoperatoren!
if ( (c=getchar()) != 'n') // Klammerung nötig!
Kontrollstrukturen
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
9
Verwendung von Bedingungen
if (zahl > 10)
if (zahl)
if (zahl != 0)
if (3*x < 0)
if (x*x > 3*y*z)
if (fp = fopen("Datei", "r"))
if (test(x))
while (*d++ = *s++) ; (später)
for(i=0; i<27; i++)
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
10
logische Operatoren
ƒ Empfehlung: auf Lesbarkeit achten!
ƒ
Bei Vergleichen den "konstanteren" Teil auf die rechte Seite des
Vergleichsoperators stellen,
z.B.
for(i=0; i<27; i++)
nicht:
for(i=0; 27>i; i++)
ƒ
Kein unnötiger Gebrauch von Wertzuweisungen im
Bedingungsteil; Beispiel:
fp = fopen("Datei", "r");
if (fp != NULL)
wäre ebenfalls möglich gewesen
ƒ
ƒ ... verknüpfen Wahrheitswerte zu einem neuen Wahrheitswert
ƒ ... sind definiert über Ausdrücken, die zu Wahrheitswerten
ausgewertet werden können
Lieber (aufgrund der Auswerteprioritäten) zuviel Klammern setzen
als eine zuwenig!
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
11
Operator
NICHT
UND
/ NOT
/ AND
ODER
/ OR
Kontrollstrukturen
Schreibweise Schema wahr, wenn
!
! a
a ist falsch
&&
a && b beide sind wahr
||
a || b ein Operand wahr
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
Beispiel
! (a < b)
(a==b)&&(b < c)
(a<b) || (a>b)
12
2
logische Operatoren
Verwendungsbeispiele
ƒ Prioritäten
ƒ Bedingungsausdrücke (if-Anweisung , bedingte Schleifen)
Verknüpfen von Wahrheitswerten, Variablen und Vergleichsausdrücke
ƒ ! hat höhere Priorität als die Vergleichsoperatoren
ƒ die Priorität von && ist größer als die von ||
ƒ beide haben geringere Priorität als die Vergleichsoperatoren!
ƒ Wichtige Besonderheit bei C/C++
ƒ && oder || - Ausdrücke werden strikt von links nach rechts bewertet
ƒ ... und zwar nur solange (!), bis das Resultat der logischen
Verknüpfung feststeht!
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
13
ƒ
ƒ
ƒ
if (!( a < 1.0) )
if (!a)
if (!test(a))
ƒ
if ( (a < 1.0) && (b > 4.7))
if ( a < 1.0 && b > 4.7 )
ƒ
do ...... while ((c=getchar()) != 'n'
ƒ
in Wertzuweisungen für Wahrheitswerte:
a = a && (b < c) ;
a = (a == b) || (b == c);
Kontrollstrukturen
Verwendungsbeispiele
switch
ƒ Typische Anwendungen
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c !=
EOF; ++ i)
s[i] = c;
ƒ
if (test() && tue_manches() )
// Achtung: tue_manches() wird nur aufgerufen, wenn test() true lieferte!!!
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
15
switch
ƒ
ƒ
ƒ
ƒ
switch ( <Ganzzahlausdruck> )
{
case <Ganzzahlkonstante>:
<Anweisung>
// Fall 1
....
// Fall n
case <Ganzzahlkonstante>:
<Anweisung>
default :
<Default-Anweisung> // sonst-Fall
}
<Ganzzahlausdruck>: Ausdruck, der zu einem ganzzahligen Wert
ausgewertet wird
<Ganzzahlkonstante>: ganze Zahl oder Zeichen , keine strings!
<Anweisung>
alle in C/C++ erlaubten, formulierbaren Anweisungen,
besonders: break; (Verlassen der switchAnweisung)
<Default-Anweisung>
Sonst-Fall, kann fehlen
Kontrollstrukturen
c != 'y')
14
Fallunterscheidung
Auswahlentscheidungen - 1 aus n
Anweisungskaskade mit berechnetem Einstieg
vollständige Mehrfachverzweigung
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
16
Abarbeitung der switch-Anweisung
ƒ Syntax
ƒ
ƒ
ƒ
ƒ
ƒ
&&
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
ƒ Bedingungsausdrücke (if-Anweisung , bedingte Schleifen)
Verknüpfen von Wahrheitswerten, Variablen und Vergleichsausdrücke
ƒ
// ausreichend wäre:
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
17
ƒ Auswerten des <Ganzzahlausdruck>
ƒ Vergleich mit <Ganzzahlkonstante> der case-Konstante
ƒ Bei Gleichheit Ausführen der <Anweisung> hinter ":"
ƒ Anweisungsausführung ohne / mit break;
ƒ sequentielle Bearbeitung aller folgenden <Anweisungen> bis zum
ersten break;
ƒ oder bis Ende der switch ... } - Anweisung
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
18
3
Beispiel für Verwendung von switch:
Realisierung von Auswahl-Menüs
Abarbeitung der switch-Anweisung
Cmd = getchar();
switch (Cmd) {
case 'h':
printf("Hilfe:\n");
printf("p - PKW eingeben\n";
printf("m - Motorrad eingeben\n";
printf("s <Kennzeichen> Daten zum Kennzeichen abrufen\n";
printf("d - alle Daten abrufen\n";
printf("x - Programm verlassen\n\n";
break;
case 'p':
/* Abfrage der PKW-Daten und Ablegen der Daten */
break;
case 'm':
/* Abfrage der Motorrad-Daten und Ablegen der Daten */
break; ...
case 'd':
/* Ausgabe der gesamten erfassten Daten */
break;
}
ƒ Besonderheit: <Anweisung> bzw. break kann auch fehlen:
ƒ Zusammenfassen mehrerer Fälle zu gleicher Bearbeitung
switch (ausdruck) {
case 1:
case 2:
printf("Fälle 1 & 2 ...");
break;
}
ƒ keine Übereinstimmung mit Fall-Konstante
ƒ Ausführen der <Default-Anweisung>
ƒ fehlt <Default-Anweisung>, Fortsetzung hinter switch ... }
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
19
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
Zählschleife mit for
Zählschleife mit for
ƒ Wiederholung von Anweisungen abhängig von Zählvariable
ƒ typische Anwendungen:
ƒ Besonderheiten / zu beachten
ƒ Durchlassausdruck wird vor dem (ersten) Betreten des
Schleifenrumpfs überprüft und kann somit zum "Überspringen" des
Schleifenrumpfs führen
ƒ Indexlauf, Indizierung von Feldelementen
ƒ Berechnungen, abhängig von Zählvariable
for (<Initialisierungsausdruck> ;
// initialisiert Zählvar.
<Durchlassausdruck>
;
// Bedingung für Durchlauf
<Schleifennachlaufausdruck> ) // Operation auf Zählvariable
< Anweisung> oder {< Anweisungsfolge>} // Schleifenrumpf
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
20
21
Zähl-Schleife mit for
ƒ Wert einer globalen Zählvariable ist nach der for-Schleife definiert
ƒ Die Berechnung innerhalb des Schleifenrumpfs muß der
Abbruchbedingung zustreben (Durchlassausdruck = false)
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
22
Zähl-Schleife mit for
ƒ Komma-Operator ermöglicht Initialisierung mehrerer
Variablen bzw. Fortschaltung mehrerer Variablen im
Schleifennachlaufausdruck
for (j=0, i=1; j<max; i++, j++) ...
ƒ Der Anweisungsteil kann leer sein (weil schon alles im for-Kopf
passiert).
Empfehlung: Dies optisch durch eine Zeile nur mit Semikolon
verdeutlichen!!!
for (i=0; z[i]=q[i]; i++)
;
ƒ Jeder der drei for-Schleifenabschnitte (Init, Durchlassen,
Fortschalten) kann leer sein. Ein fehlender
Durchlassausdruck wird als 'wahr' angenommen!!!
// z und q Zeichenketten
for ( ; ; ) // Formulierung einer unendlichen Schleife
--> Die Abbruchbedingung muß somit im Schleifenrumpf
stehen (break, return, oä.)
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
23
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
24
4
Äquivalente Formulierung von for in
Form einer while-Schleife
Beispiele
ƒ for (x=10 ; x<=15 ; x++)
// Schleifenkopf
{
printf("%d %d\n", x, x*x); // Schleifenrumpf
}
// { } Hier eigentlich unnötig
<Initialisierungsausdruck>
while (<Durchlassausdruck>)
feld
0
1
2
3
{
4
<Anweisungen....>
<Schleifennachlaufausdruck>
ƒ max = feld[0];
// Was wird berechnet ?
for ( x=1; x<maxanz ; x=x+1 ) //
{
if (feld[x] > max)
//
max = feld[x];
//
}
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
}
25
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
Bedingte Schleifen mit while und do
... while
Bedingte Schleifen mit while und do
... while
ƒ Anwendungen:
ƒ Syntax der do ... while - Schleife:
do
bzw. { <Anweisungsfolge> }
<Anweisung>
while (<Bedingungsausdruck>)
ƒ bedingte Wiederholung einer Anweisung / Anweisungsfolge
ƒ do ... while besonders für Tastaturabfragen ... bis Eingabe gültig
ƒ Syntax der while-Schleife:
ƒ Semantik:
while ( <Bedingungsausdruck> )
<Anweisung> bzw. {<Anweisungsfolge> }
ƒ Semantik
ƒ Solange <Bedingungsausdruck> wahr, führe <Anweisung...>
aus.
ƒ Prüfe vor erstem Durchlauf
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
26
27
ƒ Führe den Schleifenrumpf aus, solange der <Bedingungsausdruck>
wahr ist
ƒ Prüfe nach dem (ersten) Durchlauf --> mindestens ein Durchlauf!
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
28
Unbedingte Fortsetzungen mit goto,
continue, break, return
Bedingungen für alle Schleifen
ƒ goto marke ;
ƒ Der <Bedingungsausdruck> muß durch die Operationen im
Schleifenrumpf dem Wahrheitswert false zustreben
(nicht unbedingt monoton!)
ƒ dann:
ƒ sonst:
ƒ Herkunft: Assembler, Fortran, Basic,...
ƒ Wirkung: Unbedingte Fortsetzung des Programmlaufs bei der durch
Marke angezeigten Stelle innerhalb derselben Funktion
Schleife terminiert
Endlosschleife
ƒ Anwendung
ƒ möglicher, aber nicht nötiger Anwendungsfall kann das Verlassen einer
tiefen Schachtelung sein, wenn Fehler, z.B. bei Funktionsaufrufen,
eingetreten sind.
ƒ for (...)
{ ...
while (...)
{ ...
if (schwerer_fehler) goto fehlerbehandlung;
}
}
fehlerbehandlung: fehler_behandlungs_anweisung ;
ƒ Als <Bedingungsausdruck> zulässig
ƒ alle arithmetischen Ausdrücke,
ƒ alle Zeiger-Ausdrücke und
ƒ alle unzweideutig in solche konvertierbaren Ausdrücke
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
29
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
30
5
Beispielprogramm für continue
continue
ƒ Bedeutung
ƒ // programm anz_ohne, Beispiel für die Anwendung von continue
// das Prog. zählt die Zeichenvorkommen != dem Zeichen in c (variable)
ƒ Beende aktuellen Durchlauf durch den Schleifenrumpf
ƒ setze Schleife mit neuem Durchlauf (d.h. ggf. Fortschaltung,
Durchlassprüfung) fort
void main (void)
{
const maxstr = 20;
char str [maxstr] = ”Maximilian”;
char c = 'i';
// Vergleichszeichen
int anzahl = 0, anz_ohne_c = 0; // index bzw. zählervariable
ƒ Wirkung
ƒ Abbrechen des aktuellen Schleifendurchlaufs
ƒ nicht jedoch der ganzen Schleifenanweisung!!!
while (str [anzahl])
// solange string-Ende nicht erreicht
{
if (str[anzahl++] ==c)
continue;
// beende Rumpfdurchlauf falls==c
anz_ohne_c = anz_ohne_c + 1; // sonst: erhöhe zähler
}
// enthält Zeichenanzahl ohne c
ƒ Anwendung
ƒ eher selten
ƒ Einsparung von if-Schachtelungen innerhalb des Schleifenrumpfs
}
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
31
Beispielprogramm für continue
if (str[anzahl++] != c)
// erhöhe zähler, wenn zeichen != c
anz_ohne_c = anz_ohne_c + 1;
// erhöhe feldindex, = gesamtanzahl
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
32
break
ƒ Wie kann man auf dieses continue verzichten bzw. es ohne Verlust
ersetzen?
Kontrollstrukturen
Kontrollstrukturen
ƒ Bedeutung / Wirkung:
ƒ Bricht die Bearbeitung des aktuellen umgebenden switch-Blocks
oder der umgebenden Schleife ab.
ƒ Fortsetzung bei der Anweisung, die dem switch bzw. der Schleife
folgt.
ƒ Anwendung
ƒ durchaus geläufige Verwendung
ƒ Realisierung einer echten Mehrfachverzweigung in switch
ƒ Abbruch einer Schleife beim Eintreten von Ablaufbesonderheiten,
evtl. von Fehlern
ƒ Einsparung von 'Hilfsvariablen', die im Durchlassausdruck immer
wieder abgetestet werden müssen sowie das Verlassen einer
möglicherweise tiefen IF-Schachtelung
33
Kontrollstrukturen
Quelle: R. Eck und U. Wienkop
Programmieren I, GSO FH Nürnberg
34
6
Herunterladen