TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2007/2008 Praktikum Grundlagen der Programmierung Lösungsvorschläge zu Blatt 3 F. Forster, T. Gawlitza, A. Flexeder 5. November 2007 Übungen zu Praktikum Grundlagen der Programmierung Aufgabe 14 Kontrollfluss-Graph (Lösungsvorschlag) Start i=read(); k = -1; j=read(); n = 0; no j >=-k yes no i > j yes j = j % i; 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 < 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 < women. length; i ++){ women[i] = readstring (); for(int 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 n >= 0 yes write("n<0"); sum = 0; Stop prod = 1; no sum = 2*sum+1; i!= n yes 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 while (i < a. length) { a[i] = ( (int)( str_a.charat(a.length - i - 1)) - (int) 0 ); // Umwandeln des zweiten Argumentes in ein Array while (i < b. length) { b[i] = ( (int)( str_b.charat(b.length - i - 1)) - (int) 0 ); // 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; 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; // Umwandlung des Ergebnisses in einen String str_ret_val = ""; while (i < ret_val. length) { str_ret_val = ret_val[i] + str_ret_val ; 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 while (i < a. length) { a[i] = ( (int)( str_a.charat(a.length - i - 1)) - (int) 0 ); // Umwandeln des zweiten Argumentes in ein Array while (i < b. length) { b[i] = ( (int)( str_b.charat(b.length - i - 1)) - (int) 0 ); // 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; 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; // Umwandlung des Ergebnisses in einen String str_ret_val = ""; while (i < ret_val. length) { str_ret_val = ret_val[i] + str_ret_val ; 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]);