Technische Universität München Fakultät für Informatik A. Berlea, M. Petter, Dr. M. Schneider, P. Ziewer WS 2004/2005 Lösungsvorschläge zu Blatt 2 4. November 2004 Übungen zu Einführung in die Informatik I Aufgabe 5 Umwandlung zwischen Biinär und Dezimal (Lösungsvorschlag) public class BasisUmwandlung extends MiniJava { // Hilfsfunktion public static int power(int x, int y){ // Initialisierung int power = 1; // Anzahl der Durchläufe ist y while (y > 0) { power = power * x; y = y - 1; } return power; } // Umwandlung von Dezimal nach Binaer public static void dec2Bin(int d) { // Array, wo die berechnete Darstellung gespeichert wird int representation[]= new int[32]; // Hilfsvariable zur Iterierung ueber die Stellen der binaeren Darstellung int i=0; // An Stelle Null wird die letzte Stelle gespecihert // Berechnung while(d>0){ representation[i] = d % 2; // die letzte Stelle von d in Binaer d = d/2; // Entfernen der letzten binaeren Stelle i = i+1; } // Ausgabe; die erste Stelle ist die zuletzt berechnete while(i>0){ i = i-1; System.out.print(representation[i]); } System.out.println(); } Lösung 2/ Seite 2 // Umwandlung von Binaer nach Dezimal public static void bin2Dec(int b) { int z=0;// Akkumuliert das Ergebnis via Addition int i=0;// Hilfsvariable zur Iteration ueber die Stellen der binaeren Darstellung int last;// speichert die jeweils letzte Stelle while(b>0){ last = b % 10; // die letzte Stelle von b (muss entweder 0 oder 1 sein) if (last!=0 && last!=1) { System.out.println("Unerlaubte Ziffer in Binaer"); System.exit(1); } z = z + last * power(2,i); b = b/10; // Entfernen der letzten Stelle i = i+1; } System.out.println(z); } public static void main(String[] args) { // Dezimal nach Binaer int m = read(); dec2Bin(m); // Binaer nach Dezimal int n = read(); bin2Dec(n); } } Aufgabe 6 Sieb des Eratosthenes (Lösungsvorschlag) public class Eratosthenes extends MiniJava { public static void main(String[] args) { // Eingabe int n = read(); if (n < 0) { // fehlerhafte Eingabe write("Nur positive Eingaben erlaubt."); } else { // korrekte Eingabe; Berechnung kann erfolgen // Sieb anlegen boolean prime[] = new boolean[n + 1]; for (int i = 2; i < prime.length; i++) prime[i] = true; Lösung 2/ Seite 3 // Primzahlen berechnen for (int i = 2; i < prime.length; i++) { if (prime[i]) { // Primzahl ausgeben System.out.println(i); // alle Vielfachen streichen for (int j = 2 * i; j < prime.length; j = j + i) { prime[j] = false; } } } } } } Mögliche Optimierungen: • Nur ungerade Zahlen berücksichtigen • Berechnung bis zur Wurzel der oberen Grenze ist ausreichend Aufgabe 7 Grammatiken (Lösungsvorschlag) a) {wcwR | w ∈ (a|b)∗ }, wobei (a|b)∗ die Menge aller Wörter bestehend aus a0 s und b0 s ist, und wR die Spiegelung des Wortes w darstellt. Das heißt, c spiegelt ein beliebiges Wort aus a’s und b’s. b) {an bm cm d n | m, n ∈ N, m ≥ 1, n ≥ 1}, wobei an das Wort bestehend aus genau n a’s ist. Bitte wenden! Aufgabe 8 Syntax-Baum (Lösungsvorschlag) (i) program stmt decl stmt cond stmt cond bbinop cond expr stmt comp expr expr type name a , b ; name number b = 29 name ; a = read ( ) ; if ( expr binop expr expr number name name 1 name < a && ( a number * 3 ) < b stmt expr expr number number ) { write ( 1 ) ; } else write ( 0 ) ; Lösung 2/ Seite 4 int name expr comp expr stmt program decl stmt stmt stmt stmt cond expr type name int x name , r name , n name ; r expr number = 1 name ; n expr comp expr number = 1 name ; name x = read ( ) ; while ( n name < x stmt ) (ii) stmt cond stmt stmt expr stmt stmt expr bbinop expr expr binop expr name { if ( r % number number 1 0 && name ) r = expr expr expr expr binop expr unop expr expr binop expr expr name name name r name * name n ; else r = name r * name ( − n ) ; name n = n number + 1 ; write ( r ) ; } Lösung 2/ Seite 5 expr binop expr Lösung 2/ Seite 6 Aufgabe 9 Kontrollfluss-Diagramm (Lösungsvorschlag) Start r = 1; n = 1; Start x = read(); a = read(); no yes n<x no b = 29; n%2==0 r = r*(−n); no 1<a && (a*3)<b write(0); r = r * n; yes write(1); n = n + 1; write(r); Stop (i) yes Stop (ii)