2.1 Kontrollfluss Beispiel – Suche#

Kontrollfluss#

Zur Steuerung des Kontrollflusses stehen verschiedene Anweisungen zur Verfügung:

  • Bedingte Ausführung

    • if-else

    • switch-case

  • Schleifen

    • for

    • while *do-while

  • Sprünge

    • goto und Spungmarken

In diesem Beispiel wird dies einmal für eine einfache Suche in einem Array realisiert und demonstriert.

Aufgabe: Suche nach einem Eintrag in einem Array#

Gegeben Sei ein Array von “int” Zahlen. Schreiben Sie eine allgemeine Funktion “search”, welche die Zahlen durchsucht. Eine Funktion “search” soll als Parameter zunächst die Anzahl der Elemente im Array, dann das Array selbst und zuletzt das zu suchende Element als Argument haben. Die Funktion soll den Index (0 basiert) im Array zurückliefern, an dem das Element gefunden wurde. Überlegen sie, was ein guter Rückgabewert ist, wenn der Eintrag nicht gefunden wurde.

Überladen Sie die Funktion “search” mit einer weiteren Variante, die als letzten Parameter statt des zu suchenden Elements eine Prädikatsfunktion nimmt. Die Prädikatsfunktion ist eine Funktion, die ein zu testendes Element übergeben bekommt und “true” zurückgibt, wenn das zu testende Element das richtige ist. Definieren Sie einen geeigneten Typ für die Prädikatsfunktion (typedef).

Wichtig: die vers. Funktionen und Typdefinitionen müssen in einzelnen Blöcken durchgeführt werden.

Als Hilfe: Vergleichsoperatoren, Kontrollstrukturen.

// Search Funktion mit Übergabe der Parameter - letzter Parameter ist der zu suchende Eintrag
int search(int num, int numbers[], int number)
{
    for (int i = 0; i < num; ++i)
        if (numbers[i] == number)
            return i;
            
    return -1;
}
// Definition des SearchPredicate Typs
typedef bool (*SearchPredicate)(int);
// Beispiel Search-Predicate
bool findFive(int x) { return x == 5; }
// Beispiel Search-Predicate
bool findFour(int x) { return x == 4; }
// Überladen der Search Funktion mit Übergabe eines SearchPredicate als letzten Parameter
int search(int num, int numbers[], SearchPredicate pred)
{
    for (int i = 0; i < num; ++i)
        if (pred(numbers[i]))
            return i;
            
    return -1;
}
#include <iostream>

int arr[] = {5,2,3,4,1,7,19,3};
std::cout << search( sizeof(arr)/sizeof(int), arr, 19) << std::endl;
std::cout << search( sizeof(arr)/sizeof(int), arr, findFour) << std::endl;

Anmerkungen / Fragen#

  • Was ist eine geeignete Rückgabe für die Funktion?

  • Wie würden sie die Funktion anpassen auf einem Array eines anderen Datentyps?

  • Wie würden sie die Funktion anpassen, wenn sie den letzten Eintrag im Array zurückgeben wollen?

  • Was ist der Typ von SearchPredicate?

Diese Aufgabe wurde angepasst aus dem WWU C++ Kurs übernommen.