Hausaufgabe 10 loesung PDF

Title Hausaufgabe 10 loesung
Author Longqi He
Course Einführung in die Informatik
Institution Technische Universität Berlin
Pages 7
File Size 209 KB
File Type PDF
Total Downloads 68
Total Views 166

Summary

Download Hausaufgabe 10 loesung PDF


Description

Einführung in die Informatik - WS 2019/20 Technische Universität Berlin

Computer Vision & Remote Sensing

Übungsblatt 10 (Block 3) Prof. Dr. Olaf Hellwich und Mitarbeiter Wiederholung, Zahlendarstellung Verfügbar ab: Abgabe bis:

06.01.20 13.01.20-17.01.20

Aufgabe 1: Zahlendarstellung

2 Punkte

In der folgenden Tabelle sollen die vier Zahlen A, B, C und D in mehrere Zahlensysteme konvertiert werden. Jede Zeile der Tabelle repräsentiert eine dieser vier Zahlen.

Zahl A Zahl B Zahl C Zahl D

Dual 1011

Oktal

Dezimal

Hexadezimal

55 97 AB

Vervollständigen Sie diese Tabelle, indem Sie jede Zahl in die jeweils drei übrigen Zahlensysteme umwandeln. Der Rechenweg muss nicht angegeben werden.

Zahl E

Dual 1111

Oktal 17

Dezimal 15

Hexadezimal F

Musterlösung:

Zahl Zahl Zahl Zahl

A B C D

Dual 1000 101101 1100001 10101011

Oktal 13 55 141 253

Dezimal 11 45 97 171

Hexadezimal B 2D 61 AB

Aufgabe 2: Binäre Addition

2 Punkte

Berechnen Sie 65(10) + 7610 =?(10) und 42(8) + 55(8) =?(8) in Binärdarstellung. Gehen Sie dabei wie folgt vor: 1. Umwandeln der ersten Zahl in eine Dualzahl 2. Umwandeln der zweiten Zahl in eine Dualzahl 3. Addieren Sie die beiden Dualzahlen 4. Wandeln Sie die Dualzahl in eine Dezimalzahl bzw. Oktalzahl um

weitere Informationen unter https://isis.tu-berlin.de/course/view.php?id=16998

1

InfTech

WS 2019/20

Übungsblatt 10 (Block 3)

Musterlösung:

65(10) + 76(10) = 141(10) , weil 1. 65(10) = 1000001(2) 2. 76(10) = 1001100(2) 3. 1000001(2) + 1001100(2) = 10001101(2) 4. 10001101(2) = 1 · 27 + 1 · 23 + 1 · 22 + 1 · 20 = 128(10) + 8(10) + 4(10) + 1(10) = 141(10) 42(8) + 55(8) = 117(8) , weil 1. 42(8) = 100010(2) 2. 55(8) = 101101(2) 3. 100010(2) + 101101(2) = 1001111(2) 4. 1001111(2) = 001001111(2) = 117(8) , da 001(2) = 1(8) und 001(2) = 1(8) und 111(2) = 7(8) (3 Bits → 1 Oktalziffer) Aufgabe 3: Binäre Subtraktion

2 Punkte

Berechnen Sie 52(10) − 14(10) =?(10) und F B(16) − AB(16) =?(16) in Binärdarstellung. Gehen Sie dabei wie folgt vor: 1. Umwandeln der ersten Zahl in eine Dualzahl 2. Umwandeln der zweiten Zahl in eine Dualzahl 3. Subtrahieren Sie die beiden Dualzahlen 4. Wandeln Sie die Dualzahl in eine Dezimalzahl bzw. Hexadezimalzahl um

Musterlösung:

52(10) − 14(10) = 38(10) , weil 1. 52(10) = 110100(2) 2. 14(10) = 1110(2) 3. 110100(2) − 1110(2) = 100110(2) 4. 100110(2) = 1 · 25 + 1 · 22 + 1 · 21 = 32(10) + 4(10) + 2(10) = 38(10) F B(16) − AB(16) = 50(16) , weil 1. F B(16) = 11111011(2) 2. AB(16) = 10101011(2) 3. 11111011(2) − 10101011(2) = 1010000(2) 4. 01010000(2) = 50(16) , da 0101(2) = 5(16) und 0000(2) = 0(16) (4 Bits → 1 Hexadezimalziffer) Nur Java Aufgabe 4: Konverter

4 Punkte

Betrachten Sie das folgende unvollständige Java-Programm, welches eine Zahl in Dezimaldarstellung in eine Zahl zur Basis 8 umrechnen und ausgeben soll. Anschließend wird die Zahl zur Basis 8 zurück in Dezimaldarstellung umgewandelt und erneut ausgegeben. 1 public class Konverter {

weitere Informationen unter https://isis.tu-berlin.de/course/view.php?id=16998

2

InfTech 2 3

WS 2019/20

Übungsblatt 10 (Block 3)

// konvertiert eine Zahl von Dezimal− in Oktaldarstellung public static void dezimalZuOktal(int dezimal, int[] oktal, int idx){

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 }

// IHR CODE } // konvertiert eine Zahl von Oktal− in Dezimalzahldarstellung public static int oktalZuDezimal(int[] oktal){ //IHR CODE } public static void main(String[] argv){ int n = 1487469; int[] oktal = new int[8]; // in Oktal−Darstellung konvertieren und ausgeben dezimalZuOktal(n, oktal, 0); System.out.print("Oktalzahl: \t"); for(int i = 0; i < oktal.length; i++){ System.out.print(oktal[i]); } System.out.println(); // in Dezimaldarstellung konvertieren und ausgeben int result = oktalZuDezimal(oktal); System.out.println("Dezimalzahl: \t" + result); // Auswertung if(result == n){ System.out.println("SUCCESS"); } else{ System.out.println("ERROR"); } }

• Vervollständigen Sie die Methode dezimalZuOktal folgendermaßen: Berechnen Sie die Darstellung der Zahl zur Basis 8 aus der übergebenen Ganzzahl dezimal und speichern Sie diese im bereits existierenden Array oktal. Das heißt in jedem Eintrag Ihres Arrays wird eine Ziffer gespeichert. Beachten Sie, dass sie das Big-Endian-Format wählen sollen, d.h. dass die höchstwertigste Stelle in oktal[0] gespeichert werden muss. Somit wäre 9023 = [9,0,2,3] (ohne Konvertierung). Desweiteren muss die Implementierung mithilfe von Rekursion erfolgen. • Vervollständigen Sie die Methode oktalZuDezimal, welche eine Zahl der Basis 8 in eine Dezimalzahl umrechnen soll. Dies darf iterativ (ohne Rekursion) umgesetzt werden. Beispiel für eine Zahl der Länge 4: Index Array Umrechnung

3 0 +0 · 83

2 0 +0 · 82

1 2 + 2 · 81

0 0 +0 · 80

= 1410

weitere Informationen unter https://isis.tu-berlin.de/course/view.php?id=16998

3

InfTech

WS 2019/20

Übungsblatt 10 (Block 3)

Hinweis 1: Verwenden Sie den Algorithmus aus Allgemeine Umrechnung (Tutorium), um ausgehend von einer Dezimalzahl die Darstellung zur Basis 8 zu berechnen. Hierzu ist es hilfreich, sich zu erinnern, wie Ganzzahldivision (Operator / mit int-Operanden) sowie Restberechnung bei der Ganzzahldivision (Operator % mit int-Operanden) in Java einzusetzen sind. Hinweis 2: Für das Berechnen von Potenzen kann die Methode Math.pow() genutzt werden. Musterlösung: 1 public class Konverter { 2 // konvertiert eine Zahl von Dezimal− in Oktaldarstellung 3 public static void dezimalZuOktal(int dezimal, int[] oktal, int idx){ 4 // Verwendung von idx so gewaehlt, dass Arraydurchlauf von hinten nach vorn 5 // Speichere ’rest’ in oktal−Array 6 oktal[oktal.length−1−idx] = dezimal % 8; 7 // ganzzahlige Division 8 dezimal /= 8; 9 if(idx == oktal.length−1){ // Abbruch 10 11 if(dezimal != 0) 12 System.out.println("Fehler bei Umrechnung: Array zu klein."); 13 return; 14 } 15 // Rekursionsaufruf 16 17 dezimalZuOktal(dezimal, oktal, idx + 1); 18 } 19 // konvertiert eine Zahl von Oktal− in Dezimalzahldarstellung 20 21 public static int oktalZuDezimal(int[] oktal){ 22 int dezimal = 0; 23 24 int exponent = 0; 25 // Array von hinten nach vorne durchlaufen 26 27 for(int i = oktal.length−1; i>=0; i−−){ 28 // addiere oktal[i] * 8 ^ wertigkeit[i] 29 dezimal += oktal[i]*Math.pow(8, exponent); 30 exponent++; 31 } 32 return dezimal; 33 } 34 35 public static void main(String[] argv){ 36 int n = 1487469; 37 int[] oktal = new int[8]; 38 39 // in Oktal−Darstellung konvertieren und ausgeben 40 dezimalZuOktal(n, oktal, 0); 41 System.out.print("Oktalzahl: \t"); 42 for(int i = 0; i < oktal.length; i++){ 43 System.out.print(oktal[i]); 44 }

weitere Informationen unter https://isis.tu-berlin.de/course/view.php?id=16998

4

InfTech 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 }

WS 2019/20

Übungsblatt 10 (Block 3)

System.out.println(); // in Dezimaldarstellung konvertieren und ausgeben int result = oktalZuDezimal(oktal); System.out.println("Dezimalzahl: \t" + result); // Auswertung if(result == n){ System.out.println("SUCCESS"); } else{ System.out.println("ERROR"); } }

Nur C/C++ Aufgabe 4: Konverter

4 Punkte

Betrachten Sie den vorgegebenen Quellcode convert.cpp. Vervollständigen Sie in dieser Datei die Funktion vector dezimalZuHexadezimal(unsigned int &dezimalzahl), welche eine Dezimalzahl in

eine Hexadezimalzahl (einen Vektor aus 0en bis F) konvertiert. Vervollständigen Sie außerdem die Funktion unsigned int HexadezimalZuDezimal(vector &hexadezimalzahl), welche eine Hexadezimalzahl in eine Dezimalzahl konvertiert. Achtung: Das Element am Index 0 (hexadezimalzahl.at(0)) ist die rechteste Ziffer der Hexadezimalzahl. Für die Zahl 1153(10) = 184(16) zeigt die folgende Tabelle, an welchem Index welches Bit steht: Index Wert

0 1

1 8

2 4

Hinweis 1: Benutzen Sie den Algorithmus aus dem Tutorium, um ausgehend von einer Dezimalzahl die Darstellung zur Basis 16 zu berechnen. Eine while-Schleife bietet sich dabei an. Erinnern Sie sich, wie Ganzzahldivision (Operator /) sowie Restberechnung bei der Ganzzahldivision (Operator %) in C++ einzusetzen sind. Hinweis 2: Für die Berechnung von Potenzen können Sie die Funktion double pow(double basis, double exponent) aus der cmath-Bibliothek verwenden. Hinweis 3: Beachten Sie bei der Verwendung von chars den Unterschied zwischen dem Buchstaben ’7’ und der Zahl 7. (’7’ entspricht der Zahl 55, vgl. ASCII-Tabelle.) Listing 1: convert.cpp 1 2 3 4 5 6 7 8 9 10 11 12

#include #include #include #include



using namespace std; vector dezimalZuHexadezimal(unsigned int &dezimalzahl){ // Hier ihr Code ... }

weitere Informationen unter https://isis.tu-berlin.de/course/view.php?id=16998

5

InfTech 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

WS 2019/20

Übungsblatt 10 (Block 3)

unsigned int hexadezimalZuDezimal(vector &hexadezimalzahl){ // Hier ihr Code ... } string printHexadezimalZahl(vector &hexadezimalzahl){ stringstream s; for(int i = hexadezimalzahl.size()−1; i >= 0 ; i−−){ s...


Similar Free PDFs