Übungen zu Einführung in die Informatik I

Werbung
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)
Herunterladen