3.2 Selektion
Innerhalb eines Algorithmus ist die Selektion entweder eine Einfachauswahl oder eine
Einseitige Einfachauswahl
In der Abbildung 1 ist allgemein die einseitige Einfachauswahl im Struktogramm dargestellt. Wie in der Abbildung zu erkennen ist, hat die einseitige Einfachauswahl nur den Zweig wahr. Der Zweig falsch ist leer.
Algorithmus »Ordnen1«
Als Beispiel einer einseitigen Einfachauswahl ist in der Abbildung der Algorithmus »Ordnen1« gegeben.
- Die Variablen »zahl1«, »zahl2« und »hilf«[1] des Algorithmus sind vom Datentyp Gleitkommazahl (float/double).
- Der Algorithmus »Ordnen1« besteht aus einer Sequenz von fünf Anweisungen, wobei eine Anweisung eine einseitige Einfachauswahl ist (im Struktogramm farblich rot hervorgehoben).
- Die einseitige Einfachauswahl besteht wiederum aus einer Sequenz von drei Anweisungen.
Mithilfe das Algorithmus »Ordnen1« lässt sich das Problem des aufsteigenden Ordnens zweier Zahlen lösen.
Aufgabe A11
Ordne mithilfe des in der Abbildung1 dargestellten Algorithmus »Ordnen1« die jeweiligen Zahlen aufsteigend.
- zahl1 ist 56.4 und zahl2 ist 0
- zahl1 ist -24 und zahl2 ist -12 ist
- zahl1 ist 18 und zahl2 ist -18
- zahl1 ist 3 und zahl2 ist 3
- zahl1 ist -3 und zahl2 ist -33
Der Algorithmus »Ordnen1« ist in den Programmen »ordnen1.java« und »ordnen1.py« implementiert.
import java.util.Scanner;
public class Ordnen {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Erste Zahl: ");
double zahl1=input.nextDouble();
System.out.print("Zweite Zahl: ");
double zahl2=input.nextDouble();
if (zahl1>zahl2) {
double hilf=zahl1;
zahl1=zahl2;
zahl2=hilf;
}
System.out.println(String.format(
"Erste Zahl: %f", zahl1));
System.out.println(String.format(
"Zweite Zahl: %f", zahl2));
}
input.close();
}
zahl1=float(input("Erste Zahl: "))
zahl2=float(input("Zweite Zahl: "))
if zahl1>zahl2:
hilf=zahl1
zahl1=zahl2
zahl2=hilf
print(f"Erste Zahl: {zahl1}")
print(f"Zweite Zahl: {zahl2}")
Aufgabe A12
Entwickele eine Algorithmus »Ordnen2«, der das Problem des absteigenden Ordnens dreier Gleikommazahlen löst (beispielsweise ergibt -3.4, 29 und 10.8 absteigend geordnet 29, 10.8 und -3.4).
- Stelle den Algorithmus mithilfe des Structorizers in einem Struktogramm dar.
- Teste den Algorithmus.
Algorithmus »Betragssumme«
Ein weiters Beispiel einer einseitigen Einfachauswahl ist in der Abbildung 3 im Algorithmus
- Der Betrag |x| ist für x<0 gleich -x.
- Der Betrag |x| ist für x≥0 gleich x.
-
Die Variablen »zahl1«, »zahl2« und »summe« des Algorithmus
sind vom Datentyp
Gleitkommazahl (float/double).
Aufgabe A13
Rechne mithilfe des in der Abbildung3 dargestellten Algorithmus »Betragssumme« die jeweiligen Betragssummen aus.
- zahl1 ist 15 und zahl2 ist 9
- zahl1 ist -34 und zahl2 ist 21
- zahl1 ist 6 und zahl2 ist -12
- zahl1 ist -17 und zahl2 ist -30
-
Der Algorithmus »Betragssumme« ist in den Programmen »betragssumme.java«
und
»betragssumme.py« implementiert.
import java.util.Scanner;
public class Betragssumme {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Erste Zahl: ");
double zahl1=input.nextDouble();
System.out.print("Zweite Zahl: ");
double zahl2=input.nextDouble();
if (zahl1<0) {
zahl1=-zahl1;
}
if (zahl2<0) {
zahl2=-zahl2;
}
double summe=zahl1+zahl2;
System.out.println(String.format("Summe: %d", summe));
input.close();
}
}
zahl1=float(input("Erste Zahl= "))
zahl2=float(input("Zweite Zahl: "))
if zahl1<0:
zahl1=-zahl1
if zahl2<0:
zahl2=-zahl2
summe=zahl1+zahl2
print(f"Summe: {summe}")
Zweiseitige Einfachauswahl
In der Abbildung 4 ist allgemein die zweiseitige Einfachauswahl im Struktogramm dargestellt. Wie in der Abbildung zu erkennen ist, hat die zweiseitige Einfachauswahl die Zweige wahr und falsch.
Algorithmus »Dreieck«
Ein Beispiel einer zweiseitigen Einfachauswahl ist in der Abbildung 5 im Algorithmus
- Die Variablen »a«, »b« und »c« des Algorithmus sind vom Datentyp Gleitkommazahl (float/double).
- Im Struktogramm ist die zweiseitige Einfachauswahl farblich rot hervorgehoben.
- Der Algorithmus entscheidet, ob aus den eingegebenen Längen (>0) der Seiten a, b und c ein Dreieck konstruiert werden kann oder nicht.[3]
Aufgabe A14
Beantworte die Frage:
Für welche eingegebenen Längen der Seiten a, b und c lassen sich Dreiecke konstruieren und für welche nicht?
- a ist 2.6, b ist 1.2 und c ist 1.3
- amist 3, b ist 4 und c ist 5
- a ist 17.8, b ist 5.9 und c ist 3.6
- a ist 6.8, b ist 6.8 ist c=6.8
- Der Algorithmus »Dreieck« ist den Programmen »dreieck.java« und »dreieck.py« implementiert.
import java.util.Scanner;
public class Dreieck {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Seite a: ");
double a=input.nextDouble();
System.out.print("Seite b: ");
double b=input.nextDouble();
System.out.print("Seite c: ");
double c=input.nextDouble();
if (a+b>c && a+c>b && b+c>a) {
System.out.println(
"Dreieck konstruierbar.");
}
else {
System.out.println(
"Dreieck nicht konstruierbar.");
}
input.close();
}
}
a=float(input("Seite a: "))
b=float(input("Seite b: "))
c=float(input("Seite c: "))
if a+b>c and a+c>b and b+c>a:
print("Dreieck konstruierbar.")
else:
print("Dreieck nicht konstruierbar.")
Aufgabe A15
Den beiden Programmen »maximum.java« und »maximum.py« liegt der gemeinsame Algorithmus »Maximum« zugrunde.
import java.util.Scanner;
public class Maximum {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Erste Zahl: ");
double zahl1=input.nextDouble();
System.out.print("Zweite Zahl: ");
double zahl2=input.nextDouble();
if (zahl1==zahl2) {
System.out.println("Erste und zweite Zahl sind gleich.");
}
else {
if (zahl1>zahl2) {
System.out.println(String.format("Maximum: %f",zahl1));
}
else {
System.out.println(String.format("Maximum: %f",zahl2));
}
}
input.close();
}
}
zahl1=float(input("Erste Zahl: "))
zahl2=float(input("Zweite Zahl: "))
if zahl1==zahl2:
print("Erste und zweite Zahl sind gleich.")
elif zahl1>zahl2:
print(f"Maxumum: {zahl1}")
else:
print(f"Maximum: {zahl2}")
- Stelle den in den Programmen implementierten Algorithmus »Maximum« in einem Struktogramm mit dem Structorizer dar.
- Gib jede Variable des Algorithmus und deren Datentyp an.
- Teste den Algorithmus.
Mehrfachauswahl
Algorithmus »Monat«
In der Abbildung 6 ist der Algorithmus »Monat« mit einer Mahrfachauswahl dargestellt.
- Die Variable »monatsnummer« im Algorithmus ist vom Datentyp Ganzzahl (int). Mithilfe das Algorithmus kann zur jeweiligen Monatsnummer der zugehörige Monatsname ermittelt und ausgegeben werden – wie beispielsweise:
- Eingabe 9
- Ausgabe September
- Im Struktogramm ist die Mehrfachauswahl farblich rot hervorgehoben.
- Der Algorithmus ist in den Programmen »monat.java« und »monat.py« implementiert.
import java.util.Scanner;
public class Monate {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Monatsnummer: ");
int monatsnummer=input.nextInt();
switch (monatsnummer) {
case 1: System.out.println("Januar");break;
case 2: System.out.println("Februar");break;
case 3: System.out.println("März");break;
case 4: System.out.println("April");break;
case 5: System.out.println("Mai");break;
case 6: System.out.println("Juni");break;
case 7: System.out.println("Juli");break;
case 8: System.out.println("August");break;
case 9: System.out.println("September");break;
case 10: System.out.println("Oktober");break;
case 11: System.out.println("November");break;
case 12: System.out.println("Dezember");break;
default: System.out.println("Monatsnummer falsch");
}
input.close();
}
}
monatsnummer=int(input("Monatsnummer: "))
if monatsnummer==1:
print("Januar")
elif monatsnummer==2:
print("Februar")
elif monatsnummer==3:
print("März")
elif monatsnummer==4:
print("April")
elif monatsnummer==5:
print("Mai")
elif monatsnummer==6:
print("Juni")
elif monatsnummer==7:
print("Juli")
elif monatsnummer==8:
print("August")
elif monatsnummer==9:
print("September")
elif monatsnummer==10:
print("Oktober")
elif monatsnummer==11:
print("November")
elif monatsnummer==12:
print("Dezember")
else:
print("Monatsnummer falsch")
In beiden Quelltexten ist deutlich der Unterschied der Notationen des Algorithmus aufgrund der jeweiligen Programmiersprache zu erkennen – das heißt, derselbe Algorithmus in unterschiedlichen Beschreibungen.
Algorithmus »Jahreszeit«
Ein weiters Beispiel einer Mehrfachauswahl ist in der Abbildung 7 im Algorithmus
-
Mithilfe das Algorithmus kann zum jeweiligen Monatsnamen die zugehörige Jahreszeit ermittelt und
ausgegeben werden – wie beispielsweise:
- Eingabe Oktober
- Ausgabe Herbst
- Die Variable »monatsname« des Algorithmus ist vom Datentyp Zeichenkette (str).
- Im Struktogramm ist die Mehrfachauswahl ebenfalls farblich rot hervorgehoben.
- In den Programmen »jahreszeit.java« und »jahreszeit.py« ist der Algorithmus implementiert.
import java.util.Scanner;
public class Monate {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.print("Monatsname: ");
String monatsname=input.nextLine();
switch (monatsname) {
case "März","April","Mai":
System.out.println("Frühling");break;
case "Juni","Juli","August":
System.out.println("Sommer");break;
case "September","Oktober","November":
System.out.println("Herbst");break;
case "Dezember","Januar","Februar":
System.out.println("Winter");break;
default: System.out.println("Monatsname falsch");
}
input.close();
}
}
monatsname=input("Monatsname: ")
if monatsname=="März"\
or monatsname=="April" or monatsname=="Mai":
print("Frühling")
elif monatsname=="Juni"\
or monatsname=="Juli" or monatsname=="August":
print("Sommer")
elif monatsname=="September"\
or monatsname=="Oktober" or monatsname=="November":
print("Herbst")
elif monatsname=="Dezember"\
or monatsname=="Januar" or monatsname=="Februar":
print("Winter")
else:
print("Monatsname falsch")
Aufgabe A16
Entwickle einen Algorithmus »Wochentag«, der bei Eingabe des Namens eines Wochtentags die Wochentagsnummer[4] ausgibt – wie beispielsweise:
- Eingabe Freitag
- Ausgabe 5
Stelle den Algorithmus mit dem Structorizer in einem Struktogramm dar.
Teste den Algorithmus.
- [1] Die Hilfsvariable »hilf« – die auch Schmierzettel 😉 genannt wird – dient einzig dem Tauschen der Werte zweier Variablen.
- [2] Der Operator && in der Bedingung der einfachen Auswahl steht für das logische UND (and).
- [3] Ein Dreieck kann konstruiert werden, wenn die Summe der Längen der beiden kürzesten Seiten größer ist als die längste Seite.
- [4] Die Wochentagsnummern sind 1 für Montag und 7 für Sonntag.