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