fakult¨at f¨ur informatik - Sprachen und Beschreibungsstrukturen

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