9.3 Verschachtelte Verzweigung
Aufgabe 9-6: Szenario – „verzwickt“
Ziel dieses Szenarios ist es, dass ein Roboter vom Feld (2; 1) startet und das Zielfeld (4; 6) erreicht. Dabei gibt es zwei Schwierigkeiten. Zum einen ist nicht geklärt, ob das Feld (3; 3) oder das Feld (5; 3) durch eine Mauer blockiert ist. Zum anderen wird der östliche Weg durch einen Erdhügel versperrt. Allerdings ist seine genaue Lage ebenfalls unklar. In Frage kommt entweder das Feld (6; 4) oder das Feld (6; 5).
Aufgabe
Entwickeln Sie die Klasse Szenario. Gehen Sie dabei wie folgt vor:
-
Entwerfen Sie zunächst für die Methode
steuereRoboter()ein Struktogramm. Lösung
Abb. 9-26: Struktogramm der Methode steuereRobi() -
Erstellen Sie dann den Quellcode der Klasse Szenario.
Lösung
JAVApackage welt;
public class Szenario {
private Roboter robi;
public void erstelleRobi(Spielbrett pSpielbrett){
robi = new Roboter();
robi.setSpielbrett(pSpielbrett);
robi.starteAufFeld(2,1);
robi.setGeschwindigkeit(4);
}
public void steuereRobi() {
robi.ladAuf();
robi.gehVorwaerts();
robi.ladAb();
robi.gehVorwaerts();
robi.drehRechts();
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehRechts();
if(robi.istWegFrei()) {
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehLinks();
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehLinks();
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehRechts();
}
else {
robi.drehRechts();
robi.drehRechts();
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehRechts();
if(robi.istWegFrei()) {
robi.gehVorwaerts();
robi.ladAuf();
}
else {
robi.ladAuf();
robi.gehVorwaerts();
}
robi.gehVorwaerts();
robi.drehRechts();
robi.ladAb();
robi.gehVorwaerts();
robi.gehVorwaerts();
robi.drehLinks();
}
robi.gehVorwaerts();
}
}Abb. 9-27: Klasse Szenario(Quellcode)
Hinweise:
- Erstellen Sie mit dem Spielbretteditor zunächst eine Variante des Spielbretts und speichern Sie diese als 'Spielbrett s7a' ab. Ändern Sie das Spielbrett dann jeweils so ab, dass eine weitere Variante des Spielbretts entsteht, und speichern Sie diese als 'Spielbrett s7b' ab. Fahren Sie damit solange fort, bis alle möglichen Spielbrettvarianten vorliegen. Testen Sie Ihren Quellcode dann mit allen Spielbrettvarianten. Der Roboter soll dabei jeweils das Ziel erreichen, ohne dass hierfür Änderungen am Quellcode erforderlich werden.
-
Weisen Sie dem Roboter eine Geschwindigkeit von
4zu, um die Tests zu beschleunigen.
Aufgabe 9-7: Halbjahresleistung II
Modifizieren Sie den Quellcode der in Aufgabe 8-2 erstellten Fachklasse so, dass neben dem berechneten Notendurchschnitt auch die entsprechende Zeugnisnote ausgegeben werden.
==================
Bitte geben Sie die folgenden Noten ein:
----------------------------------------
1. Klassenarbeit: 10
2. Klassenarbeit: 11
Mündliche Note: 12
----------------------------------------
Notendurchschnitt: 10.875
Zeugnisnote: gut
| Notendurchschnitt | Zeugnisnote |
|---|---|
| weniger als 0,5 Punkte | ungenügend |
| ab 0,5 Punkten | mangelhaft |
| ab 3,5 Punkten | ausreichend |
| ab 6,5 Punkten | befriedigend |
| ab 9,5 Punkten | gut |
| ab 12,5 Punkten | sehr gut |
Lösung
String schulnote;
double schnittGesamt = this.berechneNotendurchschnitt();
if(schnittGesamt>=12.5) {
schulnote = "sehr gut";
}
else {
if(schnittGesamt>=9.5) {
schulnote = "gut";
}
else {
if (schnittGesamt>=6.5) {
schulnote = "befriedigend";
}
else {
if (schnittGesamt>=3.5) {
schulnote = "ausreichend";
}
else {
if (schnittGesamt>=0.5) {
schulnote = "mangelhaft";
}
else {
schulnote = "ungenügend";
}
}
}
}
}
return schulnote;
}
ermittleZeugnisnote(): String der Klasse Note (Quellcode)System.out.println("\nFolgende Daten wurden erfasst:");
System.out.println("----------------------------------------");
System.out.println("Notendurchschnitt: " + noten.berechneNotendurchschnitt());
System.out.println("Schulnote: " + noten.ermittleZeugnisnote());
}
zeigeNotendurchschnitt() der Klasse Benutzerkonsole (Quellcode)
Aufgabe 9-8: Body Mass Index
Der Body-Mass-Index (BMI) ist eine Maßzahl für die Bewertung des Körpergewichts eines Menschen. Da Übergewicht ein weltweit zunehmendes Problem darstellt, wird die Körpermassenzahl vor allem dazu verwendet, auf eine diesbezügliche Gefährdung hinzuweisen. Der BMI gibt dabei lediglich einen groben Richtwert an und ist umstritten, da er die Statur eines Menschen und die individuell verschiedene Zusammensetzung des Körpergewichts aus Fett- und Muskelgewebe naturgemäß nicht berücksichtigt.
Aufgabe
Erstellen Sie eine Java-Anwendung, die Vor- und Nachname sowie Größe und Gewicht der Person erfragt. Anschließend soll sie ein Objekt der Klasse Person erzeugen und diesem die erfassten Daten zuweisen. Abschließend soll sie von dem erzeugten Personen-Objekt den BMI berechnen lassen und eine kurze Auswertung zu diesem BMI (vgl. Abb. 9-34) anfordern. Die Erfassung und Ausgabe der Daten soll mit Hilfe der Konsole erfolgen (vgl. Abb. 9-33).
-------------------------------
Bitte geben Sie Ihre Daten ein!
Vorname: Max
Nachname: Maier
Gewicht (in kg): 75
Größe (in m): 1.85
===============================
Max Meier
---------
BMI: 21.913805697
Auswertung: Normalgewicht
| BMI | Auswertung |
|---|---|
| unter 19 | Untergewicht |
| bis 25 | Normalgewicht |
| bis 29 | leichtes Übergewicht |
| bis 39 | Übergewicht |
| über 39 | extremes Übergewicht |
Lösung
public class Person {
private String vorname;
private String nachname;
private double gewicht;
private double groesse;
public Person() {
}
public Person(String pVorname, String pNachname){
this.vorname = pVorname;
this.nachname = pNachname;
}
public void setVorname(String pVorname) {
this.vorname = pVorname;
}
public String getVorname(){
return this.vorname;
}
public void setNachname(String pNachname) {
this.nachname = pNachname;
}
public String getNachname(){
return this.nachname;
}
public void setGewicht(double pGewicht) {
this.gewicht = pGewicht;
}
public double getGewicht(){
return this.gewicht;
}
public void setGroesse(double pGroesse) {
this.groesse = pGroesse;
}
public double getGroesse(){
return this.groesse;
}
public double berechneBMI() {
return this.gewicht / (this.groesse * this.groesse);
}
public String ermittleAuswertungBMI() {
double bmi = this.berechneBMI();
String auswertung;
if(bmi<19) {
auswertung = "Untergewicht";
}
else {
if(bmi<=25) {
auswertung = "Normalgewicht";
}
else {
if(bmi<=29) {
auswertung = "leichtes Übergewicht";
}
else {
if(bmi<=39) {
auswertung = "Übergewicht";
}
else {
auswertung = "extremes Übergewicht";
}
}
}
}
return auswertung;
}
}
BodyMassIndex (Quellcode)import app.Person;
public class Benutzerkonsole {
private Person person;
public Benutzerkonsole() {
this.erfasseDaten();
this.zeigeDaten();
}
public void erfasseDaten(){
ConsoleReader consoleReader = new ConsoleReader();
String vorname;
String nachname;
double gewicht;
double groesse;
System.out.println("Body Mass Index");
System.out.println("-------------------------------");
System.out.println("Bitte geben Sie Ihre Daten ein!\n");
System.out.print("Vorname: ");
vorname = consoleReader.nextString();
System.out.print("Nachname: ");
nachname = consoleReader.nextString();
System.out.print("Gewicht (in kg): ");
gewicht = consoleReader.nextDouble();
System.out.print("Groesse (in m): ");
groesse = consoleReader.nextDouble();
person = new Person(vorname, nachname);
person.setGewicht(gewicht);
person.setGroesse(groesse);
}
public void zeigeDaten(){
System.out.println("===============================");
System.out.println(person.getVorname() + " " + person.getNachname());
System.out.println("---------");
System.out.println("Body Mass Index: " + person.berechneBMI());
System.out.println("Auswertung: " + person.ermittleAuswertungBMI());
}
}
Benutzerkonsole (Quellcode)Durch die Verschachtelung mehrere if-else-Anweisungen, wird der entsprechende Quellcode zunehmend unübersichtlich.
bonus = 6;
}
else {
if(punkte > 20) {
bonus = 4;
}
else {
if(punkte > 10) {
bonus = 2;
}
else {
bonus = 0;
}
}
}
else { ...Als Alternative bietet sich hier die Verwendung der else-if-Anweisung an. Der entsprechende Quellcode besitzt eine übersichtliche Struktur und ist leicht nachvollziehbar.
bonus = 6;
}
else if(punkte > 20) {
bonus = 4;
}
else if(punkte > 10) {
bonus = 2;
}
else {
bonus = 0;
}
else if { ...if-else- und else-if-Anweisung
Aufgabe 9-9: else-if-Anweisung
Überarbeiten Sie die folgenden beiden Methoden so, dass anstelle der verschachtelten if-else-Anweisungen entsprechende else-if-Anweisungen zum Einsatz kommen.
-
Methode
ermittleSchulnote(): Stringder KlasseNote(Aufgabe 9-7) Lösung
JAVApublic String ermittleSchulnote() {
String schulnote;
double schnittGesamt = this.berechneNotendurchschnitt();
if(schnittGesamt>=12.5) {
schulnote = "sehr gut";
}
else if(schnittGesamt>=9.5) {
schulnote = "gut";
}
else if (schnittGesamt>=6.5) {
schulnote = "befriedigend";
}
else if (schnittGesamt>=3.5) {
schulnote = "ausreichend";
}
else if (schnittGesamt>=0.5) {
schulnote = "mangelhaft";
}
else {
schulnote = "ungenügend";
}
return schulnote;
}Abb. 9-42: Die Methode ermittleSchulnote(): Stringder KlasseNote(Quellcode) -
Methode
ermittleAuswertungBMI(): Stringder KlasseBodyMassIndex(Aufgabe 9-8) Lösung
JAVApublic String ermittleAuswertungBMI() {
double bmi = this.berechneBMI();
String auswertung;
if (bmi < 19) {
auswertung = "Untergewicht";
}
else if (bmi <= 25) {
auswertung = "Normalgewicht";
}
else if (bmi <= 29) {
auswertung = "leichtes Übergewicht";
}
else if (bmi <= 39) {
auswertung = "Übergewicht";
}
else {
auswertung = "extremes Übergewicht";
}
return auswertung;
}Abb. 9-43: Die Methode ermittleAuswertungBMI(): Stringder KlasseBodyMassIndex(Quellcode)