diff --git a/20151210/ainf-20151210.pdf b/20151210/ainf-20151210.pdf index 8184b16afdc756211b714c44ae7c687875d00953..8cec9514dc6be76744accd4a38f15951b91fd40c 100644 Binary files a/20151210/ainf-20151210.pdf and b/20151210/ainf-20151210.pdf differ diff --git a/20151210/ainf-20151210.tex b/20151210/ainf-20151210.tex index 294a15c9b3601904221d3462ad91e3a4f00410af..8c41d30714b9e12b3411229a7280b3c06edea3b9 100644 --- a/20151210/ainf-20151210.tex +++ b/20151210/ainf-20151210.tex @@ -1,4 +1,4 @@ -% ainf-20151203.pdf - Lecture Slides on Applied Computer Sciences +% ainf-20151210.pdf - Lecture Slides on Applied Computer Sciences % Copyright (C) 2012, 2013, 2015 Peter Gerwinski % % This document is free software: you can redistribute it and/or @@ -43,7 +43,7 @@ \title{Angewandte Informatik} \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{3.\ Dezember 2015} +\date{10.\ Dezember 2015} \begin{document} @@ -336,41 +336,69 @@ \showsubsection In Output-Port schreiben = Leitungen ansteuern - - \medskip - - Datei: \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/\\ - RP6Lib/RP6base/RP6RobotBaseLib.c} - - Suchbegriff: \lstinline{setMotorDir} - - \medskip - - \begin{lstlisting} - void setMotorDir(uint8_t left_dir, uint8_t right_dir) - { - /* ... */ - if(left_dir) - PORTC |= DIR_L; - else - PORTC &= ~DIR_L; - if(right_dir) - PORTC |= DIR_R; - else - PORTC &= ~DIR_R; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(2.2,0.50){\vector(-2,1){0.5}} - \put(2.25,0.40){\makebox(0,0)[l]{Output-Port}} - \put(4.7,3.0){\vector(-2,1){0.75}} - \put(4.7,3.0){\vector(-2,-1){0.75}} - \put(4.8,3.0){\makebox(0,0)[l]{Manipulation einzelner Bits}} - \end{picture} - - \vspace*{-1.5cm} - \strut\hfill\textarrow\ Steuerung der Motordrehrichtung + \begin{tabbing} + Datei: \= \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/}\\ + \> \file{RP6Lib/RP6base/RP6RobotBaseLib.c} + \end{tabbing} + \begin{onlyenv}<1> + Suchbegriff: \lstinline{setMotorDir} + + \medskip + + \begin{lstlisting}[gobble=6] + void setMotorDir(uint8_t left_dir, uint8_t right_dir) + { + /* ... */ + if(left_dir) + PORTC |= DIR_L; + else + PORTC &= ~DIR_L; + if(right_dir) + PORTC |= DIR_R; + else + PORTC &= ~DIR_R; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,0.50){\vector(-2,1){0.5}} + \put(2.25,0.40){\makebox(0,0)[l]{Output-Port}} + \put(4.7,3.0){\vector(-2,1){0.75}} + \put(4.7,3.0){\vector(-2,-1){0.75}} + \put(4.8,3.0){\makebox(0,0)[l]{Manipulation einzelner Bits}} + \end{picture} + + \vspace*{-1.5cm} + \strut\hfill\textarrow\ Steuerung der Motordrehrichtung + \end{onlyenv} + \begin{onlyenv}<2> + Suchbegriff: \lstinline{updateStatusLEDs} + + \medskip + + \begin{lstlisting}[gobble=6] + DDRB &= ~0x83; + PORTB &= ~0x83; + if(statusLEDs.LED4){ DDRB |= SL4; PORTB |= SL4; } + if(statusLEDs.LED5){ DDRB |= SL5; PORTB |= SL5; } + if(statusLEDs.LED6){ DDRB |= SL6; PORTB |= SL6; } + DDRC &= ~0x70; + PORTC &= ~0x70; + DDRC |= ((statusLEDs.byte << 4) & 0x70); + PORTC |= ((statusLEDs.byte << 4) & 0x70); + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(3.7,3.9){\vector(-1,0){0.5}} + \put(3.75,3.9){\makebox(0,0)[l]{Data Direction Register: auf Input(!) setzen}} + \put(3.7,3.5){\vector(-1,0){0.5}} + \put(3.75,3.5){\makebox(0,0)[l]{internen Pull-Up-Widerstand ausschalten}} + \put(8.7,2.7){\makebox(0,0)[l]{\shortstack{Manipulation\\einzelner Bits}}} + \put(7.2,1.0){\makebox(0,0)[l]{\shortstack{3 Bits\\gemeinsam}}} + \end{picture} + + \lstinline{union statusLEDs}: Bit-Felder vs.\ Byte + \end{onlyenv} \end{frame} @@ -407,7 +435,7 @@ \put(2.0,4.4){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} \put(2.3,3.6){\vector(-1,-1){0.7}} \put(2.4,3.6){\makebox(0,0)[l]{Interrupt-Vektor 0 darauf zeigen lassen}} - \put(3.7,2.9){\makebox(0,0)[l]{Schreibweise herstellerspezifisch!}} + \put(3.7,2.9){\makebox(0,0)[l]{Schreibweise abhängig von Prozessor und Compiler!}} \end{picture} \vspace*{-1.5cm} diff --git a/20151210/sort-0.c b/20151210/sort-0.c new file mode 100644 index 0000000000000000000000000000000000000000..43814eb3ff763bb05e82cde70014d7a02ad4727a --- /dev/null +++ b/20151210/sort-0.c @@ -0,0 +1,16 @@ +#include <stdio.h> + +char *find_first (char **name) +{ + return "Anna"; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + char *first = find_first (name); + printf ("%s\n", first); + return 0; +} diff --git a/20151210/sort-1.c b/20151210/sort-1.c new file mode 100644 index 0000000000000000000000000000000000000000..75d22da4f7c1fc8c05348bb5330f2baf5aa51ada --- /dev/null +++ b/20151210/sort-1.c @@ -0,0 +1,27 @@ +#include <stdio.h> +#include <string.h> + +char *find_first (char **name) +{ + if (name == NULL || name[0] == NULL) + return NULL; + char *first = name[0]; + int i = 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + first = name[i]; + i++; + } + return first; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + char *first = find_first (name); + printf ("%s\n", first); + return 0; +} diff --git a/20151210/sort-10.c b/20151210/sort-10.c new file mode 100644 index 0000000000000000000000000000000000000000..bb00db23b46272d24a0fc384fbf05a8970f6bda9 --- /dev/null +++ b/20151210/sort-10.c @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (100000); + return strcmp (name[left], name[right]); +} + +void sort (char **name, int size) +{ + int sorted = 0; + int n = size; + while (n > 1 && !sorted) + { + sorted = 1; + for (int i = 0; i < n - 1; i++) + if (compare (name, i, i + 1) > 0) + { + sorted = 0; + char *temp = name[i]; + name[i] = name[i + 1]; + name[i + 1] = temp; + } + n--; + } +} + +int main (void) +{ + char *names[] = { "Anna", "Berta", "Box", "Dieter", "Fritz", "Hans", + "Heinrich", "Hugo", "Lisa", "Maria", "Otto", "Peter", + "Siegfried", "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 16); + output (names); + return 0; +} diff --git a/20151210/sort-11.c b/20151210/sort-11.c new file mode 100644 index 0000000000000000000000000000000000000000..eb8236cb8d655a484a347637f9b024a3e4ff6daa --- /dev/null +++ b/20151210/sort-11.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (100000); + return strcmp (name[left], name[right]); +} + +void sort (char **name, int size) /* BubbleSort */ +{ /* Wikipedia: bubblesort3 */ + int sorted = 0; + int n = size; + while (n > 1 && !sorted) + { + int newn = 1; + sorted = 1; + for (int i = 0; i < n - 1; i++) + if (compare (name, i, i + 1) > 0) + { + sorted = 0; + char *temp = name[i]; + name[i] = name[i + 1]; + name[i + 1] = temp; + newn = i + 1; + } + n = newn; + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 16); + output (names); + return 0; +} diff --git a/20151210/sort-12.c b/20151210/sort-12.c new file mode 100644 index 0000000000000000000000000000000000000000..428d4fab9614277cbef8362f1cbc0f9e557387dd --- /dev/null +++ b/20151210/sort-12.c @@ -0,0 +1,62 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (100000); + return strcmp (name[left], name[right]); +} + +void sort (char **name, int size) /* BubbleSort */ +{ /* Wikipedia: bubblesort3 */ + int n = size; + while (n > 1) + { + int newn = 1; + for (int i = 0; i < n - 1; i++) + if (compare (name, i, i + 1) > 0) + { + char *temp = name[i]; + name[i] = name[i + 1]; + name[i + 1] = temp; + newn = i + 1; + } + n = newn; + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 16); + output (names); + return 0; +} diff --git a/20151210/sort-13.c b/20151210/sort-13.c new file mode 100644 index 0000000000000000000000000000000000000000..5daf8054d1d5255fb2b48d0f6d3784b0dd74d602 --- /dev/null +++ b/20151210/sort-13.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1); +} + +int compare (char **name, int left, char *right) +{ + comp_counter++; + output_marked (name, left); + usleep (100000); + return strcmp (name[left], right); +} + +void sort (char **name, int left, int right) /* QuickSort */ +{ + if (left < right) + { + int middle = (left + right) / 2; + char *test = name[middle]; + int l = left; + int r = right; + while (l <= r) + { + while (compare (name, l, test) < 0) + l++; + while (compare (name, r, test) > 0) + r--; + if (l <= r) + { + char *temp = name[l]; + name[l] = name[r]; + name[r] = temp; + l++; + r--; + } + } + sort (name, left, r); + sort (name, l, right); + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 0, 15); + output (names); + return 0; +} diff --git a/20151210/sort-14.c b/20151210/sort-14.c new file mode 100644 index 0000000000000000000000000000000000000000..c3046ab8d1ffcf08f770a781f750af0b12f25f73 --- /dev/null +++ b/20151210/sort-14.c @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1); +} + +int compare (char **name, int left, char *right) +{ + comp_counter++; + output_marked (name, left); + usleep (100000); + return strcmp (name[left], right); +} + +void sort (char **name, int left, int right) /* QuickSort */ +{ + if (left < right) + { + int middle = left + rand () % (right - left + 1); + char *test = name[middle]; + int l = left; + int r = right; + while (l <= r) + { + while (compare (name, l, test) < 0) + l++; + while (compare (name, r, test) > 0) + r--; + if (l <= r) + { + char *temp = name[l]; + name[l] = name[r]; + name[r] = temp; + l++; + r--; + } + } + sort (name, left, r); + sort (name, l, right); + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + srand (137); + sort (names, 0, 15); + output (names); + return 0; +} diff --git a/20151210/sort-2.c b/20151210/sort-2.c new file mode 100644 index 0000000000000000000000000000000000000000..1b4dd9e544bcb9c39c8e2cc3bccfba79073132ed --- /dev/null +++ b/20151210/sort-2.c @@ -0,0 +1,32 @@ +#include <stdio.h> +#include <string.h> + +int find_first (char **name) +{ + if (name == NULL || name[0] == NULL) + return -1; + int first_pos = 0; + char *first = name[0]; + int i = 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + { + first_pos = i; + first = name[i]; + } + i++; + } + return first_pos; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + int first = find_first (name); + if (first >= 0) + printf ("%s\n", name[first]); + return 0; +} diff --git a/20151210/sort-3.c b/20151210/sort-3.c new file mode 100644 index 0000000000000000000000000000000000000000..5b74a9139af986fdfa010c59e5de76c326a9d8b1 --- /dev/null +++ b/20151210/sort-3.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include <string.h> + +int find_first (char **name) +{ + if (name == NULL || name[0] == NULL) + return -1; + int first_pos = 0; + char *first = name[0]; + int i = 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + { + first_pos = i; + first = name[i]; + } + i++; + } + return first_pos; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + int first = find_first (name); + if (first >= 0) + { + printf ("%s\n", name[first]); + char *temp = name[0]; + name[0] = name[first]; + name[first] = temp; + first = find_first (name + 1); + printf ("%s\n", name[1 + first]); + } + return 0; +} diff --git a/20151210/sort-4.c b/20151210/sort-4.c new file mode 100644 index 0000000000000000000000000000000000000000..0d7c1c160ebdac2b67a0bcf656a13ed722836bb1 --- /dev/null +++ b/20151210/sort-4.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <string.h> + +int find_first (char **name) +{ + if (name == NULL || name[0] == NULL) + return -1; + int first_pos = 0; + char *first = name[0]; + int i = 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + { + first_pos = i; + first = name[i]; + } + i++; + } + return first_pos; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + int i = 0; + int first = find_first (name + i); + while (first >= 0) + { + printf ("%s\n", name[first + i]); + char *temp = name[0 + i]; + name[0 + i] = name[first + i]; + name[first + i] = temp; + i++; + first = find_first (name + i); + } + return 0; +} diff --git a/20151210/sort-5.c b/20151210/sort-5.c new file mode 100644 index 0000000000000000000000000000000000000000..7bab242a32aa3c5c351f4f0866ac784340ca79ee --- /dev/null +++ b/20151210/sort-5.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <string.h> + +int find_first (char **name, int start_index) +{ + if (name == NULL || name[start_index] == NULL) + return -1; + int first_pos = start_index; + char *first = name[start_index]; + int i = start_index + 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + { + first_pos = i; + first = name[i]; + } + i++; + } + return first_pos; +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + int start = 0; + int first = find_first (name, start); + while (first >= 0) + { + printf ("%s\n", name[first]); + char *temp = name[start]; + name[start] = name[first]; + name[first] = temp; + start++; + first = find_first (name, start); + } + return 0; +} diff --git a/20151210/sort-6.c b/20151210/sort-6.c new file mode 100644 index 0000000000000000000000000000000000000000..83e780006ad9d9eb156a255a86846dc618474930 --- /dev/null +++ b/20151210/sort-6.c @@ -0,0 +1,46 @@ +#include <stdio.h> +#include <string.h> + +int find_first (char **name, int start_index) +{ + if (name == NULL || name[start_index] == NULL) + return -1; + int first_pos = start_index; + char *first = name[start_index]; + int i = start_index + 1; + while (name[i]) + { + if (strcmp (name[i], first) < 0) + { + first_pos = i; + first = name[i]; + } + i++; + } + return first_pos; +} + +void sort (char **name) +{ + int start = 0; + int first = find_first (name, start); + while (first >= 0) + { + char *temp = name[start]; + name[start] = name[first]; + name[first] = temp; + start++; + first = find_first (name, start); + } +} + +int main (void) +{ + char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (name); + for (int i = 0; name[i]; i++) + printf ("%s\n", name[i]); + return 0; +} diff --git a/20151210/sort-7.c b/20151210/sort-7.c new file mode 100644 index 0000000000000000000000000000000000000000..7af587c5cf492e8dcb3b9e18ea1f456c42df2041 --- /dev/null +++ b/20151210/sort-7.c @@ -0,0 +1,70 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (200000); + return strcmp (name[left], name[right]); +} + +int find_first (char **name, int first_pos) +{ + if (name == NULL || name[first_pos] == NULL) + return -1; + int i = first_pos + 1; + while (name[i]) + { + if (compare (name, i, first_pos) < 0) + first_pos = i; + i++; + } + return first_pos; +} + +void sort (char **name) +{ + if (name) + for (int i = 0; name[i] != NULL; i++) + { + int first = find_first (name, i); + char *temp = name[i]; + name[i] = name[first]; + name[first] = temp; + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names); + output (names); + return 0; +} diff --git a/20151210/sort-8.c b/20151210/sort-8.c new file mode 100644 index 0000000000000000000000000000000000000000..30f7647683fec6c315f56be5c2d1660ee06df11d --- /dev/null +++ b/20151210/sort-8.c @@ -0,0 +1,56 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (100000); + return strcmp (name[left], name[right]); +} + +void sort (char **name, int size) /* Wikipedia: bubblesort1 */ +{ + for (int n = size; n > 1; n--) + for (int i = 0; i < n - 1; i++) + if (compare (name, i, i + 1) > 0) + { + char *temp = name[i]; + name[i] = name[i + 1]; + name[i + 1] = temp; + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 16); + output (names); + return 0; +} diff --git a/20151210/sort-9.c b/20151210/sort-9.c new file mode 100644 index 0000000000000000000000000000000000000000..3fd3f44073787223a21e5f8d6e78bbd116dd5036 --- /dev/null +++ b/20151210/sort-9.c @@ -0,0 +1,63 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int comp_counter = 0; + +void clear_screen (void) +{ + printf ("\e[H\e[J"); +} + +void output_marked (char **name, int mark1, int mark2) +{ + clear_screen (); + for (int i = 0; name[i]; i++) + if (i == mark1 || i == mark2) + printf ("%s <--\n", name[i]); + else + printf ("%s\n", name[i]); + printf ("%d\n", comp_counter); +} + +void output (char **name) +{ + output_marked (name, -1, -1); +} + +int compare (char **name, int left, int right) +{ + comp_counter++; + output_marked (name, left, right); + usleep (100000); + return strcmp (name[left], name[right]); +} + +void sort (char **name, int size) /* Wikipedia: bubblesort2 */ +{ + int sorted = 0; + int n = size; + while (n > 1 && !sorted) + { + sorted = 1; + for (int i = 0; i < n - 1; i++) + if (compare (name, i, i + 1) > 0) + { + sorted = 0; + char *temp = name[i]; + name[i] = name[i + 1]; + name[i + 1] = temp; + } + n--; + } +} + +int main (void) +{ + char *names[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", + "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", + "Thomas", "Ulrich", "Zacharias", NULL }; + sort (names, 16); + output (names); + return 0; +}