• Keine Ergebnisse gefunden

¨Ubungspaket 8 Datentyp int

N/A
N/A
Protected

Academic year: 2021

Aktie "¨Ubungspaket 8 Datentyp int"

Copied!
11
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ubungspaket 8 ¨ Datentyp int

Ubungsziele: ¨

1. Umgang mit dem Datentyp int, 2. Deklarationen von int-Variablen, 3. int-Konstanten

4. und int-Rechenoperationen.

Skript:

Kapitel: 21 Semester:

Wintersemester 2021/22 Betreuer:

Thomas, Tim und Ralf Synopsis:

Aufgrund seiner grundlegenden Bedeutung muss man sich mit dem

Datentyp int m¨ oglichst fr¨ uhzeitig und m¨ oglichst intensiv auseinander-

setzen. Genau das machen wir in diesem ¨ Ubungspaket ;-)

(2)

Teil I: Stoffwiederholung

Aufgabe 1: Definition von int-Variablen

Zeige anhand einiger Beispiele, wie man int-Variablen definieren und initialisieren kann.

1 int i = 1; // def . i , v a l u e = 1

2 int j = 2 * i ; // def . j , v a l u e = 2* i = 2

3 int k = j - i ; // def . k , v a l u e = 1

4 int m = -1 , n = 1 - m ; // def . m , n , v a l u e s = -1 , 2

Aufgabe 2: Zahlenbasis

In der Programmiersprache C k¨onnen int-Zahlen bez¨uglich dreier Basen angegeben wer- den. Erkl¨are jede g¨ultige Basis anhand eines kleinen Beispiels:

1. Dezimal: 123 2. Oktal: 0123 (83) 3. Hexadezimal: 0xD (13)

Aufgabe 3: Eingabe

Zeige am Beispiel, wieint-Variablen eingelesen werden k¨onnen: scanf( "%d", & i )

Aufgabe 4: Ausgabe

Erkl¨are anhand zweier Beispiele wie int-Variablen ausgegeben werden k¨onnen.

1. printf( "%d", i ) 2. printf( "%6d", (j - 3)/k )

Aufgabe 5: Rechenoperationen

Welche f¨unf Rechenoperationen sind bei int-Ausdr¨ucken erlaubt?

1. Plus: + 2. Minus: - 3. Mal: * 4. Geteilt: / 5. Modulo: %

Aufgabe 6: Basis und Zahlenwert

Aus der Schule wissen wir, dass jede Zahl bez¨uglich einer Basis angegeben wird. In unserem

”normalen“ Leben ist die Basis meist 10 (zehn), weshalb wir auch vom Dezimalsystem reden. Dieses Dezimalsystem ist bei uns in Deutschland (und vielen anderen westlichen L¨andern) fast ¨uberall zu finden. Aber L¨ander wie Grossbritanien und USA geben nicht alle

(3)

Gr¨oßen bez¨uglich eines Zehnerwertes an. Ein bekanntes Beispiel ist: 1 Fuss ist gleich 12 Inch bzw. 1/3 Yard.

Im Dezimalsystem hat die Ziffernfolge 123 den Wert: 1×102 + 2×101 + 3×100 bzw.

1×100+2×10+3×1. ImOktalsystemhat die Ziffernfolge 234 den Wert: 2×82+3×81+4×80 bzw. 2×64 + 3×8 + 4×1, was dem Dezimalwert 156 entspricht.

Wandle folgende Oktalzahlen in Dezimalzahlen um:

Oktalzahl C-Syntax Dezimal

1 01 1

10 010 8

100 0100 64

Wandle folgende Dezimalzahlen in Oktalzahlen um:

Dezimal Oktalzahl C-Syntax

1 1 01

10 12 012

100 144 0144

Aufgabe 7: Zahlendarstellung in C

Wie werden Dezimalzahlen in C angegeben? wie im Leben

Wie werden Oktalzahlen in C angegeben? mit einer vorlaufenden Null Wie werden Hexadezimalzahlen in C angegeben? mit 0x am Anfang

Hexadezimalziffern:

Dezimalwert 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Hexadezimalziffer 0 1 2 3 4 5 6 7 8 9 a b c d e f

A B C D E F

(4)

Teil II: Quiz

Aufgabe 1: Umrechnen zwischen verschiedenen Basen

In dieser ¨Ubungsaufgabe geht es darum, Zahlen zwischen den einzelnen Zahlensystemen hin und her zu rechnen. Vervollst¨andige folgende Tabelle, in der alle Zahlen einer Zeile den selben Wert haben sollen:

Basis

16 12 10 9 8 7 3 2

F 13 15 16 17 21 120 1111

4E 66 78 86 116 141 2220 1001110

B B 11 12 13 14 102 1011

28 34 40 44 50 55 1111 101000

10 14 16 17 20 22 121 10000

1C 24 28 31 34 40 1001 11100

Aufgabe 2: Division und Modulo

Wie nennt man die folgenden Operatoren und was sind deren Ergebnisse?

Operator Name Ergebnis

/ Division Ganzzahldivision ohne Rest

% Modulo Divisionsrest Vervollst¨andige die nachfolgende Tabelle:

i 3 10 4 123 123 10 -10

j 2 3 5 10 100 -3 -3

i / j 1 3 0 12 1 -3 3

i % j 1 1 4 3 23 1 -1

(5)

Teil III: Fehlersuche

Aufgabe 1: Einfache Fehler bei int-Variablen

Finde und korrigiere die sieben Fehler in folgendem Nonsens-Programm:

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 int i j ;

6 int m == 2;

7 i = m ** 2;

8 p r i n t f ( " b i t t e i e i n g e b e n : " ) ; 9 s c a n f ( " % c " , & i ) ;

10 p r i n t f ( " b i t t e j e i n g e b e n : " ) ; 11 s c a n f ( " % d " , j ) ;

12 m = i * j

13 p r i n t f ( " e r g e b n i s : m =% d \ n " , & m ) ;

14 }

Zeile Fehler Erl¨auterung Korrektur

5 , fehlt Bei der Definition m¨ussen die einzelnen Variablen mit Kommas voneinander getrennt werden.

int i, j;

. . . .

6 == statt = Die Wertzuweisung geschieht mittels=; das == wird f¨ur Vergleiche ben¨otigt.

int m = 2;

. . . .

7 ** statt * Die Multiplikation wird mittels*ausgef¨uhrt; ein**(f¨ur beispielsweise Exponent) gibt es in der Programmier- sprache C nicht.

m * 2

. . . .

9 %c statt %d Beim Einlesen von int-Werten wird %d als Formatie- rung ben¨otigt; bei %c wird nur ein einzelnes Zeichen gelesen.

%d

. . . .

11 & fehlt Bei der Eingabeanweisung m¨ussen nicht die Werte son- dern die Adressen der Variablen ¨ubergeben werden, die mittels des Adressoperators & gebildet werden.

& j

. . . .

12 ; fehlt In der Programmiersprache C wird jede Anweisung mit einem Semikolon beendet.

m = i * j;

. . . .

13 & zu viel Bei Ausgabe eines int-Wertes muss die Variable und nicht ihre Adresse ¨ubergeben werden.

m

(6)

Programm mit Korrekturen:

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 int i , j , m = 2;

6 i = m * 2;

7 p r i n t f ( " b i t t e i e i n g e b e n : " ) ; s c a n f ( " % d " , & i ) ; 8 p r i n t f ( " b i t t e j e i n g e b e n : " ) ; s c a n f ( " % d " , & j ) ;

9 m = i * j ;

10 p r i n t f ( " e r g e b n i s : m =% d \ n " , m ) ;

11 }

(7)

Teil IV: Anwendungen

Aufgabe 1: Testprogramm f¨ ur die Grundrechenarten

In dieser Aufgabe sollt ihr ein wenig mit dem Datentypintvertraut werden. Dazu entwi- ckeln wir einen kleinen

”Taschenrechner“. Die Programmentwicklung f¨uhren wir wie immer gem¨aß des Software Life Cycle durch.

1. Aufgabenstellung

Entwickle ein kleines Testprogramm, das zwei Werte vom Typintnimmt und darauf die f¨unf Grundrechenarten anwendet. Die f¨unf Ergebnisse sollten jeweils ausgegeben und mit den erwarteten Ergebnissen verglichen werden. Uns ist es egal, ob ihr den beteiligten Variablen direkt konstante Werte zuweist, oder diese mittels einer ent- sprechenden Eingabeanweisung einlest.

2. Pflichtenheft

Aufgabe : Testprogramm mit den f¨unf Grundrechenarten Eingabe : zwei Zahlen

Ausgabe : Ergebnis der f¨unf Grundrechenarten

Sonderf¨alle : keine, um das Programm einfach zu halten 3. Testdaten

Uberlegt euch¨ mindestens sechs Datens¨atze, mit denen Ihr euer Programm tes- ten wollt. Die Testdaten sollten auch ung¨ultige Zahlenwerte enthalten, da es unter Umst¨anden f¨ur sp¨ater interessant ist, schon jetzt das Verhalten des Programms f¨ur

”unsinnige“ Eingaben zu testen. Ung¨ultige Eingabe sind eines der h¨aufigsten Ursa- chen f¨ur manch merkw¨urdiges Programmverhalten.

Zahl 1 Zahl 2 + - * / %

2 1 3 1 2 2 0

5 -2 3 7 -10 -2 1

3 -7 -4 10 -21 0 3

-4 -5 -9 1 20 0 -4

-12 5 -7 -17 -60 -2 -2

8 0 8 8 0 undef. undef.

300 -300 0 600 -90 000 -1 0

5 000 4 000 9 000 1 000 20 000000 1 10 000

4. Implementierung

(8)

Testprogramm f¨ur die Grundrechenarten Variablen: Integer: z1, z2

Ausgabe: Begr¨ußung

Eingabeaufforderung und Einlesen der Zahl z1 Eingabeaufforderung und Einlesen der Zahl z2 Berechne z1 + z2 und Ausgabe des Ergebnises Berechne z1 - z2 und Ausgabe des Ergebnises Berechne z1 * z2 und Ausgabe des Ergebnises Berechne z1 / z2 und Ausgabe des Ergebnises Berechne z1 % z2 und Ausgabe des Ergebnises

5. Kodierung

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 int z1 , z2 ;

6 p r i n t f ( " P r o g r a m m : G r u n d r e c h e n a r t e n in C \ n " ) ; 7 p r i n t f ( " B i t t e e r s t e Z a h l z1 e i n g e b e n : " ) ; 8 s c a n f ( " % d " , & z1 ) ;

9 p r i n t f ( " B i t t e z w e i t e Z a h l z2 e i n g e b e n : " ) ; 10 s c a n f ( " % d " , & z2 ) ;

11 p r i n t f ( " p l u s : %6 d + %6 d = %8 d \ n " , z1 , z2 , z1 + z2 ) ; 12 p r i n t f ( " m i n u s : %6 d - %6 d = %8 d \ n " , z1 , z2 , z1 - z2 ) ; 13 p r i n t f ( " mal : %6 d * %6 d = %8 d \ n " , z1 , z2 , z1 * z2 ) ; 14 p r i n t f ( " g e t e i l t : %6 d / %6 d = %8 d \ n " , z1 , z2 , z1 / z2 ) ; 15 p r i n t f ( " m o d u l o : %6 d %% %6 d = %8 d \ n " , z1 , z2 , z1 % z2 ) ;

16 }

Auf der n¨achsten Seite pr¨asentieren wir noch eine weitere Version, die zus¨atzliche die ”Korrektheit“ der eingebenen Zahlen ¨uberpr¨uft. F¨ur die meisten von euch ist es sicherlich vorteilhaft, wenn ihr euch auch diese Variante anschaut und versucht zu verstehen, was, wie, wo passiert.

(9)

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 int z1 = 0 , z2 = 0 , a n z a h l ;

6 p r i n t f ( " P r o g r a m m : G r u n d r e c h e n a r t e n in C \ n " ) ; 7 p r i n t f ( " E i n g a b e : g a n z e Z a h l z1 : " ) ;

8 a n z a h l = s c a n f ( " % d " , & z1 ) ;

9 if ( a n z a h l > 0 )

10 {

11 p r i n t f ( " E i n g a b e : g a n z e Z a h l z2 : " ) ; 12 a n z a h l = s c a n f ( " % d " , & z2 ) ;

13 if ( a n z a h l > 0 )

14 {

15 p r i n t f ( " ### E r g e b n i s s e # # # \ n " ) ;

16 p r i n t f ( " % d + % d = % d \ n " , z1 , z2 , z1 + z2 ) ; 17 p r i n t f ( " % d - % d = % d \ n " , z1 , z2 , z1 - z2 ) ; 18 p r i n t f ( " % d * % d = % d \ n " , z1 , z2 , z1 * z2 ) ;

19 if ( z2 ) // z2 != 0 w a e r e g e n a u s o gut

20 {

21 p r i n t f ( " % d / % d = % d \ n " , z1 , z2 , z1 / z2 ) ; 22 p r i n t f ( " % d %% % d = % d \ n " , z1 , z2 , z1 % z2 ) ;

23 }

24 e l s e p r i n t f ( " F e h l e r : D i v i s i o n d u r c h 0\ n " ) ;

25 }

26 e l s e p r i n t f ( " F e h l e r : k e i n e G a n z z a h l \ n " ) ;

27 }

28 e l s e p r i n t f ( " F e h l e r : k e i n e G a n z z a h l \ n " ) ;

29 r e t u r n 0;

30 }

(10)

Aufgabe 2: Ausgabeformate f¨ ur int-Werte

In Skript und Vorlesung haben wir kurz erw¨ahnt, dass manint-Werte mittels%d ausgeben kann. Zweck dieser Aufgabe ist es, sich mit der int-Formatierung vertiefter zu besch¨afti- gen. Eine erste sehr gute M¨oglickeit ist es, sich mittels man 3 printf die entsprechende Manual Page durchzulesen. Aufgrund der L¨ange der Manual Page ist dies sehr m¨uhsame, im Zweifelsfalle aber unumg¨anglich. Hier versuchen wir einen etwas einfacheren Weg, in dem wir mit einigen Elementen ein wenig herumspielen. Also, nur Mut! Schreibe hierf¨ur ein kleines Testprogramm, das verschiedene Werte mittels verschiedener Formatierungen ausgibt. Dieses Testprogramm sollte folgende Eigenschaften haben:

1. Gebe zur besseren Spaltenorientierung hin und wieder eine

”Kopfzeile“ aus, die wie folgt aussehen kann: 012345678901234567890123456789.

2. Schließe zur besseren Veranschaulichung die Ausgabe in zwei Marker ein. Ein Beispiel hierf¨ur lautet: printf( "|%7d|\n", 4711 );

3. Neben der dezimalen Formatierung dsind aucho,xund Xm¨oglich. Zu welcher Basis werden die Zahlenwerte dargestellt und was ist der Unterschied zwischenx und X?

4. Das Zusatzzeichen # in der Formatierung, beispielsweise %#x, veranlasst, dass der Pr¨afix beim Oktal- bzw. Hexadezimalformat automatisch erg¨anzt wird.

5. Probiere, ob die L¨angenangabe ein eventuelles Vorzeichen einschließt?

6. Probier, was passiert, wenn die L¨angenangabe kleiner als die Breite der Zahl ist.

7. Die L¨angenangabe wie beispielsweise %7dkann man auch mit einer Null %07dbegin- nen lassen. Wozu f¨uhrt dies?

8. Der L¨angenangabe kann man auch ein Minuszeichen voranstellen. Beispiel: "%-6d", was man mit der f¨uhrenden Null kombinieren kann. Welchen Effekt hat dies?

Hinweis zur Fehlererkennung: F¨ur diejenigen, die ihr Programm mit einer ersten klei- nen Fehlererkennung ausstatten wollen, seien folgende Hinweise gegeben: Die Funktion scanf() liefert zur¨uck, wie viele ihrer Argumente sie erfolgreich einlesen konnte. Das be- deutet, der Aufruf ret = scanf( "%d", & i ) weist der Variablen ret den Wert 1 zu, wenn sie tats¨achlich einen Ganzzahlwert (int) einlesen konnte. Sofern in der Eingabezei- le etwas anderes, beispielsweise ein nette Anrede wie Na Du Computer, vorkommt, erh¨alt die Variable ret den Wert 0. Sollte beim Einlesen von einer Datei das Dateiende erreicht worden sein oder der Nutzer die Tastenkombination CTRL-D gedr¨uckt haben, erh¨alt die Variable ret den Wert EOF, der in der Regel-1 ist.

Unser Testprogramm zeigen wir auf der n¨achsten Seite, damit es durch den Seitenumbruch nicht zerst¨uckelt wird.

(11)

Programm zum Testen diverser Formatierungen:

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 p r i n t f ( " d e z i m a l : der Z a h l e n w e r t ist 4 7 1 1 \ n " ) ; 6 p r i n t f ( " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ n " ) ;

7 p r i n t f ( " |% d |\ n " , 4 7 1 1 ) ; // 4 z i f f e r n

8 p r i n t f ( " |%2 d |\ n " , 4 7 1 1 ) ; // 4 z i f f e r n

9 p r i n t f ( " |%6 d |\ n " , 4 7 1 1 ) ; // 2 l e e r z e i c h e n 4 z i f f e r n 10 p r i n t f ( " |% -6 d |\ n " , 4 7 1 1 ) ; // dito , a b e r i n k s b u e n d i g 11 p r i n t f ( " |%+ d |\ n " , 4 7 1 1 ) ; // v o r z e i c h e n , 4 z i f f e r n 12

13 p r i n t f ( " d e z i m a l : der Z a h l e n w e r t ist -4711\ n " ) ; 14 p r i n t f ( " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ n " ) ;

15 p r i n t f ( " |%6 d |\ n " , -4711 ) ; // blank , ’ - ’ , 4 z i f f e r n 16 p r i n t f ( " |%2 d |\ n " , -4711 ) ; // v o r z e i c h e n , 4 z i f f e r n 17

18 p r i n t f ( " \ n h e x : der Z a h l e n w e r t ist 1 2 3 4 \ n " ) ; 19 p r i n t f ( " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ n " ) ;

20 p r i n t f ( " |% x |\ n " , 1 2 3 4 ) ; // hex , k l e i n b u c h s t a b e n 21 p r i n t f ( " |% X |\ n " , 1 2 3 4 ) ; // hex , g r o s s b u c h s t a b e n

22 p r i n t f ( " |%# x |\ n " , 1 2 3 4 ) ; // hex , mit 0 x

23 p r i n t f ( " |%# X |\ n " , 1 2 3 4 ) ; // hex , mit 0 X

24 p r i n t f ( " |%# -8 x |\ n " , 1 2 3 4 ) ; // hex , 0 x1234 , 4 b l a n k s 25 p r i n t f ( " | % # 0 8 x |\ n " , 1 2 3 4 ) ; // hex , mit 0 x , n u l l e n 26

27 p r i n t f ( " \ n o c t a l : der Z a h l e n w e r t ist 4 7 1 1 \ n " ) ; 28 p r i n t f ( " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ n " ) ;

29 p r i n t f ( " |% o |\ n " , 4 7 1 1 ) ; // 5 ziffern , o h n e 0 30 p r i n t f ( " |%# o |\ n " , 4 7 1 1 ) ; // 5 ziffern , mit 0 31

32 p r i n t f ( " \ n d y n a m i s c h dez .: der Z a h l e n w e r t ist 4 7 1 1 \ n " ) ; 33 p r i n t f ( " 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 \ n " ) ;

34 p r i n t f ( " |%* d |\ n " , 8 , 4 7 1 1 ) ; // a c h t z i f f e r n

35 r e t u r n 0;

36 }

Referenzen

ÄHNLICHE DOKUMENTE

Abb.: Lösungsraum für zwei nicht direkt vergleichbare Ziele.. Z1 = volkswirtschaftlicher Nutzen z2 =

lu lu Lesen von Tastatur nach R1 (falls leer) oder R2 Lesen von Tastatur nach R1 (falls leer) oder R2 ld ld R1 anzeigen R1 anzeigen. pr z pr z Lesen von Speicherzelle z: R1 Lesen

Lesen einer Gleitpunktzahl von der Tastatur Lesen einer Gleitpunktzahl von der Tastatur Eingegeben wird die Zahl 2998 ·. Eingegeben wird die Zahl 2998 ·10 -1 (Lichtge- schwindigkeit

Da Möbiustransformationen Kreise entweder auf Kreise oder auf Geraden abbilden und ∞ auf jeder Geraden und auf keinem Kreis liegt, müssen T (∂G 1 ) und T (∂G 2 ) Geraden sein..

Das ergibt einen Kreissektor (mit welchem Winkel?), auf dem die Geod¨ate ein Geradenst¨uck sein muss, da in der Ebene die Geod¨aten Geraden sind. Da der Schlitz die Geod¨ate auf

(c) Ab dem Zeitpunkt, zu dem der Massenpunkt die Kugel verl¨asst, bewegt sich der Massenpunkt frei. Deshalb wirkt auf den Massenpunkt keine

[r]

COMPACT Zeigt die Komprimierung der Dateien auf NTFS-Partitionen an oder ändert sie.. CONVERT Konvertiert FAT-Datenträger