TECHNISCHE
UNIVERSITÄT
MÜNCHEN
FAKULTÄT FÜR INFORMATIK
Lehrstuhl für Sprachen und Beschreibungsstrukturen
Praktikum Grundlagen der Programmierung
F. Forster, T. Gawlitza, A. Flexeder
Übungen zu
WS 2007/2008
Lösungsvorschläge zu Blatt 3
5. November 2007
Praktikum Grundlagen der Programmierung
Aufgabe 14 Kontrollfluss-Graph (Lösungsvorschlag)
Start
i=read();
k = -1;
j=read();
n = 0;
no
yes
j >=-k
no
i > j
j = j % i;
yes
i = i - j;
write(i);
n = (n - k) * 2 - 1;
Stop
Aufgabe 15 Minumum und Maximum (Lösungsvorschlag)
public class MinMax extends MiniJava {
public static void main ( String [] args ) {
// Anzahl der einzugebenden Zahlen abfragen
int eingaben = readInt (" Wie viele Zahlen möchten Sie eingeben ?" );
if ( eingaben < 1)
Lösung 3/ Seite 2
return;
// Array anlegen
int[] zahlen = new int[ eingaben ];
// Array mit Zahlen füllen
for (int i = 0; i < eingaben ; i ++) {
int zahl = readInt (" Bitte geben Sie die " + (i +1) + ". Zahl ein ." );
zahlen [i] = zahl ;
}
// min und max berechnen
int min = zahlen [0];
int max = zahlen [0];
for (int i = 1; i < eingaben ; i ++) {
if ( zahlen [i] < min )
min = zahlen [i ];
if ( zahlen [i] > max )
max = zahlen [i ];
}
// Ausgeben
write (" Die kleinste Zahl war " + min );
write (" Die größte Zahl war "+ max );
}
}
Aufgabe 16 (Ü)
Tanzpaarbildung
public class Tanzpaare extends MiniJava {
public static void main ( String [] args ){
int c = 10;
String [] men = new String [c ];
String [] women = new String [c ];
String [][] pair = new String [c ][2];
for(int i = 0; i < women . length ; i ++){
women [i] = readString ();
}
for(int i = 0; i < men . length ; i ++){
men [i] = readString ();
}
for(int j =0;j < women . length ;j ++){
int bigman =0;
int bigwoman =0;
Lösung 3/ Seite 3
for(int i= 1; i < men . length ; i ++){
if( men [ bigman ]. length () <men [i ]. length ()) bigman = i;
}
for(int i= 1; i < women . length ; i ++){
if( women [ bigwoman ]. length () < women [i ]. length ()) bigwoman = i;
}
pair [j ][0]= women [ bigwoman ];
pair [j ][1]= men [ bigman ];
women [ bigwoman ] = "";
men [ bigman ]= "";
}
write (" es ergibt sich folgende Tanzpaarbildung :" );
for(int i= 0; i < men . length ; i ++){
write (" frau : "+ pair [i ][0]);
write (" mann : "+ pair [i ][1]);
}
}
}
Aufgabe 17 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;
// 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 = i * i; j < prime . length ; j = j + i) {
prime [j] = false;
}
}
}
}
Lösung 3/ Seite 4
}
}
Mögliche Optimierungen:
• Nur ungerade Zahlen berücksichtigen
• Berechnung bis zur Wurzel der oberen Grenze ist ausreichend
Aufgabe 18 Kontrollfluss-Graph (Lösungsvorschlag)
Start
n = read();
no
yes
n >= 0
sum = 0;
write("n<0");
prod = 1;
Stop
i = 0;
no
i != n
yes
sum = 2*sum+1;
sum = sum+prod;
write(sum);
prod = 3*prod;
Stop
i = i+1;
Lösung 3/ Seite 5
Aufgabe 19 Natürliche Zahlen (Lösungsvorschlag)
a)
public class L1 extends MiniJava {
public static void main ( String [] args ) {
// Deklarationen
int i , max_len , uebertrag , tmp ;
String str_a , str_b , str_ret_val ;
int[] a , b , ret_val ;
// Eingabe der Argumente
str_a = readString ();
str_b = readString ();
// Instantiierung der Arrays fuer a und b
a = new int[ str_a . length ()];
b = new int[ str_b . length ()];
// Umwandeln des ersten Argumentes in ein Array
i = 0;
while (i < a. length ) {
a[i] = ( (int)( str_a . charAt (a. length - i - 1)) - (int) ’0 ’ );
i = i + 1;
}
// Umwandeln des zweiten Argumentes in ein Array
i = 0;
while (i < b. length ) {
b[i] = ( (int)( str_b . charAt (b. length - i - 1)) - (int) ’0 ’ );
i = i + 1;
}
// Instantiierung eines hinreichend grossen Arrays
// fuer das Ergebnis
if (a. length < b. length )
max_len = b. length ;
else
max_len = a. length ;
ret_val = new int[ max_len + 1];
// Die eigentliche Addition
uebertrag = 0;
i = 0;
while (i < ret_val . length ) {
tmp = uebertrag ;
if (i < a. length )
tmp = tmp + a[i ];
if (i < b. length )
tmp = tmp + b[i ];
ret_val [i] = tmp % 10;
Lösung 3/ Seite 6
uebertrag = tmp / 10;
i = i + 1;
}
// Umwandlung des Ergebnisses in einen String
str_ret_val = "";
i = 0;
while (i < ret_val . length ) {
str_ret_val = ret_val [i] + str_ret_val ;
i = i + 1;
}
write ( str_ret_val );
}
}
b)
public class L2 extends MiniJava {
public static void main ( String [] args ) {
// Deklarationen
int i , j , max_len , uebertrag , tmp ;
String str_a , str_b , str_ret_val ;
int[] a , b , h , ret_val ;
// Eingabe der Argumente
str_a = readString ();
str_b = readString ();
// Instantiierung der Arrays fuer a und b
a = new int[ str_a . length ()];
b = new int[ str_b . length ()];
// Umwandeln des ersten Argumentes in ein Array
i = 0;
while (i < a. length ) {
a[i] = ( (int)( str_a . charAt (a. length - i - 1)) - (int) ’0 ’ );
i = i + 1;
}
// Umwandeln des zweiten Argumentes in ein Array
i = 0;
while (i < b. length ) {
b[i] = ( (int)( str_b . charAt (b. length - i - 1)) - (int) ’0 ’ );
i = i + 1;
}
// Instantiierung eines hinreichend grossen Arrays
// fuer das Ergebnis
ret_val = new int[a. length + b. length ];
Lösung 3/ Seite 7
// Die eigentliche Multiplikation
uebertrag = 0;
i = 0;
while (i < b. length ) {
// Multiplikation der i-ten Ziffer von b mit a.
// Macht auf eine Multiplikation mit 10^i.
h = new int[ ret_val . length ];
uebertrag = 0;
j = 0;
while (j < a. length ) {
tmp = a[j] * b[i] + uebertrag ;
h[i + j] = tmp % 10;
uebertrag = tmp / 10;
j = j + 1;
}
h[i + a. length ] = uebertrag ;
// Addition der Zwischen-Ergebnisse
uebertrag = 0;
j = 0;
while (j < ret_val . length ) {
tmp = ret_val [j] + h[j] + uebertrag ;
ret_val [j] = tmp % 10;
uebertrag = tmp / 10;
j = j + 1;
}
i = i + 1;
}
// Umwandlung des Ergebnisses in einen String
str_ret_val = "";
i = 0;
while (i < ret_val . length ) {
str_ret_val = ret_val [i] + str_ret_val ;
i = i + 1;
}
write ( str_ret_val );
}
}
Aufgabe 20 Fussballturnier (Lösungsvorschlag)
public class Turnier extends Match {
public static void main ( String [] args ){
String [] teams = new String [8];
Lösung 3/ Seite 8
int[] points = new int[8];
//Einlesen der Teamnamen, des Punktestands
for(int i =0; i < teams . length ; i ++)
teams [i] = readString ();
for(int i =0; i < points . length ; i ++)
points [i] = readInt ();
//Punktestaende von Mannschaften, die eine Runde weiter sind
String [] new_teams = new String [ teams . length /2];
int[] new_points = new int[ points . length /2];
int rounds = 0;
while( new_teams . length !=1){
//Turnier laeuft so lange ab, bis GesamtSieger ermittelt
new_teams = new String [ teams . length /2];
new_points = new int[ points . length /2];
rounds ++;
//Bestimmung aller Mannschaften, die eine Runde weiter sind
for(int i =0; i < new_teams . length ; i ++){
int min_pos =0 , max_pos = 0;
//Position von Mannschaft mit min/max Punktestand
int min = points [0] , max = points [0];
//Bestimmung der Mannschaften, die gegeneinander spielen
for(int j =1; j < points . length ; j ++){
if( points [j] > max ){ max_pos = j; max = points [j ];}
if(( points [j] > min ) && ( min == -1) && ( points [j] != -1))
{ min_pos = j; min = points [j ];}
if(( points [j] < min ) && ( min != -1) && ( points [j] != -1))
{ min_pos = j; min = points [j ];}
}
write ( teams [ min_pos ]+ " spielt gegen "+ teams [ max_pos ]+ " in der "+ rounds +
//Bestimmung des Siegers einer Begegnung
int[] result = getScores ();
if( result [0] < result [1]){
new_teams [i] = teams [ max_pos ];
new_points [i] = points [ max_pos ];
}else{
new_teams [i] = teams [ min_pos ];
new_points [i] = points [ min_pos ];
}
write (" Sieger dieser Begegnung ist "+ new_teams [i ]);
points [ min_pos ] = points [ max_pos ] = -1;
//Ausblenden derer, die schon gegeneinander spielten
}
teams = new String [ new_teams . length ];
for(int k =0;k < teams . length ; k ++) teams [k] = new_teams [k ];
points = new int[ new_points . length ];
for(int k =0;k < points . length ; k ++) points [k] = new_points [k ];
Lösung 3/ Seite 9
}
write (" Sieger des Turniers ist : "+ new_teams [0]);
}
}