Technische Informatik für Ingenieure WS 00/0 Übungsblatt Nr. 0. Januar 0 Übungsgruppenleiter: Matthias Fischer Mouns Almarrani Rafał Dorociak Michael Feldmann Thomas Gewering Benjamin Koch Dominik Lüke Alexander Teetz Simon Titz Simon Oberthür Seite () Aufgabe : Gegeben sind die folgenden Programmausschnitte: (Schleifen) I. Programmausschnitt: for(int i = 0; i < x; i++) { for (int j = 0; j < x; j++) { Out.print(j); II. Programmausschnitt: for(int i = 0; i < x; i++) { for (int j = 0; j <= i; j++) { Out.print(j); III. Programmausschnitt: for(int i = 0; i < x; i++) { for (int j = i; j < x; j++) { Out.print(j); IV. Programmausschnitt: for(int i = ; i <= x; i++) { for (int j = x-i; j < x; j++) { Out.print(j); Prüfen Sie auf dem Papier, welche Ausgabe die Programme jeweils für x = 0 liefern.
Technische Informatik für Ingenieure Seite () Ausgabe Programm I: i j 0 Ausgabe Programm II: 0 0 0 0 0 0 0 0 0 i j 0 0 0 0 0 0 0
Technische Informatik für Ingenieure Seite () Ausgabe Programm III: i j 0 j=i=0 j=i= j=i= Ausgabe Programm IV: i j=x-i j=0-= j=0-= j=0-= j=0-= j=0-=
Technische Informatik für Ingenieure Seite () Aufgabe : (geschachtelte Schleifen) Schreiben Sie eine der Schleifen in Aufgabe so um, dass für eine frei wählbare gerade Zahl eine Ausgabe wie im folgenden Beispiel (hier ist n = ) erfolgt. Testen Sie das Programm in Eclipse. Bauen Sie Ihr Programm nun so um, dass die folgende Ausgabe auf der Konsole erscheint: public class Schleifen { public static void main(string[] args) { int x = 0; for (int i = ; i < x; i++) { for (int j = ; j <= i; j++) { if (i <= x / ) { Out.print(j + " "); else { if (j <= x - i) { Out.print(j + " ");
Technische Informatik für Ingenieure Seite () public class Stern { public static void main(string[] args) { /* * Die Variable x bezeichnet die Anzahl der zu zeichnenden Sterne pro Richtung (horizontal, vertikal, diagonal LO->RU, diagonal LU->RO ). * Hinweis: x = 0 bedeutet die Anzeige von Sternen. */ int x = 0; for (int i = 0; i <= x; i++) { for (int j = 0; j <= x; j++) { // horizontale Linie if (i == x / ) { Out.print(" * "); // Linie oben-links nach unten-rechts else if (i == j) { Out.print(" * "); // Linie oben-rechts nach unten-links else if (i == x - j) { Out.print(" * "); // vertikale Linie else if (j == x / ) { Out.print(" * "); // Leerzeichen zum Ausfüllen else { Out.print(" ");
Technische Informatik für Ingenieure Seite () Aufgabe : Gegeben sind folgende Dezimalzahlen: a = b = (Zahlenrepräsentation) a) Berechnen Sie a + b im er-komplement. Wandeln Sie dazu die Zahlen zunächst in Dualzahlen (bestehend aus en und 0en) um, addieren Sie diese und überprüfen Sie das Ergebnis durch die abermalige Umwandlung in eine Dezimalzahl. Der folgende Algorithmus aus der Vorlesung gibt das er-komplement in vertauschter Bitreihenfolge aus: for (i = 0; i <= n- ; i++) { Out.println(x%); x = x/; /* Bitreihenfolge beachten! */ Beachten Sie: In der Vorlesung konnten Zahlen von - bis + mit Ziffern dargestellt werden. Die vorderste Ziffer hat dabei das Vorzeichen bestimmt. Ziffern können ³ = Zahlenwerte und ein Vorzeichen darstellen (0- u. - bis -). Bestimmen Sie zuerst die benötigte Anzahl von Stellen für die Darstellung der Zahlen und des Ergebnisses im er-komplement. b) Berechnen Sie b - a. Was müssen Sie beachten? Überprüfen Sie ihr Ergebnis. c) Nehmen Sie an, es ständen nur Bit für die Speicherung der Zahlen im er- Komplement zur Verfügung. Führen Sie die Addition aus a) für diesen Fall durch und diskutieren Sie ihre Beobachtungen. Führen Sie auch den in der Vorlesung besprochenen Überlauftest durch. Die größte darzustellende Zahl ist das Ergebnis + =. Um darstellen zu können, benötigen wir inklusive des Vorzeichens Bit, da = und =. Bit reichen aus, um den Zahlenbereich - bis + darzustellen, der auch die benötigte beinhaltet. Zusammen mit dem Vorzeichenbit (das Most Significant Bit, also das erste Bit von links) benötigen wir also Bit für die Darstellung der Rechnung im er- Komplement. Umwandeln in Dualzahlen: / = Rest / = Rest / = Rest / = Rest / = Rest 0 / = 0 Rest
Technische Informatik für Ingenieure Seite () a = 000 es werden zwei 0-en vorangestellt um die Bit zu vervollständigen. / = Rest / = Rest / = Rest 0 / = Rest 0 / = Rest 0 / = 0 Rest b = 00000 Addition: 000 +00000 --------- 00000 Umrechnung des Ergebnisses in das Dezimalsystem: 00000 = 0* 0 +* +0* +0* +* +0* +* +0* = ++ = b) Berechnen Sie b - a. Was müssen Sie beachten? Überprüfen Sie ihr Ergebnis. Subtraktion: Wir müssen beachten, dass wir, um - = - zu berechnen, eigentlich + (-) rechnen müssen. Um aus der eine - zu machen, müssen wir zuerst invertieren, indem wir alle Bits umdrehen. Das Ergebnis nennen wir er-komplement der Zahl: 000 00000 Dann addieren wir auf das Ergebnis und erhalten - im er-komplement: 00000 +0000000 --------- 0000
Technische Informatik für Ingenieure Seite () Die Subtraktion wird dann durch die Addition des er-komplements erreicht: 00000 +0000 --------- 000 Zur Überprüfung können wir die Umrechnung aus dem Dezimal- ins Dualsystem umdrehen, also - addieren und anschließend die Bits invertieren. Das Subtrahieren wird wie im obigen Fall durchgeführt. - im er-komplement wird zu, so dass bei der Addition folgendes berechnet wird. 000 + --------- 00 Das erste Bit ist zu viel, fällt beim Invertieren aber ohnehin weg. Wir erhalten: 000000 = 0* 0 +0* +* +* +0* +0* +0* + 0* =, also - unter Beachtung des Vorzeichens. Alternativ können wir aus dem Dualsystem direkt ins Dezimalsystem umrechnen, indem wir das Vorzeichen als negativen Summanden einbringen: 000 = 0* 0 +0* +* +0* +* +* +* -* = + + + = - Das Ergebnis stimmt also. c) Nehmen Sie an, es ständen nur Bit für die Speicherung der Zahlen im er- Komplement zur Verfügung. Führen Sie die Addition aus a) für diesen Fall durch und diskutieren Sie ihre Beobachtungen. Führen Sie auch den in der Vorlesung besprochenen Überlauftest durch. Wir stellen bei der oben durchgeführten Umrechnung von a und b in das Dualsystem nur eine 0 voran, um auf Bit aufzufüllen. Die Rechnung sieht dann wie folgt aus: 00 +0000 -------- 0000
Technische Informatik für Ingenieure Seite () Interpretiert man dieses Ergebnis, so muss das erste Bit als Vorzeichenbit betrachtet werden. Das Ergebnis ist also negativ und demnach falsch, da wir ursprünglich positive Zahlen addiert haben. 0000 = 0* 0 +* +0* +0* +* +0* -* = + = - Also falsch! Überlauftest: Schreibe das jeweils erste Bit noch einmal hin und vergleiche die ersten beiden Bits. 000 +00000 --------- 00000 Hier hat es einen Überlauf gegeben. Das Ergebnis ist also, wie bereits festgestellt, nicht korrekt. Aufgabe : (Typisierung) Bestimmen Sie alle Typen und den Wert der Variable ergebnis so, dass sie keinen Typfehler erzeugt. int a = ; int b = ; short i; byte j; long k; double x =.0; double y =.0; char c = 'a'; char h = 'b'; String s = "xyz"; a) ergebnis = a + b; b) ergebnis = a / b; c) ergebnis = a + y; d) ergebnis = a * x; e) ergebnis = a / y; f) ergebnis = a!= b; g) ergebnis = a * (int)x; h) ergebnis = (int)(x * y) * y; i) ergebnis = c > h; j) ergebnis = a % b; k) ergebnis = "abc"+""; l) ergebnis = "abc"+; Die beiden nachfolgenden Fälle sind etwas komplexer zu bestimmen, da in ihnen mehrere unterschiedliche Datentypen vorkommen und diese zum Teil explizit umgewandelt werden. Benutzen Sie daher bei m) und n) den Syntaxbaum zur Unterstützung, um den Typ der Variable ergebnis zu ermitteln. Hinweis: Ein Type-Cast wird im Syntaxbaum als ein unärer Knoten dargestellt.
Technische Informatik für Ingenieure Seite 0() m) ergebnis = (a+j/b+k)/((float) (i/x+j)); n) ergebnis = s.length() <= i+(int)(y*c-x*h)/s.charat(); double float long int String boolean a).0.0 b) 0.0 0.0 0 0 c).0 d).0 e) 0. f) true g).0.0 h).0 i) false j).0.0 k) abc l) abc m)
Technische Informatik für Ingenieure Seite () n)