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