TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen Einführung in die Informatik I Prof. Dr. Helmut Seidl, M. Schwarz, A. Herz, Dr. M. Petter WS 11/12 Übungsblatt 4 10.11.10 Abgabe: 21.11.10 (vor 12 Uhr) Aufgabe 4.1 (P) Arrays verstehen Diskutieren Sie, was in dem folgenden Programm passiert. 1 public c l a s s MeineArrays extends MiniJava { 2 public s t a t i c void main ( S t r i n g [ ] a r g s ) { 3 4 int [ ] e r s t e s A = { 1 , 2 , 3 , 4 } ; 5 write ( erstesA [ 1 ] ) ; 6 7 int [ ] z w e i t e s A = new int [ 7 ] ; 8 zweitesA [ 0 ] = 3 ; 9 int i =1; 10 while ( i <z w e i t e s A . l e n g t h ) { 11 z w e i t e s A [ i ] = i +3; 12 i ++; 13 } 14 15 fo r ( int j =0; j <z w e i t e s A . l e n g t h ; j ++) { 16 write ( zweitesA [ j ] ) ; 17 i ++; 18 } 19 20 write ( zweitesA [ i ] ) ; 21 22 zweitesA = erstesA ; 23 zweitesA [ 1 ] = 2 5 ; 24 write ( erstesA [ 1 ] ) ; 25 } 26 } Lösungsvorschlag 4.1 Folgendes passiert in dem Programm: 4 Anlegen eines Arrays mit festem Inhalt 5 Ausgeben des Wertes an Position 1 → 2 (Die Positionen beginnen bei 0.) 7 Anlegen eines leeren Arrays der Länge 7 8 Füllen der Position 0 mit dem Wert 3 11 Füllen der i-ten Position mit i + 3 2 9-13 Das zweite Array ist [3, 4, 5, 6, 7, 8, 9] 15 For-Schleife durchläuft das Array 15-18 Schrittweises Ausgeben des Arrays 17 Variable i wird insgesamt um Länge von Array zweitesA hochgezählt 20 Laufzeitfehler! Position i existiert in Array zweitesA nicht. Es wird eine ArrayIndexOutOfBoundsException geworfen. 22 Die Referenz auf Array erstesA wird in Variable zweitesA kopiert. 23 Das Feld 1 des Arrays, auf das sich zweitesA bezieht, wird auf 25 gesetzt. 24 Durch Zeile 23 wurde auch diese Ausgabe beeinflusst, da erstesA seit Zeile 22 das selbe Array referenziert wie zweitesA. Aufgabe 4.2 (P) Minimum und Maximum Schreiben Sie ein MiniJava-Programm namens MinMax.java, das in einem Array von ganzen Zahlen den kleinsten und den größten Wert findet. Das Programm soll sich wie folgt verhalten: • Zunächst fragt das Programm ab, wie viele Zahlen in das Array eingegeben werden sollen. • Dann werden die Zahlen eingegeben und in einem Array gespeichert. • Anschließend wird das Array durchsucht und in einem Durchgang soll sowohl die kleinste als auch die größte Zahl gefunden werden. • Schließlich sollen die kleinste und die größte Zahl ausgegeben werden. Lösungsvorschlag 4.2 public c l a s s MinMax extends MiniJava { public s t a t i c void main ( S t r i n g [ ] a r g s ) { // Anzahl d e r e i n z u g e b e n d e n Zahlen a b f r a g e n int e i n g a b e n = r e a d I n t ( ”Wie v i e l e Zahlen m c h t e n S i e e i n g e b e n ? ” ); i f ( eingaben < 1) { return ; } // Array a n l e g e n int [ ] z a h l e n = new int [ e i n g a b e n ] ; // Array mit Zahlen f l l e n int z a h l ; int i = 0 ; while ( i < e i n g a b e n ) { z a h l = r e a d I n t ( ” B i t t e geben S i e d i e ” + ( i + 1 ) + ” . Zahl e i n . ”) ; 3 zahlen [ i ] = zahl ; i ++; } // min und max b e r e c h n e n int min = z a h l e n [ 0 ] ; int max = z a h l e n [ 0 ] ; i = 1; while ( i < e i n g a b e n ) { i f ( z a h l e n [ i ] < min ) { min = z a h l e n [ i ] ; } i f ( z a h l e n [ i ] > max) { max = z a h l e n [ i ] ; } i ++; } // Ausgeben w r i t e ( ”Die k l e i n s t e Zahl war ” + min ) ; w r i t e ( ”Die g r t e Zahl war ” + max) ; } } Aufgabe 4.3 (P) Addition von Arrays Schreiben Sie ein MiniJava-Programm namens Add.java, 9 5 1 5 welches zwei positive Zahlen einliest und diese in int- a1 : Arrays a1 der Länge m und a2 der Länge n stellenweise ein- a2 : + 7 1 6 fügt. Ein Arrayelement soll hierbei nur die Ziffern 0, 1, . . . , 9 beinhalten. (ints können maximal 10 Dezimalstellen ha- a : 1 0 2 3 1 3 ben.) Anschließend werden die beiden Arrays addiert (wie beim schriftlichen Addieren aus der Schule) und das Ergebnis dieser Addition wird in ein Array a3 der Länge max(m, n) + 1 abgespeichert. Dann soll das Ergebnisarray a3 mit Hilfe der Methode java.util.Arrays.toString(a3 ) in einen String verwandelt und ausgegeben werden. Lösungsvorschlag 4.3 public c l a s s Add extends MiniJava { public s t a t i c void main ( S t r i n g [ ] a r g s ) { int i 1 = r e a d ( ) ; int i 2 = r e a d ( ) ; // 11 S t e l l e n r e i c h e n l o c k e r f u e r 32 b i t −i n t s int [ ] a1 = new int [ 1 1 ] ; int [ ] a2 = new int [ 1 1 ] ; // 12 S t e l l e n wegen U e b e r t r a g ! int [ ] a3 = new int [ 1 2 ] ; 4 // Z u e r s t Eingabe i n Arrays v e r w a n d e l n ! // dazu gehen w i r a l l e 10 er−S t e l l e n durch : int i =0; while ( i 1 >0 | | i 2 >0){ a1 [ i ]= i 1 %10; a2 [ i ]= i 2 %10; i 1=i 1 / 1 0 ; i 2=i 2 / 1 0 ; i ++; } int u e b e r t r a g =0; fo r ( int j =0; j <11; j ++){ // S t e l l e n und den l e t z t e n U e b e r t r a g aufsummieren int summe = a1 [ j ]+ a2 [ j ]+ u e b e r t r a g ; // a l l e 10 e r i n den U e b e r t r a g u e b e r t r a g=summe / 1 0 ; // a l l e 1 e r i n d i e r i c h t i g e S t e l l e a3 [ j ]= summe%10; } // l e t z t e n U e b e r t r a g n i c h t v e r g e s s e n a3 [ 1 1 ] = u e b e r t r a g ; // K o n v e r t i e r u n g und Ausgabe d e r Menge r e s u l t S t r i n g e r g e b n i s = j a v a . u t i l . Arrays . t o S t r i n g ( a3 ) ; write ( ergebnis ) ; } }