• Keine Ergebnisse gefunden

¨Ubungspaket 15 Einfaches Sortieren, Suchen und Finden

N/A
N/A
Protected

Academic year: 2021

Aktie "¨Ubungspaket 15 Einfaches Sortieren, Suchen und Finden"

Copied!
10
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ubungspaket 15 ¨

Einfaches Sortieren, Suchen und Finden

Ubungsziele: ¨

1. Erarbeiten der Funktionsweise eines einfachen Sortieralgorithmus 2. Implementierung von Bubble Sorts

3. Suchen und Finden in sortierten und unsortierten Arrays Skript:

Kapitel: 27 und 33 Semester:

Wintersemester 2021/22 Betreuer:

Thomas, Tim und Ralf Synopsis:

Sortieren, Suchen und Finden geh¨ oren zu den Standardaufgaben in der Informatik, die auch in vielen Anwendungen f¨ ur uns Elektrotechniker relevant sind. Beim Sortieren von Daten gehen wir im Rahmen dieses Ubungspaketes davon aus, dass bereits bei der Programmerstellung fest ¨ steht, wie groß das Datenarray sein soll. F¨ ur das Sortieren verwenden wir den einfachsten Algorithmus, der auch unter dem Namen Bubble Sort bekannt ist. Um ein Element zu suchen und nach M¨ oglichkeit auch zu finden, verwenden wir ebenfalls einen sehr einfachen Algorithmus:

das lineare Durchsuchen eines Arrays. Diese Themen werden wir wieder in ¨ Ubungspaket 21 aufgreifen.

Da wir die

” Zutaten“ f¨ ur diese Algorithmen schon hatten, werden wir in

den ersten drei Abschnitten (Stoffwiederholung, Quiz und Fehlersuche)

keinen neuen Stoff ein¨ uben, sondern bereits Gelerntes nochmals kurz

wiederholen. Wer hier auf Schwierigkeiten st¨ oßt, sollte sich zun¨ achst

noch einmal die entsprechenden ¨ Ubungspakete anschauen.

(2)

Teil I: Stoffwiederholung

Aufgabe 1: Definition eindimensionaler Felder

Zun¨achst ein paar allgemeine Fragen bzw. Teilaufgaben zu Arrays. Zeige anhand zweier Beispiele, wie man eindimensionale Felder definiert.

1.

2.

Welche Indizes haben die Elemente eines Arrays mit 12 Elementen?

Nehmen wir mal an, wir wollen im weiteren Verlauf unseres Programms auf die einzelnen Elemente eines zuvor definierten Feldes zugreifen. Hierf¨ur m¨ussen wir vor allem die Gr¨oße des Feldes wissen. Wie f¨uhren wir g¨unstigerweise die Definition durch, damit das Programm m¨oglichst ¨anderungsfreundlich ist? Zeige dies anhand eines Beispiels einer Definition nebst einer Initialisierung:

Aufgabe 2: Ein-/Ausgabe von Arrays

(3)

Aufgabe 3: Arbeiten mit Array-Elementen

Nehmen wir wieder an, wir haben ein Array feld vom Typ int, das 20 Elemente haben soll. Wie sieht die Definition aus?

Beantworte die folgenden Fragen anhand eines frei gew¨ahlten Beispiels.

Wie vergleicht man zwei benachbarte Elemente?

Wie vertauscht man sie?

Nehmen wir an, wir f¨uhren obige Vergleiche etc. mit folgender Schleife durch:

1 for ( i = 0; . . . ; i = i + 1 ) // die S c h l e i f e

2 if ( . . . ) // der V e r g l e i c h

3 { . . . } // die A n w e i s u n g e n

Wie muss obige Schleifenbedingung richtig lauten?

Begr¨unde kurz deine Antwort

Zum Abschluss formulieren wir die Frage noch einmal anders: Nehmen wir an, wir ha- ben ein Array der Gr¨oße SIZE. Nehmen wir ferner an, wir vergleichen nacheinander alle benachbarten Elemente i und i+1.

Wie viele Vergleiche werden durchgef¨uhrt?

(4)

Teil II: Quiz

Aufgabe 1: Schleifen und Arrays

Nehmen wir an, wir haben ein Array und vergleichen benachbarte Elemente miteinander, wie wir es gerade eben in Aufgabe 3 gemacht haben. Nehmen wir ferner an, dass wir das Array aufsteigend sortieren wollen.

”Aufsteigend“ heißt hier, dass sich an der Stelle 0 das kleinste Element und an der StelleSIZE - 1das gr¨oßte Element befindet. Daf¨ur verwenden wir folgende Definitionen und Anweisungen (rudiment¨ar, ohne richtiges Programm):

1 # d e f i n e S I Z E 4 2 int i , h , a [ S I Z E ];

3

4 for ( i = 0; i < S I Z E - 1; i = i + 1 ) 5 if ( a [ i ] > a [ i + 1 ] )

6 {

7 h = a [ i ]; a [ i ] = a [ i + 1 ]; a [ i + 1 ] = h ;

8 }

F¨ur die folgende Handsimulation nehmen wir an, dass das Array wie folgend belegt ist:

Elemente a[ 0 ] a[ 1 ] a[ 2 ] a[ 3 ]

Werte 4711 27 42 2

F¨uhre in der folgenden Handsimulation schrittweise alle Vergleiche und ggf. die resultie- renden Tausch-Operationen durch.

a[ 0 ] a[ 1 ] a[ 2 ] a[ 3 ] i Vergleich Indizes Vergleich Werte initial: 4711 27 42 2 0 . . . . . . . . . . . . . . . . . . . . . . . .

(5)

Teil III: Fehlersuche

Aufgabe 1: Finden und Z¨ ahlen von Anstiegen

Das folgende Programm besitzt ein Array, in dem einige Werte vorliegen. Das Programm soll feststellen, wann ein Wert ai+1 gr¨oßer als ai ist. Ferner soll das Programm ausgeben, wie viele dieser positiven Vergleiche es gefunden hat.

1 # i n c l u d e < s t d i o . h >

2

3 int m a i n ( int argc , c h a r ** a r g v )

4 {

5 int i , cnt ;

6 int a [] = { 1 2 4 0 -2 33 4 7 1 1 815 };

7 # d e f i n e S I Z E ( s i z e o f ( a ) / s i z e o f ( a [ 0 ] ) ) 8

9 for ( i = 0 , i < SIZE , i = i + 1 )

10 if ( a [ i ] < a [ i + 1 ] )

11 cnt = cnt + 1;

12 p r i n t f ( " %5 d - - > %5 d \ n " , a [ i ] , a [ i + 1] ) ; 13

14 p r i n t f ( " % d mal s t e i g e n d \ n " , cnt ) ; 15 r e t u r n 0;

16 }

(6)

Teil IV: Anwendungen

Aufgabe 1: Sortieren mittels Bubble Sort

Ziel dieser Aufgabe ist die Entwicklung des wohl einfachsten Sortieralgorithmus, der auch unter dem NamenBubble Sort bekannt ist. Wie bisher in diesem ¨Ubungspaket gehen wir davon aus, dass sich die zu sortierenden Daten in einem Array befinden und dass wir die Daten aufsteigend sortieren wollen; also das kleinste Element an die Stelle mit dem Index0 und das gr¨oßte Element an die Stelle mit dem Index SIZE-1.

1. Vor¨uberlegungen

Bubble Sort macht nichts anderes als wir uns im Quiz-Teil dieses ¨Ubungspakets erarbeitet haben: Er geht das zu sortierende Array elementweise durch, vergleicht zwei Nachbarn und vertauscht diese gegebenenfalls. Dadurch kommt das gr¨oßte Element ans Ende. Dieser Vorgang wird dann insgesamt maximal SIZE-1 mal wiederholt.

Anschließend ist das Array definitiv sortiert. Um aus

”Glauben“ Wissen zu machen, machen wir hier eben noch eine Handsimulation (verk¨urzt, jeweils am Ende eines vollst¨andigen Durchlaufs):

Durchlauf a[ 0 ] a[ 1 ] a[ 2 ] a[ 3 ]

0 4711 27 42 2

1 . . . . . . . . . . . . . . . .

2 . . . . . . . . . . . . . . . .

3 . . . . . . . . . . . . . . . .

2. Aufgabenstellung

Entwickle ein Programm, das die Elemente eines eindimensionalen Arrays aufstei-

(7)

4. Testdaten

Als Testdaten k¨onnen wir die Beispiele aus dem Quiz-Teil ¨ubernehmen.

5. Implementierung

6. Kodierung

7. Erweiterung I

Die erste Erweiterung besteht darin, dass das Programm die zu sortierenden Daten selbstst¨andig einliest. Wie das geht, haben wir bereits besprochen.

(8)

8. Erweiterung II

Im Quizteil haben wir gesehen, dass wir die Zahl der Vergleiche in jedem Durchlauf um eins reduzieren k¨onnen. Hierzu m¨ussen wir die Laufvariablen der ¨außeren Schleife in der Bedingung der inneren Schleife ber¨ucksichtigen. In der Musterl¨osung geschieht dies in Zeile13durch die Variablei. F¨uhre die entsprechenden Erweiterungen durch.

(9)

Aufgabe 2: Suchen in unsortierten Tabellen

Eine zweite Standardaufgabe besteht darin, dass ein Programmteil ¨uberpr¨uft, ob ein be- stimmter Wert in einem Array vorhanden ist oder nicht. Diese Aufgabe ist mit dem Nach- schlagen einer Telefonnummer in einem (elektronischen) Telefonbuch vergleichbar. In dieser Ubungsaufgabe wenden wir uns einem sehr einfachen Fall zu, um uns das Grundkonzept¨ einmal zu erarbeiten.

1. Aufgabenstellung

Wir nehmen an, dass wir ein Array haben, das mit Daten gef¨ullt ist. Wir nehmen fer- ner an, dass dieses Array unsortiert ist (ja, wir k¨onnten es mit unseremBubble Sort Algorithmus mal eben sortieren). Entwickle nun ein Programmst¨uck, das ¨uberpr¨uft, ob ein angegebener Wert in diesem Array vorhanden ist oder nicht.

Beispiel: Wir nehmen an, wir haben folgende Daten: 4711,27,42 und 2 Eingabe: 27 Ausgabe: 27 ist vorhanden, Index=1

Eingabe: 25 Ausgabe: 25 ist nicht vorhanden Quizfrage: Welche Anweisung bricht eine for-Schleife fr¨uhzeitig ab?

2. Pflichtenheft: Aufgabe, Eingabe, Ausgabe, Sonderf¨alle

3. Testdaten

Als Testdaten nehmen wir obige Werte zuz¨uglich weiterer beliebiger Ganzzahlen.

4. Implementierung

(10)

5. Kodierung

Referenzen

ÄHNLICHE DOKUMENTE

Typ Bezeichnung 1 Bezeichnung 2 Hersteller Dimension Werkstoff Werkstoff Kürzel Oberfläche Oberfläche nach DIN Oberfläche Kürzel Kleinste VK-Einheit (VG) Gewicht.

Typ Bezeichnung 1 Bezeichnung 2 Hersteller Dimension Werkstoff Werkstoff Kürzel Oberfläche Oberfläche nach DIN Oberfläche Kürzel Kleinste VK-Einheit (VG) Gewicht.