Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Zahldarstellung Lernziele: Vertiefen der Kenntnisse über Zahldarstellungen. Aufgabe 1: Werte/Konstanten Ergänzen Sie die Tabelle ganzzahliger Konstanten auf einem 16-­‐Bit-­‐System. Die Konstanten in einer Zeile sollen jeweils den gleichen Wert haben: Dezimal oktal Hexadezimal Datentyp 16 020 0x10 int 10L 012L 0xAL long 27UL 033ul 0x1bUL unsigned long 255 0377 0XFF int 100000 0303240 0x186A0 long 32767 077777 0X7FFF int 32768U 0100000 0X8000 unsigned int 100000UL 0303240ul 0x186a0UL unsigned long Aufgabe 2: Umwandlung Dezimal nach Binär Wandeln Sie die folgenden Zahlen aus der dezimalen in die duale Darstellung um. a) 45 c) 45.375 b) 196 d) 196.40625 Beispiellösung: Zur Lösung teilen wir den Vorkommateil jeweils durch 2. Die Reste (0 oder 1) ergeben (in umgekehrter Reihenfolge) die Binärdarstellung. a) 45 45 : 2 = 22 Rest 1 22 : 2 = 11 Rest 0 11 : 2 = 5 Rest 1 5 : 2 = 2 Rest 1 2 : 2 = 1 Rest 0 1 : 2 = 0 Rest 1 à (45)10 = (101101)2 S. 1 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung b) 196 196 : 2 = 98 Rest 0 98 : 2 = 49 Rest 0 49 : 2 = 24 Rest 1 24 : 2 = 12 Rest 0 12 : 2 = 6 Rest 0 6 : 2 = 3 Rest 0 3 : 2 = 1 Rest 1 1 : 2 = 0 Rest 1 à (196)10 = (11000100)2 c) Für den Nachkommateil multiplizieren wir analog die Zahl jeweils mit 2. Aufgabe 3: Algorithmus: Umwandlung Dezimal nach Binär a) Entwickeln Sie ein Programm, um eine nicht-­‐negative ganze Zahl in ihre Binärdarstellung umzuwandeln. Hinweis: Da wir momentan noch keine Felder (Arrays) oder andere Datenstrukturen kennengelernt haben, können Sie die einzelnen Ziffern einfach zeilenweise ausgeben. Die Binärdarstellung der Zahl kann dann von unten nach oben gelesen werden. b) Entwickeln Sie ferner ein Programm, um eine nicht-­‐negative ganze Zahl in ihre Oktaldarstellung (= Zahldarstellung zur Basis 8) umzuwandeln. Hinweis: Sie können das Programm Dezimal à Binär als Grundlage nehmen. S. 2 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Beispiellösung: a) Wie in der vorigen Aufgabe gezeigt, wird die umzuwandelnde Zahl solange durch 2 geteilt, bis wir bei 0 aufhören können. Die Divisionsreste ergeben jeweils die einzelnen Ziffern, wobei diese von unten nach oben gelesen werden müssen. Beachten Sie, dass dieser Algorithmus nur bei positiven Zahlen funktioniert. Bei der Null als Eingabe müssen wir wegen (0)10 = (0)2 auch eine Ausgabe (0) liefern. Bei negativen Zahlen müssen wir am Ende ein negatives Vorzeichen ausgeben (und mit dem Absolutbetrag der Eingabezahl weiterrechnen), oder alternativ eine Umwandlung ins Zweier-­‐Komplement vornehmen (dann wäre der Algorithmus anzupassen), oder solche Eingaben verbieten. In der gestellten Aufgabe war der Test auf negatives Vorzeichen jedoch nicht erforderlich (und ist hier folglich optional). ALGORITHMUS DecimalNachBinär() Beschreibung Wandelt eine (Dezimal-­‐)Zahl in ihre Binärdarstellung um Deklaration und Definition der lokalen Größen Aufrufparameter: -­‐-­‐-­‐ Rückgabeparameter: -­‐-­‐-­‐ Ganze Zahlen: zahl, rest Logischer Wert: istVorzeichenNegativ Algorithmuskern Einlesen von zahl FALLS (zahl == 0) DANN Ausgabe 0 SONST FALLS (zahl < 0) DANN istVorzeichenNegativ = WAHR zahl = -­‐ zahl SONST istVorzeichenNegativ = FALSCH ENDE FALLS FALLS (zahl == 0) DANN Ausgabe 0 SONST SOLANGE (zahl ≠ 0) FÜHRE AUS rest = zahl MODULO 2 zahl = zahl / 2 Ausgabe rest /* Ziffer ausgeben */ ENDE SOLANGE ENDE DANN FALLS (istVorzeichenNegativ == WAHR) DANN Ausgabe “-­‐“ ENDE FALLS ENDE FALLS ENDE ALGORITHMUS S. 3 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Übersetzt in ein C-­‐Programm ergibt sich: #include <stdio.h> /* Beschreibung: * Wandelt eine (Dezimal-­‐)Zahl in ihre Binärdarstellung um */ void main(void) { /* Definition der lokalen Variablen */ int dezimal, rest; int istVorzeichenNegativ; /* Algorithmuskern*/ printf("Umwandlung Dezimalzahl nach Binaer\n\n"); printf("Dezimalzahl = "); scanf("%d", &dezimal); if (dezimal < 0) { istVorzeichenNegativ = 1; // TRUE dezimal = -­‐ dezimal; } else { istVorzeichenNegativ = 0; // FALSE } printf("Binaerdarstellung ist (in umgekehrter Reihenfolge):\n"); if (dezimal == 0) { printf("0\n"); // Sonderfall: Zahl 0 } else { while (dezimal != 0) { rest = dezimal % 2; dezimal = dezimal / 2; printf("%d\n", rest); // Ziffer ausgeben } } if (istVorzeichenNegativ == 1 /* WAHR */) { printf("-­‐\n"); } } S. 4 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Durch Verwendung einer WIEDERHOLE-­‐SOLANGE-­‐Schleife (mit Test erst nach dem ersten Schleifendurchlauf) brauchen wir die 0 nicht mehr als Sonderfall zu behandeln. ALGORITHMUS DecimalNachBinär() Beschreibung Wandelt eine (Dezimal-­‐)Zahl in ihre Binärdarstellung um Deklaration und Definition der lokalen Größen Aufrufparameter: -­‐-­‐-­‐ Rückgabeparameter: -­‐-­‐-­‐ Ganze Zahlen: zahl, rest Logischer Wert: istVorzeichenNegativ Algorithmuskern Einlesen von zahl FALLS (zahl < 0) DANN istVorzeichenNegativ = WAHR zahl = -­‐ zahl SONST istVorzeichenNegativ = FALSCH ENDE FALLS WIEDERHOLE rest = zahl MODULO 2 zahl = zahl / 2 Ausgabe rest /* Ziffer ausgeben */ SOLANGE (zahl ≠ 0) FALLS (istVorzeichenNegativ == WAHR) DANN Ausgabe “-­‐“ ENDE FALLS ENDE ALGORITHMUS Als C-­‐Programm: #include <stdio.h> /* Beschreibung: * Wandelt eine (Dezimal-­‐)Zahl in ihre Binärdarstellung um */ void main(void) { /* Definition der lokalen Variablen */ int dezimal, rest; int istVorzeichenNegativ; /* Algorithmuskern*/ printf("Umwandlung Dezimalzahl nach Binaer\n\n"); printf("Dezimalzahl = "); scanf("%d", &dezimal); if (dezimal < 0) { S. 5 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung istVorzeichenNegativ = 1; // TRUE dezimal = -­‐ dezimal; } else { istVorzeichenNegativ = 0; // FALSE } printf("Binaerdarstellung ist (in umgekehrter Reihenfolge):\n"); do { rest = dezimal % 2; dezimal = dezimal / 2; printf("%d\n", rest); // Ziffer ausgeben } while (dezimal != 0); if (istVorzeichenNegativ == 1 /* WAHR */) { printf("-­‐\n"); } } Anmerkung: Statt den MODULO-­‐Operator zur Berechnung des Restes zu verwenden (in C ist dies der %-­‐Operator) kann man auch einfach testen, ob 2 * (zahl / 2) == zahl gilt – in diesem Fall ist der Rest 0 und die auszugebene Ziffer ist 0, anderenfalls 1: WIEDERHOLE FALLS 2 * (zahl / 2) == zahl DANN Ausgabe 0 SONST Ausgabe 1 ENDE FALLS zahl = zahl / 2 SOLANGE (zahl ≠ 0) Allerdings ist die Version mit MODULO direkt erweiterbar auf beliebige Basen: Statt der Fallunterscheidung wird bei Umwandlung ins Oktalsystem dann jeweils der Rest als Ziffer ausgegeben, d.h. rest = zahl MODULO 8 S. 6 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung b) Umwandlung Binär nach Oktal: #include <stdio.h> /* Beschreibung: * Wandelt eine (Dezimal-­‐)Zahl in ihre Binärdarstellung um */ void main(void) { /* Definition der lokalen Variablen */ int dezimal, rest; int istVorzeichenNegativ; /* Algorithmuskern*/ printf("Umwandlung Dezimalzahl nach Binaer\n\n"); printf("Dezimalzahl = "); scanf("%d", &dezimal); if (dezimal < 0) { istVorzeichenNegativ = 1; // TRUE dezimal = -­‐ dezimal; } else { istVorzeichenNegativ = 0; // FALSE } printf("Binaerdarstellung ist (in umgekehrter Reihenfolge):\n"); do { rest = dezimal % 2; dezimal = dezimal / 2; printf("%d\n", rest); // Ziffer ausgeben } while (dezimal != 0); if (istVorzeichenNegativ == 1 /* WAHR */) { printf("-­‐\n"); } } Aufgabe 4: Umwandlung Binär nach Dezimal Wandeln Sie folgende Zahlen aus der dualen in die dezimale Darstellung um: a) 1001 c) 1001.1101 b) 1011 d) 1011.101 S. 7 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Beispiellösung: a) 1001 = 1⋅23 + 0⋅22 + 0⋅21 + 1⋅20 = 8 + 1 = 9 b) 1011 = 1⋅23 + 0⋅22 + 1⋅21 + 1⋅20 = 8 + 2 +1 = 11 c) 1001.1101 = 1⋅23 + 0⋅22 + 0⋅21 + 1⋅20 + 1⋅2-­‐1 + 1⋅2-­‐2 + 0⋅2-­‐3 + 1⋅2-­‐4 = 8 + 1 + 0.5 + 0.25 + 0.0625 = 9.8125 d) 1011.101 = 23 + 21 + 20+ 2-­‐1 + 2-­‐3 = 11.62 Aufgabe 5: Zahlumwandlung Wandeln Sie folgende Zahlen in das jeweils angegebene System um: a) (123)16 → (?)10 g) (23)10 → (?)8 b) (123)10 → (?)16 h) (1B.3D)16 → (?)10 c) (7A)16 → (?)8 i) (101110 . 1100101)2 → (?)16 d) (101110)2 → (?)16 j) (101110 . 1100101)2 → (?)8 e) (101110)2 → (?)8 k) (101110 . 1100101)2 → (?)10 f) (101110)2 → (?)10 Beispiellösung: a) (123)16 → (?)10 (123)16 = 1⋅162 + 2⋅161 + 3⋅160 = = 256 + 32 + 3 = 291 b) (123)10 → (?)16 123 : 16 = 7 Rest 11 7 : 16 = 0 Rest 7 (123)10 = (7B)16 S. 8 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung c) (7A)16 → (?)8 Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F Binär 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 Dezimal Oktal 0 00 1 01 2 02 3 03 4 04 5 05 6 06 7 07 8 10 9 11 10 12 11 13 12 14 13 15 14 16 15 17 Hexadezimal: 1 Ziffer zu 4 Bit, Oktal: 3 Bit zu einer Ziffer (7A)16 → (01 111 010)2→ (172)8 d) (101110)2 → (?)16 (10 1110)2 → (2 E)16 4 Binär-­‐Ziffern (Bits) zu einer (Hexadezimal-­‐)Stelle e) (101110)2 → (?)8 (101 110)2 = (5 6)8 3 Binär-­‐Ziffern (Bits) zu einer (Oktal-­‐)Stelle f) (101110)2 → (?)10 (101110)2 = 1⋅25 + 0⋅24 + 1⋅23 + 1⋅22 + 1⋅21 + 0⋅20 = 32 + 8 + 4 + 2 = 46 g) (23)10 → (?)8 (23)10 : 25: 8 = 2 Rest 7 2: 8 = 0 Rest 2 => (25)10 = (27)8 S. 9 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung h) (101110.1100101)2 → (?)16 (10 1110 . 1100 101)2 → (2 E . C A)16 4 Binär-­‐Ziffern (Bits) zu einer (Hexadezimal-­‐)Stelle i) (101110.1100101)2 → (?)8 (101 110 . 110 010 1)2 = (101 110 . 110 010 100)2 = (5 6 . 6 2 4 )8 3 Binär-­‐Ziffern (Bits) zu einer (Oktal-­‐)Stelle j) (101110.1100101)2 → (?)10 (101110.1100101)2 = 1⋅25 + 0⋅24 + 1⋅23 + 1⋅22 + 1⋅21 + 0⋅20 + 1⋅2-­‐1 + 1⋅2-­‐2 + 0⋅2-­‐3 + 0⋅2-­‐4 + 1⋅2-­‐5 + 0⋅2-­‐6 + 0⋅2-­‐7 = 32 + 8 + 4 + 2 + 0.5 + 0.25 + 0.03125 + 0.0078125 = 46.7890625 Zusatz-­‐‑Aufgabe 6: Nicht ausgelastet? Umrechnung zwischen Stellenwert-­‐‑ systemen Wandeln Sie die folgende Zahl (zur Basis 30) in eine Zahl zur Basis 29 um: I N F O (30) = ? (29) Beispiellösung: (I N F O)30 = 18 ·∙ 303 + 23 ·∙ 302 + 15 ·∙ 301 + 24 ·∙ 300 = 18 ·∙ 27.000 + 23 ·∙ 900 + 15 ·∙ 30 + 24 ·∙ 1 = 486.000 + 20.700 + 450 + 24 = 507.174 507.174 : 29 = 17.488 Rest 22 17.488 : 29 = 603 Rest 1 603 : 29 = 20 Rest 23 20 : 29 = 0 Rest 20 à (I N F O)30 = (K N 1 M)29 S. 10 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Aufgabe 7: Gleitpunktzahlen a) Wandeln Sie die reelle Zahl 0.3 in eine Dualzahl um: (0.3)10 → (?)2 b) Wandeln Sie die reelle Zahl 0.37 (zur Basis 10) in eine Dualzahl mit zehn binären Nachkommastellen um und nehmen Sie dann die Umwandlung noch einmal in Gegenrichtung vor. Geben Sie den entstandenen Fehler mit acht Nachkommastellen an. Beispiellösung: a) Umwandlung von 0.3: 0,3 * 2 = 0,6 à Ziffer 0 Rest 0,6 0,6 * 2 = 1,2 à Ziffer 1 Rest 0,2 0,2 * 2 = 0,4 à Ziffer 0 Rest 0,4 0,4 * 2 = 0,8 à Ziffer 0 Rest 0,8 0,8 * 2 = 1,6 à Ziffer 1 Rest 0,6 à Wiederholung (s.o.) 0,6 * 2 = 1,2 à Ziffer 1 Rest 0,2 0,2 * 2 = 0,4 à Ziffer 0 Rest 0,4 0,4 * 2 = 0,8 à Ziffer 0 Rest 0,8 0,8 * 2 = 1,6 à Ziffer 1 Rest 0,6 0,6 * 2 = 1,2 à Ziffer 1 Rest 0,2 … Die Zahl 0.3 benötigt also unendlich viele binäre Ziffern und kann somit nicht exakt im Rechner dargestellt werden (wegen begrenzter Anzahl an speicherbaren binären Ziffern!) è (0.3)10 = (0.0100110011…)2 = (0.0 1001 )2 b) Umwandlung der Dezimalzahl 0,37 in eine binäre Gleitpunktzahl: 0,37 * 2 = 0,74 0,74 * 2 = 1,48 0,48 * 2 = 0,96 0,96 * 2 = 1,92 0,92 * 2 = 1,84 0,84 * 2 = 1,68 0,68 * 2 = 1,36 0,36 * 2 = 0,72 0,72 * 2 = 1,44 0,44 * 2 = 0,88 à Ziffer 0 (nach dem Komma), Rest 0,74 à Ziffer 1 Rest 0,48 à Ziffer 0 Rest 0,96 à Ziffer 1 Rest 0,92 à Ziffer 1 Rest 0,84 à Ziffer 1 Rest 0,68 à Ziffer 1 Rest 0,36 à Ziffer 0 Rest 0,72 à Ziffer 1 Rest 0,44 à Ziffer 0 Rest 0,88 Ergebnis: (0,37)10 = (0,0101111010)2 S. 11 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Anmerkung: • Da der verbliebene Rest 0,88 größer als 0,5 ist, hätte man die letzte Ziffer auch aufrunden können und damit als Ergebnis (0,0101111011)2 nehmen können. Wir haben in unserem Beispiel einfach nach 10 Nachkommastellen abgebrochen (anstatt zu runden). Umwandlung zurück in eine Dezimalzahl: • Bei der Umwandlung ins Dezimalsystem berücksichtigen wir die Wertigkeit der einzelnen Ziffern an den verschiedenen Stellen. o Allgemein gilt für eine Zahl a2a1a0,a-­‐1a-­‐2 (mit den Ziffern a2, a1, …, a-­‐2) zur Basis B: (a2a1a0,a-­‐1a-­‐2 )B = a2 ⋅B2 + a1⋅B1 + a0⋅B0 + a-­‐1⋅B-­‐1 + a-­‐2 ⋅B-­‐2 o Z.B. gilt (125,73)10 = 1⋅102 + 2⋅101 + 5⋅100 + 7⋅10-­‐1 + 3⋅10-­‐2 = 1⋅100 + 2⋅10 + 5⋅1 + ! ! 7⋅ + 3⋅ = 100 + 20 + 5 + 0,7 + 0,03 = 125,73 !" !"" • Folglich gilt für die Umwandlung Binärsystem (Basis B = 2) ins Dezimalsystem: o (0,0101111010)2 = 0⋅20 + 0⋅2-­‐1 + 1⋅2-­‐2 + 0⋅2-­‐3 + 1⋅2-­‐4 + 1⋅2-­‐5 + 1⋅2-­‐6 + 1⋅2-­‐7 + 0⋅2-­‐8 + " ! " ! ! ! ! " ! " !%* 1⋅2-­‐9 + 0⋅2-­‐10 = 0 + + + + + + + + + + = = # $ % !' (# '$ !#% #)' )!# !"#$ )!# (0,369140625)10 o Gerundet auf 8 Nachkommastellen ergibt sich (0,36914062)10 • Der Fehler ist die Differenz zur Zahl 0,37 (diese wollten wir ja eigentlich darstellen) und beträgt 0,37 -­‐ 0,369140625 = 0,000859375 ≈ 0,00085938 Anmerkung: • Man beachte, dass Gleitpunktzahlen fast nie exakt im Rechner dargestellt werden können, sondern fast immer gerundet sind! (Dadurch ergeben sich bereits Rundungsfehler durch die Zahldarstellung an sich, weitere Rundungsfehler entstehen beim Rechnen mit Gleitpunkzahlen – siehe nachfolgende Aufgabe.) S. 12 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Aufgabe 8: Speicherbedarf Wie viele Bytes benötigt man mindestens, um folgende Dezimalzahlen binär kodiert zu speichern? a) 9 c) 897645 b) 7625 d) 39427613 Beispiellösung: Zunächst überlegen wir uns, welche Zahlen man mit einer bestimmten Anzahl an binären Ziffern, d.h. mit wie vielen Bits darstellen kann: Bit Darstellbare Zahlen Zusätzlicher Zahlenbereich für höherwertigstes Bit 1 0 ... 1 0 … 1 = 0 … 2^1 -­‐ 1 2 0 ... 3 2 … 3 = 2^1 … 2^2 -­‐ 1 3 0 … 7 4 … 7 = 2^2 … 2^3 -­‐ 1 4 0 … 15 8 … 15 = 2^3 … 2^4 -­‐ 1 5 0 … 31 16 … 31 = 2^4 … 2^5 -­‐ 1 … … … n 0 … 2^n -­‐ 1 2^(n-­‐1) … 2^n -­‐ 1 Also: Eine Zahl z wird mit ⎣log2(z)⎦ + 1 Bit kodiert. Das jeweils gerade noch benötigte höherwertigste Bit n ergibt sich, wenn 2n-­‐1 ≤ z ≤ 2n -­‐ 1 Ein Byte sind jeweils 8 Bit. a) 9 = 23 + 20 = 1001 ⇒ 23 ≤ 9 ≤ 24-­‐1 ⇒ 4 binäre Ziffern, d.h. benötigt 4 Bits ⇒ 1 Byte Beachte: Nicht: 4 /8 = 0,5 Byte, sondern 1 ganzes Byte würde benötigt werden! b) 7625 ⇒ 13 Bits (213-­‐1=4096 ≤ 7625 ≤ 213-­‐1 = 8191) ⇒ 2 Byte c) 897645 ⇒ 20 Bits (219 = 524 288 ≤ 897.645 ≤ 220-­‐1 = 1 048 575) ⇒ 3 Byte d) 39427613 ⇒ 26 Bits (225 = 33.554.432 ≤ 39.427.613 ≤ 226-­‐1 = 67.108.865) ⇒ 4 Byte S. 13 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Zusatz-­‐‑Aufgabe 9: Nicht ausgelastet? – Ermittlung Speicherbedarf Entwickeln Sie ein C-­‐Programm, um den Speicherbedarf einer Zahl zu ermitteln. Geben Sie dazu jeweils die Anzahl der mindestens benötigten Bits und der mindestens benötigten Bytes an, um eine Dezimalzahl binär codiert zu speichern. Beispiellösung: ALGORITHMUS Speicherbedarf() Beschreibung Berechnet den Speicherbedarf einer Zahl, d.h. die benötigte Anzahl an Bits und Bytes. Deklaration und Definition der lokalen Größen Aufrufparameter: -­‐-­‐-­‐ Rückgabeparameter: -­‐-­‐-­‐ Natürliche Zahlen: zahl, bits, bytes Algorithmuskern Einlesen von zahl FALLS (zahl < 0) DANN Ausgabe Fehler ABBRUCH SONST bits = 0 WIEDERHOLE bits = bits + 1 zahl = zahl / 2 SOLANGE (zahl ≠ 0) bytes = bits / 8 FALLS (bits MODULO 8 ≠ 0) DANN bytes = bytes + 1 ENDE FALLS Ausgabe bits, bytes ENDE FALLS ENDE ALGORITHMUS Als C-­‐‑Programm ergibt sich: #include <stdio.h> /* Beschreibung: * Ermittelt den Speicherbedarf einer Zahl, * d.h. die benötigte Anzahl an Bits und Bytes */ void main(void) { /* Definition der lokalen Variablen */ unsigned int zahl, bits, bytes; /* Algorithmuskern*/ S. 14 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung } printf("Ermittlung Speicherbedarf einer Zahl\n\n"); printf("Zahl = "); scanf("%u", &zahl); if (zahl < 0) { printf("Fehler\n"); // dürfte nicht vorkommen bei unsigned Zahlen } else { bits = 0; do { bits = bits + 1; zahl = zahl / 2; } while (zahl != 0); bytes = bits / 8; if (bits % 8 != 0) { // Aufrunden auf nächstgrößere Byte-­‐Anzahl bytes = bytes + 1; } } printf("Benötigt: %d Bits bzw. %d Bytes\n", bits, bytes); Zusatz-­‐‑Aufgabe 10: Nicht ausgelastet? – Rechengenauigkeit a) Da die Rechengenauigkeit jedes Rechners begrenzt ist, soll ein Algorithmus entworfen werden, der eine Zahl ε > 0 findet, so dass der Rechner 1 + ε = 1 als richtig ansieht. ε soll zunächst mit dem Wert 1 initialisiert werden und dann solange halbiert werden, bis die Abbruchbedingung 1 + ε = 1 erfüllt ist. Danach soll ε ausgegeben werden. Entwerfen Sie den Algorithmus! b) Überführen Sie den Algorithmus in drei kleine C-­‐Programme. Jedes C-­‐Programm soll einen anderen Schleifentyp verwenden. Zusatz-­‐‑Aufgabe 11: Nicht ausgelastet? – IP-­‐‑Adressen Im Internet werden IP-­‐Adressen byteweise in dezimaler Form geschrieben, bei IPv4 beispielsweise 194.19.121.100 a) Wie viele verschiedene Rechner können so (theoretisch) adressiert werden? S. 15 / 16 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 3 – Beispiellösung Beispiellösung: Bei IP, Version 4 (IPv4) besteht eine IP-­‐Adresse aus 4 Bytes mit jeweils 28=256 möglichen Werten. 4 Bytes sind 4 * 8 = 32 Bits, also können 232 = (28)4 = 2564 = 4.294.967.296 verschiedene Rechneradressen gebildet werden. (Davon sind jedoch einige Adressen reserviert, sodass der tatsächlich nutzbare Bereich etwas geringer ausfällt.) Anmerkung: In der Nachfolgeversion (IPv6) werden 8 Bytes = 64 Bits für die Adressen verwendet, hier könnten somit theoretisch 264 = (28)8 = 2568 ≈ 3,7⋅1019 verschiedene Adressen gebildet werden. b) Wie sieht die obige Adresse in binärer/hexadezimaler Schreibweise aus? Lösung: Binär: 11000010.00010011.01111001.01100100 Hexadezimal: C2.13.79.64 S. 16 / 16