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...