FAKULTÄT FÜR INFORMATIK Übungen zu Praktikum Grundlagen

Werbung
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]);
}
}
Herunterladen