3. Kontrollstrukturen 3.1. Bedingte Verzweigung Erlaubt die

Werbung
3. Kontrollstrukturen
3.1. Bedingte Verzweigung
Erlaubt die Programmierung von ja/nein Entscheidungen
Syntax:
if
(
Ausdruck
else
)
Anweisung
Anweisung
Beispiele:
(1) if - Anweisung ohne else-Zweig
if (x)
Anweisung1;
Anweisung3;
/* wird ausgeführt wenn x ungleich Null */
/* wird immer ausgeführt */
(2) if - Anweisung mit else-Zweig
if (x)
Anweisung1;
else
Anweisung2;
Anweisung 3;
/* wird ausgeführt wenn x ungleich Null */
/* wird ausgeführt wenn x gleich Null */
/* wird immer ausgeführt */
An die Stelle der Anweisungen 1 und 2 können auch mehrere Anweisungen (Blöcke), die von
{ und } begrenzt werden, treten.
Beispiel 3.1:
#include<stdio.h>
#include<conio.h>
Eingabe: stunde
void main()
{
int stunde;
clrscr();
printf("Stunde (0-24) eingeben -->");
scanf("%d", &stunde);
if (stunde < 12)
printf("Good morning\n");
else
printf("Good afternoon\n");
}
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
stunde < 12
ja
nein
Ausgabe:
Ausgabe:
Good morning
Good afternoon
Einer der häufigsten Fehler beim Programmieren einer bedingten Verzweigung (neben der
Verwechslung des Zuweisungsoperators = mit dem Vergleichsoperator ==) ist das Setzen
eines Strichpunktes hinter if(Ausdruck).
z.B: if(a>b);
Anweisung1;
Der Strichpunkt nach if(a>b) bedeutet eine leere Anweisung und die Anweisung1 wird in
jedem Fall ausgeführt. Ein Strichpunkt nach if(Bedingung) ist nur dann korrekt, wenn
der if-Zweig einer bedingten Verzweigung leer sein soll und daher nur der else-Zweig
ausgeführt werden darf. In diesem Fall sollte die leere Anweisung der Deutlichkeit halber erst
in der nächsten Zeile stehen. Man sollte allerdings prüfen, ob in einem solchen Fall nicht das
Vertauschen der ja - nein Zweige sinnvoller ist.
if(a>b)
;
/* keine Aktion, wenn a>b */
else
Anweisung;
a>b
ja
nein
Anweisung
Bedingte Verzweigungen können in beliebiger Tiefe verschachtelt werden. Um die
Übersichtlichkeit eines Programms zu fördern ist es empfehlenswert, die Verschachtelung
durch Einrückungen im Listing zu dokumentieren.
if(B1)
if(B2)
{
A1;
A2;
}
else
A3;
else if(B3)
{
A4;
A5;
A6;
}
else if(B4)
A7;
else
{
A8;
A9;
}
B1
j
n
B2
B3
j
n
j
n
A4
B4
A1
j
A3
A5
n
A8
A7
A2
A6
A9
Übungen:
3.1. Es sind zwei Zahlen vom Datentyp unsigned einzulesen und der ganzzahlige Quotient
sowie der Rest auszugeben. Ist der Divisor Null, so soll eine entsprechende Meldung
ausgegeben werden.
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
3.2.
x und y-Koordinate eines Punkes sind einzulesen. Anschließend ist eine der folgenden
Meldungen auszugeben:
Der Punkt liegt im 1.Quadranten
Der Punkt liegt im 2.Quadranten
Der Punkt liegt im 3.Quadranten
Der Punkt liegt im 4.Quadranten
Der Punkt liegt auf der x-Achse
Der Punkt liegt auf der y-Achse
Der Punkt ist der Ursprung
3.3.
Es ist eine Zahl vom Datentyp unsigned einzulesen und zu prüfen, ob die Zahl
dreistellig war. Ist dies der Fall, so ist weiters zu prüfen, ob die Zahl durch ihre
Ziffernsumme teilbar ist.
3.2. Schleifen mit Eingangsbedingung
Syntax:
while
(
Ausdruck
)
Anweisung
Zunächst wird "Ausdruck" ausgewertet. Ergibt sich ein Wert ungleich Null (Ist "Ausdruck"
also wahr) so wird "Anweisung" ausgeführt. Anweisung ist entweder eine einzelne
Anweisung oder ein durch {} begrenzter Block. Nun wird wieder "Ausdruck" ausgewertet
und der Ablauf wiederholt sich solange, bis "Ausdruck" den Wert Null aufweist (also falsch
ist). Das Programm wird nun nach "Anweisung" fortgesetzt.
Anweisung heißt auch Schleifenkörper.
Beispiel 3.2:
#include<stdio.h>
void main()
{
int a=5, b=15;
a = 5, b = 15
solange a<=b
Ausgabe a
while(a<=b)
{
/* Beginn des Schleifenkörpers */
printf("\n a hat nun den Wert %2d", a); /* Zeile 7 */
a++;
/* Zeile 8 */
}
/* Ende des Schleifenkörpers */
a inkrementieren
}
Welche Ausgabe erzeugt obiges Programm. Wie ändert sich die Ausgabe, wenn man Zeile 7
und 8 vertauscht ?
Beachte:
Wenn die Auswertung von "Ausdruck" gleich zu Beginn den Wert Null liefert, wird die
while-Schleife nicht durchlaufen !
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Beispiel 3.3
#include<stdio.h>
Lese Zeichen ch
void main()
{
int ch;
solange ch  EOF
Ausgabe ch
ch = getchar();
while(ch != EOF)
{
putchar(ch);
ch = getchar();
}
Lese Zeichen ch
}
Das obige Beispiel 3.3 liest mit Hilfe von getchar() solange Zeichen von der Tastatur
(genauer von stdin), bis EOF eingegeben wird. EOF steht für "End of File". Es handelt
sich dabei um eine in stdio.h definierte symbolische Konstante, die nicht mit einem
anderen Zeichen verwechselt werden kann. Über die Tastatur gibt man EOF mit Hilfe von F6
oder Str-Z ein.
Übungen:
Verwende zur Lösung while Schleifen:
3.4.
Schreibe ein Programm, das mit Hilfe von getchar() einen Text über die Tastatur
einliest (EOF beendet) und die Anzahl der Leerzeichen innerhalb dieses Textes zählt.
3.5.
Schreibe ein Programm, das über die Tastatur eine Reihe von positiven integerWerten einliest und anschließend den Mittelwert der eingegebenen Zahlen berechnet.
Zuerst wird nach der Anzahl der einzugebenden Werte gefragt.
Es werden solange Werte eingelesen, bis die Zahl Null eingegeben wird. (Null zählt
nicht mehr zu der Reihe)
a)
b)
3.6.
Über die Tastatur ist eine Zahl vom Typ unsigned einzulesen. Anschließend ist zu
prüfen , ob es sich um eine Primzahl handelt.
3.3. Schleifen mit Ausgangsbedingung
Syntax:
do
Anweisung
while
(
Ausdruck
)
;
Der Schleifenkörper "Anweisung" (oder ein mit {} begrenzter Block von Anweisungen) wird
auf jeden Fall einmal ausgeführt. Danach wird "Ausdruck" ausgewertet. Bei einem von Null
verschiedenen Wert wird der Schleifenkörper wieder ausgeführt, bis die Bewertung von
"Ausdruck" den Wert Null ergibt.
Beispiel 3.4:
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Es soll eine Reihe von ganzen Zahlen über die Tastatur eingelesen werden. Eine Fehleingabe
bzw. EOF beendet die Eingabe. Anschließend ist die Summe dieser Zahlen auszugeben.
#include<stdio.h>
void main()
{
int eingabe=0, summe=0, test;
eingabe = 0, summe = 0
do
{
summe += eingabe;
printf("\nBitte die nächste Zahl eingeben ");
printf("(EOF beendet) --> ");
test = scanf("%d",&eingabe);
}
while(test==1);
printf("\n\nDie Summe der eingegebenen Zahlen");
printf("beträgt %d", summe);
}
summe = summe + eingabe
Lese eingabe
solange Eingabe in Ordnung
Ausgabe summe
Übungen:
3.7
Löse 3.4. mit Hilfe einer do-while Schleife
3.8
Löse 3.5. mit Hilfe einer do-while Schleife
3.9
Löse 3.6. mit Hilfe einer do-while Schleife
3.10
Programmiere folgendes Zahlenratespiel:
Mit Hilfe des Zufallsgenerators wird eine Zahl zwischen 1 und 999 erzeugt. Diese
Zahl ist zu erraten. Nach jedem Versuch wird ausgegeben, ob die geratene Zahl zu
groß oder zu klein war. Zum Schluß ist die Anzahl der notwendigen Versuche auszugeben.
Anleitung: Zum Erzeugen der Zufallszahl vergleiche die Funktionen rand() und
randomize() sowie das Makro random().
3.11
Mit Hilfe von getchar() ist eine Binärzahl einzulesen. Anschließend ist
anzugeben, ob diese Binärzahl mindestens einen 1er-Drilling enthält.
3.4. Zählschleifen
Syntax:
for
(
Ausdruck 1
;
Ausdruck 2
;
)
Anweisung
Ausdruck 3
Die for-Schleife wird wie folgt abgearbeitet:
1.
Zunächst wird Ausdruck 1 bearbeitet. Hier werden üblicherweise eine oder mehrere
Variable initialisiert.
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
2.
3.
Dann wird Ausdruck 2 ausgewertet. Ist Ausdruck 2 falsch (ergibt sich also der Wert
Null), so verläßt der Programmfluß die for-Schleife und setzt das Programm mit der
ersten Anweisung hinter der for-Schleife fort. Ist Ausdruck 2 wahr (ergibt sich also
ein Wert ungleich Null), so wird der Schleifenkörper Anweisung (eine einzelne Anweisung oder ein durch {} begrenzter Block) abgearbeitet.
Nach Abarbeitung des Schleifenkörpers wird Ausdruck 3 bearbeitet. Danach wird
wieder Ausdruck 2 ausgewertet (vgl. 2.) usw.
for(Ausdruck1;Ausdruck2;Ausdruck3)
Anweisung;
ist also äquivalent zu
Ausdruck1;
while (Ausdruck2)
{
Anweisung;
Ausdruck3;
}
Ausdruck 1
solange (Ausdruck 2)
Anweisung
Ausdruck 3
Beispiel:
for(i=10;i<=20;i++)
Anweisung;
i  10,20 (1)
Anweisung
Zunächst wird die Laufvariable i mit dem Anfangswert 10 initialisiert. Dann wird die
Bedingung (i<=20) geprüft. Ist die Bedingung richtig, wird der Schleifenkörper Anweisung
durchgeführt, anschließend i inkrementiert. Zum letzten mal wird Anweisung durchgeführt,
wenn i den Endwert 20 erreicht hat.
Beispiel 3.5:
Erstelle eine Tabelle für die Quadrate und die Kuben der natürlichen Zahlen von 1 bis 10.
#include<stdio.h>
#include<conio.h>
void main()
{
int i;
Ausgabe:
A: Überschrift
i <- 1, 10 (1)
clrscr();
printf("%3s%10s%10s\n","n","n^2","n^3");
for(i=1;i<=23;i++)
putchar('=');
for(i=1;i<=10;i++)
printf("\n%3d%10d%10d",i,i*i,i*i*i);
getch();
}
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Ausgabe:
i, i^2, i^3
n
n^2
n^3
=======================
1
1
1
2
4
8
3
9
27
4
16
64
5
25
125
6
36
216
7
49
343
8
64
512
9
81
729
10
100
1000
Beispiel 3.6:
Mit Hilfe von getchar() ist ein Satz einzulesen. Weiters sind die in dem Satz vorkommenden
Ziffern zu einer Zahl zusammenzusetzen und diese Zahl ist anschließend auszugeben.
zahl = 0
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#define EOL '\n'
Lies erstes Zeichen ch
/* wegen isdigit() */
solange ch <> EOF
ist ch Ziffer ?
j
n
void main()
{
int ch,zahl=0;
zahl=10*zahl+ch-’0’
ch = getchar();
/*Zeile 8*/
for(;ch!=EOL;ch=getchar())
/*Zeile 9*/
if (isdigit(ch))
zahl = zahl*10 + (ch - '0'); /*Zeile 11*/
Lies nächstes Zeichen ch
Ausgabe zahl
printf("\nEs wurde die Zahl %d eingegeben.",
zahl);
getch();
}
Obiges Beispiel zeigt einige Neu- bzw. Besonderheiten. Zunächst die Funktion
int isdigit(int c);
Prototyp in
<ctype.h>
Diese Funktion erwartet als Argument eine Variable vom Datentyp int (hier ch) und liefert
als Ergebnis einen Wert ungleich Null, wenn der ASCII-Code einer Ziffer (also ein Wert
zwischen 48 und 57) übergeben wird. Bei jedem anderen Übergabewert liefert isdigit()
den Wert Null. Weitere mit isdigit() verwandte Funktionen vgl. ADIM-Skriptum S 32.
Zeile 9 zeigt, daß im Befehl for(Ausdr1;Ausdr2;Ausdr3) Ausdrücke auch
weggelassen werden dürfen. Syntaktisch wäre sogar der Befehl for(;;) richtig. Er würde
allerdings eine Endlosschleife erzeugen, die nur mit break velassen werden kann (vgl.
nächsten Abschnitt).
Die Zeilen 8 und 9 könnten auch in einem Befehl zusammengefaßt werden:
for(ch=getchar();ch!=10;ch=getchar())
Zeile 11: Ist das zuletzt eingelesene Zeichen eine Ziffer, so wird zahl mit 10 multipliziert
und danach zu dem Ergebnis dieser Multiplikation jene Ziffer addiert, deren ASCII-Code in
ch steht. Dies erreicht man, indem man von ch den ASCII-Code von Null ('0' oder 48)
subtrahiert. Man hätte die Zeile 11 auch so codieren können (besser ist jedoch die im
Programm verwendete Version):
zahl = zahl * 10 + (ch - 48);
Beispiel 3.7:
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Es sind alle aus drei Buchstaben bestehenden Worte auszugeben, die durch Variationen der
fünf Buchstaben ABCDE gebildet werden können. Weiters ist mitzuzählen, wieviele solche
Möglichkeiten es gibt.
#include<stdio.h>
#include<conio.h>
zaehler = 0
ch1 <- ´A´,´E´ (1)
void main()
{
int ch1,ch2,ch3,zaehler=0;
ch2 <- ´A´,´E´ (1)
ch3 <- ´A´,´E´ (1)
clrscr();
for(ch1='A';ch1<='E';ch1++)
for(ch2='A';ch2<='E';ch2++)
for(ch3='A';ch3<='E';ch3++)
{
printf("%c%c%c ",ch1,ch2,ch3);
zaehler++;
A: ch1, ch2, ch3
zaehler++
Ausgabe zaehler
}
printf("\n\nEs gibt %d Variationen.",zaehler);
getch();
}
Ausgabe:
AAA AAB
ADB ADC
BBC BBD
BED BEE
CCE CDA
DBA DBB
DEB DEC
ECC ECD
AAC
ADD
BBE
CAA
CDB
DBC
DED
ECE
AAD
ADE
BCA
CAB
CDC
DBD
DEE
EDA
AAE
AEA
BCB
CAC
CDD
DBE
EAA
EDB
ABA
AEB
BCC
CAD
CDE
DCA
EAB
EDC
ABB
AEC
BCD
CAE
CEA
DCB
EAC
EDD
ABC
AED
BCE
CBA
CEB
DCC
EAD
EDE
ABD
AEE
BDA
CBB
CEC
DCD
EAE
EEA
ABE
BAA
BDB
CBC
CED
DCE
EBA
EEB
ACA
BAB
BDC
CBD
CEE
DDA
EBB
EEC
ACB
BAC
BDD
CBE
DAA
DDB
EBC
EED
ACC
BAD
BDE
CCA
DAB
DDC
EBD
EEE
ACD
BAE
BEA
CCB
DAC
DDD
EBE
ACE
BBA
BEB
CCC
DAD
DDE
ECA
ADA
BBB
BEC
CCD
DAE
DEA
ECB
Es gibt 125 Variationen.
Obiges Beispiel zeigt die Schachtelung von for-Schleifen.
Übungen:
3.12 Schreibe ein Programm, das einen positiven ganzen Wert einliest und bestimmt, ob es
sich um eine Primzahl handelt.
3.13 Modifiziere Übung 3.12 so, daß mehrere Zahlen eingegeben werden können (vor jeder
weiteren Eingabe wird abgefragt, ob noch ein Zahl geprüft werden soll)
3.14 Erzeuge mit Hilfe von geschachtelten Schleifen folgende Zahlenpyramide
1
232
34543
4567654
567898765
67890109876
7890123210987
890123454321098
90123456765432109
0123456789876543210
3.15
Bestimme alle dreistelligen Zahlen, die gleich der Summe der Kubikwerte ihrer
einzelnen Ziffern sind. (Die Zahl 153 ist z.B. gleich 13+53+33)
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
3.16
Schreibe ein Programm, das das kleine 1 mal 1 in folgender Form ausgibt:
1 *
2 *
10 *
1 *
2 *
10 *
1 =
1 =
...
1 =
6 =
6 =
...
6 =
1
2
10
6
12
60
1 * 2 =
2
2 * 2 =
4
...
10 * 2 = 20
...
...
1 * 7 =
7
2 * 7 = 14
...
10 * 7 = 70
...
...
1 *
2 *
10 *
5 =
5 =
...
5 =
5
10
50
1 * 10 = 10
2 * 10 = 20
...
10 * 10 = 100
3.5. Unterbrechen von Schleifen mit break und continue
In jedem der drei Schleifentypen
while
do - while
for
können die Anweisungen break und continue verwendet werden.
break springt zum Schleifenende und führt zum Verlassen der Schleife
(Abbruchbedingung - vgl. Struktogramme).
continue übergeht alle folgenden im Schleifenkörper enthaltenen Anweisungen und setzt
die Programmausführung mit dem nächsten Schleifendurchgang fort. Bei do-while also
mit dem Test der Schleifenbedingung am Schleifenende bzw. bei while und forSchleifen mit dem Test der Schleifenbedingung am Schleifenkopf. Bei einer for-Schleife
wird zunächst noch der Ausdruck3 ausgeführt.
Folgende Beispiele zeigen den Unterschied der Befehle break und continue:
Beispiel 3.7:
#include<stdio.h>
#include<conio.h>
i <- 1, 5 (1)
Abbruch wenn i=3
Ausgabe i
Ausgabe i
Ausgabe:
Der Wert von i ist jetzt 1.
Der Wert von i ist jetzt 2.
Der Wert von i nach break ist 3.
void main()
{
int i;
clrscr();
for(i=1;i<=5;i++)
{
if (i==3) break;
printf("\nDer Wert von i ist jetzt %2d.",i);
}
printf("\nDer Wert von i nach break ist %d.",i);
getch();
}
Beispiel 3.8:
#include<stdio.h>
#include<conio.h>
i <- 1, 5 (1)
Weiter, wenn i=3
Ausgabe i
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
void main()
{
int i;
clrscr();
Ausgabe:
Der Wert
Der Wert
Der Wert
Der Wert
von
von
von
von
i
i
i
i
ist
ist
ist
ist
jetzt
jetzt
jetzt
jetzt
for(i=1;i<=5;i++)
{
if (i==3) continue;
printf("\nDer Wert von i ist jetzt %2d.",i);
}
getch();
}
1.
2.
4.
5.
Bemerkung:
break und continue sind eigentlich Sprungbefehle und stellen damit prinzipiell einen
Verstoß gegen den Gedanken des strukturierten Programmierens dar. Diese Befehle sollen
daher möglichst selten verwendet werden und es ist bei jedem Einsatz zu prüfen, ob die
Verwendung nicht vermieden werden könnte.
Übung:
3.17
Es sollen alle vollkommenen Zahlen zwischen x und y ausgegeben werden, wobei x
und y einzugeben sind. Eine vollkommene Zahl liegt dann vor, wenn die Summe aller
Teiler dieser Zahl z (ohne z selbst) gleich dieser Zahl ist.
z.B.: 28 = 1+2+4+7+14 ist eine vollkommene Zahl.
3.7. Die switch-Anweisung
Die switch-Anweisung erlaubt die Programmierung von
Fallabfragen.
Syntax:
switch
(
case
Ausdruck
Konstante
)
{
:
Anweisung
default
:
Anweisung
}
Die switch-Anweisung wird wie folgt abgearbeitet:
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Zunächst wird Ausdruck ausgewertet (die Datentypen float und double sind hier nicht
erlaubt). Dann wird geprüft ob eine der Konstanten nach dem Schlüsselwort case mit dem
Ergebnis der Auswertung übereinstimmt. Wird eine solche Konstante gefunden, so werden
die entsprechende Anweisung (der zur Konstanten gehörige Zweig) sowie alle weiteren Anweisungen (alle weiteren Zweige) ausgeführt. Mit Hilfe des Schlüsselworts break kann
man allerdings die Abarbeitung der nachfolgenden Zweige verhindern.
Stimmt keine der auf case folgenden Konstanten mit der Auswertung von Ausdruck
überein und gibt es einen default (sonst) - Zweig (default heißt vorgegeben, Standard) so
wird dieser default-Zweig abgearbeitet. Dieser sonst-Zweig eignet sich hervorragend zum
Abfangen von falschen Werten.
Das folgende Beispiel zeigt die Arbeitsweise. Für das Struktogramm gibt es je nach
Platzbedarf zu Möglichkeiten:
Beispiel 3.9:
Es wird die Nummer eines Monats (1-12) eingelesen. Das Programm gibt aus wieviele Tage
der Monat hat.
Eingabe monat
Eingabe monat
monat
1,3,5
7,8,10
12
2
31
Tage
28(29)
Tage
4,
6,9,11
monat
1,3,5,7,8,10,12:
A: 31 Tage
sonst
2:
30 Tage
falscher
Monat
A: 28 (29) Tage
4,6,9,11:
A: 30 Tage
sonst:
A: ungültige Monatsnummer
#include<stdio.h>
void main()
{
int monat;
/* Beginn main */
printf("\nBitte die Nummer des Monats (1-12) --> ");
scanf("%d", &monat);
switch(monat)
{
/* Beginn switch */
case 1: case 3: case 5:
case 7: case 8: case 10:
case 12:
printf("\nDer Monat hat 31 Tage.");
break;
case 2:
printf("\n Der Monat hat 28 (29) Tage.");
break;
case 4: case 6: case 9:
case 11:
printf("\nDer Monat hat 30 Tage.");
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
break;
default:
printf("\nEs wurde eine falsche Nummer eingegeben.");
}
/* Ende switch */
}
/* Ende main */
Beispiel 3.10:
Man schreibe ein Programm, das zwei Zahlen vom Datentyp double (Operanden) und ein
Zeichen (Operator) einliest. Wenn dieses Zeichen ein Rechenzeichen ist (+,-,*,/) so soll das
Ergebnis Operator1 Operand Operator2 ausgegeben werden, sonst eine entsprechende
Meldung.
#include<stdio.h>
#include<conio.h>
flag = 0
Eingabe op1, op2, op
void main()
{
/* Beginn main */
double op1, op2, erg;
int op, flag;
op
'+'
'-'
'*'
'/'
sonst
op2  0
clrscr();
flag = 0;
printf("\nOperand 1 --> ");
scanf("%lf", &op1);
printf("\nOperand 2 --> ");
scanf("%lf", &op2);
printf("\nOperator
--> ");
fflush(stdin);
op = getchar();
erg =
erg =
op1+op2
op1-op2
erg =
j
erg =
op1*op2
op1/op2
n
flag=2
flag = 1
flag
0
Ausgabe:
op1 op op2 = erg
1
Ausgabe:
Division durch Null
verboten
2
Ausgabe:
kein
Rechnezeichen
switch (op)
{
/* Beginn switch (op) */
case '+' : erg = op1 + op2;
break;
case '-' : erg = op1 - op2;
break;
case '*' : erg = op1 * op2;
break;
case '/' : if (op2)
erg = op1/op2;
else
flag = 1;
break;
default : flag = 2;
break;
}
/* Ende switch (op) */
switch (flag)
{
/* Beginn switch (flag) */
case 0 : printf("\n%lg %c %lg = %lg", op1, op, op2, erg);
break;
case 1 : printf("\nDie Division durch Null ist verboten !");
break;
case 2 : printf("\nEs wurde kein Rechenzeichen eingegeben.");
break;
}
/* Ende switch (flag) */
}
/* Ende main */
Die break-Anweisungen in den letzten Zweigen (default bzw. case 2) sind nicht notwendig.
Sollte das Programm jedoch später erweitert werden und weitere Zweige hinzukommen, so
kann man auf das Hinzufügen dieser break-Anweisungen nicht vergessen.
Übungen:
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
3.18
3.19
3.20
Schreibe ein Programm, welche eine über die Tastatur eingegebene int-Zahl im
Wortlaut ausgibt. Es reicht, wenn das Programm beispielsweise die Zahl 547 in der
Form "Fünf Vier Sieben" ausgibt.
Schreibe ein Programm, das Tag, Monat und Jahr eines Datums einliest (z.B. 21-7-57)
und dann folgenden Satz ausgibt:
Der 21. Juli 1957 war ein Sonntag.
Anleitung: vergleiche ADIM-Skriptum S 28 Aufgabe 4.2I
Schreibe ein Programm, das Brüche addiert, subtrahiert, multipliziert und dividiert.
Die Beiden Operanden (bestehend aus Zähler und Nenner) und der Operator sollen in
einem Dialog eingelesen werden. Das Ergebnis soll als gekürzter Bruch ausgegeben
werden. Anleitung: zur Berechnung des größten gemeinsamen Teilers von Zähler und
Nenner vergleiche den euklidischen Algorithmus ADIM-Skriptum Seite 18.
Manuel Egger
C-Skriptum
HTL-Villach Abteilung EDV und Organisation
Herunterladen