3.2 Selektion

Innerhalb eines Algorithmus ist die Selektion entweder eine Einfachauswahl oder eine Mehrfachauswahl.

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.

Bild 09
Abbildung 1: Einfachauswahl mit dem Zweig wahr

Algorithmus »Ordnen1«

Als Beispiel einer einseitigen Einfachauswahl ist in der Abbildung der Algorithmus »Ordnen1« gegeben.

Bild 13
Abbildung 2: Algorithmus »Ordnen1«
  • 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.

Übung

Aufgabe A11

Ordne mithilfe des in der Abbildung1 dargestellten Algorithmus »Ordnen1« die jeweiligen Zahlen aufsteigend.

  1. zahl1 ist 56.4 und zahl2 ist 0
  2. zahl1 ist -24 und zahl2 ist -12 ist
  3. zahl1 ist 18 und zahl2 ist -18
  4. zahl1 ist 3 und zahl2 ist 3
  5. zahl1 ist -3 und zahl2 ist -33

Der Algorithmus »Ordnen1« ist in den Programmen »ordnen1.java« und »ordnen1.py« implementiert.

Quelltext des Java-Programms »ordnen1.java«
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();
}

Quelltext des Python-Programms »ordnen1.py«
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}")

Übung

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 »Betragssumme« gegeben.

Definition
Mathematischer Begriff »Betrag«
  • Der Betrag |x| ist für x<0 gleich -x.
  • Der Betrag |x| ist für x≥0 gleich x.
Bild 12
Abbildung 3: Algorithmus »Betragssumme«
  • Die Variablen »zahl1«, »zahl2« und »summe« des Algorithmus sind vom Datentyp Gleitkommazahl (float/double).
Übung

Aufgabe A13

Rechne mithilfe des in der Abbildung3 dargestellten Algorithmus »Betragssumme« die jeweiligen Betragssummen aus.

  1. zahl1 ist 15 und zahl2 ist 9
  2. zahl1 ist -34 und zahl2 ist 21
  3. zahl1 ist 6 und zahl2 ist -12
  4. zahl1 ist -17 und zahl2 ist -30
  • Der Algorithmus »Betragssumme« ist in den Programmen »betragssumme.java« und »betragssumme.py« implementiert.
Quelltext des Java-Programms »betragssumme.java«
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();
    }
}

Quelltext des Python-Programms »betragssumme.py«
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.

Bild 10
Abbildung 4: Zweiseitige Einfachauswahl mit den Zweigen wahr und falsch

Algorithmus »Dreieck«

Ein Beispiel einer zweiseitigen Einfachauswahl ist in der Abbildung 5 im Algorithmus »Dreieck« gegeben.

Bild 11
Abbildung 5: Algorithmus »Dreieck«[2]
  • 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]
Übung

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?

  1. a ist 2.6, b ist 1.2 und c ist 1.3
  2. amist 3, b ist 4 und c ist 5
  3. a ist 17.8, b ist 5.9 und c ist 3.6
  4. a ist 6.8, b ist 6.8 ist c=6.8
  • Der Algorithmus »Dreieck« ist den Programmen »dreieck.java« und »dreieck.py« implementiert.
Quelltext des Java-Programms »dreieck.java«
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();
    }
}

Quelltext des Python-Programms »dreieck.py«
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.")

Übung

Aufgabe A15

Den beiden Programmen »maximum.java« und »maximum.py« liegt der gemeinsame Algorithmus »Maximum« zugrunde.

Quelltext des Java-Programms »maximum.java«
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();
    }  
}

Quelltext des Python-Programms »maximum.py«
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.

Bild 14
Abbildung 6: Algorithmus »Monat«
  • 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.
Quelltext des Java-Programms »monate.java«
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();
    }
}

Quelltext des Python-Programms »monate.py«
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 »Jahreszeit« dargestellt.

Bild 15
Abbildung 7: Algorithmus »Jahreszeit«
  • 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.
Quelltext des Java-Programms »jahreszeit.java«
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();
    }
}

Quelltext des Python-Programms »jahreszeit.py«
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")

Übung

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. [1] Die Hilfsvariable »hilf« – die auch Schmierzettel 😉 genannt wird – dient einzig dem Tauschen der Werte zweier Variablen.
  2. [2] Der Operator && in der Bedingung der einfachen Auswahl steht für das logische UND (and).
  3. [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. [4] Die Wochentagsnummern sind 1 für Montag und 7 für Sonntag.