Musterlösungen Aufwärmen Trainingseinheit

Werbung
Musterlösungen
Aufwärmen
A1
a) int zahl;
b) double anteil=0,764;
c) String nachname=“Schmitt“; d) boolean istHerdAus;
A2
a) Integer (lat. numerus integer = ganze Zahl) speichert ganze Zahlen.
b) Double speichert Gleitkommazahlen mit Vorzeichen.
c) String ist eine Zeichenkette und gibt also Wörter oder Zeichen ( in Anführungszeichen )
wieder.
d) Char speichert einzelne Buchstaben oder Zeichen.
e) Boolean gibt wieder ob die Bedingung oder Aussage wahr oder falsch ist.
A3
Gemeinsamkeit : Beide benötigen die Angabe eines Datentyps (z.B. int ) und beide speichern unter
einem gewählten Namen einen vorgesehenen Wert.
Weiterhin lassen sich beide nur benutzen solange die Methode abgearbeitet wird ( → Sichtweite ).
Unterschied : Parameter finden sich in der Kopfzeile einer Methode, d.h. sie sind mit Namen versehene
Platzhalter für Werte, die man der Methode übergeben will. Lokale Variablen finden sich nicht im
Kopf, sondern im Hauptteil von Methoden.
A4
Vorschlag A ist falsch. Dieses Programm weist in der dritten Zeile b den Wert von a zu. Nach dieser
Zeile haben also a und b beide den Wert 4. Die ursprünglich vorhandene 10 ist überschrieben. Daher
bewirkt die Anweisung a=b; auch nur, dass a den aktuellen Wert von b ( also die 4 ) erhält.
Vorschlag B löst dieses Problem indem es einer dritte Variable c den Wert von a zuweist und dann
später a den b-Wert und b den c(also den ursprünglichen a-Wert) zuweist.
A5
1. Man erfährt den Namen der Methode ( woBu..)
2. Man erfährt, dass man der Methode zwei ganze Zahlen übergeben muss, damit sie ablaufen kann
( int a, int b).
3. Man erfährt, dass sie einen Text ( String ) zurückgibt.
4. Man erfährt, dass sie auch von anderen Klassen ( von der eigenen sowieso ) benutzt werden kann.
( public).
Trainingseinheit
T1
a) zahl : formaler Parameter, summe, i : lokale Variablen
b) Zuerst werden die lokalen Variablen summe = 0 und i = 1 festgelegt. Wenn die while–Schleife
startet, kommt zunächst die if-Abfrage, die prüft, ob der Rest = 0 ist, wenn man die vorher angegebene
Zahl (in diesem Fall 5) durch i teilt. Bei i = 1 ist das der Fall. Jetzt wird summe um 1x1 erhöht (summe
= 0 + 1 = 1), i wird um 1 erhöht und die while Schleife startet erneut, diesmal mit i = 2.
summe = summe + i*i passiert erst wieder, wenn i = 5 ist, somit ist summe jetzt 1 + 5*5 = 26.
Nachdem i nochmal um 1 erhöht wird, wird die while Schleife nicht mehr ausgeführt (6 ist nicht <= 5)
und 26 wird ausgegeben.
( Allgemein liefert die Methode die Summe aller Quadrate der Teiler von zahl ).
Verzweigungen
V1
String s;
if (alter >= 40) {
s = "geeignet";
}
else {
s = "leider noch zu jung";
}
System.out.println("Der Kandidat ist " + s) ;
V2
if ( punkte > 4){
if (punkte >9 && punkte <=15){
println ( "Bestanden mit Auszeichnung");
}
if (punkte <= 10){
println ("Bestanden");
}
}
else{
println ("Druchgefallen");
}
V3
double note=3;
int alter=23;
if( note<3 ){
if(alter>=20 && alter<=60){
System.out.println("Einstellen");
}
else{
System.out.println("Lieber nicht");
}
}
else{
System.out.println("Lieber nicht");
}
Schleifen
S1
i ist zu Beginn der Schleife auf 0 gesetzt und die Schleife wird solange durchlaufen bis i größer oder
gleich 10 ist.
Im folgenden Schritt der Schleife wird das Wort „Hugo“ ausgeben und darauf i um den Wert 1 erhöht.
Die Schleife bewirkt somit, dass auf dem Bildschirm zehn Mal das Wort „Hugo“ erscheint.
S2
Die Schleife wird ausgeführt solange i<30. Da i mit 1 startet, ist das erste Ergebnis 1 ,da 1*1=1 .
Danach wird i um 5 erhöht also geht es immer in 5er Schritten voran. Daher ist der größtmögliche
Wert bei i=26 erreicht. Die Ausgabe läuft also insgesamt 6 mal.
Ausgegeben wird in einer Zeile (print nicht println). Nach dem Ergebnis wird immer ein Leerzeichen,
ein Komma und ein Leerzeichen ausgegeben bis dann im nächsten Schritt wieder die Zahl kommt.
Ausgabe: 1 , 36 , 121 , 256 , 441 , 676 ,
S3
Ausgabe :
1/1,1/2,1/3,1/4,1/5
2/1,2/2,2/3,2/4,2/5
usw. bis
5/1,5/2,5/3,5/5,5/5
S4
Es erfolgt folgende Ausgabe :
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
Aktuell
bei
bei
bei
bei
bei
bei
bei
bei
bei
bei
1,
1,
1,
1,
1,
2,
2,
2,
2,
2,
0
2
4
6
8
0
2
4
6
8
S5
Es werden Zeile pro Zeile die Zahlen von 1 bis 10 ausgegeben. Obwohl die for-Schleife bis i=99 laufen
würden, sorgt dass break-Kommando dafür, dass die Schleife bei i=11 unterbrochen wird.
Da break nach der Ausgabe steht, wird i=11 nicht mehr ausgegeben.
S6
In rosa sind die fehlenden Ergänzungen zu erkennen :
int i=1;
int summe=0;
while (i <= 99 )
{
summe=summe+i;
i=i+2;
}
System.out.println(summe);
S7
a) Ausgabe :
1 , 1
1 , 2
2 , 1
2 , 2
usw. bis
5 , 1
5 , 2
1 , 3
2 , 3
1 , 4
2 , 4
1 , 5
2 , 5
5 , 3
5 , 4
5 , 5
b) Die innere Schleife (k) beginnt dann nicht mehr bei 1 sondern beim Wert von i.
Ausgabe :
1 , 1
1 , 2
1 , 3
1 , 4
1 , 5
2 , 2
2 , 3
usw. bis
4 , 4
4 , 5
5 , 5
S8
int start=90;
while (start>=3){
System.out.println(start);
start -=3;
}
2 , 4
2 , 5
Boolesche Ausdrücke
B1
Welche der folgenden Ausdrücke liefern „true“ als ErgebnisBeachte : Das ! ist das mathematische
„nicht“ und ändert den Wert von true auf false und umgekehrt.
! (4 < 5)
→ false
Der innere Term ist true, das „Nicht (!)“ ändert daher den Wert auf false.
! false
→ true
Das Gegenteil von false ist true.
(2 > 2) ││ ((4 == 4) && (1 < 0))
→ false
Trenne den Ausdruck beim „oder(||)“ auf.
Der erste Ausdruck ( 2>2 ) ist false.
Der zweite Ausdruck besteht wieder aus zwei Teilausdrücken. Davon ist der erste true ( 4==4), der
zweite aber false(1<0). Da sie mit einem „und(&&)“ verbunden sind, käme man nur auf true, wenn
beide true wären. Somit ist ((4==4) && (1<0) ) insgesamt false. Beide Seiten beim oder sind false und
damit dann auch der ganze Ausdruck.
(34 != 33) && ! false
→ true
Trenne den Ausdruck beim „und(&&)“ auf. Der erste Ausdruck ist true, denn 34 ist ungleich 33.
Der hintere Term ist auch true ( siehe 2. Beispiel, oben ).
Da beide Ausdrücke true sind, ergibt sich auch insgesamt ein true.
B2
Wbei der if-Abfrage mit dem „und“ müssen beide Bedingungen gleichzeitig erfüllt sein, d.h. wert muss
sowohl ≥0 als auch < limit sein. Damit liegt wert mathematisch gesehen im Intervall [0; limit[.
Wählt man das „oder“, so reicht es, wenn eine der beiden Bedingungen erfüllt ist. Somit kann wert≥0
sein oder <limit. Mathematisch sind das aber alle Zahlen, d.h. die Bedingung ist immer erfüllt ( falls
limit eine positive Zahl ist) .
B3
Beide Ausdrücke liefern das gleiche Ergebnis. Beleg per Tabelle :
a&&b
b true
b false
a true
true
false
a false
false
false
!( !a || !b)
b true
b false
a true
true
false
a false
false
false
Struktogramme
St1
a) a=5, b=3 → 15
a=14, b=6 → 42
a=8, b=2 → 8
b) Es berechnet das kleinste, gemeinsame Vielfache von a und b.
c) public int kgV(int a, int b)
{
int a0=a;
while ( a%b > 0 ){
a=a+a0;
}
return a;
}
St2
Ausgabe : 1,2,3,...,39, 71,72, … , 100
St3
Einzelne Schritte : a=10, n=5
x
1
5,5
i
1
2
3,65909 3,19601 3,16246 3,31623
3
4
5
6 → Ende der Schleife
Bei n=8 werden drei weitere Werte berechnet, die sich dann immer mehr der Wurzel von 10 nähern.
Das Struktogramm zeigt den Ablauf des sogenannten „Heron-Verfahrens“ zur Berechnung von √ a .
Arrays ( Felder )
Ar1
a) int[] lottozahlen=new int[6];
b) String[] kontakte=new String[50];
c) boolean[] schalter=new boolean[10];
d) Buch[] buchliste=new Buch[8];
e) String[] schachspieler={“Fischer“, “Spasski“, “Tal“, “Anand“, ”Kasparov“ }
f) int[] primzahlen={2,3,5,7}
Ar2
Für die Aufgabe gehen wir von folgenden vorhandenen Arrays aus :
char[] buchstaben = new char[10];
String[] namen = new String[10];
int[] anzahlen = new int[20];
Gib jeweils an, mit welcher Anweisung in Java man die folgenden Ziele erreicht.
a) buchstaben[0]='A';
b) anzahlen[19]=3;
c) namen[0]=“Peter;
namen[1]=“Wolf“;
d) for (int i=0; i<20; i++){
}
anzahlen[i]=100+i;
Ar3
int[] fibo=new int[30];
fibo[0]=1;
fibo[1]=1;
for (int i=2; i<fibo.length; i++){
fibo[i]=fibo[i-1]+fibo[i-2];
}
Ar4
for (int i=0; i<geheimzahlen.length; i++){
System.out.println( geheimzahlen[i] );
}
Klassen und Objekte
KO1
a) & b)
public class Kreis
{
private double mitteX;
private double mitteY;
private double radius;
public Kreis (double mitteX, double mitteY,double radius)
{
this.mitteX = mitteX;
this.mitteY= mitteY;
this.radius = radius;
}
public double gibFlaeche()
{
return (3.14*radius*radius);
}
}
public boolean schneidetXAchse ()
{
if (mitteY>0) //Überprüfung ob der Kreis über oder unter der x-Achse liegt
{
return ((mitteY-radius)<0);
//Schauen ob der graph die x-Achse schneidet
}
else if (mitteY<0)
{
return ((mitteY+radius)>0);
}
else
{
return true; // Der Fall mitteY=0, dann auf jeden Fall Schnitt mit x-Achse
}
}
c)Getter für mitteX:
public double getMitteX()
{
return mitteX;
}
Setter für mitteX:
public double setMitteX(double mx)
{
mitteX=mx;
}
Analog für mitteY und radius.
KO2
a) kohl : Kanzler, partei=CDU, geschlecht=männlich, amtsantritt=1982, amtsjahre=16
b) Name der Klasse : Kanzler
Attribute :
–partei : String
–geschlecht : String –amtsantritt : Integer
– amtsjahre : Integer
Methoden :
+getPartei() : String
+setPartei( s : String )
c) String getPartei(){
}
return partei;
void setPartei( p : String ){
partei = p;
}
etc...
Herunterladen