Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
C-Kurs WS 01/02<br />
- 4. Übungszettel -<br />
13. Ändern Sie das Programm aus dem Kurs, welches beliebig viele Zahlen<br />
vom Bildschirm einliest und addiert (http://www.rzuser.uniheidelberg.de/~x29/C/addiere.c)<br />
derart ab, dass auch Zahlen mit<br />
Nachkommastellen eingegeben werden können. Die Summe soll auf 5<br />
Stellen nach dem Komma ausgegeben werden.<br />
14. Ein Programm soll vom Bildschirm drei int-Variablen einlesen. Anschließend<br />
soll deren Durchschnitt berechnet und mit 4 Stellen nach dem<br />
Komma ausgegeben werden. Ändern Sie hierzu am besten das Programm<br />
von Aufgabe 8 vom dritten Übungszettel entsprechend ab.<br />
15. Lösen Sie nochmals die Aufgabe 7 vom letzten Zettel (Einmaleinstabelle),<br />
jetzt aber mit for-Schleifen.<br />
Zusatzaufgaben:<br />
16. Erstellen Sie ein C-Programm, welches mit scanf einen beliebigen Geldbetrag<br />
einliest, getrennt nach Mark und Pfennig, also zwei int-Zahlen.<br />
Das Programm soll daraus berechnen, wie sich dieser Betrag aus möglichst<br />
wenig Münzen zusammensetzen lässt. Beispiel: Die Eingabe 13 34<br />
soll 13,34 DM bedeuten und eine Ausgabe ähnlich wie folgt ergeben:<br />
2 Fünfmarkstück(e)<br />
1 Zweimarkstück(e)<br />
1 Einmarkstück(e)<br />
0 Fünfzigpfennigstück(e)<br />
3 Zehnpfenninstück(e)<br />
0 Fünfpfennigstück(e)<br />
2 Zweipfennigstück(e)<br />
0 Einpfennigstück(e)<br />
Wandeln Sie den Betrag zunächst in Pfennige um. Bedenken Sie, dass<br />
bei der Division von int-Variablen immer ganzzahlige Werte entstehen.<br />
17. Berechnen Sie unter Verwendung einer einfach genauen float-Variablen<br />
die Summe 1 + 1/2 + 1/3 + 1/4 + 1/5 + .... Das Aufsummieren<br />
kann abgebrochen werden, wenn sich die Summe nicht mehr ändert.<br />
Wer die Möglichkeit hat, sollte das Programm auf verschiedenen Rechnertypen<br />
ausprobieren und die Ergebnisse vergleichen.<br />
U<strong>RZ</strong> / PS
* Uebung 8 */<br />
#include <br />
void main()<br />
{<br />
int a,b,c,mittelwert;<br />
printf("Bitte drei int-Zahlen eingeben: ");<br />
scanf("%d %d %d",&a,&b,&c);<br />
}<br />
mittelwert=(a+b+c)/3;<br />
printf("Mittelwert aus %d, %d und %d ist %d\n",<br />
a,b,c,mittelwert);<br />
aixterm7:/u/fmath/pstede/c> a.out<br />
Bitte drei int-Zahlen eingeben: 10 -3 7<br />
Mittelwert aus 10, -3 und 7 ist 4<br />
aixterm7:/u/fmath/pstede/c><br />
/* Uebung 9 */<br />
#include <br />
void main()<br />
{<br />
int unter_grenze, ober_grenze, i;<br />
long int summe=0;<br />
printf("Bitte Unter- und Obergrenze eingeben: ");<br />
scanf("%d %d",&unter_grenze, &ober_grenze);<br />
}<br />
i=unter_grenze;<br />
while (i a.out<br />
Bitte Unter- und Obergrenze eingeben: 300 1000<br />
Summe der Zahlen von 300 bis 1000 = 455650<br />
aixterm7:/u/fmath/pstede/c><br />
/* Uebung 7 */<br />
#include <br />
void main()<br />
{<br />
int zeile=1, spalte;<br />
}<br />
while (zeile
* Uebung 10 */<br />
#include <br />
void main()<br />
{<br />
int x,y,resultat;<br />
char plusminus;<br />
scanf("%d %c %d",&x,&plusminus,&y);<br />
if (plusminus != '+' &&<br />
plusminus != '-' &&<br />
plusminus != '*' &&<br />
plusminus != '/')<br />
{<br />
printf("ungültiger Operator\n");<br />
}<br />
else<br />
{<br />
if (plusminus=='+') resultat=x+y;<br />
}<br />
}<br />
else<br />
{<br />
if (plusminus=='-') resultat=x-y;<br />
else<br />
{<br />
if (plusminus=='*') resultat=x*y;<br />
else<br />
if (plusminus=='/') resultat=x/y;<br />
}<br />
}<br />
printf("%d%c%d=%d\n",x,plusminus,y,resultat);<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
125 / 5<br />
125/5=25<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
17 * 13<br />
17*13=221<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
256 : 16<br />
ungültiger Operator<br />
aixterm6:/u/fmath/pstede/c><br />
/* Uebung 10 */<br />
#include <br />
void main()<br />
{<br />
int x,y,resultat;<br />
char plusminus;<br />
scanf("%d %c %d",&x,&plusminus,&y);<br />
if (plusminus != '+' &&<br />
plusminus != '-' &&<br />
plusminus != '*' &&<br />
plusminus != '/')<br />
{<br />
printf("ungültiger Operator\n");<br />
}<br />
else<br />
{<br />
if (plusminus=='+')<br />
{<br />
resultat=x+y;<br />
}<br />
}<br />
}<br />
if (plusminus=='-')<br />
{<br />
resultat=x-y;<br />
}<br />
if (plusminus=='*')<br />
{<br />
resultat=x*y;<br />
}<br />
if (plusminus=='/')<br />
{<br />
resultat=x/y;<br />
}<br />
printf("%d%c%d=%d\n",x,plusminus,y,resultat);<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
125 / 5<br />
125/5=25<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
17 * 13<br />
17*13=221<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
256 : 16<br />
ungültiger Operator<br />
aixterm6:/u/fmath/pstede/c>
* Uebung 11 */<br />
#include <br />
void main()<br />
{<br />
int huehner, kaninchen;<br />
int i,k;<br />
int tiere=38, beine;<br />
}<br />
huehner=0;<br />
while (huehnera.out<br />
Loesung: 22 Huehner und 16 Kaninchen<br />
aixterm7:/u/fmath/pstede/c><br />
/* Uebung 12 */<br />
#include <br />
void main()<br />
{<br />
int huehner, kaninchen;<br />
int i,k;<br />
int tiere=38, beine, anz_beine;<br />
}<br />
aixterm7:/u/fmath/pstede/c> a.out<br />
38 Huehner + 0 Kaninchen = 76 Beine<br />
37 Huehner + 1 Kaninchen = 78 Beine<br />
36 Huehner + 2 Kaninchen = 80 Beine<br />
35 Huehner + 3 Kaninchen = 82 Beine<br />
34 Huehner + 4 Kaninchen = 84 Beine<br />
33 Huehner + 5 Kaninchen = 86 Beine<br />
32 Huehner + 6 Kaninchen = 88 Beine<br />
31 Huehner + 7 Kaninchen = 90 Beine<br />
. . . . .<br />
10 Huehner + 28 Kaninchen = 132 Beine<br />
9 Huehner + 29 Kaninchen = 134 Beine<br />
8 Huehner + 30 Kaninchen = 136 Beine<br />
7 Huehner + 31 Kaninchen = 138 Beine<br />
6 Huehner + 32 Kaninchen = 140 Beine<br />
5 Huehner + 33 Kaninchen = 142 Beine<br />
4 Huehner + 34 Kaninchen = 144 Beine<br />
3 Huehner + 35 Kaninchen = 146 Beine<br />
2 Huehner + 36 Kaninchen = 148 Beine<br />
1 Huehner + 37 Kaninchen = 150 Beine<br />
0 Huehner + 38 Kaninchen = 152 Beine<br />
aixterm7:/u/fmath/pstede/c><br />
anz_beine=76;<br />
while (anz_beine
void main()<br />
{<br />
int x,y;<br />
char c;<br />
scanf("%d %c %d",&x,&c,&y);<br />
printf("x=%d c=%c y=%d\n",x,c,y);<br />
}<br />
aixterm7:/u/fmath/pstede> a.out<br />
123456 x 7890<br />
x=123456 c=x y=7890<br />
aixterm7:/u/fmath/pstede> a.out<br />
123456x7890<br />
x=123456 c=x y=7890<br />
aixterm7:/u/fmath/pstede> a.out<br />
123456 xxx 7890<br />
x=123456 c=x y=0<br />
aixterm7:/u/fmath/pstede><br />
void main()<br />
{<br />
int x,y;<br />
char c;<br />
scanf("%3d %3c %3d",&x,&c,&y);<br />
printf("x=%d c=%c y=%d\n",x,c,y);<br />
}<br />
aixterm7:/u/fmath/pstede> a.out<br />
123 abc 456<br />
x=123 c=a y=456<br />
aixterm7:/u/fmath/pstede> a.out<br />
123x456<br />
x=123 c=x y=6<br />
aixterm7:/u/fmath/pstede> a.out<br />
123abc456<br />
x=123 c=a y=456<br />
aixterm7:/u/fmath/pstede> a.out<br />
123 456 7890<br />
x=123 c=4 y=789<br />
aixterm7:/u/fmath/pstede><br />
/* Uebung 10 */<br />
#include <br />
void main()<br />
{<br />
int x,y,resultat;<br />
char plusminus;<br />
scanf("%d %c %d",&x,&plusminus,&y);<br />
if (plusminus != '+' &&<br />
plusminus != '-' &&<br />
plusminus != '*' &&<br />
plusminus != '/')<br />
{<br />
printf("ungültiger Operator\n");<br />
}<br />
else<br />
{<br />
if (plusminus=='+')<br />
{<br />
resultat=x+y;<br />
}<br />
}<br />
}<br />
if (plusminus=='-')<br />
{<br />
resultat=x-y;<br />
}<br />
if (plusminus=='*')<br />
{<br />
resultat=x*y;<br />
}<br />
if (plusminus=='/')<br />
{<br />
resultat=x/y;<br />
}<br />
printf("%d%c%d=%d\n",x,plusminus,y,resultat);<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
125/5<br />
125/5=25<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
17*13<br />
17*13=221<br />
aixterm6:/u/fmath/pstede/c>a.out<br />
256:16<br />
ungültiger Operator<br />
aixterm6:/u/fmath/pstede/c>
Variablen vom Datentyp float<br />
PC (Turbo C) AIX (cc)<br />
Bytes Bereich Bytes Bereich<br />
float 4 ±10 -37 ... ±10 38 4 ±10 -37 ... ±10 38<br />
long float double<br />
8 ±10 -307 ...±10 308 8 ±10 -307 ...±10 308<br />
Der Bereich kenzeichnet nur die größte mögliche Zahl. Die Genauigkeit<br />
ist geringer: Es sind nur 7 Stellen signifikant (float) bzw.16 (double),<br />
wobei die Position des Dezimalpunktes fließend ist.<br />
Datentyp float sollte nur benutzt werden, wenn der Wertebereich von int<br />
nicht ausreicht. Eine höhere Genauigkeit wird damit nicht erzielt.<br />
U<strong>RZ</strong> / PS efg<br />
Float-Zahlen<br />
- Darstellung -<br />
Sehr große oder sehr kleine Zahlen können in Exponentialdarstellung<br />
dargestellt werden. Dies ist vorallem von<br />
Vorteil bei float-Zahlen. Der Exponent wird von der Mantisse<br />
durch ein kleines oder großes e getrennt. Beispiele:<br />
1e20 = 100000000000000000000<br />
314159e-5 = 3.14159<br />
1e-5 = 0.00001<br />
Ausgabe mit printf mit den Formaten e, f oder g:<br />
Ausgabe:<br />
float r;<br />
r=31.4159;<br />
printf(“r=%9.2f\n“,r);<br />
printf(“r=%9.2e\n“,r);<br />
printf(“r=%e\n“,r);<br />
r= 31.42<br />
r= 3.14e+01<br />
r=3.141590e+01<br />
Eine Konstante ist vom Typ int, wenn sie weder Exponent<br />
noch Dezimalpunkt enthält: Beispiel:<br />
int: 33 -33 0<br />
float: 3.14159 27e44 33.<br />
Das Ergebnis einer Division ist vom Typ float, wenn mindestens<br />
einer der Operanden vom Typ float ist.<br />
Formatangaben<br />
- Formate für float-Variablen-<br />
• Dezimale Gleitpunktzahl (z.B. 3.14159)<br />
%s.nf<br />
s Spaltenzahl (des Ausgabefeldes) insgesamt, davon<br />
n Stellen nach dem Dezimalpunkt.<br />
• Dezimale Gleitpunktzahl in Exponentialdarstellung<br />
(z.B. 3.141e-14)<br />
%s.ne<br />
s Spaltenzahl (des Ausgabefeldes) insgesamt, davon<br />
n Stellen nach dem Dezimalpunkt.<br />
• Dezimale Gleitpunktzahl in kürztmöglicher Darstellung<br />
%s.ng<br />
s Spaltenzahl (des Ausgabefeldes) insgesamt, davon<br />
n signifikante Stellen.<br />
#include <br />
void main()<br />
{<br />
float einfach;<br />
long float doppelt, doppelt_neg;<br />
einfach = 10./3;<br />
doppelt = 10./3;<br />
doppelt_neg = -doppelt;<br />
printf("|%10.3f|\n",einfach);<br />
printf("|%10.3e|\n",einfach);<br />
printf("|%-10.3g|\n",einfach);<br />
printf("|%30.9f|\n",doppelt);<br />
printf("|%30.9e|\n",doppelt_neg);<br />
printf("|%-30.9f|\n",einfach);<br />
printf("|%10.3f|\n\n\n\n\n",einfach);<br />
einfach = 1e5/3;<br />
doppelt = 1e8/3;<br />
printf("|%30.2f|\n",einfach);<br />
printf("|%30.2e|\n",einfach);<br />
printf("|%30.2g|\n",einfach);<br />
printf("|%30.8f|\n",doppelt);<br />
printf("|%030.8f|\n\n\n\n",einfach);<br />
Die Ausgabe erfolgt mit oder ohne Exponent, je nach<br />
dem, was weniger Platz benötigt.<br />
Es zählen als je eine Stelle: Ziffer, Vorzeichen, Dezimalpunkt,<br />
e und Vorzeichen des Exponenten.<br />
}<br />
doppelt = 0.000000000730;<br />
printf("|%g|\n",doppelt);<br />
printf("|%6.4f|\n",doppelt);<br />
U<strong>RZ</strong> / PS efg1
aixterm7:/u/fmath/pstede/c> a.out<br />
| 3.333|<br />
| 3.333e+00|<br />
|3.33 |<br />
| 3.333333333|<br />
| -3.333333333e+00|<br />
|3.333333254 |<br />
| 3.333|<br />
| 33333.33|<br />
| 3.33e+04|<br />
| 3.3e+04|<br />
| 33333333.33333333|<br />
|000000000000000033333.33203125|<br />
|7.3e-10|<br />
|0.0000|<br />
aixterm7:/u/fmath/pstede/c><br />
#include <br />
void main()<br />
{<br />
float brutto, netto;<br />
printf("Bitte Mark und Pfennig eingeben, durch Punkt getrennt: ");<br />
scanf("%f",&netto);<br />
brutto=netto*1.16;<br />
printf("%6.2f DM zzgl. MWSt. sind %6.2f DM\n",netto, brutto);<br />
}<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
Bitte Mark und Pfennig eingeben, durch Punkt getrennt: 100.00<br />
100.00 DM zzgl. MWSt. sind 116.00 DM<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
Bitte Mark und Pfennig eingeben, durch Punkt getrennt: 123.45<br />
123.45 DM zzgl. MWSt. sind 143.20 DM<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
Bitte Mark und Pfennig eingeben, durch Punkt getrennt: 123,45<br />
123.00 DM zzgl. MWSt. sind 142.68 DM<br />
aixterm7:/u/fmath/pstede/c><br />
#include <br />
void main()<br />
{<br />
int mark, pfennig;<br />
float brutto;<br />
printf("Bitte Mark und Pfennig eingeben, durch Komma getrennt: ");<br />
scanf("%i %*c %i", &mark, &pfennig);<br />
printf("%d,%02d DM zzgl. MWSt. sind ", mark, pfennig);<br />
brutto=(mark+pfennig/100.)*1.16;<br />
mark=brutto; /* Kommastellen werden abgeschnitten */<br />
pfennig=(brutto-mark)*100;<br />
printf("%d,%02d DM\n", mark, pfennig);<br />
}<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
Bitte Mark und Pfennig eingeben, durch Komma getrennt: 100,00<br />
100,00 DM zzgl. MWSt. sind 116,00 DM<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
Bitte Mark und Pfennig eingeben, durch Komma getrennt: 123,45<br />
123,45 DM zzgl. MWSt. sind 143,20 DM<br />
aixterm7:/u/fmath/pstede/c<br />
Block-Wiederholungen<br />
- do...while-Schleife -<br />
do<br />
{<br />
U<strong>RZ</strong> / PS dowhile<br />
...;<br />
...;<br />
...;<br />
}<br />
while (bedingung);<br />
Die Anweisungen innerhalb des Blocks werden zunächst<br />
einmal ausgeführt. Danach wird vor jedem weiterem<br />
Durchlauf die bedingung überprüft und der Block ein<br />
weiteres mal ausgeführt, wenn diese „wahr“ ist.<br />
Im Gegensatz zur while-Schleife wird die do...while-<br />
Schleife also mindestens einmal abgearbeitet, selbst<br />
wenn die Bedingung kein einziges mal erfüllt ist!
#include <br />
void main()<br />
{<br />
int a, b, rest;<br />
#include <br />
void main()<br />
{<br />
int zahl, summe=0;<br />
do<br />
{<br />
printf("Bitte Zahl eingeben, 0 fuer Abbruch: ");<br />
scanf("%d",&zahl);<br />
summe=summe+zahl;<br />
} while (zahl != 0);<br />
printf("Summe ist %d\n",summe);<br />
}<br />
aixterm7:/u/fmath/pstede/c> a.out<br />
Bitte Zahl eingeben, 0 fuer Abbruch: 145<br />
Bitte Zahl eingeben, 0 fuer Abbruch: -23<br />
Bitte Zahl eingeben, 0 fuer Abbruch: 47<br />
Bitte Zahl eingeben, 0 fuer Abbruch: 11<br />
Bitte Zahl eingeben, 0 fuer Abbruch: 0<br />
Summe ist 180<br />
aixterm7:/u/fmath/pstede/c><br />
}<br />
printf("Bitte zwei Zahlen eingeben: ");<br />
scanf("%d %d",&a,&b);<br />
printf("GGT von %d und %d ist ",a,b);<br />
do<br />
{<br />
rest = a % b;<br />
a = b;<br />
b = rest;<br />
}<br />
while(rest != 0);<br />
printf("%ld\n",a);<br />
aixterm7:/u/fmath/pstede> a.out<br />
Bitte zwei Zahlen eingeben: 112 42<br />
GGT von 112 und 42 ist 14<br />
aixterm7:/u/fmath/pstede> a.out<br />
Bitte zwei Zahlen eingeben: 42 112<br />
GGT von 42 und 112 ist 14<br />
aixterm7:/u/fmath/pstede> a.out<br />
Bitte zwei Zahlen eingeben: 63 40<br />
GGT von 63 und 40 ist 1<br />
aixterm7:/u/fmath/pstede><br />
Ablaufsteuerung<br />
- for-Schleife -<br />
Viele Schleifen können mit der for-Anweisung übersichtlicher<br />
programmiert werden als unter Benutzung von<br />
while:<br />
for (anweisung1; bedingung; anweisung2)<br />
{<br />
...;<br />
...;<br />
...;<br />
}<br />
Arbeitsweise:<br />
1. Vor dem ersten Schleifendurchlauf anweisung1<br />
ausführen (Anfangswert setzen).<br />
2. Vor jedem Schleifendurchlauf prüfen, ob bedingung<br />
erfüllt.<br />
3. Nach jedem Schleifendurchlauf anweisung2 ausführen.<br />
int i=1;<br />
while (i
switch-Anweisung<br />
- Syntax -<br />
Mit der switch-Anweisung können mehrfache, u.U.<br />
geschachtelte if-Anweisungen vermieden werden.<br />
Syntax allgemein:<br />
aixterm7:/u/fmath/pstede/c> a.out<br />
*<br />
**<br />
***<br />
****<br />
*****<br />
******<br />
*******<br />
********<br />
*********<br />
**********<br />
***********<br />
************<br />
*************<br />
**************<br />
***************<br />
aixterm7:/u/fmath/pstede/c><br />
switch (ausdruck)<br />
{<br />
case ausdr1:<br />
anweisungen1;<br />
case ausdr2:<br />
anweisungen2;<br />
....<br />
case ausdrn:<br />
anweisungenn;<br />
default:<br />
anweisungend;<br />
}<br />
• „ausdruck“ wird ausgewertet und der Reihe nach<br />
mit den angegebenen Ausdrücken verglichen. Bei<br />
Übereinstimmung wird mit den dort angegebenen<br />
Anweisungen fortgefahren.<br />
• Andernfalls wird die default-Anweisung ausgeführt.<br />
Diese kann auch entfallen.<br />
• Alle Anweisungsblöcke sollten mit der break-<br />
Anweisung enden, da sonst mit den folgenden Blökken<br />
weitergemacht wird.<br />
U<strong>RZ</strong> / PS scwitch<br />
#include <br />
void main()<br />
{<br />
int x,y,resultat;<br />
char plusminus;<br />
scanf("%d %c %d",&x,&plusminus,&y);<br />
switch (plusminus)<br />
{<br />
case '+':<br />
resultat=x+y;<br />
break;<br />
case '-':<br />
resultat=x-y;<br />
break;<br />
case '*':<br />
resultat=x*y;<br />
break;<br />
case '/':<br />
resultat=x/y;<br />
break;<br />
default:<br />
printf("ungültiger Operator\n");<br />
plusminus='x';<br />
break;<br />
}<br />
if (plusminus != 'x')<br />
printf("%d%c%d=%d\n",x,plusminus,y,resultat);<br />
}<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
125/5<br />
125/5=25<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
17*13<br />
17*13=221<br />
aixterm7:/u/fmath/pstede/c>a.out<br />
256:16<br />
ungültiger Operator<br />
aixterm7:/u/fmath/pstede/c>
void main()<br />
{<br />
int tag, monat, jahr, x, wochentag;<br />
printf("Bitte Datum eingeben in der Form tt mm jjjj: ");<br />
scanf("%d %d %d",&tag,&monat,&jahr);<br />
printf("Der %2d.%2d.%4d faellt auf einen ",tag,monat,jahr);<br />
if (monat==1 || monat==2)<br />
{<br />
jahr=jahr-1;<br />
monat=monat+12;<br />
}<br />
x=tag+2*monat+(3*monat+3)/5+jahr+jahr/4-jahr/100+jahr/400;<br />
wochentag=(x%7)+1;<br />
switch (wochentag)<br />
{<br />
case 1: printf("Montag\n"); break;<br />
case 2: printf("Dienstag\n"); break;<br />
case 3: printf("Mittwoch\n"); break;<br />
case 4: printf("Donnerstag\n"); break;<br />
case 5: printf("Freitag\n"); break;<br />
case 6: printf("Samstag\n"); break;<br />
case 7: printf("Sonntag\n"); break;<br />
default: printf("Da kann was nicht stimmen.\n");<br />
}<br />
}