diff --git a/20201105/hello-1.c b/20201105/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20201105/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201105/hello-2.c b/20201105/hello-2.c deleted file mode 100644 index 2dbbad99d102df43d00779483f789f03274353ca..0000000000000000000000000000000000000000 --- a/20201105/hello-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!"); - return 0; -} diff --git a/20201105/hello-3.c b/20201105/hello-3.c deleted file mode 100644 index 087b3ad2304138af63900056572aa62f69a353be..0000000000000000000000000000000000000000 --- a/20201105/hello-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf (Hello, world!); - return 0; -} diff --git a/20201105/hello-4.c b/20201105/hello-4.c deleted file mode 100644 index e27a989a53130e32f7861b61e00dd347b4730879..0000000000000000000000000000000000000000 --- a/20201105/hello-4.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - "Hello, world!"; - return 0; -} diff --git a/20201105/hello-gtk.c b/20201105/hello-gtk.c deleted file mode 100644 index 016867d41e42de57390a21653de467c061e5ded0..0000000000000000000000000000000000000000 --- a/20201105/hello-gtk.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201105/hello.c b/20201105/hello.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20201105/hello.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201105/if-1.c b/20201105/if-1.c deleted file mode 100644 index cdab16affa86b37267669782aff8785833c18d1a..0000000000000000000000000000000000000000 --- a/20201105/if-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - if (a > 10) - printf ("Die Hälfte ist: %d\n", a / 2); - else - printf ("Das Doppelte ist: %d\n", 2 * a); - return 0; -} diff --git a/20201105/if-10.c b/20201105/if-10.c deleted file mode 100644 index fe334d7106b8a13b757e67e66070e471671002a7..0000000000000000000000000000000000000000 --- a/20201105/if-10.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/if-11.c b/20201105/if-11.c deleted file mode 100644 index efd7fa7b33d0769f13b4689e69e28cef45fa54dd..0000000000000000000000000000000000000000 --- a/20201105/if-11.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - printf ("%d\n", a < b); - return 0; -} diff --git a/20201105/if-2.c b/20201105/if-2.c deleted file mode 100644 index 6e676e183ba0bbdf9f9656046a6a3a1575472f80..0000000000000000000000000000000000000000 --- a/20201105/if-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("%d\n", a / b); - return 0; -} diff --git a/20201105/if-3.c b/20201105/if-3.c deleted file mode 100644 index fe18ddb8cc91978d720368e5f6b69215d17581f8..0000000000000000000000000000000000000000 --- a/20201105/if-3.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - return 0; -} diff --git a/20201105/if-4.c b/20201105/if-4.c deleted file mode 100644 index 507d07a82870a4dc5062adc0ef79ce5e825e0dc8..0000000000000000000000000000000000000000 --- a/20201105/if-4.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != 0) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/if-5.c b/20201105/if-5.c deleted file mode 100644 index 1e6e776997c8310afd46c73eb29bab8ae5880333..0000000000000000000000000000000000000000 --- a/20201105/if-5.c +++ /dev/null @@ -1,4 +0,0 @@ -#include <stdio.h> -int main (void) { int a = 137; int b; printf ("Bitte eine Zahl eingeben: "); -scanf ("%d", &b); if (b != 0) { printf ("%d\n", a / b); printf ("Danke sehr.\n"); } -return 0; } diff --git a/20201105/if-6.c b/20201105/if-6.c deleted file mode 100644 index e131613c2384ed26373342de8fd238987fc66ed6..0000000000000000000000000000000000000000 --- a/20201105/if-6.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != 0 && a > b) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/if-7.c b/20201105/if-7.c deleted file mode 100644 index 9624fa3f901cc34ded9ba79a91a9edb7e1fe7d7d..0000000000000000000000000000000000000000 --- a/20201105/if-7.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != 0 & a > b) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/if-8.c b/20201105/if-8.c deleted file mode 100644 index 920bb851f4ae30da95cefde4bf6aa99d34a92bb4..0000000000000000000000000000000000000000 --- a/20201105/if-8.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != (0 & a) > b) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/if-9.c b/20201105/if-9.c deleted file mode 100644 index 8a5ad6c228a005bc5d86f98b471aa4ec39ea6026..0000000000000000000000000000000000000000 --- a/20201105/if-9.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b != ((0 & a) > b)) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201105/input-1.c b/20201105/input-1.c deleted file mode 100644 index 5ca4c8c63cf313591a5a57e18c915329a3c71162..0000000000000000000000000000000000000000 --- a/20201105/input-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; -} diff --git a/20201105/input-2.c b/20201105/input-2.c deleted file mode 100644 index e17d5efab4ea071e9ada023e783e11425e360e09..0000000000000000000000000000000000000000 --- a/20201105/input-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %20.15lf\n", a); - return 0; -} diff --git a/20201105/input-3.c b/20201105/input-3.c deleted file mode 100644 index bd9397091a6d95d4159441a3380edad04c22fb37..0000000000000000000000000000000000000000 --- a/20201105/input-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %20.13lf\n", a); - return 0; -} diff --git a/20201105/input-4.c b/20201105/input-4.c deleted file mode 100644 index 1433c46a4b04af241fa9cc0bc5088f30b337aeba..0000000000000000000000000000000000000000 --- a/20201105/input-4.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %23.20lf\n", a); - return 0; -} diff --git a/20201105/input-5.c b/20201105/input-5.c deleted file mode 100644 index 3c8912a1210787f322016cd6b611a3dd1bcaced3..0000000000000000000000000000000000000000 --- a/20201105/input-5.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; -} diff --git a/20201105/loops-1.c b/20201105/loops-1.c deleted file mode 100644 index 535de8f8e459cf19ccf7ccfc895c38bf5d2a89fd..0000000000000000000000000000000000000000 --- a/20201105/loops-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 1; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } -} diff --git a/20201105/loops-10.c b/20201105/loops-10.c deleted file mode 100644 index cd6a07bfd5d68dd871daacc88a7ef58fc7daaa20..0000000000000000000000000000000000000000 --- a/20201105/loops-10.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int a = 137; a > -5; a = a - 2) - printf ("%d\n", a); -} diff --git a/20201105/loops-11.c b/20201105/loops-11.c deleted file mode 100644 index 878568cec7ff5cae44b6d1f39964c2a6f265d5d2..0000000000000000000000000000000000000000 --- a/20201105/loops-11.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 1; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); -} diff --git a/20201105/loops-12.c b/20201105/loops-12.c deleted file mode 100644 index 1e41aaf610532b746194c453f93b5eddc03da5d4..0000000000000000000000000000000000000000 --- a/20201105/loops-12.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 11; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); -} diff --git a/20201105/loops-13.c b/20201105/loops-13.c deleted file mode 100644 index a034e8fbe6032c098128cf49282cec9cc4b3e78d..0000000000000000000000000000000000000000 --- a/20201105/loops-13.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 11; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } -} diff --git a/20201105/loops-2.c b/20201105/loops-2.c deleted file mode 100644 index d28512e329cd3db74551d0532efdfdf7f4d8529b..0000000000000000000000000000000000000000 --- a/20201105/loops-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int a = 1; a <= 10; a = a + 1) - printf ("%d\n", a); -} diff --git a/20201105/loops-3.c b/20201105/loops-3.c deleted file mode 100644 index f197918519623121390cf7fb89a15b4b443592d0..0000000000000000000000000000000000000000 --- a/20201105/loops-3.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 10; - while (a) - { - printf ("%d\n", a); - a = a - 1; - } -} diff --git a/20201105/loops-4.c b/20201105/loops-4.c deleted file mode 100644 index bbab20e7f3e2eea2051d2cc2a64e82d1573dbe91..0000000000000000000000000000000000000000 --- a/20201105/loops-4.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 10; - while (a != 0) - { - printf ("%d\n", a); - a = a - 1; - } -} diff --git a/20201105/loops-5.c b/20201105/loops-5.c deleted file mode 100644 index a2c995b5694c6ecdb16d50363a5ad06437b6dcdc..0000000000000000000000000000000000000000 --- a/20201105/loops-5.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int a = 10; a != 0; a = a - 1) - printf ("%d\n", a); -} diff --git a/20201105/loops-6.c b/20201105/loops-6.c deleted file mode 100644 index f886a46f296d10eb6ba98bfacf5b09d2eab4ac6d..0000000000000000000000000000000000000000 --- a/20201105/loops-6.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 10; - while (a) - { - printf ("%d\n", a); - a = a - 2; - } -} diff --git a/20201105/loops-7.c b/20201105/loops-7.c deleted file mode 100644 index 1f8f65c1ba3cb35ca62cfbe315ce06469fe54162..0000000000000000000000000000000000000000 --- a/20201105/loops-7.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - while (a) - { - printf ("%d\n", a); - a = a - 2; - } -} diff --git a/20201105/loops-8.c b/20201105/loops-8.c deleted file mode 100644 index 3fef4c50419f74e19d6970f10299375dd2bc9ea9..0000000000000000000000000000000000000000 --- a/20201105/loops-8.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - while (a >= 0) - { - printf ("%d\n", a); - a = a - 2; - } -} diff --git a/20201105/loops-9.c b/20201105/loops-9.c deleted file mode 100644 index 63774e315f9376cc20f35bd6b863702668167b37..0000000000000000000000000000000000000000 --- a/20201105/loops-9.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - while (a > -5) - { - printf ("%d\n", a); - a = a - 2; - } -} diff --git a/20201105/mumbleBot-20201105.diff b/20201105/mumbleBot-20201105.diff deleted file mode 100644 index c1fb850e886db29bbaeb30d224dc56e538281bbf..0000000000000000000000000000000000000000 --- a/20201105/mumbleBot-20201105.diff +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/commands/poll.go b/commands/poll.go -index 1729be5..cb6291a 100644 ---- a/commands/poll.go -+++ b/commands/poll.go -@@ -90,11 +90,12 @@ func (c *PollCommand) Execute(user *gumble.User, private bool, args ...string) { - var voteMsg bytes.Buffer - switch len(args) { - case 0: //Classic poll -- ResultNames = []string{"yes", "no"} - standardVote = true -+ ResultNames = []string{"yes", "no"} - votingMessages = []string{"yes", "ja", "+", "no", "nein", "-"} - voteMsg.WriteString(" yes/no/ja/nein/+/-") - case 1: //Range poll -+ standardVote = false - voteMsg.WriteString(" anything between") - colonIndex := strings.Index(args[0], ":") - if colonIndex != -1 { -@@ -158,6 +159,7 @@ func (c *PollCommand) Execute(user *gumble.User, private bool, args ...string) { - } - votingMessages = ResultNames - default: //Poll with given answer possibilites -+ standardVote = false - ResultNames = make([]string, len(args)) - votingMessages = make([]string, len(args)) - for i, name := range args { diff --git a/20201105/output-1.c b/20201105/output-1.c deleted file mode 100644 index ae37ad290203e4e490e3e2fac5a8080f7dfa0364..0000000000000000000000000000000000000000 --- a/20201105/output-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: "); - printf (42); - printf ("\n"); - return 0; -} diff --git a/20201105/output-2.c b/20201105/output-2.c deleted file mode 100644 index b41d5374dff9a974b9a99a4a828ff1c673e64223..0000000000000000000000000000000000000000 --- a/20201105/output-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: "); - int a = 42; - printf (a); - printf ("\n"); - return 0; -} diff --git a/20201105/output-3.c b/20201105/output-3.c deleted file mode 100644 index 2020c9dd740c98c254e38736634327e34b0c0905..0000000000000000000000000000000000000000 --- a/20201105/output-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d", 42); - printf ("\n"); - return 0; -} diff --git a/20201105/output-4.c b/20201105/output-4.c deleted file mode 100644 index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000 --- a/20201105/output-4.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d\n", 42); - return 0; -} diff --git a/20201105/output-5.c b/20201105/output-5.c deleted file mode 100644 index 839dffd3877da616ef753aecae3d4349dd775046..0000000000000000000000000000000000000000 --- a/20201105/output-5.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %x\n", 42); - return 0; -} diff --git a/20201105/variables-1.c b/20201105/variables-1.c deleted file mode 100644 index 72294c6576a5619922f31bbe286cad3bd365329a..0000000000000000000000000000000000000000 --- a/20201105/variables-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - a = 2 * a; - printf ("Das Doppelte ist: %d\n", a); - return 0; -} diff --git a/20201105/variables-2.c b/20201105/variables-2.c deleted file mode 100644 index 86a75660f1a99ce1bc860cc62efea3601557c6ec..0000000000000000000000000000000000000000 --- a/20201105/variables-2.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - a = 2 * a; - printf ("Das Doppelte ist: %d\n", a); - return 0; -} diff --git a/20201105/variables-3.c b/20201105/variables-3.c deleted file mode 100644 index 791c6f2f2a91f4ac771c12b29cf98f39b026f8e7..0000000000000000000000000000000000000000 --- a/20201105/variables-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 42; - printf ("Die Antwort lautet: %d\n", a); - return 0; -} diff --git a/20201105/variables-4.c b/20201105/variables-4.c deleted file mode 100644 index 4f9092cb2c1726eab8e382ea491db889ac839e1a..0000000000000000000000000000000000000000 --- a/20201105/variables-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - a = 42; - printf ("Die Antwort lautet: %d\n", a); - return 0; -} diff --git a/20201112/aufgabe-4.c b/20201112/aufgabe-4.c deleted file mode 100644 index b8b3de796fbef94bd4a86f944e1269b97e97982b..0000000000000000000000000000000000000000 --- a/20201112/aufgabe-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; -} diff --git a/20201112/fibonacci.txt b/20201112/fibonacci.txt deleted file mode 100644 index d2daea9ad4c40e2b492174f8fd33b850aee1ab88..0000000000000000000000000000000000000000 --- a/20201112/fibonacci.txt +++ /dev/null @@ -1,60 +0,0 @@ -Fibonacci-Zahl Nr. 199: - - * Quelle: http://www.wackerart.de/mathematik/big_numbers/fibonacci_numbers.html - 173 402 521 172 797 813 159 685 037 284 371 942 044 301 - - * Quelle: Wolfram Alpha - 173 402 521 172 797 813 159 685 037 284 371 942 044 301 - - * Quelle: ./loesung-3-12 - 173 402 521 172 797 813 134 481 939 662 687 621 349 376 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Ab loesung-3-7.c ist die Berechnung der Fibonacci-Zahlen falsch! - ~~~~~~ -Derartige Rechnungen darf man nur mit ganzen Zahlen durchführen, -nicht jedoch mit Fließkommazahlen. - -Dies gilt insbesondere auch für Kryptographie, z.B. RSA-Verschlüsselung. - - -Die Fibonacci-Zahl Nr. 199 paßt selbst in eine "long long unsigned" nicht hinein. - -Wie kann man die Genauigkeit des Rechners erhöhen? ---> "schriftlich" rechnen - - 13 · 17 = (10 + 3) · (10 + 7) - - = 10 · 10 + 10 · 7 + 3 · 10 + 3 · 7 --> nur noch kleines Einmaleins, - evtl. mit Nullen dran - = 100 - + 70 - + 30 - + 21 - ---1-- - 221 - ---> Funktion, um 2 128-Bit-Zahlen zu addieren - - - Wir speichern jede 128-Bit-Zahl in einem Array von 4 32-Bit-Zahlen - - - Wir addieren jeweils 2 32-Bit-Zahlen ("1 Ziffer"). - Das Ergebnis kann größer sein als 32 Bit, aber nicht größer als 64 Bit. - - - Die unteren 32 Bit speichern wir als Ergebnis (7 + 5: "2 hin"). - Die oberen merken wir uns als Übertrag ("1 im Sinn"). - - - Damit haben wir den "Einer" addiert. - Als nächstes kommt der "Zehner" (tatsächlich: der 2^32er). - --> Wir gehen das Array in einer Schleife von rechts nach links durch. - -Weniger effizient, aber leichter auszugeben: Dezimalziffern als Array speichern. ---> siehe ../20201203/fibonacci-*.c - - * Quelle: ../20201203/fibonacci-10.c - 173 402 521 172 797 813 159 685 037 284 371 942 044 301 - ---> :-) - -f[9999] = 20793608237133498072112648988642836825087036094015903119682945866528501423455686648927456034305226515591757343297190158010624794267250973176133810179902738038231789748346235556483191431591924532394420028067810320408724414693462849062668387083308048250920654493340878733226377580847446324873797603734794648258113858631550404081017260381202919943892370942852601647398213554479081823593715429566945149312993664846779090437799284773675379284270660175134664833266377698642012106891355791141872776934080803504956794094648292880566056364718187662668970758537383352677420835574155945658542003634765324541006121012446785689171494803262408602693091211601973938229446636049901531963286159699077880427720289235539329671877182915643419079186525118678856821600897520171070499437657067342400871083908811800976259727431820539554256869460815355918458253398234382360435762759823179896116748424269545924633204614137992850814352018738480923581553988990897151469406131695614497783720743461373756218685106856826090696339815490921253714537241866911604250597353747823733268178182198509240226955826416016690084749816072843582488613184829905383150180047844353751554201573833105521980998123833253261228689824051777846588461079790807828367132384798451794011076569057522158680378961532160858387223882974380483931929541222100800313580688585002598879566463221427820448492565073106595808837401648996423563386109782045634122467872921845606409174360635618216883812562321664442822952537577492715365321134204530686742435454505103269768144370118494906390254934942358904031509877369722437053383165360388595116980245927935225901537634925654872380877183008301074569444002426436414756905094535072804764684492105680024739914490555904391369218696387092918189246157103450387050229300603241611410707453960080170928277951834763216705242485820801423866526633816082921442883095463259080471819329201710147828025221385656340207489796317663278872207607791034431700112753558813478888727503825389066823098683355695718137867882982111710796422706778536913192342733364556727928018953989153106047379741280794091639429908796650294603536651238230626 -(2090 Ziffern) diff --git a/20201112/functions-1.c b/20201112/functions-1.c deleted file mode 100644 index 09d985fad681138e9a922a7f21e2379d474604b0..0000000000000000000000000000000000000000 --- a/20201112/functions-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void add_verbose (int a, int b) -{ - printf ("%d + %d = %d\n", a, b, a + b); -} - -int main (void) -{ - add_verbose (3, 7); - return 0; -} diff --git a/20201112/functions-10.c b/20201112/functions-10.c deleted file mode 100644 index ad641f07f7e8a4054876dd32048893e8a873756e..0000000000000000000000000000000000000000 --- a/20201112/functions-10.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-11.c b/20201112/functions-11.c deleted file mode 100644 index 9d05928f1a8180fe8217eca6bccf9712aa76bf22..0000000000000000000000000000000000000000 --- a/20201112/functions-11.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-12.c b/20201112/functions-12.c deleted file mode 100644 index 28c42f65af3992c21c4ba7156b8d96cae46f2423..0000000000000000000000000000000000000000 --- a/20201112/functions-12.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -/* - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -*/ - -int main (void) -{ - int a, b = 3; - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-13.c b/20201112/functions-13.c deleted file mode 100644 index 2ecf18b5cabfc427a2f9565fad00498214e4c575..0000000000000000000000000000000000000000 --- a/20201112/functions-13.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); -/* - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-14.c b/20201112/functions-14.c deleted file mode 100644 index cd9e2e0fd6c63cbdf2f4e81dd97a6f11b5b5074a..0000000000000000000000000000000000000000 --- a/20201112/functions-14.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-15.c b/20201112/functions-15.c deleted file mode 100644 index 9cf7165357fd2776a1ddcb446a65ab13e2fce6d4..0000000000000000000000000000000000000000 --- a/20201112/functions-15.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - a++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-16.c b/20201112/functions-16.c deleted file mode 100644 index 449b1a8977645c734f1b19d56412e8f805228322..0000000000000000000000000000000000000000 --- a/20201112/functions-16.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-17.c b/20201112/functions-17.c deleted file mode 100644 index 060bbf83a72a7f1d611a6e5da7f1003595053641..0000000000000000000000000000000000000000 --- a/20201112/functions-17.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = 12; - b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-18.c b/20201112/functions-18.c deleted file mode 100644 index b5938747e6c21ad5b2e714b79e90ea33a877b698..0000000000000000000000000000000000000000 --- a/20201112/functions-18.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); -/* - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-19.c b/20201112/functions-19.c deleted file mode 100644 index d6b79a3bff03197295a6f98e98e1270562e62486..0000000000000000000000000000000000000000 --- a/20201112/functions-19.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -void bar (void) -{ - static int a = 42; - printf ("bar(): " "a = %d, b = %d\n", a, b); -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - bar (); -/* - printf ("main(): " "a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20201112/functions-2.c b/20201112/functions-2.c deleted file mode 100644 index b09b8e32bd8e5dfc7958bc3bf01c6847329c5b1c..0000000000000000000000000000000000000000 --- a/20201112/functions-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void add_verbose (int a, int b) -{ - printf ("%d + %d = %d\n", a, b, a + b); -} - -int main (void) -{ - int a = add_verbose (3, 7); - return 0; -} diff --git a/20201112/functions-20.c b/20201112/functions-20.c deleted file mode 100644 index d6aa7c54fae1fbb49b36f9c851997bfc98d84a27..0000000000000000000000000000000000000000 --- a/20201112/functions-20.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20201112/functions-21.c b/20201112/functions-21.c deleted file mode 100644 index c2227a37337933854056d2c2affee96fb43424f2..0000000000000000000000000000000000000000 --- a/20201112/functions-21.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20201112/functions-3.c b/20201112/functions-3.c deleted file mode 100644 index c4a6e39de59add196b12a4f9da63bb769326aa60..0000000000000000000000000000000000000000 --- a/20201112/functions-3.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void add_verbose (int a, int b) -{ - printf ("%d + %d = %d\n", a, b, a + b); -} - -int main (void) -{ - void a = add_verbose (3, 7); - return 0; -} diff --git a/20201112/functions-4.c b/20201112/functions-4.c deleted file mode 100644 index 0bff50c9b0ad954586a8979c3445953b30e0371f..0000000000000000000000000000000000000000 --- a/20201112/functions-4.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -void print_hello (void) -{ - printf ("Hello, world!\n"); -} - -int main (void) -{ - print_hello (); - print_hello (); - return 0; -} diff --git a/20201112/functions-5.c b/20201112/functions-5.c deleted file mode 100644 index bf9d5729f0e72a95d6c89a8da64e64c94196241b..0000000000000000000000000000000000000000 --- a/20201112/functions-5.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 42; -} - -int main (void) -{ - print_hello (); - print_hello (); - return 0; -} diff --git a/20201112/functions-6.c b/20201112/functions-6.c deleted file mode 100644 index f7d53df85008f6f8370c9a24047326e1603354f0..0000000000000000000000000000000000000000 --- a/20201112/functions-6.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 42; -} - -void main (void) -{ - print_hello (); - print_hello (); -} diff --git a/20201112/functions-7.c b/20201112/functions-7.c deleted file mode 100644 index 8d9c8d1675de779bb3e59b6d4f0d9b2f0f0aa440..0000000000000000000000000000000000000000 --- a/20201112/functions-7.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 42; -} - -int main (void) -{ - print_hello (); - print_hello (); - return 42; -} diff --git a/20201112/functions-7.txt b/20201112/functions-7.txt deleted file mode 100644 index 26b41b9ebe46fddad60ea08f4a8011bcdd40fefd..0000000000000000000000000000000000000000 --- a/20201112/functions-7.txt +++ /dev/null @@ -1,36 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 42; -} - -int main (void) -{ - print_hello (); - print_hello (); - return 42; -} -cassini/home/peter/bo/2020ws/hp/20201112> gcc -Wall -O functions-7.c -o functions-7 cassini/home/peter/bo/2020ws/hp/20201112> if ./functions-7; then echo "Hat geklappt."; else echo "Hat nicht geklappt."; fi -Hello, world! -Hello, world! -Hat nicht geklappt. -cassini/home/peter/bo/2020ws/hp/20201112> echo $? -0 -cassini/home/peter/bo/2020ws/hp/20201112> ./functions-7 -Hello, world! -Hello, world! -cassini/home/peter/bo/2020ws/hp/20201112> echo $? -42 -cassini/home/peter/bo/2020ws/hp/20201112> ./functions-6 -Hello, world! -Hello, world! -cassini/home/peter/bo/2020ws/hp/20201112> echo $? -42 -cassini/home/peter/bo/2020ws/hp/20201112> ./functions-5 -Hello, world! -Hello, world! -cassini/home/peter/bo/2020ws/hp/20201112> echo $? -0 -cassini/home/peter/bo/2020ws/hp/20201112> diff --git a/20201112/functions-8.c b/20201112/functions-8.c deleted file mode 100644 index b12831230dc2e6d9ed775e9db180d798baee7673..0000000000000000000000000000000000000000 --- a/20201112/functions-8.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 137; -} - -void main (void) -{ - print_hello (); - print_hello (); -} diff --git a/20201112/functions-8.txt b/20201112/functions-8.txt deleted file mode 100644 index 67451237c74c9d0a83898330fbba475e8efec185..0000000000000000000000000000000000000000 --- a/20201112/functions-8.txt +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -int print_hello (void) -{ - printf ("Hello, world!\n"); - return 137; -} - -void main (void) -{ - print_hello (); - print_hello (); -} -cassini/home/peter/bo/2020ws/hp/20201112> gcc -Wall -O functions-8.c -o functions-8 functions-8.c:9:6: warning: return type of ‘main’ is not ‘int’ [-Wmain] - void main (void) - ^~~~ -cassini/home/peter/bo/2020ws/hp/20201112> ./functions-8 -Hello, world! -Hello, world! -cassini/home/peter/bo/2020ws/hp/20201112> echo $? -137 -cassini/home/peter/bo/2020ws/hp/20201112> diff --git a/20201112/functions-9.c b/20201112/functions-9.c deleted file mode 100644 index 1f8d7ce8f62ecb3ea4c9afe552e98dd30c512894..0000000000000000000000000000000000000000 --- a/20201112/functions-9.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): " "a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): " "a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): " "a = %d, b = %d\n", a, b); - foo (); - printf ("main(): " "a = %d, b = %d\n", a, b); - return 0; -*/ -} diff --git a/20201112/gitlab.png b/20201112/gitlab.png deleted file mode 100644 index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000 Binary files a/20201112/gitlab.png and /dev/null differ diff --git a/20201112/hello-1-O0.s b/20201112/hello-1-O0.s deleted file mode 100644 index 25d65981166e1534883ba3df675651412e484f5d..0000000000000000000000000000000000000000 --- a/20201112/hello-1-O0.s +++ /dev/null @@ -1,27 +0,0 @@ - .file "hello-1.c" - .text - .section .rodata -.LC0: - .string "Hello, world!" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - movq %rsp, %rbp - .cfi_def_cfa_register 6 - leaq .LC0(%rip), %rdi - call puts@PLT - movl $0, %eax - popq %rbp - .cfi_def_cfa 7, 8 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201112/hello-1-O1.s b/20201112/hello-1-O1.s deleted file mode 100644 index 62e109941c257c18e147f35cb6d795f5df027b4b..0000000000000000000000000000000000000000 --- a/20201112/hello-1-O1.s +++ /dev/null @@ -1,24 +0,0 @@ - .file "hello-1.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "Hello, world!" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - leaq .LC0(%rip), %rdi - call puts@PLT - movl $0, %eax - addq $8, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201112/hello-1.c b/20201112/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20201112/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201112/hp-20201112-fig1.pdf b/20201112/hp-20201112-fig1.pdf deleted file mode 100644 index d4e9c5f6d40d491efa9b49f4e1bcd0c9a0497924..0000000000000000000000000000000000000000 Binary files a/20201112/hp-20201112-fig1.pdf and /dev/null differ diff --git a/20201112/hp-20201112-fig1.tex b/20201112/hp-20201112-fig1.tex deleted file mode 100644 index 638a00ac007de5fa087a72f96be8776db32ed75f..0000000000000000000000000000000000000000 --- a/20201112/hp-20201112-fig1.tex +++ /dev/null @@ -1,60 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \psscalebox{0.8}{% - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - } - -\end{document} diff --git a/20201112/hp-20201112.pdf b/20201112/hp-20201112.pdf deleted file mode 100644 index 7bedab72706e692695171fd77d8eb0a3bf864c0b..0000000000000000000000000000000000000000 Binary files a/20201112/hp-20201112.pdf and /dev/null differ diff --git a/20201112/hp-20201112.tex b/20201112/hp-20201112.tex deleted file mode 100644 index aac071d34b356f21928fea3f804f52445765464a..0000000000000000000000000000000000000000 --- a/20201112/hp-20201112.tex +++ /dev/null @@ -1,1194 +0,0 @@ -% hp-20201112.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Seiteneffekte, Funktionen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{12.\ November 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \begin{itemize} - \color{medgreen} - \item[1.1] Was ist hardwarenahe Programmierung? - \item[1.2] Programmierung in C - \item[1.3] Zu dieser Lehrveranstaltung - \end{itemize} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \color{medgreen} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{orange} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \color{red} - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \item[2.11] Arrays und Strings -% \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} -% \item[\textbf{3}] \textbf{Bibliotheken} -% \vspace*{-\smallskipamount} -% \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \vspace{-0.6cm} - \begin{center} - \begin{pdfpic} - \psscalebox{0.8}{% - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - } - \end{pdfpic} - \end{center} - -\end{frame} - -\section{Einführung} -\subsection{Was ist hardwarenahe Programmierung?} - -\begin{frame} - - \showsection - \showsubsection - - Man kann Computer \hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.55]{hp-20201112-fig1.pdf}}\\ - vollständig beherrschen. - -% \begin{onlyenv}<1> -% -% \vspace*{2cm} -% -% {\Large\color{structure}\textbf{Rechnertechnik}} -% -% \bigskip -% -% Man kann vollständig verstehen, wie Computer funktionieren. -% -% \vspace*{-3cm} -% -% \end{onlyenv} - -% \pause - - \vspace{0cm plus 1filll} - - \subsection{Programmierung in C} - \showsubsection - - \vspace{-\medskipamount} - - \begin{itemize} -% \item -% kleinster gemeinsamer Nenner für viele Plattformen\\ -% \pause -% \begin{picture}(0,1) -% \color{red} -% \put(7.2,0.6){\vector(0,1){0.4}} -% \put(7.2,0.5){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}} -% \end{picture} -% \pause -% \medskip - \item - Hardware direkt ansprechen\\ - und effizient einsetzen - \medskip - \item - \dots\ bis hin zu komplexen\\ - Software-Projekten - \medskip - \item - Programmierkenntnisse werden nicht vorausgesetzt,\\ - aber schnelles Tempo - \end{itemize} - -\end{frame} - -\subsectionnonumber{Programmierung in C} - -\begin{frame} - - \showsection - \showsubsection - - Etabliertes Profi-Werkzeug - \begin{itemize} - \item - kleinster gemeinsamer Nenner für viele Plattformen -% \pause - \begin{picture}(0,0) - \color{red} - \put(-1.0,-0.8){\vector(0,1){0.7}} - \put(-1.0,-0.9){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}} - \end{picture} -% \pause - \item - leistungsfähig, aber gefährlich - \end{itemize} - -% \pause - \medskip - "`High-Level-Assembler"' - \begin{itemize} -% \pause - \item - kein "`Fallschirm"' -% \pause - \item - kompakte Schreibweise - \end{itemize} - -% \pause - \medskip - Unix-Hintergrund - \begin{itemize} -% \pause - \item - Baukastenprinzip -% \pause - \item - konsequente Regeln -% \pause - \item - kein "`Fallschirm"' - \end{itemize} - -\end{frame} - -\subsection{Zu dieser Lehrveranstaltung} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - \textbf{Lehrmaterialien:}% - \hfill\makebox(0,0)[r]{\includegraphics[width=3.5cm]{gitlab.png}}\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - \item - \textbf{Klausur:} - - Zeit: 150 Minuten - - Zulässige Hilfsmittel: - \begin{itemize} - \item Schreibgerät - \item beliebige Unterlagen in Papierform und/oder auf Datenträgern - \item elektronische Rechner (Notebook, Taschenrechner o.\,ä.) - \item \emph{kein\/} Internet-Zugang - \end{itemize} - \item - \textbf{Übungen}\\ - Nutzen Sie die Gelegenheit, Fragen zu stellen! - \item - \textbf{Praktikum} - \begin{itemize} - \item zunächst keine festen Termine - \item Quelltext zukommen lassen, zusammen durchgehen - \item zusätzliche Themen, z.\,B.\ Grundlagen Unix-Shell - \end{itemize} - \end{itemize} - -\end{frame} - -\section{Einführung in C} -\subsection{Hello, world!} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Text ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} -% \pause - \begin{picture}(0,0) - \color{red} - \put(5.0,1.5){\makebox(0,0)[bl]{printf = "`print formatted"'}} -% \pause - \put(4.0,0.4){\makebox(0,0)[br]{\tikz{\draw[-latex](0.0,0.0)--(-0.3,0.7);}}} - \put(4.0,0.3){\makebox(0,0)[t]{\textbackslash n: Zeilenschaltung}} - \end{picture} - -\end{frame} - -\subsection{Programme compilieren und ausführen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{onlyenv}<1-3> - \begin{lstlisting}[style=terminal,gobble=6] - $ ¡gcc hello-1.c -o hello-1¿ - $ ¡./hello-1¿ - Hello, world! - $ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4-> - \begin{lstlisting}[style=terminal,gobble=6] - $ ¡gcc -Wall -O hello-1.c -o hello-1¿ - $ ¡./hello-1¿ - Hello, world! - $ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \bigskip - Hier: Kommandozeilen-Interface (CLI) - \begin{itemize} - \item - Der C-Compiler (hier: \lstinline[style=cmd]{gcc}) - muß installiert sein und sich im \lstinline[style=terminal]{PATH} befinden. - \item - Der Quelltext (hier: \file{hello.c}) - muß sich im aktuellen Verzeichnis befinden. - \item - aktuelles Verzeichnis herausfinden: \lstinline[style=cmd]{pwd} - \item - aktuelles Verzeichnis wechseln: \lstinline[style=cmd]{cd foobar}, \lstinline[style=cmd]{cd ..} - \item - Inhalt des aktuellen Verzeichnisses ausgeben: \lstinline[style=cmd]{ls}, \lstinline[style=cmd]{ls -l} - \item - Ausführen des Programms (\file{hello-1}) im aktuellen Verzeichnis (\file{.}):\\ - \lstinline[style=cmd]{./hello-1} - \end{itemize} - - Alternative: Integrierte Entwicklungsumgebung (IDE)\\ - mit graphischer Benutzeroberfläche (GUI) - \begin{itemize} - \item - Das können Sie bereits. - \end{itemize} - \end{onlyenv} - \begin{onlyenv}<3> - \bigskip - GNU Compiler Collection (GCC) für verschiedene Plattformen: - \begin{itemize} - \item - GNU/Linux: \file{gcc} - \item - Apple Mac OS: \file{Xcode} - \item - Microsoft Windows: \file{Cygwin}\\ - oder \file{MinGW} mit \file{MSYS} - \medskip - \item - außerdem: Texteditor\\ - \file{vi}(\file{m}), \file{nano}, - \file{Emacs}, \file{Notepad++}, \dots\\ - (Microsoft Notepad ist \emph{nicht} geeignet!) - \end{itemize} - \end{onlyenv} - \begin{onlyenv}<1> - \begin{picture}(0,0) - \color{red} - \put(4.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-2.0,1.0);}} - \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{8cm} - \begin{tabular}{ll} - \lstinline[style=cmd]{-o hello-1} - & Name für Ausgabe-Datei ("`output"') \\ - & unter Unix: ohne Endung \\ - & unter MS-Windows: Endung \lstinline[style=cmd]{.exe} - \end{tabular} - \end{minipage}}} - \end{picture} - \end{onlyenv} - \begin{onlyenv}<4-> - \begin{picture}(0,0) - \color{red} - \put(3.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-3.0,1.0);}} - \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{6cm} - \begin{tabular}{ll} - \lstinline[style=cmd]{-Wall} & alle Warnungen einschalten\\ - \lstinline[style=cmd]{-O} & optimieren\\ - \lstinline[style=cmd]{-O3} & maximal optimieren\\ - \lstinline[style=cmd]{-Os} & Codegröße optimieren\\[\smallskipamount] - \dots & gcc hat \emph{sehr viele\/} Optionen. - \end{tabular} - \end{minipage}}} - \end{picture} - \end{onlyenv} - -\end{frame} - -\subsection{Elementare Aus- und Eingabe} - -\begin{frame}[fragile] - - \showsubsection - - Wert ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: "); - printf (42); - printf ("\n"); - return 0; - } - \end{lstlisting} -% \pause - \medskip - \textarrow\ Absturz - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Wert ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: %d\n", 42); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(5.3,0.65){\tikz{\draw[-latex](0.0,0.0)--(-0.5,0.5);}} - \put(5.9,0.35){\begin{minipage}[t]{6.5cm} - Formatspezifikation "`d"': "`dezimal"'%\pause - \\[\smallskipamount] - Weitere Formatspezifikationen:\\ - siehe Dokumentation (z.\,B.\ man 3 printf),\\ - Internet-Recherche oder Literatur - \end{minipage}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Wert einlesen - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.4,1.8){\tikz{\draw[-latex](0.0,0.0)--(-3.5,0);}} - \put(7.0,1.9){\begin{minipage}[t]{5cm} - Formatspezifikation "`lf"':\\ - "`long floating-point"'\\[\smallskipamount] - Das "`\&"' nicht vergessen! - \end{minipage}} - \end{picture} - -\end{frame} - -\subsection{Elementares Rechnen} - -\begin{frame}[fragile] - - \showsubsection - - Wert an Variable zuweisen - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - a = 2 * a; - printf ("Das Doppelte ist: %d\n", a); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable bei Deklaration initialisieren - - \bigskip - - \begin{lstlisting} - int a = 42; - a = 137; - \end{lstlisting} - - \bigskip - - \textbf{Achtung:} Initialisierung $\ne$ Zuweisung - - \smallskip - - Die beiden Gleichzeitszeichen haben\\ - \emph{subtil unterschiedliche\/} Bedeutungen! - -\end{frame} - -\subsection{Verzweigungen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{if}-Verzweigung - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b != 0) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage}\pause - \begin{minipage}[t]{6cm} - \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount] - 0 steht für \emph{falsch (false)},\\ - $\ne 0$ steht für \emph{wahr (true)}. - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Schleifen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } - \end{lstlisting} - \end{minipage}\pause - \begin{minipage}[t]{6cm} - \lstinline{for}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - for (a = 1; a <= 10; a = a + 1) - printf ("%d\n", a); - \end{lstlisting} - \vspace{1.5cm} - \pause - \lstinline{do}-\lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<4->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<2-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<3-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<5-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \color{medgreen} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \color{red} - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[\dots] -% \item[2.12] Strukturen -% \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\subsection{Seiteneffekte} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; - } - \end{lstlisting} - \pause - \begin{picture}(0,0) - \color{red} - \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}} - \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}} - \pause - \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \pause - \bigskip - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿ - $ ¡./side-effects-1¿ - Hello, world! - 14 - $ - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \begin{itemize} - \item - \lstinline{printf()} ist eine Funktion. - \pause - \item - "`Haupteffekt"': Wert zurückliefern\\ - (hier: Anzahl der ausgegebenen Zeichen) - \pause - \item - \newterm{Seiteneffekt\/}: Ausgabe - \end{itemize} - -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Seiteneffekte \protect\color{gray}bei Operatoren} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - Unäre Operatoren: - \begin{itemize} - \item - Negation: \lstinline{-foo} - \item - {\only<2->{\color{red}}Funktionsaufruf}: \lstinline{foo ()} - \item - {\only<2->{\color{red}}Post-Inkrement}: \lstinline{foo++} - \item - {\only<2->{\color{red}}Post-Dekrement}: \lstinline{foo--} - \item - {\only<2->{\color{red}}Prä-Inkrement}: \lstinline{++foo} - \item - {\only<2->{\color{red}}Prä-Dekrement}: \lstinline{--foo} - \end{itemize} - \medskip - Binäre Operatoren: - \begin{itemize} - \item - Rechnen: \lstinline{+ - * / %} - \item - Vergleich: \lstinline{== != < > <= >=} - \item - {\only<2->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=} - \item - Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b} - \end{itemize} - \pause - \medskip - {\color{red}rot = mit Seiteneffekt} - \end{minipage} - \pause - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i;¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{-2} -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<4->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<2-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<3-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<5-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Funktionen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int answer (void) - { - return 42; - } - - void foo (void) - { - printf ("%d\n", answer ()); - } - - int main (void) - { - foo (); - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \pause - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - void add_verbose (int a, int b) - { - printf ("%d + %d = %d\n", a, b, a + b); - } - - int main (void) - { - add_verbose (3, 7); - return 0; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \pause - \bigskip - \item - Der Datentyp \lstinline{void}\\ - steht für "`nichts"'\\ - und \alt<3->{muß}{kann} ignoriert werden. - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): " - "a = %d, b = %d\n", - a, b); - a++; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace{-1cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - a = b = 12; - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\end{document} diff --git a/20201112/hp-2020ws-p1.pdf b/20201112/hp-2020ws-p1.pdf deleted file mode 100644 index 53d11a2244231aeaf456105cc01b7cd12b9a817e..0000000000000000000000000000000000000000 Binary files a/20201112/hp-2020ws-p1.pdf and /dev/null differ diff --git a/20201112/hp-2020ws-p1.tex b/20201112/hp-2020ws-p1.tex deleted file mode 100644 index 46566d8a56196bbd4b5db233cec529b9968a46b1..0000000000000000000000000000000000000000 --- a/20201112/hp-2020ws-p1.tex +++ /dev/null @@ -1,199 +0,0 @@ -% hp-2020ws-p1.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 1: RSA-Verschlüsselung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{sfmath} - -\sloppy -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC BY-SA (Version 4.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 1: RSA-Verschlüsselung} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2020/21\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein Programm, das - die Verschlüsselung nach Rivest, Shamir und Adleman (RSA) - sowie die Schwierigkeiten beim Brechen ("`Knacken"') der - Verschlüsselung demonstriert. - - \begin{multicols}{2} - - Schreiben Sie ein C-Programm (oder mehrere), - das folgendes durchführt: - - \begin{itemize} - \item - \textbf{Schlüsselerzeugung} - - Bestimmen Sie drei verschiedene Primzahlen $p$, $q$ und $e$, wobei $e$ - kleiner als $(\kern0.5pt p-1)\cdot(q-1)$ und teilerfremd zu $(\kern0.5pt p-1)\cdot(q-1)$ sei. - (Dies ist z.\,B.\ der Fall, wenn $e$ größer als $p$ und $q$ ist.) - - Berechnen Sie $N = p \cdot q$ - sowie eine natürliche Zahl $d$ mit der Eigenschaft: - \begin{displaymath} - (e \cdot d) \,\%\, \bigl((\kern0.5pt p-1)\cdot(q-1)\bigr) = 1 - \end{displaymath} - ("`$x \,\%\, y\/$"' wird "`x modulo y"' gesprochen und steht - für den Rest, der bei Division von $x$ durch $y$ verbleibt.) - - $N$ und $e$ sind der \newterm{öffentliche Schlüssel}. \\ - $p$, $q$ und $d$ sind der \newterm{geheime Schlüssel}. - - \item - \textbf{Verschlüsselung} - - Wählen Sie eine geheime Botschaft $m$ eine Zahl kleiner als $N$, - die Sie verschlüsseln wollen. - - $m$ muß teilerfremd zu $N$ sein. - (Dies ist der Fall, wenn $m$ weder durch $p$ noch durch $q$ teilbar ist.) - - Schreiben Sie ein Programm, das aus $m$ die verschlüsselte - Nachricht $c$ berechnet: - \begin{displaymath} - c = m^e ~\%\, N - \end{displaymath} - - \textbf{Hinweis:} - \begin{displaymath} - m^e ~\%\, N - = \underbrace{(m \cdot m \cdot \dots \cdot m)}_{\mbox{$e$ Faktoren}} \,\%\, N - \hspace*{2cm} - \end{displaymath} - \vspace*{-\medskipamount} - \begin{displaymath} - = \underbrace{\Bigl(\dots\bigl((m \cdot m) \,\%\, N \cdot m\bigr) \,\%\, N \cdot \dots \cdot m\Bigr) \,\%\, N}_{\mbox{$e$ Faktoren}} - \end{displaymath} - - Dies bedeutet: Multiplizieren Sie die Zahl $m$ $e$-mal mit sich selbst, - wobei Sie \emph{nach jeder Multiplikation\/} modulo $N$ rechnen. - - \item - \textbf{Entschlüsselung} - - Rekonstruieren Sie aus der verschlüsselten Botschaft $c$ - wieder die geheime Botschaft $m$: - \begin{displaymath} - m = c^d ~\%\, N - \end{displaymath} - - \item - \textbf{Verschlüsselung brechen} - - Rekonstruieren Sie aus der verschlüsselten Botschaft $c$ - wieder die geheime Botschaft $m$, - \emph{ohne\/} den geheimen Schlüssel zu kennen, - d.\,h.\ Sie kennen nur $N$ und $e$, nicht jedoch $p$, $q$ und $d$. - - \textbf{Hinweis:} - Sie können z.\,B.\ versuchen, $N$ in seine Primfaktoren zu zerlegen. - Auf diese Weise können Sie zunächst $p$ und $q$ berechnen und danach $d$. - - \item - \textbf{Rechenzeit vergleichen} - - Vergleichen Sie nun - die für das Brechen der Verschlüsselung benötigte Rechenzeit - mit der Zeit, die das reguläre Ver- und Entschlüsseln dauert. - (Auf diesem Schwierigkeitsunterschied - beruht die Sicherheit der RSA-Verschlüsselung.) - - \textbf{Hinweis 1:} -% Wenn Sie ein Programm per Kommandozeile mit \lstinline[style=cmd]{time ./programm} starten, -% wird Ihnen angezeigt, wieviel Rechenzeit das Programm benötigt hat. -% Die drei angezeigten Werte stehen hierbei für die -% tatsächlich verstrichene Gesamtzeit (\lstinline[style=terminal]{real}), -% für die mit Rechnen verbrachte Zeit (\lstinline[style=terminal]{user}) -% und für die mit Systemaufrufen (z.\,B.\ Ein- und Ausgabe) -% verbrachte Zeit (\lstinline[style=terminal]{sys}). - Ein einfacher Weg, die von Ihrem Programm benötigte Rechenzeit zu messen, - ist die Verwendung der Funktion \lstinline{clock()}. - Diese gibt zurück, wieviel Rechenzeit seit Programmstart aufgewendet wurde. - Der Typ dieses Rückgabewerts ist ein ganzzahliger Typ, \lstinline{clock_t}, - mit dem man rechnen und den man mit \lstinline{%ld} ausgeben kann. - Pro Sekunde wächst der Zähler um \lstinline{CLOCKS_PER_SEC} Einheiten. - Typischerweise hat \lstinline{CLOCKS_PER_SEC} den Wert \lstinline{1000000} - oder \lstinline{1000}, die Zeiteinheit ist also eine Mikrosekunde - bzw.\ eine Millisekunde. - - \textbf{Hinweis 2:} - Die mit der o.\,a.\ Methode meßbaren Zeiten sind eigentlich zu ungenau, - um damit die sehr kurzen Rechenzeiten erfassen zu können -- - etwa so, als wollten Sie mit einem Lineal mit Millimetereinteilung - die Dicke eines Blatts Papier messen. Beides ist jedoch möglich. - - \item - \textbf{Abgabe:} - Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte - per E-Mail an \file{peter.gerwinski@hs-bochum.de} - mit dem \textbf{Betreff:} \lstinline[style=terminal]{fi2niNoh} - unter Angabe von Name, Matrikel-Nummer, - Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS). - - \end{itemize} - - \end{multicols} - - \vspace*{-\bigskipamount} - - \strut\hfill\emph{Viel Erfolg!} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 17.\ Dezember 2020 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019, 2020\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -%% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20201112/hp-musterloesung-20201112.pdf b/20201112/hp-musterloesung-20201112.pdf deleted file mode 100644 index a30be210e47015cbbcb98cbfc5469c0e1975f0f9..0000000000000000000000000000000000000000 Binary files a/20201112/hp-musterloesung-20201112.pdf and /dev/null differ diff --git a/20201112/hp-musterloesung-20201112.tex b/20201112/hp-musterloesung-20201112.tex deleted file mode 100644 index 37247f42e0c7f9f4bd32644a9cbd749c28039a26..0000000000000000000000000000000000000000 --- a/20201112/hp-musterloesung-20201112.tex +++ /dev/null @@ -1,326 +0,0 @@ -% hp-musterloesung-20201112.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 12.\ November 2020} - - \exercise{Schaltjahr ermitteln} - - Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt - und ausgibt, ob es sich um ein Schaltjahr handelt. - \begin{itemize} - \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr. - \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr. - \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\ - ist das Jahr doch wieder ein Schaltjahr. - \end{itemize} - - \solution - - Am einfachsten ist es, die Aufgabenstellung in geschachtelte - \lstinline{if}-Verzweigungen zu übersetzen. - Im folgenden finden Sie eine Funktion \lstinline{is_leap_year()}, - der man das Jahr übergibt und die für Schaltjahre \lstinline{1} - zurückgibt und für Nicht-Schaltjahre \lstinline{0}. - \begin{lstlisting} - #include <stdio.h> - - int is_leap_year (int year) - { - int leap_year = 0; - if (year % 4 == 0) - { - leap_year = 1; - if (year % 100 == 0) - { - leap_year = 0; - if (year % 400 == 0) - leap_year = 1; - } - } - return leap_year; - } - \end{lstlisting} - (In C steht \lstinline{0} für den Wahrheitswert "`falsch"' - und jeder Wert ungleich \lstinline{0} für den Wahrheitswert "`wahr'"; - die Zeile \lstinline{leap_year = 0} steht daher wörtlich und - selbsterklärend für "`ist kein Schaltjahr"'.) - - Unter Verwendung von \lstinline{else} läßt sich dies verkürzen zu: - \begin{lstlisting} - #include <stdio.h> - - int is_leap_year (int year) - { - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - return 1; - else - return 0; - } - else - return 1; - } - else - return 0; - } - \end{lstlisting} - - Eine andere Möglichkeit ist es, die Schaltjahr-Bedingung in eine - Kette von "`und"'- und "`oder"'-Verknüpfungen - (C-Operatoren \lstinline{&&} und \lstinline{||}) zu übersetzen: - \begin{lstlisting} - int is_leap_year (int year) - { - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - return 1; - else - return 0; - } - \end{lstlisting} - Dies ist zwar kürzer, aber nicht unbedingt übersichtlicher. - Der erzeugte Code ist übrigens \emph{nicht\/} kürzer und/oder - effizienter als bei der Verwendung mehrerer - \lstinline{if}-Verzweigungen. - Wir empfehlen, daß Sie immer so programmieren, - daß Sie selbst den maximalen Überblick über Ihr Programm behalten. - - \goodbreak - - Ein Hauptprogramm, das die o.\,a.\ Funktion aufruft, - könnte dann wie folgt aussehen: - \begin{lstlisting} - int main (void) - { - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; - } - \end{lstlisting} - In den Dateien \gitfile{hp}{2020ws/20201112}{loesung-1-1.c} bis \gitfile{hp}{2020ws/20201112}{loesung-1-3.c} - finden Sie lauffähige Programme, die die o.\,a.\ Funktionen aufrufen. - Beachten Sie, daß die Funktion \emph{vor\/} dem Hauptprogramm - deklariert werden muß, damit das Hauptprogramm sie kennt. - (Es gibt Tricks, mit denen es auch anders geht, - aber was hätten wir in diesem Zusammenhang davon?) - - In \gitfile{hp}{2020ws/20201112}{loesung-1-4.c} und \gitfile{hp}{2020ws/20201112}{loesung-1-5.c} - findet die Schaltjahr-Prüfung direkt im Hauptprogramm statt. - Dies ist ebenfalls eine richtige Lösung der Aufgabe, - schränkt aber die Wiederverwertbarkeit des Codes ein. - - Die Datei \gitfile{hp}{2020ws/20201112}{loesung-1-4.c} enthält darüberhinaus Codeverdopplungen, - nämlich mehrere identische \lstinline{printf()}-Auf"-rufe - an unterschiedlichen Stellen. - Dies ist schlechter Programmierstil ("`Cut-and-paste-Programmierung"'). - - Die besten Lösungen sind \gitfile{hp}{2020ws/20201112}{loesung-1-2.c} - und \gitfile{hp}{2020ws/20201112}{loesung-1-3.c}. - - \goodbreak - - Zum Testen:\vspace*{-\medskipamount} - \begin{itemize}\itemsep0pt - \item 1900 ist kein Schaltjahr. - \item 1902 ist kein Schaltjahr. - \item 1904 ist ein Schaltjahr. - \item 1996 ist ein Schaltjahr. - \item 1998 ist kein Schaltjahr. - \item 2000 ist ein Schaltjahr. - \item 2002 ist kein Schaltjahr. - \item 2004 ist ein Schaltjahr. - \item 2017 ist kein Schaltjahr. - \item 2018 ist kein Schaltjahr. - \item 2019 ist kein Schaltjahr. - \item 2020 ist ein Schaltjahr. - \end{itemize} - - \goodbreak - - Hier noch ein Hinweis für Unix-Shell-Experten: - \begin{lstlisting}[style=cmd] - for y in 1 2 3 4 5; do - clear - for x in 1900 1902 1904 1996 1998 2000 2002 2004 2017 2018 2019 2020; do - echo $x | ./loesung-1-$y - done - sleep 2s - done - \end{lstlisting} - - \exercise{Multiplikationstabelle} - - Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\ - Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen: - \begin{lstlisting}[style=terminal] - 1 * 7 = 7 - 2 * 7 = 14 - ... - 10 * 7 = 70 - \end{lstlisting} - Hinweis: Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\ - (siehe dazu die Dokumentation zu \lstinline{printf()}, - z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,) - - \solution - - Drei verschiedene richtige Lösungen finden Sie in den Dateien - \gitfile{hp}{2020ws/20201112}{loesung-2-1.c}, \gitfile{hp}{2020ws/20201112}{loesung-2-2.c} und \gitfile{hp}{2020ws/20201112}{loesung-2-3.c}. - (Zum Compilieren von \gitfile{hp}{2020ws/20201112}{loesung-2-2.c} und \gitfile{hp}{2020ws/20201112}{loesung-2-3.c} - ist mindestens der C99-Standard erforderlich; bitte nötigenfalls - in \file{gcc} die Option \lstinline[style=cmd]{-std=c99} mit angeben.) - - Die Lösung in \gitfile{hp}{2020ws/20201112}{loesung-2-3.c} ist zwar richtig, - aber unnötig kompliziert und daher nicht empfohlen. - - Eine \textbf{falsche} Lösung finden Sie in der Datei \gitfile{hp}{2020ws/20201112}{loesung-2-f4.c}: - In der Ausgabe dieses Programms stehen die Faktoren und Ergebnisse - nicht rechtsbündig untereinander. - - \exercise{Fibonacci-Zahlen} - - Die Folge der Fibonacci-Zahlen ist definiert durch: - \begin{quote} - 1.\ Zahl: 0\\ - 2.\ Zahl: 1\\ - nächste Zahl = Summe der beiden vorherigen - \end{quote} - Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt. - - Falls Ihnen dabei irgendwelche Besonderheiten auffallen - und/oder Sie irgendwelche besondere Maßnahmen treffen, - dokumentieren Sie diese. - - (Wem dies zu einfach ist, kann auch gerne - die ersten 100 Fibonacci-Zahlen ausgeben.) - - \solution - - Zwei verschiedene richtige Lösungen finden Sie in den Dateien - \gitfile{hp}{2020ws/20201112}{loesung-3-1.c} und \gitfile{hp}{2020ws/20201112}{loesung-3-2.c}. - - Die Lösung in \gitfile{hp}{2020ws/20201112}{loesung-3-2.c} - speichert alle berechneten Zahlen in einem Array, - die in \gitfile{hp}{2020ws/20201112}{loesung-3-1.c} hingegen - speichert immer nur maximal drei Zahlen gleichzeitig. - Sofern nicht alle berechneten Zahlen später noch benötigt werden, - ist daher \gitfile{hp}{2020ws/20201112}{loesung-3-1.c} zu bevorzugen. - - Wichtig in \gitfile{hp}{2020ws/20201112}{loesung-3-1.c} ist, daß \lstinline{f0 + f1} berechnet wird, - \emph{bevor\/} \lstinline{f0} oder \lstinline{f1} ein neuer Wert zugewiesen wird. - Dies ist nur möglich, weil das Programm - eine zusätzliche Variable (hier: \lstinline{f2}) verwendet. - - \emph{(Fortsetzung folgt.)} - - \exercise{Fehlerhaftes Programm} - - \begin{minipage}[t]{0.65\textwidth} - Wir betrachten das nebenstehende C-Programm - (Datei: \gitfile{hp}{2020ws/20201112}{aufgabe-4.c}). - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? Begründen Sie Ihre Antwort. - - Schreiben Sie Ihre Begründung so auf, - daß man sie auch dann versteht, - wenn man gerade nicht die Möglichkeit hat, - bei Ihnen persönlich nachzufragen - (z.\,B.\ weil man gerade eine Klausur korrigiert). - - Die Schwierigkeit dieser Aufgabe besteht - nicht allein darin, die Problematik zu verstehen, - sondern auch darin, dieses Verständnis für andere aufzuschreiben. - \item[(b)] - Ändern Sie das Programm so um, - daß es einen "`Countdown"' von 10 bis 0 ausgibt. - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm und warum?} - - Dieses Programm bewirkt nichts. - Die \lstinline{for}-Schleife wird nicht ausgeführt. - - Begründung: Die \lstinline{for}-Bedingung ist eine Zuweisung - des Werts \lstinline{0} an die Variable \lstinline{i}. - Neben dem Seiteneffekt der Zuweisung liefert der Ausdruck - einen Wert zurück, nämlich den zugewiesenen Wert - \lstinline{0}. Dieser wird von \lstinline{for} als eine - Bedingung mit dem konstanten Wert "`falsch"' interpretiert. - - (Hinweis: Ohne diese Begründung ist die Aufgabe nur zu einem - kleinen Teil gelöst.) - - Darüberhinaus ist die Zähl-Anwendung unwirksam: Sie berechnet - den Wert \lstinline{i - 1} und vergißt ihn wieder, ohne ihn - einer Variablen (z.\,B.\ \lstinline{i}) zuzuweisen. - - \item[(b)] - \textbf{Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.} - - Datei \gitfile{hp}{2020ws/20201112}{loesung-4.c}: - \begin{lstlisting}[gobble=8] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i >= 0; i--) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{itemize} - -\end{document} diff --git a/20201112/hp-uebung-20201112.pdf b/20201112/hp-uebung-20201112.pdf deleted file mode 100644 index 485f0934a5c5cbd518b659c85708179c9c07306e..0000000000000000000000000000000000000000 Binary files a/20201112/hp-uebung-20201112.pdf and /dev/null differ diff --git a/20201112/hp-uebung-20201112.tex b/20201112/hp-uebung-20201112.tex deleted file mode 100644 index ecfe5175d765cf81a36db1411e8fc52d84657d90..0000000000000000000000000000000000000000 --- a/20201112/hp-uebung-20201112.tex +++ /dev/null @@ -1,114 +0,0 @@ -% hp-uebung-20201112.pdf - Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 12.\ November 2020} - - \exercise{Schaltjahr ermitteln} - - Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt - und ausgibt, ob es sich um ein Schaltjahr handelt. - \begin{itemize} - \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr. - \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr. - \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\ - ist das Jahr doch wieder ein Schaltjahr. - \end{itemize} - - \exercise{Multiplikationstabelle} - - Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\ - Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen: - \begin{lstlisting}[style=terminal] - 1 * 7 = 7 - 2 * 7 = 14 - ... - 10 * 7 = 70 - \end{lstlisting} - \textbf{Hinweis:} Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\ - (siehe dazu die Dokumentation zu \lstinline{printf()}, - z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,) - - \exercise{Fibonacci-Zahlen} - - Die Folge der Fibonacci-Zahlen ist definiert durch: - \begin{quote} - 1.\ Zahl: 0\\ - 2.\ Zahl: 1\\ - nächste Zahl = Summe der beiden vorherigen - \end{quote} - Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt. - - Falls Ihnen dabei irgendwelche Besonderheiten auffallen - und/oder Sie irgendwelche besondere Maßnahmen treffen, - dokumentieren Sie diese. - - (Wem dies zu einfach ist, kann auch gerne - die ersten 100 Fibonacci-Zahlen ausgeben.) - - \exercise{Fehlerhaftes Programm} - - \begin{minipage}[t]{0.65\textwidth} - Wir betrachten das nebenstehende C-Programm - (Datei: \gitfile{hp}{2020ws/20201112}{aufgabe-4.c}). - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? Begründen Sie Ihre Antwort. - - Schreiben Sie Ihre Begründung so auf, - daß man sie auch dann versteht, - wenn man gerade nicht die Möglichkeit hat, - bei Ihnen persönlich nachzufragen - (z.\,B.\ weil man gerade eine Klausur korrigiert). - - Die Schwierigkeit dieser Aufgabe besteht - nicht allein darin, die Problematik zu verstehen, - sondern auch darin, dieses Verständnis für andere aufzuschreiben. - \item[(b)] - Ändern Sie das Programm so um, - daß es einen "`Countdown"' von 10 bis 0 ausgibt. - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{minipage} - -\end{document} diff --git a/20201112/if-12.c b/20201112/if-12.c deleted file mode 100644 index c04561accc01d6c880780c361bde83e474c6b290..0000000000000000000000000000000000000000 --- a/20201112/if-12.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &b); - if (b & a > b) - { - printf ("%d\n", a / b); - printf ("Danke sehr.\n"); - } - return 0; -} diff --git a/20201112/loesung-1-1.c b/20201112/loesung-1-1.c deleted file mode 100644 index ea41b8ea35bf871389c8be15779a58c293c81049..0000000000000000000000000000000000000000 --- a/20201112/loesung-1-1.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - int leap_year = 0; - if (year % 4 == 0) - { - leap_year = 1; - if (year % 100 == 0) - { - leap_year = 0; - if (year % 400 == 0) - leap_year = 1; - } - } - return leap_year; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20201112/loesung-1-2.c b/20201112/loesung-1-2.c deleted file mode 100644 index d9e4df8a36238875e0b46398b21f93e7f4f98792..0000000000000000000000000000000000000000 --- a/20201112/loesung-1-2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - return 1; - else - return 0; - } - else - return 1; - } - else - return 0; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20201112/loesung-1-3.c b/20201112/loesung-1-3.c deleted file mode 100644 index 97051b3bb5e6620ff771d6b3f5949687130abea8..0000000000000000000000000000000000000000 --- a/20201112/loesung-1-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - return 1; - else - return 0; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20201112/loesung-1-4.c b/20201112/loesung-1-4.c deleted file mode 100644 index 3a0d218e6c03f326ad73bad55ad3e29ea882eb2d..0000000000000000000000000000000000000000 --- a/20201112/loesung-1-4.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - } - else - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - } - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20201112/loesung-1-5.c b/20201112/loesung-1-5.c deleted file mode 100644 index 999d9f2030e29f1c961b12d647d2e82592b637bf..0000000000000000000000000000000000000000 --- a/20201112/loesung-1-5.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20201112/loesung-2-1.c b/20201112/loesung-2-1.c deleted file mode 100644 index 5ec9dd3caf6639d22bf770ef4b6bb779a3d7c714..0000000000000000000000000000000000000000 --- a/20201112/loesung-2-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 1; - int b = 7; - while (a <= 10) - { - printf ("%2d * %d = %2d\n", a, b, a * b); - a++; - } - return 0; -} diff --git a/20201112/loesung-2-2.c b/20201112/loesung-2-2.c deleted file mode 100644 index 8f9319ee596a52f38531a2cefb376b54e7ec3ec0..0000000000000000000000000000000000000000 --- a/20201112/loesung-2-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - printf ("%2d *%2d =%3d\n", i, x, i * x); - return 0; -} diff --git a/20201112/loesung-2-3.c b/20201112/loesung-2-3.c deleted file mode 100644 index 71fca2538b991397ac5f046a33ff0f9130b2980f..0000000000000000000000000000000000000000 --- a/20201112/loesung-2-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - { - if (i >= 10) - printf ("%d", i); - else - printf (" %d", i); - printf (" * %d = ", x); - int y = i * x; - if (y >= 10) - printf ("%d", y); - else - printf (" %d", y); - printf ("\n"); - } - return 0; -} diff --git a/20201112/loesung-2-f4.c b/20201112/loesung-2-f4.c deleted file mode 100644 index 8520d438f654856a74c22ffd01b9c5815741efbc..0000000000000000000000000000000000000000 --- a/20201112/loesung-2-f4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - printf ("%d * %d = %d\n", i, x, i * x); - return 0; -} diff --git a/20201112/loesung-3-1.c b/20201112/loesung-3-1.c deleted file mode 100644 index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int f0 = 0; - int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - int f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-10.c b/20201112/loesung-3-10.c deleted file mode 100644 index 7bb464e8490084edbe8f388e1e6cf2bfd0b5c4be..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-10.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 200; i++) - { - printf ("f[%d] = %.0Lf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-11.c b/20201112/loesung-3-11.c deleted file mode 100644 index def1256c1aaa78d07234bf73be485077e5e68270..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-11.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 200; i++) - { - printf ("f[%d] = %30.0Lf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-12.c b/20201112/loesung-3-12.c deleted file mode 100644 index 7ca898622fd72bac0cf074b947f0e0f8810d3689..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-12.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 200; i++) - { - printf ("f[%3d] = %60.0Lf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-2.c b/20201112/loesung-3-2.c deleted file mode 100644 index 7043f66e6b73894be9547a5562de8cad43cf0e71..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-2.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int f[50]; - f[0] = 0; - f[1] = 1; - for (int i = 2; i < 50; i++) - f[i] = f[i - 2] + f[i - 1]; - for (int i = 0; i < 50; i++) - printf ("f[%d] = %d\n", i, f[i]); - return 0; -} diff --git a/20201112/loesung-3-3.c b/20201112/loesung-3-3.c deleted file mode 100644 index c469857baa199b0baf12f6dec00f63fd119b0cb1..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-3.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long int f0 = 0; - long int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - int f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-4.c b/20201112/loesung-3-4.c deleted file mode 100644 index c3c0dbe62bffce9adfc49cadb1c747e2e932c04e..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-4.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long int f0 = 0; - long int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %ld\n", i, f0); - long int f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-5.c b/20201112/loesung-3-5.c deleted file mode 100644 index 119125542cf5fdca1289cf5918428f1634c4f2ee..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-5.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long f0 = 0; - long f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %ld\n", i, f0); - long f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-6.c b/20201112/loesung-3-6.c deleted file mode 100644 index 339217e92fb44da2e667dc15c5bbd839b9f579c2..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-6.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint64_t f0 = 0; - uint64_t f1 = 1; - for (int i = 0; i < 100; i++) - { - printf ("f[%d] = %lu\n", i, f0); - uint64_t f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-7.c b/20201112/loesung-3-7.c deleted file mode 100644 index 11a9e200a07e1e7c368b014f659f3c5f55196ff3..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-7.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 100; i++) - { - printf ("f[%d] = %llf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-8.c b/20201112/loesung-3-8.c deleted file mode 100644 index d6aff68d21c4aa754fa94a434f5bb17235d6535e..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-8.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 100; i++) - { - printf ("f[%d] = %Lf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-3-9.c b/20201112/loesung-3-9.c deleted file mode 100644 index e1d95dc56e72da5a203548ff0907c6c128004a28..0000000000000000000000000000000000000000 --- a/20201112/loesung-3-9.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - long double f0 = 0; - long double f1 = 1; - for (int i = 0; i < 100; i++) - { - printf ("f[%d] = %.0Lf\n", i, f0); - long double f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201112/loesung-4.c b/20201112/loesung-4.c deleted file mode 100644 index f8481e994c02ac8e581244713756c9e9be7c7fd6..0000000000000000000000000000000000000000 --- a/20201112/loesung-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 10; i >= 0; i--) - printf ("%d\n", i); - return 0; -} diff --git a/20201112/logo-hochschule-bochum-cvh-text-v2.pdf b/20201112/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201112/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201112/logo-hochschule-bochum.pdf b/20201112/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201112/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201112/pgscript.sty b/20201112/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201112/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201112/pgslides.sty b/20201112/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201112/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201112/side-effects-1.c b/20201112/side-effects-1.c deleted file mode 100644 index 61c4abb82e369b17b5acc83107b9baa598f371d2..0000000000000000000000000000000000000000 --- a/20201112/side-effects-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; -} diff --git a/20201112/side-effects-10.c b/20201112/side-effects-10.c deleted file mode 100644 index 10573eec3a86b02a2d0e8fdea51ded667e71adfc..0000000000000000000000000000000000000000 --- a/20201112/side-effects-10.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi; - pi = 3,1415926535897932384626433; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-11.c b/20201112/side-effects-11.c deleted file mode 100644 index d9e15de833542d40e30ca956f75fb78ecdb62033..0000000000000000000000000000000000000000 --- a/20201112/side-effects-11.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi; - pi = 3,14159265; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-12.c b/20201112/side-effects-12.c deleted file mode 100644 index c0dc876159df6f392d118937b99ae3d8b036bf6b..0000000000000000000000000000000000000000 --- a/20201112/side-effects-12.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi; - pi = 3.14159265; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-13.c b/20201112/side-effects-13.c deleted file mode 100644 index c2ad73c35706a2330052416148db8ab49b16837c..0000000000000000000000000000000000000000 --- a/20201112/side-effects-13.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 0; i < 10; printf ("%d\n", i), i++); - return 0; -} diff --git a/20201112/side-effects-14.c b/20201112/side-effects-14.c deleted file mode 100644 index 0ccbeb406340365d6bafc464a335881014c2c5ed..0000000000000000000000000000000000000000 --- a/20201112/side-effects-14.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi = 3,14159265; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-15.c b/20201112/side-effects-15.c deleted file mode 100644 index 13b4a2dbb8c5aa4dbd65951a5e9afeec1af31aa4..0000000000000000000000000000000000000000 --- a/20201112/side-effects-15.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi = 3, e = 14159265; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-16.c b/20201112/side-effects-16.c deleted file mode 100644 index 562c3482275dd9a1432d829914f61fefadc2916e..0000000000000000000000000000000000000000 --- a/20201112/side-effects-16.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi = (3,14159265); - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20201112/side-effects-2.c b/20201112/side-effects-2.c deleted file mode 100644 index 275a28e55e4568ff0e7f135bfaae8de819d224f7..0000000000000000000000000000000000000000 --- a/20201112/side-effects-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - 42; - return 0; -} diff --git a/20201112/side-effects-3.c b/20201112/side-effects-3.c deleted file mode 100644 index 54daff5627ad1b1d9be0bee7b47b1916b7734bce..0000000000000000000000000000000000000000 --- a/20201112/side-effects-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int whatever = printf ("Hello, world!\n"); - printf ("Zurückgegebener Wert: %d\n", whatever); - return 0; -} diff --git a/20201112/side-effects-4.c b/20201112/side-effects-4.c deleted file mode 100644 index 76da09fecf9feec1f2d30d82b456b9a8e7845fb1..0000000000000000000000000000000000000000 --- a/20201112/side-effects-4.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = a = 12; - c = b++; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/side-effects-5.c b/20201112/side-effects-5.c deleted file mode 100644 index b7b2be950285591c0778a74bf50385977618f060..0000000000000000000000000000000000000000 --- a/20201112/side-effects-5.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = a = 12; - c = ++b; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/side-effects-6.c b/20201112/side-effects-6.c deleted file mode 100644 index f40b8f68d7c383a80713707bf10212840d6fd451..0000000000000000000000000000000000000000 --- a/20201112/side-effects-6.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = a += 12; - c = ++b; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/side-effects-7.c b/20201112/side-effects-7.c deleted file mode 100644 index fa3588957ec39244cdb34f6f9282f1a41e89c2a7..0000000000000000000000000000000000000000 --- a/20201112/side-effects-7.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = a, 42; - c = ++b; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/side-effects-8.c b/20201112/side-effects-8.c deleted file mode 100644 index 03bbdb2f2dde80c9d4afe3465174ff1053a5b48a..0000000000000000000000000000000000000000 --- a/20201112/side-effects-8.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = (a, 42); - c = ++b; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/side-effects-9.c b/20201112/side-effects-9.c deleted file mode 100644 index 28d9afc75d040968cdfea735d97bc83c05a5105b..0000000000000000000000000000000000000000 --- a/20201112/side-effects-9.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b, c; - a = 10; - b = (a = 7, 42); - c = ++b; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - return 0; -} diff --git a/20201112/test.txt b/20201112/test.txt deleted file mode 100644 index f43a1847892086aeb466c814d726c1860a0b9d67..0000000000000000000000000000000000000000 --- a/20201112/test.txt +++ /dev/null @@ -1,6 +0,0 @@ -Ich ging im Walde -so für mich hin, -und nichts zu suchen, -das war mein Sinn. - -vim ist praktisch. diff --git a/20201119/arrays-1.c b/20201119/arrays-1.c deleted file mode 100644 index 35cf856c63942234116544ac721ff0a47d797b09..0000000000000000000000000000000000000000 --- a/20201119/arrays-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; -} diff --git a/20201119/arrays-10.c b/20201119/arrays-10.c deleted file mode 100644 index bafaa0e2a558352ff8f8784b5a933870674265b2..0000000000000000000000000000000000000000 --- a/20201119/arrays-10.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[]; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-11.c b/20201119/arrays-11.c deleted file mode 100644 index df8992bc15e0a9d675d5c58fde39571cf4051043..0000000000000000000000000000000000000000 --- a/20201119/arrays-11.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - prime[5] = 13; /* Dies funktioniert zwar im Moment, ist aber falsch! */ - /* Wir schreiben über das Array hinaus. Dies kann zu einem */ - for (int *p = prime; *p; p++) /* Absturz führen. */ - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-12.c b/20201119/arrays-12.c deleted file mode 100644 index 21cf467acd52bf44e9619a44373fbb31a54b3b6e..0000000000000000000000000000000000000000 --- a/20201119/arrays-12.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[] = { }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-13.c b/20201119/arrays-13.c deleted file mode 100644 index f27e0c15ff89ff1bf1cf4a2e0bc55f1d775f4f59..0000000000000000000000000000000000000000 --- a/20201119/arrays-13.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[] = { 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-2.c b/20201119/arrays-2.c deleted file mode 100644 index d206e6c3296fe7f7e48febd10893a5be65fca67a..0000000000000000000000000000000000000000 --- a/20201119/arrays-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; -} diff --git a/20201119/arrays-3.c b/20201119/arrays-3.c deleted file mode 100644 index 388b8bcc0dc426cc3aaee3769fc5ac577bfa441c..0000000000000000000000000000000000000000 --- a/20201119/arrays-3.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p; - p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; -} diff --git a/20201119/arrays-4-O0.s b/20201119/arrays-4-O0.s deleted file mode 100644 index ebca8d83fa17c0087d4f4a1e853e32b8e848594a..0000000000000000000000000000000000000000 --- a/20201119/arrays-4-O0.s +++ /dev/null @@ -1,45 +0,0 @@ - .file "arrays-4.c" - .text - .section .rodata -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - movq %rsp, %rbp - .cfi_def_cfa_register 6 - subq $32, %rsp - movl $2, -32(%rbp) - movl $3, -28(%rbp) - movl $5, -24(%rbp) - movl $7, -20(%rbp) - movl $11, -16(%rbp) - movl $0, -4(%rbp) - jmp .L2 -.L3: - movl -4(%rbp), %eax - cltq - movl -32(%rbp,%rax,4), %eax - movl %eax, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - addl $1, -4(%rbp) -.L2: - cmpl $4, -4(%rbp) - jle .L3 - movl $0, %eax - leave - .cfi_def_cfa 7, 8 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201119/arrays-4-m32.s b/20201119/arrays-4-m32.s deleted file mode 100644 index c7bcb148f2f18c3418ab976bc4f7111beb397331..0000000000000000000000000000000000000000 --- a/20201119/arrays-4-m32.s +++ /dev/null @@ -1,79 +0,0 @@ - .file "arrays-4.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - leal 4(%esp), %ecx - .cfi_def_cfa 1, 0 - andl $-16, %esp - pushl -4(%ecx) - pushl %ebp - .cfi_escape 0x10,0x5,0x2,0x75,0 - movl %esp, %ebp - pushl %edi - pushl %esi - pushl %ebx - pushl %ecx - .cfi_escape 0xf,0x3,0x75,0x70,0x6 - .cfi_escape 0x10,0x7,0x2,0x75,0x7c - .cfi_escape 0x10,0x6,0x2,0x75,0x78 - .cfi_escape 0x10,0x3,0x2,0x75,0x74 - subl $56, %esp - call __x86.get_pc_thunk.bx - addl $_GLOBAL_OFFSET_TABLE_, %ebx - movl $2, -44(%ebp) - movl $3, -40(%ebp) - movl $5, -36(%ebp) - movl $7, -32(%ebp) - movl $11, -28(%ebp) - leal -44(%ebp), %esi - leal -24(%ebp), %eax - movl %eax, -60(%ebp) - leal .LC0@GOTOFF(%ebx), %edi -.L2: - subl $8, %esp - pushl (%esi) - pushl %edi - call printf@PLT - addl $4, %esi - addl $16, %esp - cmpl -60(%ebp), %esi - jne .L2 - movl $0, %eax - leal -16(%ebp), %esp - popl %ecx - .cfi_restore 1 - .cfi_def_cfa 1, 0 - popl %ebx - .cfi_restore 3 - popl %esi - .cfi_restore 6 - popl %edi - .cfi_restore 7 - popl %ebp - .cfi_restore 5 - leal -4(%ecx), %esp - .cfi_def_cfa 4, 4 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat - .globl __x86.get_pc_thunk.bx - .hidden __x86.get_pc_thunk.bx - .type __x86.get_pc_thunk.bx, @function -__x86.get_pc_thunk.bx: -.LFB12: - .cfi_startproc - movl (%esp), %ebx - ret - .cfi_endproc -.LFE12: - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201119/arrays-4.c b/20201119/arrays-4.c deleted file mode 100644 index 83a03a4fe9425d684db38f0219cd9e9e19b405ba..0000000000000000000000000000000000000000 --- a/20201119/arrays-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; -} diff --git a/20201119/arrays-4.s b/20201119/arrays-4.s deleted file mode 100644 index 7e82bcaa41df38434faa6619221913a632de15fe..0000000000000000000000000000000000000000 --- a/20201119/arrays-4.s +++ /dev/null @@ -1,53 +0,0 @@ - .file "arrays-4.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - pushq %r12 - .cfi_def_cfa_offset 16 - .cfi_offset 12, -16 - pushq %rbp - .cfi_def_cfa_offset 24 - .cfi_offset 6, -24 - pushq %rbx - .cfi_def_cfa_offset 32 - .cfi_offset 3, -32 - subq $32, %rsp - .cfi_def_cfa_offset 64 - movl $2, (%rsp) # #include <stdio.h> - movl $3, 4(%rsp) # - movl $5, 8(%rsp) # int main (void) - movl $7, 12(%rsp) # { - movl $11, 16(%rsp) # int prime[5] = { 2, 3, 5, 7, 11 }; - movq %rsp, %rbx # for (int i = 0; i < 5; i++) - leaq 20(%rbx), %r12 # printf ("%d\n", prime[i]); - leaq .LC0(%rip), %rbp # return 0; -.L2: # } - movl (%rbx), %esi - movq %rbp, %rdi - movl $0, %eax - call printf@PLT - addq $4, %rbx - cmpq %r12, %rbx - jne .L2 - movl $0, %eax - addq $32, %rsp - .cfi_def_cfa_offset 32 - popq %rbx - .cfi_def_cfa_offset 24 - popq %rbp - .cfi_def_cfa_offset 16 - popq %r12 - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201119/arrays-5.c b/20201119/arrays-5.c deleted file mode 100644 index 2015ffc6cd5057daaa755294ab4af602559eefa4..0000000000000000000000000000000000000000 --- a/20201119/arrays-5.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; p < prime + 5; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-5.s b/20201119/arrays-5.s deleted file mode 100644 index 3a7c4d5dfeaed0ea17968f93767c3ec23693dda2..0000000000000000000000000000000000000000 --- a/20201119/arrays-5.s +++ /dev/null @@ -1,47 +0,0 @@ - .file "arrays-5.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - pushq %rbx - .cfi_def_cfa_offset 24 - .cfi_offset 3, -24 - subq $40, %rsp - .cfi_def_cfa_offset 64 - movl $2, (%rsp) # #include <stdio.h> - movl $3, 4(%rsp) # - movl $5, 8(%rsp) # int main (void) - movl $7, 12(%rsp) # { - movl $11, 16(%rsp) # int prime[5] = { 2, 3, 5, 7, 11 }; - movq %rsp, %rbx # for (int *p = prime; p < prime + 5; p++) - leaq 20(%rsp), %rbp # printf ("%d\n", *p); -.L2: # return 0; - movl (%rbx), %esi # } - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - addq $4, %rbx - cmpq %rbp, %rbx - jne .L2 - movl $0, %eax - addq $40, %rsp - .cfi_def_cfa_offset 24 - popq %rbx - .cfi_def_cfa_offset 16 - popq %rbp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201119/arrays-6.c b/20201119/arrays-6.c deleted file mode 100644 index 28a88d55b97ae96e3a4e9a4a467ba89e57719dba..0000000000000000000000000000000000000000 --- a/20201119/arrays-6.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p != 0; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-7.c b/20201119/arrays-7.c deleted file mode 100644 index dcf32170d4658f2eafdf436809e9a9aa0e56379b..0000000000000000000000000000000000000000 --- a/20201119/arrays-7.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-8.c b/20201119/arrays-8.c deleted file mode 100644 index 6e19ec4ef5e5b81e940168a4a4e6b3026a4f4375..0000000000000000000000000000000000000000 --- a/20201119/arrays-8.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/arrays-9.c b/20201119/arrays-9.c deleted file mode 100644 index 37209f1e1bf1f979d0a8102afbaf52808c3501cd..0000000000000000000000000000000000000000 --- a/20201119/arrays-9.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - prime[5] = 13; /* Dies funktioniert zwar im Moment, ist aber falsch! */ - prime[6] = 0; /* Wir schreiben über das Array hinaus. Dies kann zu einem */ - for (int *p = prime; *p; p++) /* Absturz führen. */ - printf ("%d\n", *p); - return 0; -} diff --git a/20201119/aufgabe-2.c b/20201119/aufgabe-2.c deleted file mode 100644 index 52e4f0af52b66fb03cd652d621f5044685cfa47e..0000000000000000000000000000000000000000 --- a/20201119/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } diff --git a/20201119/break-1.c b/20201119/break-1.c deleted file mode 100644 index f3ee1a8199e63ce57a7624796af5e9f91917b614..0000000000000000000000000000000000000000 --- a/20201119/break-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 0; - int b = 1; - printf ("%d\n", b); - for (int i = 0; i < 10; i++) - { - int c = a + b; - a = b; - b = c; - printf ("%d\n", b); - } - return 0; -} diff --git a/20201119/break-2.c b/20201119/break-2.c deleted file mode 100644 index 061092d844651f831ceeee60efc0f2d1d3b84698..0000000000000000000000000000000000000000 --- a/20201119/break-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -/* Aufgabe: Finde die erste Fibonacci-Zahl, die größer ist als 10. */ - -int main (void) -{ - int a = 0; - int b = 1; - while (1) - { - int c = a + b; - a = b; - b = c; - if (b > 10) - { - printf ("Die erste Fibonacci-Zahl, die größer ist als 10, lautet: %d\n", b); - /* Dieses printf() erfolgt von der Logik her nach der Schleife, - es steht aber im Quelltext _innerhalb_ der Schleife. */ - break; - } - } - return 0; -} diff --git a/20201119/break-3.c b/20201119/break-3.c deleted file mode 100644 index 676b6bc8506264873acb441a6b44e1632c22a257..0000000000000000000000000000000000000000 --- a/20201119/break-3.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> - -/* Aufgabe: Finde die erste Fibonacci-Zahl, die größer ist als 10. */ - -int main (void) -{ - int a = 0; - int b = 1; - while (b <= 10) - { - int c = a + b; - a = b; - b = c; - } - printf ("Die erste Fibonacci-Zahl, die größer ist als 10, lautet: %d\n", b); /* nach der Schleife */ - return 0; -} diff --git a/20201119/chars-1.c b/20201119/chars-1.c deleted file mode 100644 index 7089769e0a9e70cfff426c4d0fa15c89b562cec0..0000000000000000000000000000000000000000 --- a/20201119/chars-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", '*'); - printf ("%c\n", 71); - return 0; -} diff --git a/20201119/chars-2.c b/20201119/chars-2.c deleted file mode 100644 index 326aa6334808f996101cea23435e8aa4d71940c3..0000000000000000000000000000000000000000 --- a/20201119/chars-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", '*'); - printf ("%x\n", '*'); - printf ("%c\n", 71); - return 0; -} diff --git a/20201119/chars-3.c b/20201119/chars-3.c deleted file mode 100644 index 515341ce8681ea1596761494b53c431f698a9d5d..0000000000000000000000000000000000000000 --- a/20201119/chars-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", '*'); - printf ("%x\n", '*'); - printf ("%c\n", 71); - printf ("%c\n", 0x65); - return 0; -} diff --git a/20201119/hp-20201119.pdf b/20201119/hp-20201119.pdf deleted file mode 100644 index 4d3e27cc943f47546be27b9b004d3a02e0c38999..0000000000000000000000000000000000000000 Binary files a/20201119/hp-20201119.pdf and /dev/null differ diff --git a/20201119/hp-20201119.tex b/20201119/hp-20201119.tex deleted file mode 100644 index 0ee2c790b0281483d0c2e6a726116edb8bc64b72..0000000000000000000000000000000000000000 --- a/20201119/hp-20201119.tex +++ /dev/null @@ -1,1139 +0,0 @@ -% hp-20201119.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Zeiger, Arrays und Strings - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{19.\ November 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \color{black} - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{4} -\subsection{Verzweigungen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{if}-Verzweigung - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b != 0) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage}%\pause - \begin{minipage}[t]{6cm} - \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount] - 0 steht für \emph{falsch (false)},\\ - $\ne 0$ steht für \emph{wahr (true)}. - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Schleifen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } - \end{lstlisting} - \end{minipage}%\pause - \begin{minipage}[t]{6cm} - \lstinline{for}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - for (a = 1; a <= 10; a = a + 1) - printf ("%d\n", a); - \end{lstlisting} - \vspace{1.5cm} -% \pause - \lstinline{do}-\lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Seiteneffekte} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; - } - \end{lstlisting} -% \pause - \begin{picture}(0,0) - \color{red} - \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}} - \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}} - \pause - \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} -% \pause - \bigskip - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿ - $ ¡./side-effects-1¿ - Hello, world! - 14 - $ - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \begin{itemize} - \item - \lstinline{printf()} ist eine Funktion. -% \pause - \item - "`Haupteffekt"': Wert zurückliefern\\ - (hier: Anzahl der ausgegebenen Zeichen) -% \pause - \item - \newterm{Seiteneffekt\/}: Ausgabe - \end{itemize} - -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Seiteneffekte \protect\color{gray}bei Operatoren} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - Unäre Operatoren: - \begin{itemize} - \item - Negation: \lstinline{-foo} - \item - {\only<1->{\color{red}}Funktionsaufruf}: \lstinline{foo ()} - \item - {\only<1->{\color{red}}Post-Inkrement}: \lstinline{foo++} - \item - {\only<1->{\color{red}}Post-Dekrement}: \lstinline{foo--} - \item - {\only<1->{\color{red}}Prä-Inkrement}: \lstinline{++foo} - \item - {\only<1->{\color{red}}Prä-Dekrement}: \lstinline{--foo} - \end{itemize} - \medskip - Binäre Operatoren: - \begin{itemize} - \item - Rechnen: \lstinline{+ - * / %} - \item - Vergleich: \lstinline{== != < > <= >=} - \item - {\only<1->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=} - \item - Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b} - \end{itemize} -% \pause - \medskip - {\color{red}rot = mit Seiteneffekt} - \end{minipage} - \pause - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i;¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{-2} -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<1->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<1-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<1-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Funktionen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int answer (void) - { - return 42; - } - - void foo (void) - { - printf ("%d\n", answer ()); - } - - int main (void) - { - foo (); - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} -% \pause - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - void add_verbose (int a, int b) - { - printf ("%d + %d = %d\n", a, b, a + b); - } - - int main (void) - { - add_verbose (3, 7); - return 0; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} -% \pause - \bigskip - \item - Der Datentyp \lstinline{void}\\ - steht für "`nichts"'\\ - und \alt<2->{muß}{kann} ignoriert werden. - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): " - "a = %d, b = %d\n", - a, b); - a++; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace{-1cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - a = b = 12; - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \color{black} - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\subsection{Zeiger} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - - \pause - \vspace{-5cm}\hspace{5cm}% - \begin{minipage}{7cm} - \begin{itemize} - \item - \lstinline{*a} ist eine \lstinline{int}. - \pause - \item - unärer Operator \lstinline{*}:\\ - Pointer-Dererefenzierung - \pause - \arrowitem - \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}. - \pause - \bigskip - \item - unärer Operator \lstinline{&}: Adresse - \end{itemize} - \end{minipage} -\end{frame} - -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}. - -% \bigskip - \pause - \pause - - \begin{onlyenv}<1-8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<11> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<12> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<13-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - - \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. - \pause - \pause - \item - \only<6-9>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. - \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<14->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} - \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1-6> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<7> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} -% \begin{onlyenv}<8> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char hello[] = "Hello, world!\n"; -% printf ("%s", hello); -% return 0; -% } -% ¡ ¿ -% \end{lstlisting} -% \end{onlyenv} -% \begin{onlyenv}<9> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char *hello = "Hello, world!\n"; -% printf ("%s", hello); -% return 0; -% } -% ¡ ¿ -% \end{lstlisting} -% \end{onlyenv} -% \begin{onlyenv}<10> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char *hello = "Hello, world!\n"; -% while (*hello) -% printf ("%c", *hello++); -% return 0; -% } -% \end{lstlisting} -% \end{onlyenv} - - \vspace{-1.7cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} - \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. - \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<5->{\\ - also ein Zeiger auf (kleinere) Integer}. - \pause - \pause - \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal -% \pause -% & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\iffalse - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz? - - \smallskip - - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - \end{lstlisting} - - \smallskip - - (normalerweise: ASCII) - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe? - - \smallskip - - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \medskip - \item - Groß- in Kleinbuchstaben umwandeln - - \smallskip - - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 19, 11, 2020 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 19; - (*d).month = 11; - (*d).year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 19; - d->month = 11; - d->year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\fi - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{medgreen} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \color{red} - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20201119/hp-musterloesung-20201119.pdf b/20201119/hp-musterloesung-20201119.pdf deleted file mode 100644 index 53f9bb704884eee1c02c409b2b055adeed78a1b0..0000000000000000000000000000000000000000 Binary files a/20201119/hp-musterloesung-20201119.pdf and /dev/null differ diff --git a/20201119/hp-musterloesung-20201119.tex b/20201119/hp-musterloesung-20201119.tex deleted file mode 100644 index f1bcd8d470eb2269f57961a2b0d3a2601a4cde11..0000000000000000000000000000000000000000 --- a/20201119/hp-musterloesung-20201119.tex +++ /dev/null @@ -1,281 +0,0 @@ -% hp-musterloesung-20201119.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Seltsame Programme, Kalender-Berechnung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 19.\ November 2020} - - \exercise{Seltsame Programme} - - Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201119} - finden Sie (unter anderem)\\ - die Programme \gitfile{hp}{2020ws/20201119}{test-1.c}, - \gitfile{hp}{2020ws/20201119}{test-2.c} und \gitfile{hp}{2020ws/20201119}{test-3.c}. - - Was bewirken diese Programme, und warum verhalten sie sich so? - - \solution - - \begin{itemize} - \item - \gitfile{hp}{2020ws/20201119}{test-1.c} - - Hinter \lstinline{return} steht ein Ausdruck mit dem - Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma - berechnet und ignoriert und danach der Wert nach dem Komma - zurückgegeben wird. - - In diesem Fall wird vor dem Komma der Wert des - \lstinline{printf()}-Aufrufs berechnet und ignoriert. - Als Seiteneffekt gibt das Programm die Zeile - \lstinline[style=terminal]{Hello, world!} aus. - Anschließend wird der Wert \lstinline{0} an \lstinline{return} - übergeben und daher \lstinline{return 0} ausgeführt. - - \item - \gitfile{hp}{2020ws/20201119}{test-2.c} - - Das Programm gibt die Zeile - \lstinline[style=terminal]{Die Antwort lautet: 42} aus. - - Die \lstinline{if}-Bedingung ist eine Zuweisung \lstinline{b = 42}, - die den zugewiesenen Wert \lstinline{42} zurückgibt. - Weil dieser Wert ungleich Null ist, interpretiert - \lstinline{if} ihn als Wahrheitswert "`wahr"', führt also den - \lstinline{if}-Zweig aus und überspringt den - \lstinline{else}-Zweig. - - \item - \gitfile{hp}{2020ws/20201119}{test-3.c} - - Das Programm stürzt mit einer Fehlermeldung - "`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab. - - Der Funktionsaufruf \lstinline{printf (42)} übergibt den - Zahlenwert \lstinline{42} als String, also als einen Zeiger - auf \lstinline{char}-Variable, an die Funktion - \lstinline{printf()}. Diese versucht, auf den Speicher ab - Adresse 42 zuzugreifen, wofür aber das Programm keine - Zugriffsrechte hat. Das Betriebssystem beendet daraufhin das - Programm mit der o.\,a.\ Fehlermeldung. - - Der String \lstinline{"Die Antwort lautet: "} wird nicht - ausgegeben, weil Schreiboperationen aus Effizienzgründen - erst nach einer abgeschlossenen Zeile (\lstinline{"\n"}) - durchgeführt werden. - \end{itemize} - - \clearpage - - \exercise{Kalender-Berechnung} - - Am 3.\,1.\,2009 meldete \emph{heise online\/}: - \begin{quote} - Kunden des ersten mobilen Media-Players von Microsoft - erlebten zum Jahresende eine böse Überraschung: - Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus. - Ursache war ein interner Fehler bei der Handhabung von Schaltjahren. - - \strut\hfill\url{http://heise.de/-193332}, - \end{quote} - Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{2020ws/20201119}{aufgabe-2.c}), - das für einen gegebenen Wert \lstinline{days} - das Jahr und den Tag innerhalb des Jahres - für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: - \begin{lstlisting} - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - \end{lstlisting} - Dieses Quelltextfragment enthält schlechten Programmierstil, - nämlich mehrere Code-Verdopplungen: - \begin{itemize} - \item - Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf. - \item - Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\ - eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung. - \item - Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert; - stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet. - \end{itemize} - Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife. - - Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR} - anstelle der Zahl 1980 - sowie die Kapselung der Berechnung der Schaltjahr-Bedingung - in einer Funktion \lstinline{IsLeapYear()}. - - \begin{itemize} - \item[(a)] - Erklären Sie das Zustandekommen der Endlosschleife. - \item[(b)] - Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält. - \end{itemize} - - \textbf{Hinweis 1:} Verwenden Sie Ihre eigene Funktion \lstinline{IsLeapYear()}. - - \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}. - - \clearpage - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie das Zustandekommen der Endlosschleife.} - - Das Programm startet mit demjenigen Wert für \lstinline{days}, - der der Anzahl der Tage vom 1.\,1.\,1980 bis zum - 31.\,12.\,2008 entspricht. Die \lstinline{while}-Schleife - läuft zunächst solange korrekt durch, bis \lstinline{year} den - Wert \lstinline{2008} und \lstinline{days} den Wert - \lstinline{366} hat. (Der 31.\,12.\ des Schaltjahres 2008 ist - der 366.\ Tag seines Jahres.) - - Die Bedingung der \lstinline{while}-Schleife ist damit - weiterhin erfüllt; das Programm läuft weiter. - - Da 2008 ein Schaltjahr ist, ist auch die Bedingung der äußeren - \lstinline{if}-Anweisung erfüllt. - - Da \lstinline{days} den Wert 366 hat und dieser nicht größer - als 366 ist, ist die innere \lstinline{if}-Bedingung nicht - erfüllt. Somit wird innerhalb der \lstinline{while}-Schleife - kein weiterer Code ausgeführt, die \lstinline{while}-Bedingung - bleibt erfüllt, und das Programm führt eine Endlosschleife - aus. - - \item[(b)] - \textbf{Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält.} - - Um das Programm zu testen, genügt es, das Datum auf den - 31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert - 366 zu setzen. Darüberhinaus muß man die Funktion - \lstinline{IsLeapYear()} bereitstellen (vgl.\ Aufgabe 1 vom 12.\,11.\,2020). - - Der Quelltext \gitfile{hp}{2020ws/20201119}{loesung-2-f1.c} ist eine lauffähige - Version des Programms, die den Fehler (Endlosschleife) - reproduziert. - - \breath - - Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung - zu korrigieren, so daß diese Schaltjahre berücksichtigt. Der - Quelltext \gitfile{hp}{2020ws/20201119}{loesung-2-f2.c} behebt den Fehler auf diese - Weise mit Hilfe von Und- (\lstinline{&&}) und - Oder-Verknüpfungen (\lstinline{||}) in der - \lstinline{while}-Bedingung. - - Der Quelltext \gitfile{hp}{2020ws/20201119}{loesung-2-f3.c} vermeidet die umständliche - Formulierung mit \lstinline{&&} und \lstinline{||} durch - Verwendung des ternären Operators \lstinline{?:}. Dieser - stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit. - In diesem Fall liefert er für die rechte Seite des Vergleichs - \lstinline{days >} den Wert 366 im Falle eines Schaltjahrs - bzw.\ ansonsten den Wert 365. - - Beide Lösungen \gitfile{hp}{2020ws/20201119}{loesung-2-f2.c} und \gitfile{hp}{2020ws/20201119}{loesung-2-f3.c} - sind jedoch im Sinne der Aufgabenstellung \textbf{falsch}. - Diese lautet: "`Schreiben Sie das Quelltextfragment so um, - daß es die beschriebenen Probleme nicht mehr enthält."' - Mit den beschriebenen Problemen sind die genannten drei - Code-Verdopplungen gemeint, und diese befinden sich weiterhin - im Quelltext. Damit ist der Fehler zwar "`korrigiert"', aber - das Programm ist eher noch unübersichtlicher geworden, so daß - nicht klar ist, ob es nicht noch weitere Fehler enthält. - - \breath - - Eine richtige Lösung liefert \gitfile{hp}{2020ws/20201119}{loesung-2-4.c}. Dieses - Programm speichert den Wert der Tage im Jahr in einer - Variablen \lstinline{DaysInYear}. Damit erübrigen sich die - \lstinline{if}-Anweisungen innerhalb der - \lstinline{while}-Schleife, und die damit verbundenen - Code-Verdopplungen verschwinden. - - Etwas unschön ist hierbei die neu hinzugekommene - Code-Verdopplung bei der Berechnung von \lstinline{DaysInYear}. - Diese ist allerdings weniger kritisch als die vorherigen, da - sie nur einmal innerhalb der \lstinline{while}-Schleife - vorkommt und das andere Mal außerhalb derselben. - - Um diese Code-Verdopplung loszuwerden, kann man das - \lstinline{if} durch den \lstinline{?:}-Operator ersetzen und - die Zuweisung innerhalb der \lstinline{while}-Bedingung - vornehmen -- siehe \gitfile{hp}{2020ws/20201119}{loesung-2-5.c}. Dies ist einer der - seltenen Fälle, in denen ein Programm \emph{übersichtlicher\/} - wird, wenn eine Zuweisung innerhalb einer Bedingung - stattfindet. - - Alternativ kann \lstinline{DaysInYear()} auch eine Funktion - sein -- siehe \gitfile{hp}{2020ws/20201119}{loesung-2-6.c}. Diese Version ist - wahrscheinlich die übersichtlichste, hat jedoch den Nachteil, - daß die Berechnung von \lstinline{DaysInYear()} zweimal statt - nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit - verschwendet wird. - - \gitfile{hp}{2020ws/20201119}{loesung-2-7.c} und \gitfile{hp}{2020ws/20201119}{loesung-2-8.c} beseitigen - dieses Problem durch eine Zuweisung des Funktionsergebnisses - an eine Variable -- einmal innerhalb der - \lstinline{while}-Bedingung und einmal außerhalb. - Der zweimalige Aufruf der Funktion \lstinline{DaysInYear()} in - \gitfile{hp}{2020ws/20201119}{loesung-2-8.c} zählt nicht als Code-Verdopplung, denn - der Code ist ja in einer Funktion gekapselt. (Genau dazu sind - Funktionen ja da: daß man sie mehrfach aufrufen kann.) - - \breath - - Fazit: Wenn Sie sich beim Programmieren bei - Cut-And-Paste-Aktionen erwischen, sollten Sie die Struktur - Ihres Programms noch einmal überdenken. - - Wahrscheinlich gibt es dann eine elegantere Lösung, deren - Korrektheit man auf den ersten Blick sieht. - - \end{itemize} - -\end{document} diff --git a/20201119/hp-uebung-20201119.pdf b/20201119/hp-uebung-20201119.pdf deleted file mode 100644 index 199e98fa298500294d2f22bbed6ae771ec5d2145..0000000000000000000000000000000000000000 Binary files a/20201119/hp-uebung-20201119.pdf and /dev/null differ diff --git a/20201119/hp-uebung-20201119.tex b/20201119/hp-uebung-20201119.tex deleted file mode 100644 index 923d5ce91ac2391fb7d87d3a38616e5b95bd8434..0000000000000000000000000000000000000000 --- a/20201119/hp-uebung-20201119.tex +++ /dev/null @@ -1,114 +0,0 @@ -% hp-uebung-20201119.pdf - Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Seltsame Programme, Kalender-Berechnung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 19.\ November 2020} - - \exercise{Seltsame Programme} - - Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201119} - finden Sie (unter anderem)\\ - die Programme \gitfile{hp}{2020ws/20201119}{test-1.c}, - \gitfile{hp}{2020ws/20201119}{test-2.c} und \gitfile{hp}{2020ws/20201119}{test-3.c}. - - Was bewirken diese Programme, und warum verhalten sie sich so? - - \exercise{Kalender-Berechnung} - - Am 3.\,1.\,2009 meldete \emph{heise online\/}: - \begin{quote} - Kunden des ersten mobilen Media-Players von Microsoft - erlebten zum Jahresende eine böse Überraschung: - Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus. - Ursache war ein interner Fehler bei der Handhabung von Schaltjahren. - - \strut\hfill\url{http://heise.de/-193332}, - \end{quote} - Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{2020ws/20201119}{aufgabe-2.c}), - das für einen gegebenen Wert \lstinline{days} - das Jahr und den Tag innerhalb des Jahres - für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: - \begin{lstlisting} - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - \end{lstlisting} - Dieses Quelltextfragment enthält schlechten Programmierstil, - nämlich mehrere Code-Verdopplungen: - \begin{itemize} - \item - Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf. - \item - Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\ - eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung. - \item - Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert; - stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet. - \end{itemize} - Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife. - - Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR} - anstelle der Zahl 1980 - sowie die Kapselung der Berechnung der Schaltjahr-Bedingung - in einer Funktion \lstinline{IsLeapYear()}. - - \begin{itemize} - \item[(a)] - Erklären Sie das Zustandekommen der Endlosschleife. - \item[(b)] - Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält. - \end{itemize} - - \textbf{Hinweis 1:} Verwenden Sie für \lstinline{IsLeapYear()} - Ihre eigene Funktion aus Aufgabe 1 der letzten Übung. - - \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}. - -\end{document} diff --git a/20201119/init-1.c b/20201119/init-1.c deleted file mode 100644 index 9a05531f9820ada5bb72c00f2443bd6f3b2e5245..0000000000000000000000000000000000000000 --- a/20201119/init-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b = 3, 3; - printf ("a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20201119/init-2.c b/20201119/init-2.c deleted file mode 100644 index e62490d5aa8cad477fa1ed5dc3a2a4b618536ed3..0000000000000000000000000000000000000000 --- a/20201119/init-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b = (3, 3); - printf ("a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20201119/init-3.c b/20201119/init-3.c deleted file mode 100644 index 049bc7d94b12216cb5088b38345a24a9f80a201c..0000000000000000000000000000000000000000 --- a/20201119/init-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b = (3, 3); /* Komma-Operator: ignoriere die erste 3, nimm die zweite */ - /* a ist eine lokale Variable und daher uninitialisiert */ - printf ("a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20201119/loesung-2-4.c b/20201119/loesung-2-4.c deleted file mode 100644 index d141e32582374a3b3e6955f5634191d15edb3709..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-4.c +++ /dev/null @@ -1,41 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int DaysInYear; - if (IsLeapYear (year)) - DaysInYear = 366; - else - DaysInYear = 365; - - while (days > DaysInYear) - { - days -= DaysInYear; - year += 1; - if (IsLeapYear (year)) - DaysInYear = 366; - else - DaysInYear = 365; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-5.c b/20201119/loesung-2-5.c deleted file mode 100644 index 8a71934b7df24a28d11a6696e212aaccc430277f..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-5.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int DaysInYear; - - while (days > (DaysInYear = IsLeapYear (year) ? 366 : 365)) - { - days -= DaysInYear; - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-6.c b/20201119/loesung-2-6.c deleted file mode 100644 index 0605571480991d1ec73a8cec50395ddf68ae3135..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > DaysInYear (year)) - { - days -= DaysInYear (year); - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-7.c b/20201119/loesung-2-7.c deleted file mode 100644 index 5c98286730aae146cf587b5f3401eb6eadd17aa7..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-7.c +++ /dev/null @@ -1,41 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int d; - - while (days > (d = DaysInYear (year))) - { - days -= d; - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-8.c b/20201119/loesung-2-8.c deleted file mode 100644 index e94dc80375b88fd5ff3245e8a99f76a5955b6bb8..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-8.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int d = DaysInYear (year); - - while (days > d) - { - days -= d; - year += 1; - d = DaysInYear (year); - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-f1.c b/20201119/loesung-2-f1.c deleted file mode 100644 index 4d511c4fa7ee6a9dfb0bc2f69412eeb48745af56..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-f1.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-f2.c b/20201119/loesung-2-f2.c deleted file mode 100644 index a44edb09ffde3d3c77cfe673da862260368c33e3..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-f2.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while ((IsLeapYear (year) && days > 366) - || (!IsLeapYear (year) && days > 365)) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/loesung-2-f3.c b/20201119/loesung-2-f3.c deleted file mode 100644 index dbfe5040274953c3b90d6b2da194c0c8ae64f04f..0000000000000000000000000000000000000000 --- a/20201119/loesung-2-f3.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > (IsLeapYear (year) ? 366 : 365)) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20201119/logo-hochschule-bochum-cvh-text-v2.pdf b/20201119/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201119/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201119/logo-hochschule-bochum.pdf b/20201119/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201119/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201119/pgscript.sty b/20201119/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201119/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201119/pgslides.sty b/20201119/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201119/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201119/pointers-1.c b/20201119/pointers-1.c deleted file mode 100644 index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000 --- a/20201119/pointers-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-10.c b/20201119/pointers-10.c deleted file mode 100644 index 87c15939a621158c9bf85349235d11eeba76a577..0000000000000000000000000000000000000000 --- a/20201119/pointers-10.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int calc_answer (void) -{ - return 42; -} - -int main (void) -{ - int answer = 137; - answer = calc_answer (); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-11.c b/20201119/pointers-11.c deleted file mode 100644 index 09beb47172938d4a259e5652571d2c30f94fef19..0000000000000000000000000000000000000000 --- a/20201119/pointers-11.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int a) -{ - a = 42; - printf ("&a = %x\n", &a); -} - -int main (void) -{ - int answer = 137; - printf ("&answer = %x\n", &answer); - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-12.c b/20201119/pointers-12.c deleted file mode 100644 index e75810bc7fa0a7e1553fa35362951d223be2e0b4..0000000000000000000000000000000000000000 --- a/20201119/pointers-12.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; - printf ("a = %x\n", a); - printf ("&a = %x\n", &a); -} - -int main (void) -{ - int answer = 137; - printf ("&answer = %x\n", &answer); - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-2.c b/20201119/pointers-2.c deleted file mode 100644 index 7867933ea67073e239e5b307d2c219639442be77..0000000000000000000000000000000000000000 --- a/20201119/pointers-2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-3.c b/20201119/pointers-3.c deleted file mode 100644 index 69b7182f7df3725e3ecfb4a10d8376eeff43ad4c..0000000000000000000000000000000000000000 --- a/20201119/pointers-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; - printf ("*a = %d\n", *a); - printf ("a = %d\n", a); -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-4.c b/20201119/pointers-4.c deleted file mode 100644 index ab9f4575402b2bde8d1e9b8fd048a57a71eb1586..0000000000000000000000000000000000000000 --- a/20201119/pointers-4.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; - printf ("*a = %d\n", *a); - printf ("a = %x\n", a); -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-5.c b/20201119/pointers-5.c deleted file mode 100644 index f437cf432137bbf3298d038c635b74df6be0d04e..0000000000000000000000000000000000000000 --- a/20201119/pointers-5.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; - printf ("*a = %d\n", *a); - printf ("a = %d\n", a); -} - -int main (void) -{ - int answer; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-6.c b/20201119/pointers-6.c deleted file mode 100644 index 8710b87defa6afd78ca08faf1a9b26c3e7c76969..0000000000000000000000000000000000000000 --- a/20201119/pointers-6.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - printf ("a = %d\n", a); - *a = 42; - printf ("*a = %d\n", *a); -} - -int main (void) -{ - int answer; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-7.c b/20201119/pointers-7.c deleted file mode 100644 index ea57eee75caf86654957e74b28aff69e6979ab20..0000000000000000000000000000000000000000 --- a/20201119/pointers-7.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - printf ("a = %d\n", a); - *a = 42; - printf ("*a = %d\n", *a); -} - -int main (void) -{ - int answer = 137; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-8.c b/20201119/pointers-8.c deleted file mode 100644 index f253112079f1d85db4c5f823c986a35b545c77a0..0000000000000000000000000000000000000000 --- a/20201119/pointers-8.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int a) -{ - a = 42; -} - -int main (void) -{ - int answer = 137; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/pointers-9.c b/20201119/pointers-9.c deleted file mode 100644 index d347a74482460e2b5635562e99ea848fa0e8af55..0000000000000000000000000000000000000000 --- a/20201119/pointers-9.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int a) -{ - a = 42; -} - -int main (void) -{ - int answer = 137; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20201119/strings-1.c b/20201119/strings-1.c deleted file mode 100644 index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000 --- a/20201119/strings-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; -} diff --git a/20201119/strings-10.c b/20201119/strings-10.c deleted file mode 100644 index f01f72c7803ae94d6f35f99f8777b10a0e43f5e0..0000000000000000000000000000000000000000 --- a/20201119/strings-10.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 'H', 'a', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n', 0 }; - printf ("%s", hello); - return 0; -} diff --git a/20201119/strings-11.c b/20201119/strings-11.c deleted file mode 100644 index ced6e34e6d60e600655c4152028416be1139c583..0000000000000000000000000000000000000000 --- a/20201119/strings-11.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 'H', 'a', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n' }; - /* Hier fehlt das Null-Symbol am Ende des Strings! - ==> printf() liest über das String-Ende hinaus, - bis es im Speicher zufällig auf eine 0 stößt. - Dies kann zu einem Absturz führen! */ - printf ("%s", hello); - return 0; -} diff --git a/20201119/strings-12.c b/20201119/strings-12.c deleted file mode 100644 index b35da3453417c6087ce1a3b0db0f10d7e5070231..0000000000000000000000000000000000000000 --- a/20201119/strings-12.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello, world!"; - printf ("%s\n", hello); - return 0; -} diff --git a/20201119/strings-13.c b/20201119/strings-13.c deleted file mode 100644 index 0165d83890b6d0bd202dec2eb62bde98f838db3f..0000000000000000000000000000000000000000 --- a/20201119/strings-13.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%s\n", "Hallo, Welt!"); - return 0; -} diff --git a/20201119/strings-14.c b/20201119/strings-14.c deleted file mode 100644 index 32e64d466014a6c8244f3297198876f1a4a48d5a..0000000000000000000000000000000000000000 --- a/20201119/strings-14.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%s\n", "Hallo, Welt!" + 4); - return 0; -} diff --git a/20201119/strings-15.c b/20201119/strings-15.c deleted file mode 100644 index 2615531f95f77c4d5f1577eff9f8c8180a3b30ab..0000000000000000000000000000000000000000 --- a/20201119/strings-15.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Ersparnis beträgt %d%%.\n", 42); - return 0; -} diff --git a/20201119/strings-16.c b/20201119/strings-16.c deleted file mode 100644 index 43b27266c61a8d05e62a9e5cd5881447d5300ccc..0000000000000000000000000000000000000000 --- a/20201119/strings-16.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Ersparnis beträgt %d%c.\n", 42, '%'); - return 0; -} diff --git a/20201119/strings-17.c b/20201119/strings-17.c deleted file mode 100644 index 3f8e223099e7183a4ecb743458ae1baaed7fdead..0000000000000000000000000000000000000000 --- a/20201119/strings-17.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Der Format-String lautet: %s\n", "%02hhx"); - return 0; -} diff --git a/20201119/strings-18.c b/20201119/strings-18.c deleted file mode 100644 index ac0ad7c70f69972cde6062738962a3b380ab1d7b..0000000000000000000000000000000000000000 --- a/20201119/strings-18.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Добрый день!\n"); - return 0; -} diff --git a/20201119/strings-19.c b/20201119/strings-19.c deleted file mode 100644 index 7f91d53741d7a56e165839108d0c25dc4701ac8f..0000000000000000000000000000000000000000 --- a/20201119/strings-19.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%s\n", "Добрый день!"); - return 0; -} diff --git a/20201119/strings-2.c b/20201119/strings-2.c deleted file mode 100644 index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000 --- a/20201119/strings-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201119/strings-20.c b/20201119/strings-20.c deleted file mode 100644 index 17d6d120cdbee211a3316b0a2ff0f5f0e93fb7b6..0000000000000000000000000000000000000000 --- a/20201119/strings-20.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", "Д"); /* Falsch: gibt die Speicheradresse des "Д" aus. */ - return 0; -} diff --git a/20201119/strings-21.c b/20201119/strings-21.c deleted file mode 100644 index ba95961c605d7b1375f76ddca48b14442892f465..0000000000000000000000000000000000000000 --- a/20201119/strings-21.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", 'Д'); /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'Д'. */ - return 0; -} diff --git a/20201119/strings-22.c b/20201119/strings-22.c deleted file mode 100644 index 982de510faa8dcbd2bcdf285d007b3ccdb98846b..0000000000000000000000000000000000000000 --- a/20201119/strings-22.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%08x\n", 'Д'); /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'Д'. */ - return 0; /* Für korrekte Handhabung von UTF-8: Bibliothek verwenden. */ -} diff --git a/20201119/strings-23.c b/20201119/strings-23.c deleted file mode 100644 index 4b89550c9e9572581894704b4e541346232bb569..0000000000000000000000000000000000000000 --- a/20201119/strings-23.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%08x\n", 'ä'); /* Der ausgegebene Zahlenwert ist _nicht_ der Unicode für 'ä', */ - return 0; /* sondern die UTF-8-Kodierung für 'ä'. */ - /* Für korrekte Handhabung von UTF-8: Bibliothek verwenden. */ -} diff --git a/20201119/strings-3.c b/20201119/strings-3.c deleted file mode 100644 index 5c36db92dac8129b66d1f0ff6b709534b9e1bdb3..0000000000000000000000000000000000000000 --- a/20201119/strings-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 }; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201119/strings-4.c b/20201119/strings-4.c deleted file mode 100644 index aa189d9f4170e47899e9e7854070af0f73573517..0000000000000000000000000000000000000000 --- a/20201119/strings-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 }; - for (char *p = hello; !*p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201119/strings-5.c b/20201119/strings-5.c deleted file mode 100644 index f37edf15be04770135c5b178d204638c18f7f12b..0000000000000000000000000000000000000000 --- a/20201119/strings-5.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hällou, wörldt!\n"; - for (char *p = hello; *p; p++) - printf ("%x ", *p); - printf ("\n"); - return 0; -} diff --git a/20201119/strings-6.c b/20201119/strings-6.c deleted file mode 100644 index 3ae70e168f0a7101ffecb34e407a919dd7c19cf0..0000000000000000000000000000000000000000 --- a/20201119/strings-6.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hällou, wörldt!\n"; - for (char *p = hello; *p; p++) - printf ("%hhx ", *p); - printf ("\n"); - return 0; -} diff --git a/20201119/strings-7.c b/20201119/strings-7.c deleted file mode 100644 index 49dfb3e2a213c46448c33ba949af5ab281018677..0000000000000000000000000000000000000000 --- a/20201119/strings-7.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hällou, wörldt!\n"; - for (char *p = hello; *p; p++) - printf ("%02hhx ", *p); - printf ("\n"); - return 0; -} diff --git a/20201119/strings-8.c b/20201119/strings-8.c deleted file mode 100644 index 2f739c8c80d6923e9f17a184a629a37877f6131c..0000000000000000000000000000000000000000 --- a/20201119/strings-8.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hallo, Welt!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201119/strings-9.c b/20201119/strings-9.c deleted file mode 100644 index 74f11c34440c4ed87b886ef9aad8c9a39cb70a33..0000000000000000000000000000000000000000 --- a/20201119/strings-9.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 }; - printf ("%s", hello); - return 0; -} diff --git a/20201119/test-1.c b/20201119/test-1.c deleted file mode 100644 index 9dcb8ff47664fe804b3c9973166afe0d28b53ade..0000000000000000000000000000000000000000 --- a/20201119/test-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - return - printf ("Hello, world!\n"), - 0; -} diff --git a/20201119/test-2.c b/20201119/test-2.c deleted file mode 100644 index 216c924cde653228187b133b1a899765eb865584..0000000000000000000000000000000000000000 --- a/20201119/test-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b = 13 * a; - if (b = 42) - printf ("Die Antwort lautet: %d\n", b); - else - printf ("Die Antwort lautet: keine Ahnung\n"); - return 0; -} diff --git a/20201119/test-3.c b/20201119/test-3.c deleted file mode 100644 index b8964c8308aec57ed4de30acae8c3e3d31b9fa38..0000000000000000000000000000000000000000 --- a/20201119/test-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 42; - printf ("Die Antwort lautet: "); - printf (a); - return 0; -} diff --git "a/20201126/!\"\302\247$%&/().txt" "b/20201126/!\"\302\247$%&/().txt" deleted file mode 100644 index af5626b4a114abcb82d63db7c8082c3c4756e51b..0000000000000000000000000000000000000000 --- "a/20201126/!\"\302\247$%&/().txt" +++ /dev/null @@ -1 +0,0 @@ -Hello, world! diff --git a/20201126/aufgabe-1.c b/20201126/aufgabe-1.c deleted file mode 100644 index ad9d80416bad5c7c0edf9c9d4f175146c92a2755..0000000000000000000000000000000000000000 --- a/20201126/aufgabe-1.c +++ /dev/null @@ -1,8 +0,0 @@ -int fun_1 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} diff --git a/20201126/aufgabe-2-1.c b/20201126/aufgabe-2-1.c deleted file mode 100644 index e56af8cdd1c1abcac992605475472612878b786d..0000000000000000000000000000000000000000 --- a/20201126/aufgabe-2-1.c +++ /dev/null @@ -1,6 +0,0 @@ -char *f = "char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c"; - -main () -{ - printf (f, 34, f, 34, 10); -} diff --git a/20201126/aufgabe-2-2.c b/20201126/aufgabe-2-2.c deleted file mode 100644 index 9d3e005456a7316340a5c5d404e7d6f911487771..0000000000000000000000000000000000000000 --- a/20201126/aufgabe-2-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -char *f = "char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c"; - -int main (void) -{ - printf (f, 34, f, 34, 10); - return 0; -} diff --git a/20201126/aufgabe-2.c b/20201126/aufgabe-2.c deleted file mode 100644 index dc58b6e8ee4a7a023654aa0eb3a9715a5b9f75cf..0000000000000000000000000000000000000000 --- a/20201126/aufgabe-2.c +++ /dev/null @@ -1 +0,0 @@ -char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} diff --git a/20201126/aufgabe-3.c b/20201126/aufgabe-3.c deleted file mode 100644 index cd80c21b95b5a4c91a43a8b3e849f5e12db183c7..0000000000000000000000000000000000000000 --- a/20201126/aufgabe-3.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20201126/case-convert-1.c b/20201126/case-convert-1.c deleted file mode 100644 index 014847ef707d757d7a7a3aec8da33bc5e215a987..0000000000000000000000000000000000000000 --- a/20201126/case-convert-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'f'; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-2.c b/20201126/case-convert-2.c deleted file mode 100644 index 3369266d66046b658726e9df95e965c28dd19770..0000000000000000000000000000000000000000 --- a/20201126/case-convert-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'f'; - ch -= 32; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-3.c b/20201126/case-convert-3.c deleted file mode 100644 index 67666849149fc37220cc793c4f266b2a05ea2983..0000000000000000000000000000000000000000 --- a/20201126/case-convert-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'f'; - ch = ch - 'f' + 'F'; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-4.c b/20201126/case-convert-4.c deleted file mode 100644 index 06648d1f097adfed6bd3cc7246b59f3f958a6a70..0000000000000000000000000000000000000000 --- a/20201126/case-convert-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'f'; - ch += 'F' - 'f'; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-5.c b/20201126/case-convert-5.c deleted file mode 100644 index 5718dda862fea32003090f38d446c3f3a74bdc93..0000000000000000000000000000000000000000 --- a/20201126/case-convert-5.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'f'; - ch += 'A' - 'a'; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-6.c b/20201126/case-convert-6.c deleted file mode 100644 index 1f7960abb162cb218ad44643cacbacc09e250e17..0000000000000000000000000000000000000000 --- a/20201126/case-convert-6.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char ch = 'G'; - ch += 'a' - 'A'; - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/case-convert-7.c b/20201126/case-convert-7.c deleted file mode 100644 index 0133886c5c7bd30abb6ba9f7e0aed96dee765b2f..0000000000000000000000000000000000000000 --- a/20201126/case-convert-7.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> -#include <ctype.h> - -int main (void) -{ - char ch = 'G'; - ch = tolower (ch); - printf ("%c\n", ch); - return 0; -} diff --git a/20201126/fhello-1.c b/20201126/fhello-1.c deleted file mode 100644 index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000 --- a/20201126/fhello-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello-10.c b/20201126/fhello-10.c deleted file mode 100644 index 78247d9705598987ddb185d5fc216fe4bacf6fea..0000000000000000000000000000000000000000 --- a/20201126/fhello-10.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("/bin/bash", "w"); - if (!f) - error (errno, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello-2.c b/20201126/fhello-2.c deleted file mode 100644 index 2acae5f3218fef4441eca339682c0d8076e4e18d..0000000000000000000000000000000000000000 --- a/20201126/fhello-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "a"); /* "a" = "append", "w" = "(over)write" */ - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello-3.c b/20201126/fhello-3.c deleted file mode 100644 index 50afa600ce12073f7646a0548807b6472bc3b11e..0000000000000000000000000000000000000000 --- a/20201126/fhello-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello-4.c b/20201126/fhello-4.c deleted file mode 100644 index 7bda3500fb3e652126b90e8ba3daea29a7dce026..0000000000000000000000000000000000000000 --- a/20201126/fhello-4.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - if (f != NULL) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; -} diff --git a/20201126/fhello-5.c b/20201126/fhello-5.c deleted file mode 100644 index 0445ee2006464b73ab44f95dce0b60324391834c..0000000000000000000000000000000000000000 --- a/20201126/fhello-5.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; -} diff --git a/20201126/fhello-6.c b/20201126/fhello-6.c deleted file mode 100644 index a479c4694d2d370c5182d993c40ee8b4e73c4eb6..0000000000000000000000000000000000000000 --- a/20201126/fhello-6.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <errno.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; -} diff --git a/20201126/fhello-7.c b/20201126/fhello-7.c deleted file mode 100644 index 96a6610279c9a8bb6422aad12e96a33759fe6cd5..0000000000000000000000000000000000000000 --- a/20201126/fhello-7.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <string.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; -} diff --git a/20201126/fhello-8.c b/20201126/fhello-8.c deleted file mode 100644 index dc2ae6dea521671443cec60ded691ac360bc7a36..0000000000000000000000000000000000000000 --- a/20201126/fhello-8.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("!\"§$%&/().txt", "w"); - if (f == NULL) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello-9.c b/20201126/fhello-9.c deleted file mode 100644 index eaf23c4c77267d20d0b97fe46fa552b748df2c33..0000000000000000000000000000000000000000 --- a/20201126/fhello-9.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("/bin/bash", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20201126/fhello.txt b/20201126/fhello.txt deleted file mode 100644 index 95e75d98dbaf42c1efc9be0405e079f97aa24888..0000000000000000000000000000000000000000 --- a/20201126/fhello.txt +++ /dev/null @@ -1,2 +0,0 @@ -Hello, world! -Hello, world! diff --git a/20201126/hp-20201126.pdf b/20201126/hp-20201126.pdf deleted file mode 100644 index 2959fd2fd51e46a31144dde6e7d15453ce89b729..0000000000000000000000000000000000000000 Binary files a/20201126/hp-20201126.pdf and /dev/null differ diff --git a/20201126/hp-20201126.tex b/20201126/hp-20201126.tex deleted file mode 100644 index 4c7a8e88b1e7826dc63f339b4199c9346090b1ae..0000000000000000000000000000000000000000 --- a/20201126/hp-20201126.tex +++ /dev/null @@ -1,773 +0,0 @@ -% hp-20201126.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{26.\ November 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{medgreen} - \item[2.10] Zeiger - \color{orange} - \item[2.11] Arrays und Strings - \color{red} - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{black} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{9} -\subsection{Zeiger} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - -% \pause - \vspace{-5cm}\hspace{5cm}% - \begin{minipage}{7cm} - \begin{itemize} - \item - \lstinline{*a} ist eine \lstinline{int}. -% \pause - \item - unärer Operator \lstinline{*}:\\ - Pointer-Dererefenzierung -% \pause - \arrowitem - \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}. -% \pause - \bigskip - \item - unärer Operator \lstinline{&}: Adresse - \end{itemize} - \end{minipage} -\end{frame} - -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}. - -% \bigskip - \pause - \pause - - \begin{onlyenv}<1-8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<11> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<12> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<13-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - - \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. - \pause - \pause - \item - \only<6-9>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. - \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<14->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} - \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1-6> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<7> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - while (*hello) - printf ("%c", *hello++); - return 0; - } - \end{lstlisting} - \end{onlyenv} - - \vspace{-1.7cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} - \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. - \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<5->{\\ - also ein Zeiger auf (kleinere) Integer}. - \pause - \pause - \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal - \pause - & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz? - - \smallskip - - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - \end{lstlisting} - - \smallskip - - (normalerweise: ASCII) - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe?\\[-\smallskipamount] - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \medskip - \item - Groß- in Kleinbuchstaben umwandeln\\[-\smallskipamount] - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 16, 11, 2020 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 26; - (*d).month = 11; - (*d).year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 26; - d->month = 11; - d->year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Dateien und Fehlerbehandlung} - -\begin{frame}[fragile] - \showsubsection - \vspace*{-0.2925cm} - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <er¡ror.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \end{minipage}\pause\hspace*{-1.5cm}% - \begin{minipage}[t]{8.5cm} - \bigskip - \only<3->{\bigskip} - \begin{itemize} - \item - Wenn die Datei nicht geöffnet werden kann,\\ - gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück. - \pause - \medskip - \item - \addtolength{\leftskip}{1cm} - Die globale Variable \lstinline{int errno}\\ - enthält dann die Nummer des Fehlers.\\ - Benötigt: \lstinline{#include <errno.h>} - \pause - \medskip - \only<5->{\bigskip} - \item - Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\ - in einen Fehlermeldungstext um.\\ - Benötigt: \lstinline{#include <string.h>} - \pause - \medskip - \item - \addtolength{\leftskip}{-1.5cm} - Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\ - und beendet das Programm.\\ - Benötigt: \lstinline{#include <er¡¿ror.h>} - \pause - \medskip - \item - \textbf{Niemals Fehler einfach ignorieren!} - \end{itemize} - \addtolength{\leftskip}{0.5cm} - \end{minipage} -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20201126/hp-musterloesung-20201126.pdf b/20201126/hp-musterloesung-20201126.pdf deleted file mode 100644 index 4739320734aabdfa9557d77aa213fea5b04f515e..0000000000000000000000000000000000000000 Binary files a/20201126/hp-musterloesung-20201126.pdf and /dev/null differ diff --git a/20201126/hp-musterloesung-20201126.tex b/20201126/hp-musterloesung-20201126.tex deleted file mode 100644 index f885398763f9073f0f4a58462ff405342bdaf001..0000000000000000000000000000000000000000 --- a/20201126/hp-musterloesung-20201126.tex +++ /dev/null @@ -1,414 +0,0 @@ -% hp-musterloesung-20201126.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 26.\ November 2020} - - \exercise{Strings} - - Strings werden in der Programmiersprache C - durch Zeiger auf \lstinline{char}-Variable realisiert. - - Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-1.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \end{center} - \begin{itemize} - \item[(a)] - Was bewirkt die Funktion? % \points{3} - \item[(b)] - Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife? % \points{2} - \item[(c)] - Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3} -% \item[(d)] -% Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()} -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings -% -- und warum? % \points{2} - \item[(d)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter. -% und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt die Funktion?} - - Sie vergleicht zwei Strings miteinander bis zur Länge des kürzeren Strings - und gibt bei Gleichheit 1 zurück, ansonsten 0. - - Mit anderen Worten: - Die Funktion prüft, ob zwei Strings bis zur Länge des kürzeren übereinstimmen, - und gibt bei Gleichheit 1 zurück, ansonsten 0. - - Die Funktion prüft insbesondere \textbf{nicht} zwei Strings auf Gleichheit, - und sie ist \textbf{nicht} funktionsgleich zur - Standard-Bibliotheksfunktion \lstinline{strcmp()}. - - \item[(b)] - \textbf{Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife?} - - Die Bedingung prüft, ob \emph{bei einem der beiden Strings\/} - die Ende-Markierung (Null-Symbol) erreicht ist. - Falls ja, wird die Schleife beendet. - - \item[(c)] - \textbf{Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde?} - - In diesem Fall würde nur für \lstinline{s1} geprüft, - ob das Ende erreicht ist. - Wenn \lstinline{s1} länger ist als \lstinline{s2}, - würde \lstinline{s2} über sein Ende hinaus ausgelesen. - Dies kann zu Lesezugriffen auf Speicher außerhalb des Programms - und damit zu einem Absturz führen - ("`Speicherzugriffsfehler"', "`Schutzverletzung"'). - - \item[(d)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.} - - Die Effizienz läßt sich steigern, indem man die Schleife abbricht, - sobald das Ergebnis feststeht. - Es folgen drei Möglichkeiten, dies zu realisieren. - \end{itemize} - - \begin{center} - \begin{minipage}[t]{8cm} - Erweiterung der Schleifenbedingung: - - \begin{lstlisting}[gobble=8] - int fun_2 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i] && result; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - Verwendung von \lstinline{return}: - - \begin{lstlisting}[gobble=8] - int fun_3 (char *s1, char *s2) - { - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - return 0; - return 1; - } - \end{lstlisting} - \end{minipage} - \end{center} - \vspace*{-1cm}\goodbreak - - \begin{center} - \begin{minipage}{9cm} - Die nebenstehende Lösung unter Verwendung von \lstinline{break} - ist zwar ebenfalls richtig, aber länger und weniger übersichtlich - als die beiden anderen Lösungen. - - \smallskip - - Die Datei \gitfile{hp}{2020ws/20201126}{loesung-1.c} enthält ein Testprogramm - für alle o.\,a.\ Lösungen. - Das Programm testet nur die offensichtlichsten Fälle; - für den Einsatz der Funktionen in einer Produktivumgebung - wären weitaus umfassendere Tests erforderlich. - - \smallskip - - Das Testprogramm enthält String-Zuweisungen wie z.\,B.\ - \lstinline{s2 = "Apfel"}. - Dies funktioniert, weil wir damit einen Zeiger (\lstinline{char *s2}) - auf einen neuen Speicherbereich (\lstinline{"Apfel"}) zeigen lassen. - Eine entsprechende Zuweisung zwischen Arrays - (\lstinline{char s3[] = "Birne"; s3 = "Pfirsich";)} - funktioniert \emph{nicht}. - - \end{minipage}\hspace*{1cm}% - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=8] - int fun_4 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - { - result = 0; - break; - } - return result; - } - \end{lstlisting} - \end{minipage} - \end{center} - - \exercise{Programm analysieren} - - Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-2.c}): - \begin{lstlisting} - char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} - \end{lstlisting} - \vspace{-\medskipamount} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? - \item[(b)] - Wofür stehen die Zahlen? - \item[(c)] - Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll. - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm?} - - Es gibt \emph{seinen eigenen Quelltext\/} aus. - - (Wichtig ist die Bezugnahme auf den eigenen Quelltext. - Die Angabe\\ - "`Es gibt - \lstinline|char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}| - aus"'\\ - genügt insbesondere nicht.) - - \item[(b)] - \textbf{Wofür stehen die Zahlen?} - - Die 34 steht für ein Anführungszeichen und die 10 für ein - Zeilenendezeichen (\lstinline{\n}). - - Hintergrund: Um den eigenen Quelltext ausgeben zu können, muß - das Programm auch Anführungszeichen und Zeilenendezeichen - ausgeben. Dies geschieht normalerweise mit vorangestelltem - Backslash: \lstinline{\"} bzw.\ \lstinline{\n}. Um dann aber - den Backslash ausgeben zu können, müßte man diesem ebenfalls - einen Backslash voranstellen: \lstinline{\\}. Damit dies nicht - zu einer Endlosschleife wird, verwendet der Programmierer - dieses Programms den Trick mit den Zahlen, die durch - \lstinline{%c} als Zeichen ausgegeben werden. - - \item[(c)] - \textbf{Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.} - - Datei: \gitfile{hp}{2020ws/20201126}{loesung-2.c} - \begin{lstlisting}[gobble=8] - char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c"; - int main(void){printf(f,34,f,34,10);return 0;} - \end{lstlisting} - Das Programm ist eine einzige, lange Zeile, die hier nur aus - Platzgründen als zwei Zeilen abgedruckt wird. Auf das - Semikolon am Ende der "`ersten Zeile"' folgt unmittelbar -- ohne Leerzeichen -- - das Schlüsselwort \lstinline{int} am Anfang der "`zweiten Zeile"'. - - Mit "`die in Aufgabenteil (a) festgestellte Eigenschaft"' ist - gemeint, daß das Programm weiterhin seinen eigenen Quelltext - ausgeben soll. Die Herausforderung dieser Aufgabe besteht - darin, das Programm zu modifizieren, ohne diese Eigenschaft zu - verlieren. - - Zusatzaufgabe für Interessierte: Ergänzen Sie das Programm so, - daß es auch mit \lstinline[style=cmd]{-Wall} ohne Warnungen - compiliert werden kann. - - Hinweis dazu: \lstinline{#include<stdio.h>} - (ohne Leerzeichen, um Platz zu sparen) - - Lösung der Zusatzaufgabe: \gitfile{hp}{2020ws/20201126}{loesung-2x.c} - - \end{itemize} - - \exercise{Fehlerhaftes Primzahl-Programm} - - \begin{minipage}[t]{5.5cm} - Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-3.c}) - soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft. - - \smallskip - - Korrigieren Sie das Programm derart, daß ein Programm entsteht, - welches alle Primzahlen kleiner 100 ausgibt.% \points 5 - \end{minipage}\hfill - \begin{minipage}[t]{9cm} - \vspace*{-0.5cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; - } - \end{lstlisting} - \end{minipage} - - \solution - - Beim Compilieren des Beispiel-Programms mit - \lstinline[style=cmd]{gcc -Wall} erhalten wir die folgende Warnung: - \begin{lstlisting}[style=terminal] - aufgabe-2.c:11:5: warning: suggest parentheses around assignment - used as truth value [-Wparentheses] - \end{lstlisting} - Beim Ausführen gibt das Programm die folgende (falsche) Behauptung aus: - \begin{lstlisting}[style=terminal] - 100 ist eine Primzahl. - \end{lstlisting} - - Einen ersten Hinweis auf den Fehler im Programm liefert die Warnung. - Die Bedingung \lstinline{if (divisors = 2)} in Zeile 11 - steht \emph{nicht\/} für einen Vergleich - der Variablen \lstinline{divisors} mit der Zahl 2, - sondern für eine Zuweisung der Zahl 2 an die Variable \lstinline{divisors}. - Neben dem \emph{Seiteneffekt\/} der Zuweisung gibt \lstinline{divisors = 2} - den Wert \lstinline{2} zurück. - Als Bedingung interpretiert, hat \lstinline{2} den Wahrheitswert "`wahr"' ("`true"'); - die \lstinline{printf()}-Anweisung wird daher in jedem Fall ausgeführt. - - Korrektur dieses Fehlers: \lstinline{if (divisors == 2)} - -- siehe die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-1.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers compiliert das Programm ohne Warnung, - gibt aber beim Ausführen die folgende Fehlermeldung aus: - \begin{lstlisting}[style=terminal] - Gleitkomma-Ausnahme - \end{lstlisting} - (Bemerkung: Bei ausgeschalteter Optimierung - -- \lstinline[style=cmd]{gcc} ohne \lstinline[style=cmd]{-O} -- - kommt diese Fehlermeldung bereits beim ersten Versuch, das Programm auszuführen. - Der Grund für dieses Verhalten ist, daß bei eingeschalteter Optimierung - irrelevante Teile des Programms entfernt und gar nicht ausgeführt werden, - so daß der Fehler nicht zum Tragen kommt. - In diesem Fall wurde die Berechnung von \lstinline{divisors} komplett wegoptimiert, - da der Wert dieser Variablen nirgendwo abgefragt, - sondern durch die Zuweisung \lstinline{if (divisors = 2)} - sofort wieder überschrieben wurde.) - - Die Fehlermeldung "`\lstinline[style=terminal]{Gleitkomma-Ausnahme}"' - ist insofern irreführend, als daß hier gar keine Gleitkommazahlen im Spiel sind; - andererseits deutet sie auf einen Rechenfehler hin, was auch tatsächlich zutrifft. - Durch Untersuchen aller Rechenoperationen - -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} -- - finden wir den Fehler in Zeile 9: - Die Modulo-Operation \lstinline{n % i} ist eine Division, - die dann fehlschlägt, wenn der Divisor \lstinline{i} den Wert 0 hat. - Die Fehlerursache ist die bei 0 beginnende \lstinline{for}-Schleife in Zeile 8: - \lstinline{for (i = 0; i < n; i++)}. - - Korrektur dieses Fehlers: Beginn der Schleife mit \lstinline{i = 1} - statt \lstinline{i = 0} -- siehe die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-2.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers gibt das Programm überhaupt nichts mehr aus. - - Durch Untersuchen des Verhaltens des Programms - -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} -- - stellen wir fest, daß die Zeilen 8 bis 12 des Programms nur einmal ausgeführt werden - und nicht, wie die \lstinline{for}-Schleife in Zeile 6 vermuten ließe, 100mal. - Der Grund dafür ist, daß sich die \lstinline{for}-Schleife - nur auf die unmittelbar folgende Anweisung \lstinline{divisors = 0} bezieht. - Nur diese Zuweisung wird 100mal ausgeführt; - alles andere befindet sich außerhalb der \lstinline{for}-Schleife. - (Die Einrückung hat in C keine inhaltliche Bedeutung, - sondern dient nur zur Verdeutlichung der Struktur des Programms. - In diesem Fall entsprach die tatsächliche Struktur nicht der beabsichtigten.) - - Korrektur dieses Fehlers: - geschweifte Klammern um den Inhalt der äußeren \lstinline{for}-Schleife - -- siehe die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-3.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers gibt das Programm folgendes aus: - \begin{lstlisting}[style=terminal] - 4 ist eine Primzahl. - 9 ist eine Primzahl. - 25 ist eine Primzahl. - 49 ist eine Primzahl. - \end{lstlisting} - Diese Zahlen sind keine Primzahlen (mit zwei Teilern), - sondern sie haben drei Teiler. - Demnach findet das Programm einen Teiler zu wenig. - (Um diesen Fehler zu finden, kann man sich zu jeder Zahl - die gefundene Anzahl der Teiler \lstinline{divisors} ausgeben lassen.) - - Der nicht gefundene Teiler ist jeweils die Zahl selbst. - Dies kommt daher, daß die Schleife - \lstinline{for (i = 1; i < n; i++)} nur bis \lstinline{n - 1} geht, - also keine Division durch \lstinline{n} stattfindet. - - Korrektur dieses Fehlers: Schleifenbedingung \lstinline{i <= n} - statt \lstinline{i < n} - -- siehe die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-4.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers verhält sich das Programm korrekt. - - Die Datei \gitfile{hp}{2020ws/20201126}{loesung-2-4.c} enthält somit das korrigierte Programm. - -\end{document} diff --git a/20201126/hp-uebung-20201126.pdf b/20201126/hp-uebung-20201126.pdf deleted file mode 100644 index 271787494f648cfbc71bbcf7b195bc60dda2eb83..0000000000000000000000000000000000000000 Binary files a/20201126/hp-uebung-20201126.pdf and /dev/null differ diff --git a/20201126/hp-uebung-20201126.tex b/20201126/hp-uebung-20201126.tex deleted file mode 100644 index 9ca341764b4364160bdfd75783fd46d17188d85d..0000000000000000000000000000000000000000 --- a/20201126/hp-uebung-20201126.tex +++ /dev/null @@ -1,127 +0,0 @@ -% hp-uebung-20201126.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 26.\ November 2020} - - \exercise{Strings} - - Strings werden in der Programmiersprache C - durch Zeiger auf \lstinline{char}-Variable realisiert. - - Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-1.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \end{center} - \begin{itemize} - \item[(a)] - Was bewirkt die Funktion? % \points{3} - \item[(b)] - Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife? % \points{2} - \item[(c)] - Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3} -% \item[(d)] -% Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()} -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings -% -- und warum? % \points{2} - \item[(d)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter. -% und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5} - \end{itemize} - - \exercise{Programm analysieren} - - Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-2.c}): - \begin{lstlisting} - char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} - \end{lstlisting} - \vspace{-\medskipamount} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? - \item[(b)] - Wofür stehen die Zahlen? - \item[(c)] - Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll. - \end{itemize} - - \exercise{Fehlerhaftes Primzahl-Programm} - - \begin{minipage}[t]{5.5cm} - Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{2020ws/20201126}{aufgabe-3.c}) - soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft. - - \smallskip - - Korrigieren Sie das Programm derart, daß ein Programm entsteht, - welches alle Primzahlen kleiner 100 ausgibt.% \points 5 - \end{minipage}\hfill - \begin{minipage}[t]{9cm} - \vspace*{-0.5cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; - } - \end{lstlisting} - \end{minipage} - -\end{document} diff --git a/20201126/loesung-1.c b/20201126/loesung-1.c deleted file mode 100644 index 29a2b7f234ea5c31b06780e9dd461dff95dd33a3..0000000000000000000000000000000000000000 --- a/20201126/loesung-1.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <stdio.h> - -int fun_1 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} - -int fun_2 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i] && result; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} - -int fun_3 (char *s1, char *s2) -{ - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - return 0; - return 1; -} - -int fun_4 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - { - result = 0; - break; - } - return result; -} - -int main (void) -{ - char *s1 = "Apfel"; - char *s2 = "Apfelkuchen"; - if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2)) - printf ("OK\n"); - else - printf ("failed\n"); - s1 = "Apfelkuchen"; - s2 = "Apfel"; - if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2)) - printf ("OK\n"); - else - printf ("failed\n"); - s2 = "Birnenmarmelade"; - if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2)) - printf ("failed\n"); - else - printf ("OK\n"); - s1 = s2; - s2 = "Apfelkuchen"; - if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2)) - printf ("failed\n"); - else - printf ("OK\n"); - return 0; -} diff --git a/20201126/loesung-2.c b/20201126/loesung-2.c deleted file mode 100644 index 6346384a81d62e7e687f4db99be3ba8fe4020744..0000000000000000000000000000000000000000 --- a/20201126/loesung-2.c +++ /dev/null @@ -1 +0,0 @@ -char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c";int main(void){printf(f,34,f,34,10);return 0;} diff --git a/20201126/loesung-2x.c b/20201126/loesung-2x.c deleted file mode 100644 index fcc65e153ddf009f55af118278774cd202f7c316..0000000000000000000000000000000000000000 --- a/20201126/loesung-2x.c +++ /dev/null @@ -1,2 +0,0 @@ -#include<stdio.h> -char*f="#include<stdio.h>%cchar*f=%c%s%c;int main(void){printf(f,10,34,f,34,10);return 0;}%c";int main(void){printf(f,10,34,f,34,10);return 0;} diff --git a/20201126/loesung-3-1.c b/20201126/loesung-3-1.c deleted file mode 100644 index 248883b772ca68d498ae4dc080e83899eb715570..0000000000000000000000000000000000000000 --- a/20201126/loesung-3-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20201126/loesung-3-2.c b/20201126/loesung-3-2.c deleted file mode 100644 index 0cc3db639099eab0040c568acbd46987eb599645..0000000000000000000000000000000000000000 --- a/20201126/loesung-3-2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 1; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20201126/loesung-3-3.c b/20201126/loesung-3-3.c deleted file mode 100644 index af2694c1ad2f710d79d7913b9dcfc7348be96115..0000000000000000000000000000000000000000 --- a/20201126/loesung-3-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - { - divisors = 0; - for (i = 1; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - } - return 0; -} diff --git a/20201126/loesung-3-4.c b/20201126/loesung-3-4.c deleted file mode 100644 index 770d92706cc68f64147e5efd443880ac3d875495..0000000000000000000000000000000000000000 --- a/20201126/loesung-3-4.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - { - divisors = 0; - for (i = 1; i <= n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - } - return 0; -} diff --git a/20201126/logo-hochschule-bochum-cvh-text-v2.pdf b/20201126/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201126/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201126/logo-hochschule-bochum.pdf b/20201126/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201126/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201126/pgscript.sty b/20201126/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201126/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201126/pgslides.sty b/20201126/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201126/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201126/printf-shell-1.txt b/20201126/printf-shell-1.txt deleted file mode 100644 index ce393366b481a5c51a936c9b24fe25225c497787..0000000000000000000000000000000000000000 --- a/20201126/printf-shell-1.txt +++ /dev/null @@ -1,8 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201126> printf "%d\n" "*" -bash: printf: *: Ungültige Zahl. -0 -cassini/home/peter/bo/2020ws/hp/20201126> printf "%d\n" "'*'" -42 -cassini/home/peter/bo/2020ws/hp/20201126> printf "%c\n" "71" -7 -cassini/home/peter/bo/2020ws/hp/20201126> diff --git a/20201126/strings-1.c b/20201126/strings-1.c deleted file mode 100644 index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000 --- a/20201126/strings-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; -} diff --git a/20201126/strings-10.c b/20201126/strings-10.c deleted file mode 100644 index 4eeff0a580144625c15a6891d4286cf3da8d5f77..0000000000000000000000000000000000000000 --- a/20201126/strings-10.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - hello[2] = 'a'; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-11.c b/20201126/strings-11.c deleted file mode 100644 index 10e25acce870c66d065dc0015eeba501ad86e0a7..0000000000000000000000000000000000000000 --- a/20201126/strings-11.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - hello[1] = 'a'; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-12.c b/20201126/strings-12.c deleted file mode 100644 index ce49cd0f83ac1e365fd65bb6062aeb9232f18ed3..0000000000000000000000000000000000000000 --- a/20201126/strings-12.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - hello[1] = 97; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-13.c b/20201126/strings-13.c deleted file mode 100644 index dc6b7ca9a467d92f6862d273006873c26bcf122a..0000000000000000000000000000000000000000 --- a/20201126/strings-13.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello!\n"; - printf ("%s", hello); - hello[1] = 'a'; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-14.c b/20201126/strings-14.c deleted file mode 100644 index 763459bc896426c4814d752938c2d5bbd00dca9a..0000000000000000000000000000000000000000 --- a/20201126/strings-14.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello!\n"; - printf ("%s", hello); - hello = "Hallo?\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-15.c b/20201126/strings-15.c deleted file mode 100644 index 35197e386606fdf120f375fcf078be814ce7b633..0000000000000000000000000000000000000000 --- a/20201126/strings-15.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello!\n"; - printf ("%s", hello); - hello = "Hallo, Welt!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-16.c b/20201126/strings-16.c deleted file mode 100644 index 64abcdc7574cfbe0424643a2c4076fdd448f53fd..0000000000000000000000000000000000000000 --- a/20201126/strings-16.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - hello = "Hallo, Welt!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-17.c b/20201126/strings-17.c deleted file mode 100644 index b0d9dcebb6acd1df56fc3b1314a6f6d8cf7a7a04..0000000000000000000000000000000000000000 --- a/20201126/strings-17.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - strcpy (hello, "Hallo, Welt!\n"); /* Achtung: Dies kann einen Absturz bewirken! */ - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-2.c b/20201126/strings-2.c deleted file mode 100644 index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000 --- a/20201126/strings-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201126/strings-3.c b/20201126/strings-3.c deleted file mode 100644 index 8da904190d58e16b20d84e19a41e639893831f5e..0000000000000000000000000000000000000000 --- a/20201126/strings-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10 }; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201126/strings-4.c b/20201126/strings-4.c deleted file mode 100644 index 5c36db92dac8129b66d1f0ff6b709534b9e1bdb3..0000000000000000000000000000000000000000 --- a/20201126/strings-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 }; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20201126/strings-5.c b/20201126/strings-5.c deleted file mode 100644 index 74f11c34440c4ed87b886ef9aad8c9a39cb70a33..0000000000000000000000000000000000000000 --- a/20201126/strings-5.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0 }; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-6.c b/20201126/strings-6.c deleted file mode 100644 index 75c2a1cc5802891944f08a18056bb88194960fac..0000000000000000000000000000000000000000 --- a/20201126/strings-6.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = { 51, 50, 49, 48, 10, 0 }; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-7.c b/20201126/strings-7.c deleted file mode 100644 index 68227c25325d9699430cacc3d071c5dad629fb40..0000000000000000000000000000000000000000 --- a/20201126/strings-7.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-8.c b/20201126/strings-8.c deleted file mode 100644 index c75e8485434dd0f3578ad93e7c574f466424e544..0000000000000000000000000000000000000000 --- a/20201126/strings-8.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/strings-9.c b/20201126/strings-9.c deleted file mode 100644 index 5db41cf82ce518086b515eadca849ee76d87dc02..0000000000000000000000000000000000000000 --- a/20201126/strings-9.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello!\n"; - printf ("%s", hello); - hello[2] = "a"; - printf ("%s", hello); - return 0; -} diff --git a/20201126/structs-0.c b/20201126/structs-0.c deleted file mode 100644 index c597fc0612ca99a9d3d258310326bbee79f4f258..0000000000000000000000000000000000000000 --- a/20201126/structs-0.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -char day, month; -int year; - -int main (void) -{ - day = 26; - month = 11; - year = 2020; - printf ("%d.%d.%d\n", day, month, year); - return 0; -} diff --git a/20201126/structs-1.c b/20201126/structs-1.c deleted file mode 100644 index 1d71fbad0842877465d396b725b1f9626e0d9eb4..0000000000000000000000000000000000000000 --- a/20201126/structs-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -int main (void) -{ - date today = { 26, 11, 2020 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/20201126/structs-2.c b/20201126/structs-2.c deleted file mode 100644 index e9d0986ccdf4a7106e59c0ee30eb1bfcd779e255..0000000000000000000000000000000000000000 --- a/20201126/structs-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 26; - (*d).month = 11; - (*d).year = 2020; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/20201126/structs-3.c b/20201126/structs-3.c deleted file mode 100644 index 6ed3133cc2097f3b7682588d2cef1b7aafeed692..0000000000000000000000000000000000000000 --- a/20201126/structs-3.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 26; - (*d).month = 11; - (*d).year = 2020; -} - -void print_date (date *d) -{ - printf ("%d.%d.%d\n", (*d).day, (*d).month, (*d).year); -} - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20201126/structs-4.c b/20201126/structs-4.c deleted file mode 100644 index 390ce938ef8fd579b860b96303264b7303e67123..0000000000000000000000000000000000000000 --- a/20201126/structs-4.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 26; - d->month = 11; - d->year = 2020; -} - -void print_date (date *d) -{ - printf ("%d.%d.%d\n", d->day, d->month, d->year); -} - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20201126/structs-5.c b/20201126/structs-5.c deleted file mode 100644 index d48a32b38c32a57265042e3029aee6bd14467dae..0000000000000000000000000000000000000000 --- a/20201126/structs-5.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; - char *day_of_week; -} -date; - -void set_date (date *d) -{ - d->day = 26; - d->month = 11; - d->year = 2020; - d->day_of_week = "Thu"; -} - -void print_date (date *d) -{ - printf ("%s, %d.%d.%d\n", d->day_of_week, d->day, d->month, d->year); -} - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20201126/test-1.txt b/20201126/test-1.txt deleted file mode 100644 index aa4dca97b969d32af064e9bf480c1f861caea227..0000000000000000000000000000000000000000 --- a/20201126/test-1.txt +++ /dev/null @@ -1,10 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201126> cat -Hallo? -Hallo? -Hallo. -Hallo. -cassini/home/peter/bo/2020ws/hp/20201126> cat > test.txt -Dies ist ein Test. -cassini/home/peter/bo/2020ws/hp/20201126> cat test.txt -Dies ist ein Test. -cassini/home/peter/bo/2020ws/hp/20201126> diff --git a/20201126/test.txt b/20201126/test.txt deleted file mode 100644 index d7e5cff47f0303c2d892d3e790e00552759b639c..0000000000000000000000000000000000000000 --- a/20201126/test.txt +++ /dev/null @@ -1 +0,0 @@ -Dies ist ein Test. diff --git a/20201203/aufgabe-1.c b/20201203/aufgabe-1.c deleted file mode 100644 index 632b4b796ae2f4060878a8870b9e7e55e5f064b9..0000000000000000000000000000000000000000 --- a/20201203/aufgabe-1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void f (int *s0, int *s1) -{ - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); -} - -int main (void) -{ - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; -} diff --git a/20201203/aufgabe-1c.c b/20201203/aufgabe-1c.c deleted file mode 100644 index 9b6e7ab2ecfbddc16121acd229a13745182190c2..0000000000000000000000000000000000000000 --- a/20201203/aufgabe-1c.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void f (int *s0, int *s1) -{ - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); -} - -int main (void) -{ - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; -} diff --git a/20201203/fibonacci-1.c b/20201203/fibonacci-1.c deleted file mode 100644 index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int f0 = 0; - int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - int f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201203/fibonacci-10.c b/20201203/fibonacci-10.c deleted file mode 100644 index 5f5da72d082bc53737e63a29a3e027243adccba2..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-10.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdio.h> - -#define DIGITS 60 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - char carry = 0; - for (int i = 0; i < DIGITS; i++) - { - c[i] = a[i] + b[i] + carry; - if (c[i] > 9) - { - carry = 1; - c[i] -= 10; - } - else - carry = 0; - } -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 200; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-11.c b/20201203/fibonacci-11.c deleted file mode 100644 index f952267a7028434ec5e35b33541659a3be3aeef9..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-11.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdio.h> - -#define DIGITS 20000 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - char carry = 0; - for (int i = 0; i < DIGITS; i++) - { - c[i] = a[i] + b[i] + carry; - if (c[i] > 9) - { - carry = 1; - c[i] -= 10; - } - else - carry = 0; - } -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 10000; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-2.c b/20201203/fibonacci-2.c deleted file mode 100644 index dc1673c6fd2b034f3c0651f33bb2bcc4d7589720..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-2.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -void add (int *a, int *b, int *c) -{ - *c = *a + *b; -} - -int main (void) -{ - int f0 = 0; - int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - int f2; - add (&f0, &f1, &f2); - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201203/fibonacci-3.c b/20201203/fibonacci-3.c deleted file mode 100644 index be44c777b18d30b24c566db20012324659f8558c..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -typedef int number; - -void add (number *a, number *b, number *c) -{ - *c = *a + *b; -} - -int main (void) -{ - number f0 = 0; - number f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - number f2; - add (&f0, &f1, &f2); - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20201203/fibonacci-4.c b/20201203/fibonacci-4.c deleted file mode 100644 index 0781697c8a4a1bfdb512cfaebe06c7b0465f47c6..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-4.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (number *a, number *b, number *c) -{ - c[0] = a[0] + b[0]; -} - -void copy (number *a, number *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - number f2; - add (&f0, &f1, &f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-5.c b/20201203/fibonacci-5.c deleted file mode 100644 index 00ff7b3746229002cd685e6b56fa7a87a3220b7e..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-5.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - c[0] = a[0] + b[0]; -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-6.c b/20201203/fibonacci-6.c deleted file mode 100644 index f5aa3f8bfa60ae86b9d918be90d848ff042cb5e6..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-6.c +++ /dev/null @@ -1,45 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - c[0] = a[0] + b[0]; -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-7.c b/20201203/fibonacci-7.c deleted file mode 100644 index 05e8e9edaf2ac10512ecd2ef9d703c3f0a8a46ed..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-7.c +++ /dev/null @@ -1,47 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - c[0] = a[0] + b[0]; - for (int i = 1; i < DIGITS; i++) - c[i] = 0; -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-8.c b/20201203/fibonacci-8.c deleted file mode 100644 index e76226b5f351a551fea7888081491c6f2aa70d6f..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-8.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - char carry; - c[0] = a[0] + b[0]; - if (c[0] > 9) - { - carry = 1; - c[0] -= 10; - } - else - carry = 0; - c[1] = a[1] + b[1] + carry; - if (c[0] > 9) - { - carry = 1; - c[1] -= 10; - } - else - carry = 0; - c[2] = a[2] + b[2] + carry; - if (c[2] > 9) - { - carry = 1; - c[2] -= 10; - } - else - carry = 0; - for (int i = 3; i < DIGITS; i++) - c[i] = 0; -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/fibonacci-9.c b/20201203/fibonacci-9.c deleted file mode 100644 index b73982f7195cbc00377caff254920744826e054f..0000000000000000000000000000000000000000 --- a/20201203/fibonacci-9.c +++ /dev/null @@ -1,56 +0,0 @@ -#include <stdio.h> - -#define DIGITS 42 - -typedef char number[DIGITS]; - -void add (char *a, char *b, char *c) -{ - char carry = 0; - for (int i = 0; i < DIGITS; i++) - { - c[i] = a[i] + b[i] + carry; - if (c[i] > 9) - { - carry = 1; - c[i] -= 10; - } - else - carry = 0; - } -} - -void copy (char *a, char *b) -{ - for (int i = 0; i < DIGITS; i++) - b[i] = a[i]; -} - -void print (char *a) -{ - int i = DIGITS - 1; - while (i > 0 && a[i] == 0) - i--; - while (i >= 0) - { - printf ("%d", a[i]); - i--; - } -} - -int main (void) -{ - number f0 = { 0 }; - number f1 = { 1 }; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = ", i); - print (f0); - printf ("\n"); - number f2; - add (f0, f1, f2); - copy (f1, f0); - copy (f2, f1); - } - return 0; -} diff --git a/20201203/functions-1.c b/20201203/functions-1.c deleted file mode 100644 index 306c83a358fa5cae65e0fde2c2a5aecbbdab17a0..0000000000000000000000000000000000000000 --- a/20201203/functions-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -void print (x) - int x; -{ - printf ("%d\n", x); -} - -int main (void) -{ - print (42); - return 0; -} diff --git a/20201203/functions-2.c b/20201203/functions-2.c deleted file mode 100644 index 135f7b3dd22e34a71fdfbc9b1f2cb971fda1f2f7..0000000000000000000000000000000000000000 --- a/20201203/functions-2.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -void print (x) - int x; -{ - printf ("%d\n", x); -} - -int main (void) -{ - print ("42"); - return 0; -} diff --git a/20201203/functions-3.c b/20201203/functions-3.c deleted file mode 100644 index 0522e8744ee5d3fe18f7acaaa192e2e052fed81b..0000000000000000000000000000000000000000 --- a/20201203/functions-3.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -void print (x) - int x; -{ - printf ("%d\n", x); -} - -int main (void) -{ - print (atoi ("42")); - return 0; -} diff --git a/20201203/functions-4.c b/20201203/functions-4.c deleted file mode 100644 index af1d7f7407daebed1373459b8e9a2dd0811f49de..0000000000000000000000000000000000000000 --- a/20201203/functions-4.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void print (int x) -{ - printf ("%d\n", x); -} - -int main (void) -{ - print ("42"); - return 0; -} diff --git a/20201203/hp-20201203.pdf b/20201203/hp-20201203.pdf deleted file mode 100644 index f9e869fd8789e1bc161d0f82273adc086f41f242..0000000000000000000000000000000000000000 Binary files a/20201203/hp-20201203.pdf and /dev/null differ diff --git a/20201203/hp-20201203.tex b/20201203/hp-20201203.tex deleted file mode 100644 index 7e6f6ed9848e6524864e2e4d79b0ba66ec653ded..0000000000000000000000000000000000000000 --- a/20201203/hp-20201203.tex +++ /dev/null @@ -1,1788 +0,0 @@ -% hp-20201203.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Parameter des Hauptprogramms, String-Operationen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{3.\ Dezember 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{10} -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<1->{ und deren Nachbarn}. - -% \bigskip -% \pause -% \pause - - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<5> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<6-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - -% \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<1->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. -% \pause -% \pause - \item - \only<1-2>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. -% \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. -% \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<1->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} -% \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} -% \begin{onlyenv}<5> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char *hello = "Hello, world!\n"; -% while (*hello) -% printf ("%c", *hello++); -% return 0; -% } -% \end{lstlisting} -% \end{onlyenv} - - \vspace{-2.5cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} -% \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. -% \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<1->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<1->{\\ - also ein Zeiger auf (kleinere) Integer}. -% \pause -% \pause -% \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal - \pause - & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz (normalerweise: ASCII)?\\ - Welches Zeichen entspricht dem Zahlenwert \lstinline{71}? - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - printf ("%c\n", 71); - \end{lstlisting} - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe? - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \smallskip - \item - Groß- in Kleinbuchstaben umwandeln - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} - \vspace*{-1cm} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 3, 12, 2020 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - -% \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 3; - (*d).month = 12; - (*d).year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - -% \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 3; - d->month = 12; - d->year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Dateien und Fehlerbehandlung} - -\begin{frame}[fragile] - \showsubsection - \vspace*{-0.2925cm} - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <er¡ror.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \end{minipage}\pause\hspace*{-1.5cm}% - \begin{minipage}[t]{8.5cm} - \bigskip - \only<3->{\bigskip} - \begin{itemize} - \item - Wenn die Datei nicht geöffnet werden kann,\\ - gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück. - \pause - \medskip - \item - \addtolength{\leftskip}{1cm} - Die globale Variable \lstinline{int errno}\\ - enthält dann die Nummer des Fehlers.\\ - Benötigt: \lstinline{#include <errno.h>} - \pause - \medskip - \only<5->{\bigskip} - \item - Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\ - in einen Fehlermeldungstext um.\\ - Benötigt: \lstinline{#include <string.h>} - \pause - \medskip - \item - \addtolength{\leftskip}{-1.5cm} - Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\ - und beendet das Programm.\\ - Benötigt: \lstinline{#include <er¡¿ror.h>} - \pause - \medskip - \item - \textbf{Niemals Fehler einfach ignorieren!} - \end{itemize} - \addtolength{\leftskip}{0.5cm} - \end{minipage} -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \begin{itemize} -% \color{red} -% \item[4.1] Bit-Operationen -% \item[4.2] I/O-Ports -% \color{black} -% \item[4.3] Interrupts -% \vspace*{-0.1cm} -% \item[\dots] -% \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\subsection{Parameter des Hauptprogramms} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; *argv; i++, argv++) - printf ("argv[%d] = \"%s\"\n", i, *argv); - return 0; - } - \end{lstlisting} - -\end{frame} - -\subsection{String-Operationen} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame} - - \showsection - - Sprachelemente weitgehend komplett - - \bigskip - Es fehlen: - \begin{itemize} - \item - Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile}) - \item - Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()}) - \arrowitem - werden eingeführt, wenn wir sie brauchen - \bigskip - \item - Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen) - \arrowitem - werden eingeführt, wenn wir sie brauchen, oder: - \arrowitem - Literatur\\[\smallskipamount] - (z.\,B.\ Wikibooks: C-Programmierung,\\ - Dokumentation zu Compiler und Bibliotheken) - \bigskip - \item - Praxiserfahrung - \arrowitem - Übung und Praktikum: nur Einstieg - \arrowitem - selbständig arbeiten - \end{itemize} -\end{frame} - -\iffalse - -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - - \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} - \pause - \item - Kein Semikolon! - \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} - \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-3cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿ - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<5> - \begin{picture}(0,0)(0.3,0.3) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - \end{onlyenv} - \pause - \pause - \item - Auf manchen Plattformen kommt es auf die Reihenfolge an: - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -O $(pkg-config --cflags) \ - hello-gtk.c $(pkg-config --libs) \ - -o hello-gtk¿ - \end{lstlisting} - (Backslash = "`Es geht in der nächsten Zeile weiter."') - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\setcounter{section}{4} -\section{Algorithmen} -\subsection{Differentialgleichungen} - -%\begin{frame}[fragile] -% -% \showsection -% \showsubsection -% -% \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -% -% \begin{center} -% \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg} -% \end{center} -% -%\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\fi - -\end{document} diff --git a/20201203/hp-musterloesung-20201203.pdf b/20201203/hp-musterloesung-20201203.pdf deleted file mode 100644 index b4e1a8c2a0acc02a5385f0053cecc5810c168bc9..0000000000000000000000000000000000000000 Binary files a/20201203/hp-musterloesung-20201203.pdf and /dev/null differ diff --git a/20201203/hp-musterloesung-20201203.tex b/20201203/hp-musterloesung-20201203.tex deleted file mode 100644 index b2208917afca84821c8020490e76241a781c8323..0000000000000000000000000000000000000000 --- a/20201203/hp-musterloesung-20201203.tex +++ /dev/null @@ -1,212 +0,0 @@ -% hp-musterloesung-20201203.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Arrays mit Zahlen, Datum-Bibliothek - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 3.\ Dezember 2020} - - \exercise{Arrays mit Zahlen} - - \begin{minipage}[t]{0.4\textwidth} - Wir betrachten das folgende Programm\\ - (Datei: \gitfile{hp}{2020ws/20201203}{aufgabe-1.c}): - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void f (int *s0, int *s1) - { - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); - } - - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.55\textwidth} - \vspace*{-\bigskipamount} - \begin{enumerate}[\quad(a)] - \item - Was bewirkt die Funktion \lstinline{f},\\ - und wie funktioniert sie? - \points{4} -% \item -% Von welcher Ordnung (Landau-Symbol) ist die Funktion? -% Begründen Sie Ihre Antwort. -% -% Wir beziehen uns hierbei auf die Anzahl der Vergleiche -% in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}. -% Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen, -% obwohl sie normalerweise nicht gleich sind. -% \points{2} - \item - Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort. - \points{2} - \item - Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{2020ws/20201203}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort. - \begin{lstlisting}[gobble=8] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \points{2} -% \item -% Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie -% sich die Funktion \lstinline{f} effizienter gestalten läßt, -% wenn man die ihr übergebenen Arrays \lstinline{s0} und -% \lstinline{s1} als sortiert voraussetzt. -% \points{5} -% -% Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen? -% \item -% Von welcher -% Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum? -% \points{2} - \end{enumerate} - \end{minipage} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Was bewirkt die Funktion \lstinline{f}, und wie funktioniert sie?} - - Die Funktion gibt alle Zahlen aus, die sowohl im Array \lstinline{s0} - als auch im Array \lstinline{s1} vorkommen (Schnittmenge). - - Dies geschieht, indem der Zeiger \lstinline{s0} das gesamte Array durchläuft - (äußere Schleife). - Für jedes Element des ersten Arrays durchläuft der Zeiger \lstinline{s} - das gesamte zweite Array (innere Schleife). - Auf diese Weise wird jedes Element von \lstinline{s0} - mit jedem von \lstinline{s1} verglichen und bei Gleichheit ausgegeben. - - Um die Schleifen abbrechen zu können, enthalten beide Arrays - als Ende-Markierung eine negative Zahl (\lstinline{-1}). - - \item - \textbf{Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort.} - - In dem Moment, wo auf den jeweiligen Parameter-Zeiger zugegriffen wird - (\lstinline{while (*s0 >= 0)} für \lstinline{s0} bzw.\ - \lstinline{int *s = s1; while (*s >= 0)} für \lstinline{s1}), - kommt es zu einem Absturz (Speicherzugriffsfehler). - Die Dereferenzierung eines Zeigers mit dem Wert \lstinline{NULL} - ist nicht zulässig. - - \item - \textbf{Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{2020ws/20201203}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort.} - - \begin{minipage}{0.35\textwidth} - \begin{lstlisting}[gobble=10] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}{0.575\textwidth} - Durch die fehlenden Ende-Markierungen der Arrays - laufen die Schleifen immer weiter, - bis sie irgendwann zufällig auf Speicherzellen stoßen, - die sich als Ende-Markierungen interpretieren lassen (negative Zahlen). - Dadurch kann es zu einem Lesezugriff auf Speicher kommen, - für den das Programm kein Lesezugriffsrecht hat, - also zu einem Absturz (Speicherzugriffsfehler). - \end{minipage} - \end{enumerate} - - \exercise{Datum-Bibliothek} - - Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen) - zur Behandlung von Datumsangaben. - - Diese soll enthalten: - \begin{itemize} - \item - einen \lstinline{struct}-Datentyp \lstinline{date}, - der eine Datumsangabe speichert, - \item - eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt, - \item - eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)}, - die ein Datum auf einen gegebenen Tag setzt - und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja), - \item - eine Funktion \lstinline{void date_next (date *d)}, - die ein Datum auf den nächsten Tag vorrückt. - \end{itemize} - - Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet. - - \solution - - Die Datei \gitfile{hp}{2020ws/20201203}{loesung-2.c} - enthält die Bibliothek zusammen mit einem Test-Programm. - - Eine detaillierte Anleitung, - wie man auf die Funktion \lstinline{date_next()} kommt, - finden Sie im Skript zur Lehrveranstaltung, Datei \gitfile{hp}{script}{hp-2020ws.pdf}, - ab Seite 29. - - (Die Vorgehensweise, - die Bibliothek und das Hauptprogramm in dieselbe Datei zu schreiben, - hat den Nachteil, - daß man die Bibliothek in jedes weitere Programm, das sie benutzt, - kopieren und auch dort aktuell halten muß. - Eine sinnvollere Lösung wird demnächst in der Vorlesung vorgestellt werden.) - -\end{document} diff --git a/20201203/hp-uebung-20201203.pdf b/20201203/hp-uebung-20201203.pdf deleted file mode 100644 index f6a2d288e3db1714dcfa52b366e0dda929cafe80..0000000000000000000000000000000000000000 Binary files a/20201203/hp-uebung-20201203.pdf and /dev/null differ diff --git a/20201203/hp-uebung-20201203.tex b/20201203/hp-uebung-20201203.tex deleted file mode 100644 index f1b3659cd4ec6e8beb192a2a199e400d4870be07..0000000000000000000000000000000000000000 --- a/20201203/hp-uebung-20201203.tex +++ /dev/null @@ -1,152 +0,0 @@ -% hp-uebung-20201203.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Arrays mit Zahlen, Datum-Bibliothek - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 3.\ Dezember 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 45 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 8 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Arrays mit Zahlen} - - \begin{minipage}[t]{0.4\textwidth} - Wir betrachten das folgende Programm\\ - (Datei: \gitfile{hp}{2020ws/20201203}{aufgabe-1.c}): - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void f (int *s0, int *s1) - { - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); - } - - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.55\textwidth} - \vspace*{-\bigskipamount} - \begin{enumerate}[\quad(a)] - \item - Was bewirkt die Funktion \lstinline{f},\\ - und wie funktioniert sie? - \points{4} -% \item -% Von welcher Ordnung (Landau-Symbol) ist die Funktion? -% Begründen Sie Ihre Antwort. -% -% Wir beziehen uns hierbei auf die Anzahl der Vergleiche -% in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}. -% Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen, -% obwohl sie normalerweise nicht gleich sind. -% \points{2} - \item - Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort. - \points{2} - \item - Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{2020ws/20201203}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort. - \begin{lstlisting}[gobble=8] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \points{2} -% \item -% Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie -% sich die Funktion \lstinline{f} effizienter gestalten läßt, -% wenn man die ihr übergebenen Arrays \lstinline{s0} und -% \lstinline{s1} als sortiert voraussetzt. -% \points{5} -% -% Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen? -% \item -% Von welcher -% Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum? -% \points{2} - \end{enumerate} - \end{minipage} - - \exercise{Datum-Bibliothek} - - Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen) - zur Behandlung von Datumsangaben. - - Diese soll enthalten: - \begin{itemize} - \item - einen \lstinline{struct}-Datentyp \lstinline{date}, - der eine Datumsangabe speichert, - \item - eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt, - \item - eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)}, - die ein Datum auf einen gegebenen Tag setzt - und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja), - \item - eine Funktion \lstinline{void date_next (date *d)}, - die ein Datum auf den nächsten Tag vorrückt. - \end{itemize} - - Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet. - - \points{8} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20201203/integers-1.c b/20201203/integers-1.c deleted file mode 100644 index 60a31e32ec67a7ec20672fec06578f2af4e2d7bd..0000000000000000000000000000000000000000 --- a/20201203/integers-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 42; - int b = 137; - printf ("%d\n", a + b); - return 0; -} diff --git a/20201203/integers-2.c b/20201203/integers-2.c deleted file mode 100644 index c90e0174b5336da4b10508bd88c1984d2e98f394..0000000000000000000000000000000000000000 --- a/20201203/integers-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 1500000000; - int b = 1500000000; - printf ("%d\n", a + b); - return 0; -} diff --git a/20201203/integers-2.s b/20201203/integers-2.s deleted file mode 100644 index 28aa51f20b321095c66e3bfe9dc645f768be739e..0000000000000000000000000000000000000000 --- a/20201203/integers-2.s +++ /dev/null @@ -1,26 +0,0 @@ - .file "integers-2.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - movl $-1294967296, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %eax - addq $8, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201203/loesung-2.c b/20201203/loesung-2.c deleted file mode 100644 index 151c965980df79b5d0e04188f7bf6ac7a3b836a9..0000000000000000000000000000000000000000 --- a/20201203/loesung-2.c +++ /dev/null @@ -1,109 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -int is_leap_year (int year) -{ - if (year % 4 == 0) - if (year % 100 == 0) - if (year % 400 == 0) - return 1; - else - return 0; - else - return 1; - else - return 0; -} - -int days_in_month (int month, int year) -{ - if (month == 2) - if (is_leap_year (year)) - return 29; - else - return 28; - else if (month == 4 || month == 6 || month == 9 || month == 11) - return 30; - else - return 31; -} - -void date_print (date *d) -{ - printf ("%02d.%02d.%04d", d->day, d->month, d->year); -} - -int date_set (date *d, char day, char month, int year) -{ - d->year = year; - if (month > 0 && month <= 12) - d->month = month; - else - return 0; - if (day > 0 && day <= days_in_month (month, year)) - d->day = day; - else - return 0; - return 1; -} - -void date_next (date *d) -{ - d->day++; - if (d->day > days_in_month (d->month, d->year)) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -void check (char day, char month, int year) -{ - date d; - if (date_set (&d, day, month, year)) - { - date_print (&d); - printf (" --> "); - date_next (&d); - date_print (&d); - printf ("\n"); - } - else - printf ("%02d.%02d.%04d: invalid date\n", day, month, year); -} - -int main (void) -{ - check (6, 11, 2018); - check (29, 11, 2018); - check (30, 11, 2018); - check (31, 11, 2018); - check (29, 12, 2018); - check (30, 12, 2018); - check (31, 12, 2018); - check (28, 2, 2016); - check (29, 2, 2016); - check (30, 2, 2016); - check (28, 2, 2015); - check (29, 2, 2015); - check (30, 2, 2015); - check (31, 12, 2008); - check (28, 2, 2000); - check (29, 2, 2000); - check (30, 2, 2000); - check (28, 2, 1900); - check (29, 2, 1900); - check (30, 2, 1900); - return 0; -} diff --git a/20201203/logo-hochschule-bochum-cvh-text-v2.pdf b/20201203/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201203/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201203/logo-hochschule-bochum.pdf b/20201203/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201203/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201203/main-params-1.c b/20201203/main-params-1.c deleted file mode 100644 index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000 --- a/20201203/main-params-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/20201203/main-params-10.c b/20201203/main-params-10.c deleted file mode 100644 index 01909d2df3074e1ba1be80a7bb9a7815fffb6b62..0000000000000000000000000000000000000000 --- a/20201203/main-params-10.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (char **y, int x) -{ - printf ("x = %d\n", x); - int i = 0; - char **s = y; - while (*s) - printf ("y[%d] = \"%s\"\n", i++, *s++); - return 0; -} diff --git a/20201203/main-params-2.c b/20201203/main-params-2.c deleted file mode 100644 index 242aa8abb5f3af0ea60aeba94edb978388ea4c4d..0000000000000000000000000000000000000000 --- a/20201203/main-params-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; argv[i]; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/20201203/main-params-3.c b/20201203/main-params-3.c deleted file mode 100644 index 78d0e6aebb012d6401a0f44497d66a85be32dc0b..0000000000000000000000000000000000000000 --- a/20201203/main-params-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (char **s argv; *s; s++) - printf ("argv[%d] = \"%s\"\n", i, *s); - return 0; -} diff --git a/20201203/main-params-4.c b/20201203/main-params-4.c deleted file mode 100644 index 9b68f005f9eb7b8da9fae0783ae36831051732ad..0000000000000000000000000000000000000000 --- a/20201203/main-params-4.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - int i = 0; - for (char **s = argv; *s; s++) - printf ("argv[%d] = \"%s\"\n", i, *s); - return 0; -} diff --git a/20201203/main-params-5.c b/20201203/main-params-5.c deleted file mode 100644 index f2e68bc84bf46b3d62774e6f768e2c8bcab3a01b..0000000000000000000000000000000000000000 --- a/20201203/main-params-5.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - int i = 0; - char **s = argv; - while (*s) - printf ("argv[%d] = \"%s\"\n", i++, *s++); - return 0; -} diff --git a/20201203/main-params-6.c b/20201203/main-params-6.c deleted file mode 100644 index 9555a8f5207b63c81d2a2a212aee3594fb400aab..0000000000000000000000000000000000000000 --- a/20201203/main-params-6.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (int x, char **y) -{ - printf ("x = %d\n", x); - int i = 0; - char **s = y; - while (*s) - printf ("y[%d] = \"%s\"\n", i++, *s++); - return 0; -} diff --git a/20201203/main-params-7.c b/20201203/main-params-7.c deleted file mode 100644 index 0ab2c3061f17634df91f75d7cbbed80e655e8b99..0000000000000000000000000000000000000000 --- a/20201203/main-params-7.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (int x) -{ - printf ("x = %d\n", x); - return 0; -} diff --git a/20201203/main-params-8.c b/20201203/main-params-8.c deleted file mode 100644 index b5dd4e21346d723f4a535b88f4c523153b0dd0fa..0000000000000000000000000000000000000000 --- a/20201203/main-params-8.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (int x, char **y) -{ - printf ("x = %d\n", x); - return 0; -} diff --git a/20201203/main-params-9.c b/20201203/main-params-9.c deleted file mode 100644 index d742f43eb354c75e23ced8d86e5e6a60c6a97d1a..0000000000000000000000000000000000000000 --- a/20201203/main-params-9.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (int x, char **) -{ - printf ("x = %d\n", x); - return 0; -} diff --git a/20201203/main-params-link b/20201203/main-params-link deleted file mode 120000 index 05db77323d41949eaf431b8d4e6adc1920e28a90..0000000000000000000000000000000000000000 --- a/20201203/main-params-link +++ /dev/null @@ -1 +0,0 @@ -main-params-1 \ No newline at end of file diff --git a/20201203/pgscript.sty b/20201203/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201203/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201203/pgslides.sty b/20201203/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201203/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201203/setup-loop-1.c b/20201203/setup-loop-1.c deleted file mode 100644 index 60589366d54356fee895299ccfc9dfd354103790..0000000000000000000000000000000000000000 --- a/20201203/setup-loop-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -void setup (void) -{ - printf ("Arduino wird initialisiert.\n"); -} - -void loop (void) -{ - printf ("Arduino läuft.\n"); -} - -int main (void) -{ - return 0; -} diff --git a/20201203/setup-loop-2.c b/20201203/setup-loop-2.c deleted file mode 100644 index f3689d0eb46a77745d1f0d5bb0d4cbc5e4f70453..0000000000000000000000000000000000000000 --- a/20201203/setup-loop-2.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> - -void setup (void) -{ - printf ("Arduino wird initialisiert.\n"); -} - -void loop (void) -{ - printf ("Arduino läuft.\n"); -} - -int main (void) -{ - setup (); - while (1) - loop (); - return 0; -} diff --git a/20201203/spaces-1.txt b/20201203/spaces-1.txt deleted file mode 100644 index f2d1ba4e270e93cf6765ae84fa9267b2d55c57d1..0000000000000000000000000000000000000000 --- a/20201203/spaces-1.txt +++ /dev/null @@ -1,18 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 a b " " c -x = 5 -y[0] = "./main-params-6" -y[1] = "a" -y[2] = "b" -y[3] = " " -y[4] = "c" -cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 Dies\ ist ein\ Test -x = 3 -y[0] = "./main-params-6" -y[1] = "Dies ist" -y[2] = "ein Test" -cassini/home/peter/bo/2020ws/hp/20201203> ./main-params-6 "Dies ist" "ein Test" -x = 3 -y[0] = "./main-params-6" -y[1] = "Dies ist" -y[2] = "ein Test" -cassini/home/peter/bo/2020ws/hp/20201203> diff --git a/20201203/string-operations-1.c b/20201203/string-operations-1.c deleted file mode 100644 index 92163074ea985f03c6611b60ac033a212925aa47..0000000000000000000000000000000000000000 --- a/20201203/string-operations-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - -/* - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20201203/string-operations-10.c b/20201203/string-operations-10.c deleted file mode 100644 index ff4e43799c4546102a9b9e31bac29228a43b7c7e..0000000000000000000000000000000000000000 --- a/20201203/string-operations-10.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *zacharias = "Zacharias"; - char *anton = "Anton"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char anton1[] = "Anton"; - char anton2[] = "Anton"; - - if (anton1 < anton2) /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */ - printf ("%d\n", -1); - else if (anton1 > anton2) - printf ("%d\n", 1); - else - printf ("%d\n", 0); - printf ("%d\n", strcmp (anton1, anton2)); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-11.c b/20201203/string-operations-11.c deleted file mode 100644 index 7966ffe8a9c2a2545d69c8e0351c46dff6a44c7f..0000000000000000000000000000000000000000 --- a/20201203/string-operations-11.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - -/* - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); -*/ - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; -} diff --git a/20201203/string-operations-12.c b/20201203/string-operations-12.c deleted file mode 100644 index c95d341a5fda4da887f664a8d65a62a75623f0be..0000000000000000000000000000000000000000 --- a/20201203/string-operations-12.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - -/* - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); -*/ - - char buffer[6] = "Huber "; /* Kein Platz für das Null-Symbol --> String ohne Null-Symbol! */ - strcat (buffer, anton); /* Pufferüberlauf */ - printf ("%s\n", buffer); - - return 0; -} diff --git a/20201203/string-operations-13.c b/20201203/string-operations-13.c deleted file mode 100644 index 0d14e9196c604198cdf382237c8cd1262f3bfdfb..0000000000000000000000000000000000000000 --- a/20201203/string-operations-13.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - -/* - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); -*/ - - char buffer[] = "Huber "; - strcat (buffer, anton); /* Pufferüberlauf */ - printf ("%s\n", buffer); - - return 0; -} diff --git a/20201203/string-operations-14.c b/20201203/string-operations-14.c deleted file mode 100644 index e867f6a0d069a7980100d7185f60e780fd1c8d51..0000000000000000000000000000000000000000 --- a/20201203/string-operations-14.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - -/* - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); -*/ - - char buffer[] = "Huber "; - for (int i = 0; i < 5; i++) - strcat (buffer, anton); /* Pufferüberlauf */ - printf ("%s\n", buffer); - - return 0; -} diff --git a/20201203/string-operations-15.c b/20201203/string-operations-15.c deleted file mode 100644 index a7c37b16a1ff44e2d54ea4a6f81f3f0cc58a6236..0000000000000000000000000000000000000000 --- a/20201203/string-operations-15.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - -/* - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); -*/ - - char buffer[100] = "Huber "; - for (int i = 0; i < 5; i++) - strncat (buffer, anton, 100); /* Ebenfalls Puffer-überlauf, da sich die 100 auf die */ - printf ("%s\n", buffer); /* maximale Länge von "anton" bezieht. */ - - return 0; -} diff --git a/20201203/string-operations-16.c b/20201203/string-operations-16.c deleted file mode 100644 index 8101ccfc1de8242f1155164746688f9163b5a338..0000000000000000000000000000000000000000 --- a/20201203/string-operations-16.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-17.c b/20201203/string-operations-17.c deleted file mode 100644 index efaddc2869a0ae7be93ec383d7925f5796cfe5a9..0000000000000000000000000000000000000000 --- a/20201203/string-operations-17.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[10] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-18.c b/20201203/string-operations-18.c deleted file mode 100644 index 5ccb1083403a0be3f9d46cd58f5d3b5e89612210..0000000000000000000000000000000000000000 --- a/20201203/string-operations-18.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[10] = ""; - snprintf (buffer, 10, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-19.c b/20201203/string-operations-19.c deleted file mode 100644 index e1c1e84fba7eade92c2a0c818104de31b24c5f61..0000000000000000000000000000000000000000 --- a/20201203/string-operations-19.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; -} diff --git a/20201203/string-operations-2.c b/20201203/string-operations-2.c deleted file mode 100644 index dbeea54f286116d282611b914f61f6e42f5899b9..0000000000000000000000000000000000000000 --- a/20201203/string-operations-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - -/* - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - -/* - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20201203/string-operations-3.c b/20201203/string-operations-3.c deleted file mode 100644 index 2f1b5349cafe5796c721ffcd1f573d342a8cffc5..0000000000000000000000000000000000000000 --- a/20201203/string-operations-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - -/* - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - printf ("%s\n", hello + 16); - printf ("%zd\n", strlen (hello + 16)); - -/* - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20201203/string-operations-4.c b/20201203/string-operations-4.c deleted file mode 100644 index dee5c1d23f8ac24fa91725e05af62b0b79dc0c9b..0000000000000000000000000000000000000000 --- a/20201203/string-operations-4.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - -/* - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - printf ("%s\n", hello + 16000000); - printf ("%zd\n", strlen (hello + 16000000)); - -/* - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20201203/string-operations-5.c b/20201203/string-operations-5.c deleted file mode 100644 index 2d15ca233f94e1aa63cf17d8a6906391f3b64017..0000000000000000000000000000000000000000 --- a/20201203/string-operations-5.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - -/* - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 16000000); - printf ("%zd\n", strlen (hello + 16000000)); -*/ - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; -} diff --git a/20201203/string-operations-6.c b/20201203/string-operations-6.c deleted file mode 100644 index 95e826860f223ebd5f3819c56934eedadcd3d0d4..0000000000000000000000000000000000000000 --- a/20201203/string-operations-6.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-7.c b/20201203/string-operations-7.c deleted file mode 100644 index f668bc669252fa8f694295d155435022da938db0..0000000000000000000000000000000000000000 --- a/20201203/string-operations-7.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-8.c b/20201203/string-operations-8.c deleted file mode 100644 index f4d4f74f865912424930f354ea83eaf29e62f458..0000000000000000000000000000000000000000 --- a/20201203/string-operations-8.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - if (anton < zacharias) /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */ - printf ("%d\n", -1); - else if (anton > zacharias) - printf ("%d\n", 1); - else - printf ("%d\n", 0); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-8.s b/20201203/string-operations-8.s deleted file mode 100644 index e5e78f9cba272c4c47b1217ef891a144fbf8c4a9..0000000000000000000000000000000000000000 --- a/20201203/string-operations-8.s +++ /dev/null @@ -1,65 +0,0 @@ - .file "string-operations-8.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" -.LC1: - .string "Anton" -.LC2: - .string "Zacharias" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - movl $-1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - leaq .LC1(%rip), %rdx - leaq .LC2(%rip), %rax - cmpq %rax, %rdx - jb .L6 - leaq .LC1(%rip), %rdx - leaq .LC2(%rip), %rax - cmpq %rax, %rdx - jbe .L4 - movl $1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT -.L3: - movl $0, %eax - addq $8, %rsp - .cfi_remember_state - .cfi_def_cfa_offset 8 - ret -.L6: - .cfi_restore_state - movl $-1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - jmp .L3 -.L4: - movl $0, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - jmp .L3 - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201203/string-operations-9.c b/20201203/string-operations-9.c deleted file mode 100644 index 74802a1e370dafff8f40712fa623c28d4853dd66..0000000000000000000000000000000000000000 --- a/20201203/string-operations-9.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *zacharias = "Zacharias"; - char *anton = "Anton"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - if (anton < zacharias) /* vergleicht die Nummern der Speicherzellen --> meistens nicht sinnvoll */ - printf ("%d\n", -1); - else if (anton > zacharias) - printf ("%d\n", 1); - else - printf ("%d\n", 0); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20201203/string-operations-9.s b/20201203/string-operations-9.s deleted file mode 100644 index 09a5ead8fb0c2e535840d6effd0fc34ebd8fb8d2..0000000000000000000000000000000000000000 --- a/20201203/string-operations-9.s +++ /dev/null @@ -1,65 +0,0 @@ - .file "string-operations-9.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" -.LC1: - .string "Anton" -.LC2: - .string "Zacharias" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - movl $-1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - leaq .LC1(%rip), %rdx - leaq .LC2(%rip), %rax - cmpq %rax, %rdx - jb .L6 - leaq .LC1(%rip), %rdx - leaq .LC2(%rip), %rax - cmpq %rax, %rdx - jbe .L4 - movl $1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT -.L3: - movl $0, %eax - addq $8, %rsp - .cfi_remember_state - .cfi_def_cfa_offset 8 - ret -.L6: - .cfi_restore_state - movl $-1, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - jmp .L3 -.L4: - movl $0, %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - jmp .L3 - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20201203/strings-1.c b/20201203/strings-1.c deleted file mode 100644 index 396e2c16fb8695f38c95b40e947a83975c0ccd84..0000000000000000000000000000000000000000 --- a/20201203/strings-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Es heißt: \"Hello, world!\"\n"); - return 0; -} diff --git a/20201203/strings-2.c b/20201203/strings-2.c deleted file mode 100644 index 5cbeb48d81fc636b126b900209324843c46ae5e9..0000000000000000000000000000000000000000 --- a/20201203/strings-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Es heißt: %cHello, world!%c\n", 34, 34); - return 0; -} diff --git a/20201203/strings-3.c b/20201203/strings-3.c deleted file mode 100644 index 4d1d3bd31762299b8dbc171abc47535e6fe202bc..0000000000000000000000000000000000000000 --- a/20201203/strings-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Es heißt: "Hello, world!"\n", 34, 34); - return 0; -} diff --git a/20201210/answer.c b/20201210/answer.c deleted file mode 100644 index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000 --- a/20201210/answer.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 23; -} diff --git a/20201210/answer.h b/20201210/answer.h deleted file mode 100644 index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000 --- a/20201210/answer.h +++ /dev/null @@ -1 +0,0 @@ -extern int answer (void); diff --git a/20201210/aufgabe-2.c b/20201210/aufgabe-2.c deleted file mode 100644 index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000 --- a/20201210/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/20201210/aufgabe-3.c b/20201210/aufgabe-3.c deleted file mode 100644 index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000 --- a/20201210/aufgabe-3.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <string.h> - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} diff --git a/20201210/gtk-1.c b/20201210/gtk-1.c deleted file mode 100644 index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000 --- a/20201210/gtk-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-2.c b/20201210/gtk-2.c deleted file mode 100644 index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000 --- a/20201210/gtk-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-3.c b/20201210/gtk-3.c deleted file mode 100644 index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000 --- a/20201210/gtk-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-3a.c b/20201210/gtk-3a.c deleted file mode 100644 index a414b65cdf090099634b72b17f1ccde78ec86bcb..0000000000000000000000000000000000000000 --- a/20201210/gtk-3a.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <gtk/gtk.h> - -GtkWidget *button; - -void hide_button (void) -{ - gtk_widget_hide (button); -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (hide_button), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-3b.c b/20201210/gtk-3b.c deleted file mode 100644 index c9e5aa19ca26ba5d2f2d490e21176353fd83000f..0000000000000000000000000000000000000000 --- a/20201210/gtk-3b.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <gtk/gtk.h> - -void hide_button (GtkWidget *button) -{ - gtk_widget_hide (button); -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (hide_button), button); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-3c.c b/20201210/gtk-3c.c deleted file mode 100644 index 0c00089967a5575987cd04c89668d8fc6c02bec1..0000000000000000000000000000000000000000 --- a/20201210/gtk-3c.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_widget_hide), button); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-4.c b/20201210/gtk-4.c deleted file mode 100644 index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000 --- a/20201210/gtk-4.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-5.c b/20201210/gtk-5.c deleted file mode 100644 index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000 --- a/20201210/gtk-5.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-5a.c b/20201210/gtk-5a.c deleted file mode 100644 index 5386a44255235d40bae6be87c0c9251a8c766fb6..0000000000000000000000000000000000000000 --- a/20201210/gtk-5a.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-6.c b/20201210/gtk-6.c deleted file mode 100644 index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000 --- a/20201210/gtk-6.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-7.c b/20201210/gtk-7.c deleted file mode 100644 index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000 --- a/20201210/gtk-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data) -{ - printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y); - return FALSE; -} - -gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data) -{ - printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); - g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL); - - gtk_widget_add_events (window, GDK_KEY_PRESS_MASK); - g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/gtk-8.c b/20201210/gtk-8.c deleted file mode 100644 index 80e5747c13d94699d4883018a5b2457fed9885cb..0000000000000000000000000000000000000000 --- a/20201210/gtk-8.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += 0.5; - y -= 0.7; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/hello-1.E b/20201210/hello-1.E deleted file mode 100644 index bba2a7fe853f3ead309fa27d02789911adacb2a1..0000000000000000000000000000000000000000 --- a/20201210/hello-1.E +++ /dev/null @@ -1,815 +0,0 @@ -# 1 "hello-1.c" -# 1 "<built-in>" -# 1 "<command-line>" -# 31 "<command-line>" -# 1 "/usr/include/stdc-predef.h" 1 3 4 -# 32 "<command-line>" 2 -# 1 "hello-1.c" -# 1 "/usr/include/stdio.h" 1 3 4 -# 27 "/usr/include/stdio.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 1 3 4 -# 33 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 3 4 -# 1 "/usr/include/features.h" 1 3 4 -# 424 "/usr/include/features.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4 -# 442 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 -# 443 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/long-double.h" 1 3 4 -# 444 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4 -# 425 "/usr/include/features.h" 2 3 4 -# 448 "/usr/include/features.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4 -# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4 -# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4 -# 449 "/usr/include/features.h" 2 3 4 -# 34 "/usr/include/x86_64-linux-gnu/bits/libc-header-start.h" 2 3 4 -# 28 "/usr/include/stdio.h" 2 3 4 - - - - - -# 1 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 1 3 4 -# 216 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 3 4 - -# 216 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h" 3 4 -typedef long unsigned int size_t; -# 34 "/usr/include/stdio.h" 2 3 4 - - -# 1 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h" 1 3 4 -# 40 "/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h" 3 4 -typedef __builtin_va_list __gnuc_va_list; -# 37 "/usr/include/stdio.h" 2 3 4 - -# 1 "/usr/include/x86_64-linux-gnu/bits/types.h" 1 3 4 -# 27 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4 -# 28 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4 - - -typedef unsigned char __u_char; -typedef unsigned short int __u_short; -typedef unsigned int __u_int; -typedef unsigned long int __u_long; - - -typedef signed char __int8_t; -typedef unsigned char __uint8_t; -typedef signed short int __int16_t; -typedef unsigned short int __uint16_t; -typedef signed int __int32_t; -typedef unsigned int __uint32_t; - -typedef signed long int __int64_t; -typedef unsigned long int __uint64_t; - - - - - - -typedef __int8_t __int_least8_t; -typedef __uint8_t __uint_least8_t; -typedef __int16_t __int_least16_t; -typedef __uint16_t __uint_least16_t; -typedef __int32_t __int_least32_t; -typedef __uint32_t __uint_least32_t; -typedef __int64_t __int_least64_t; -typedef __uint64_t __uint_least64_t; - - - -typedef long int __quad_t; -typedef unsigned long int __u_quad_t; - - - - - - - -typedef long int __intmax_t; -typedef unsigned long int __uintmax_t; -# 140 "/usr/include/x86_64-linux-gnu/bits/types.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/typesizes.h" 1 3 4 -# 141 "/usr/include/x86_64-linux-gnu/bits/types.h" 2 3 4 - - -typedef unsigned long int __dev_t; -typedef unsigned int __uid_t; -typedef unsigned int __gid_t; -typedef unsigned long int __ino_t; -typedef unsigned long int __ino64_t; -typedef unsigned int __mode_t; -typedef unsigned long int __nlink_t; -typedef long int __off_t; -typedef long int __off64_t; -typedef int __pid_t; -typedef struct { int __val[2]; } __fsid_t; -typedef long int __clock_t; -typedef unsigned long int __rlim_t; -typedef unsigned long int __rlim64_t; -typedef unsigned int __id_t; -typedef long int __time_t; -typedef unsigned int __useconds_t; -typedef long int __suseconds_t; - -typedef int __daddr_t; -typedef int __key_t; - - -typedef int __clockid_t; - - -typedef void * __timer_t; - - -typedef long int __blksize_t; - - - - -typedef long int __blkcnt_t; -typedef long int __blkcnt64_t; - - -typedef unsigned long int __fsblkcnt_t; -typedef unsigned long int __fsblkcnt64_t; - - -typedef unsigned long int __fsfilcnt_t; -typedef unsigned long int __fsfilcnt64_t; - - -typedef long int __fsword_t; - -typedef long int __ssize_t; - - -typedef long int __syscall_slong_t; - -typedef unsigned long int __syscall_ulong_t; - - - -typedef __off64_t __loff_t; -typedef char *__caddr_t; - - -typedef long int __intptr_t; - - -typedef unsigned int __socklen_t; - - - - -typedef int __sig_atomic_t; -# 39 "/usr/include/stdio.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h" 1 3 4 - - - - -# 1 "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h" 1 3 4 -# 13 "/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h" 3 4 -typedef struct -{ - int __count; - union - { - unsigned int __wch; - char __wchb[4]; - } __value; -} __mbstate_t; -# 6 "/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h" 2 3 4 - - - - -typedef struct _G_fpos_t -{ - __off_t __pos; - __mbstate_t __state; -} __fpos_t; -# 40 "/usr/include/stdio.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h" 1 3 4 -# 10 "/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h" 3 4 -typedef struct _G_fpos64_t -{ - __off64_t __pos; - __mbstate_t __state; -} __fpos64_t; -# 41 "/usr/include/stdio.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/types/__FILE.h" 1 3 4 - - - -struct _IO_FILE; -typedef struct _IO_FILE __FILE; -# 42 "/usr/include/stdio.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/types/FILE.h" 1 3 4 - - - -struct _IO_FILE; - - -typedef struct _IO_FILE FILE; -# 43 "/usr/include/stdio.h" 2 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h" 1 3 4 -# 35 "/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h" 3 4 -struct _IO_FILE; -struct _IO_marker; -struct _IO_codecvt; -struct _IO_wide_data; - - - - -typedef void _IO_lock_t; - - - - - -struct _IO_FILE -{ - int _flags; - - - char *_IO_read_ptr; - char *_IO_read_end; - char *_IO_read_base; - char *_IO_write_base; - char *_IO_write_ptr; - char *_IO_write_end; - char *_IO_buf_base; - char *_IO_buf_end; - - - char *_IO_save_base; - char *_IO_backup_base; - char *_IO_save_end; - - struct _IO_marker *_markers; - - struct _IO_FILE *_chain; - - int _fileno; - int _flags2; - __off_t _old_offset; - - - unsigned short _cur_column; - signed char _vtable_offset; - char _shortbuf[1]; - - _IO_lock_t *_lock; - - - - - - - - __off64_t _offset; - - struct _IO_codecvt *_codecvt; - struct _IO_wide_data *_wide_data; - struct _IO_FILE *_freeres_list; - void *_freeres_buf; - size_t __pad5; - int _mode; - - char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; -}; -# 44 "/usr/include/stdio.h" 2 3 4 -# 52 "/usr/include/stdio.h" 3 4 -typedef __gnuc_va_list va_list; -# 63 "/usr/include/stdio.h" 3 4 -typedef __off_t off_t; -# 77 "/usr/include/stdio.h" 3 4 -typedef __ssize_t ssize_t; - - - - - - -typedef __fpos_t fpos_t; -# 133 "/usr/include/stdio.h" 3 4 -# 1 "/usr/include/x86_64-linux-gnu/bits/stdio_lim.h" 1 3 4 -# 134 "/usr/include/stdio.h" 2 3 4 - - - -extern FILE *stdin; -extern FILE *stdout; -extern FILE *stderr; - - - - - - -extern int remove (const char *__filename) __attribute__ ((__nothrow__ , __leaf__)); - -extern int rename (const char *__old, const char *__new) __attribute__ ((__nothrow__ , __leaf__)); - - - -extern int renameat (int __oldfd, const char *__old, int __newfd, - const char *__new) __attribute__ ((__nothrow__ , __leaf__)); -# 173 "/usr/include/stdio.h" 3 4 -extern FILE *tmpfile (void) ; -# 187 "/usr/include/stdio.h" 3 4 -extern char *tmpnam (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ; - - - - -extern char *tmpnam_r (char *__s) __attribute__ ((__nothrow__ , __leaf__)) ; -# 204 "/usr/include/stdio.h" 3 4 -extern char *tempnam (const char *__dir, const char *__pfx) - __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__)) ; - - - - - - - -extern int fclose (FILE *__stream); - - - - -extern int fflush (FILE *__stream); -# 227 "/usr/include/stdio.h" 3 4 -extern int fflush_unlocked (FILE *__stream); -# 246 "/usr/include/stdio.h" 3 4 -extern FILE *fopen (const char *__restrict __filename, - const char *__restrict __modes) ; - - - - -extern FILE *freopen (const char *__restrict __filename, - const char *__restrict __modes, - FILE *__restrict __stream) ; -# 279 "/usr/include/stdio.h" 3 4 -extern FILE *fdopen (int __fd, const char *__modes) __attribute__ ((__nothrow__ , __leaf__)) ; -# 292 "/usr/include/stdio.h" 3 4 -extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) - __attribute__ ((__nothrow__ , __leaf__)) ; - - - - -extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __attribute__ ((__nothrow__ , __leaf__)) ; - - - - - -extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __attribute__ ((__nothrow__ , __leaf__)); - - - -extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, - int __modes, size_t __n) __attribute__ ((__nothrow__ , __leaf__)); - - - - -extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, - size_t __size) __attribute__ ((__nothrow__ , __leaf__)); - - -extern void setlinebuf (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)); - - - - - - - -extern int fprintf (FILE *__restrict __stream, - const char *__restrict __format, ...); - - - - -extern int printf (const char *__restrict __format, ...); - -extern int sprintf (char *__restrict __s, - const char *__restrict __format, ...) __attribute__ ((__nothrow__)); - - - - - -extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, - __gnuc_va_list __arg); - - - - -extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); - -extern int vsprintf (char *__restrict __s, const char *__restrict __format, - __gnuc_va_list __arg) __attribute__ ((__nothrow__)); - - - -extern int snprintf (char *__restrict __s, size_t __maxlen, - const char *__restrict __format, ...) - __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 4))); - -extern int vsnprintf (char *__restrict __s, size_t __maxlen, - const char *__restrict __format, __gnuc_va_list __arg) - __attribute__ ((__nothrow__)) __attribute__ ((__format__ (__printf__, 3, 0))); -# 379 "/usr/include/stdio.h" 3 4 -extern int vdprintf (int __fd, const char *__restrict __fmt, - __gnuc_va_list __arg) - __attribute__ ((__format__ (__printf__, 2, 0))); -extern int dprintf (int __fd, const char *__restrict __fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); - - - - - - - -extern int fscanf (FILE *__restrict __stream, - const char *__restrict __format, ...) ; - - - - -extern int scanf (const char *__restrict __format, ...) ; - -extern int sscanf (const char *__restrict __s, - const char *__restrict __format, ...) __attribute__ ((__nothrow__ , __leaf__)); -# 409 "/usr/include/stdio.h" 3 4 -extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) __asm__ ("" "__isoc99_fscanf") - - ; -extern int scanf (const char *__restrict __format, ...) __asm__ ("" "__isoc99_scanf") - ; -extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) __asm__ ("" "__isoc99_sscanf") __attribute__ ((__nothrow__ , __leaf__)) - - ; -# 434 "/usr/include/stdio.h" 3 4 -extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, - __gnuc_va_list __arg) - __attribute__ ((__format__ (__scanf__, 2, 0))) ; - - - - - -extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) - __attribute__ ((__format__ (__scanf__, 1, 0))) ; - - -extern int vsscanf (const char *__restrict __s, - const char *__restrict __format, __gnuc_va_list __arg) - __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__format__ (__scanf__, 2, 0))); -# 457 "/usr/include/stdio.h" 3 4 -extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vfscanf") - - - - __attribute__ ((__format__ (__scanf__, 2, 0))) ; -extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vscanf") - - __attribute__ ((__format__ (__scanf__, 1, 0))) ; -extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __asm__ ("" "__isoc99_vsscanf") __attribute__ ((__nothrow__ , __leaf__)) - - - - __attribute__ ((__format__ (__scanf__, 2, 0))); -# 491 "/usr/include/stdio.h" 3 4 -extern int fgetc (FILE *__stream); -extern int getc (FILE *__stream); - - - - - -extern int getchar (void); - - - - - - -extern int getc_unlocked (FILE *__stream); -extern int getchar_unlocked (void); -# 516 "/usr/include/stdio.h" 3 4 -extern int fgetc_unlocked (FILE *__stream); -# 527 "/usr/include/stdio.h" 3 4 -extern int fputc (int __c, FILE *__stream); -extern int putc (int __c, FILE *__stream); - - - - - -extern int putchar (int __c); -# 543 "/usr/include/stdio.h" 3 4 -extern int fputc_unlocked (int __c, FILE *__stream); - - - - - - - -extern int putc_unlocked (int __c, FILE *__stream); -extern int putchar_unlocked (int __c); - - - - - - -extern int getw (FILE *__stream); - - -extern int putw (int __w, FILE *__stream); - - - - - - - -extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) - ; -# 609 "/usr/include/stdio.h" 3 4 -extern __ssize_t __getdelim (char **__restrict __lineptr, - size_t *__restrict __n, int __delimiter, - FILE *__restrict __stream) ; -extern __ssize_t getdelim (char **__restrict __lineptr, - size_t *__restrict __n, int __delimiter, - FILE *__restrict __stream) ; - - - - - - - -extern __ssize_t getline (char **__restrict __lineptr, - size_t *__restrict __n, - FILE *__restrict __stream) ; - - - - - - - -extern int fputs (const char *__restrict __s, FILE *__restrict __stream); - - - - - -extern int puts (const char *__s); - - - - - - -extern int ungetc (int __c, FILE *__stream); - - - - - - -extern size_t fread (void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __stream) ; - - - - -extern size_t fwrite (const void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __s); -# 679 "/usr/include/stdio.h" 3 4 -extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __stream) ; -extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, - size_t __n, FILE *__restrict __stream); - - - - - - - -extern int fseek (FILE *__stream, long int __off, int __whence); - - - - -extern long int ftell (FILE *__stream) ; - - - - -extern void rewind (FILE *__stream); -# 713 "/usr/include/stdio.h" 3 4 -extern int fseeko (FILE *__stream, __off_t __off, int __whence); - - - - -extern __off_t ftello (FILE *__stream) ; -# 737 "/usr/include/stdio.h" 3 4 -extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); - - - - -extern int fsetpos (FILE *__stream, const fpos_t *__pos); -# 763 "/usr/include/stdio.h" 3 4 -extern void clearerr (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)); - -extern int feof (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; - -extern int ferror (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; - - - -extern void clearerr_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)); -extern int feof_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; -extern int ferror_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; - - - - - - - -extern void perror (const char *__s); - - - - - -# 1 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 1 3 4 -# 26 "/usr/include/x86_64-linux-gnu/bits/sys_errlist.h" 3 4 -extern int sys_nerr; -extern const char *const sys_errlist[]; -# 788 "/usr/include/stdio.h" 2 3 4 - - - - -extern int fileno (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; - - - - -extern int fileno_unlocked (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; -# 806 "/usr/include/stdio.h" 3 4 -extern FILE *popen (const char *__command, const char *__modes) ; - - - - - -extern int pclose (FILE *__stream); - - - - - -extern char *ctermid (char *__s) __attribute__ ((__nothrow__ , __leaf__)); -# 846 "/usr/include/stdio.h" 3 4 -extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)); - - - -extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)) ; - - -extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__)); -# 864 "/usr/include/stdio.h" 3 4 -extern int __uflow (FILE *); -extern int __overflow (FILE *, int); - - - - -# 1 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 1 3 4 -# 38 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 3 4 -extern __inline __attribute__ ((__gnu_inline__)) int -vprintf (const char *__restrict __fmt, __gnuc_va_list __arg) -{ - return vfprintf (stdout, __fmt, __arg); -} - - - -extern __inline __attribute__ ((__gnu_inline__)) int -getchar (void) -{ - return getc (stdin); -} - - - - -extern __inline __attribute__ ((__gnu_inline__)) int -fgetc_unlocked (FILE *__fp) -{ - return (__builtin_expect (((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end), 0) ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++); -} - - - - - -extern __inline __attribute__ ((__gnu_inline__)) int -getc_unlocked (FILE *__fp) -{ - return (__builtin_expect (((__fp)->_IO_read_ptr >= (__fp)->_IO_read_end), 0) ? __uflow (__fp) : *(unsigned char *) (__fp)->_IO_read_ptr++); -} - - -extern __inline __attribute__ ((__gnu_inline__)) int -getchar_unlocked (void) -{ - return (__builtin_expect (((stdin)->_IO_read_ptr >= (stdin)->_IO_read_end), 0) ? __uflow (stdin) : *(unsigned char *) (stdin)->_IO_read_ptr++); -} - - - - -extern __inline __attribute__ ((__gnu_inline__)) int -putchar (int __c) -{ - return putc (__c, stdout); -} - - - - -extern __inline __attribute__ ((__gnu_inline__)) int -fputc_unlocked (int __c, FILE *__stream) -{ - return (__builtin_expect (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end), 0) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c))); -} - - - - - -extern __inline __attribute__ ((__gnu_inline__)) int -putc_unlocked (int __c, FILE *__stream) -{ - return (__builtin_expect (((__stream)->_IO_write_ptr >= (__stream)->_IO_write_end), 0) ? __overflow (__stream, (unsigned char) (__c)) : (unsigned char) (*(__stream)->_IO_write_ptr++ = (__c))); -} - - -extern __inline __attribute__ ((__gnu_inline__)) int -putchar_unlocked (int __c) -{ - return (__builtin_expect (((stdout)->_IO_write_ptr >= (stdout)->_IO_write_end), 0) ? __overflow (stdout, (unsigned char) (__c)) : (unsigned char) (*(stdout)->_IO_write_ptr++ = (__c))); -} -# 127 "/usr/include/x86_64-linux-gnu/bits/stdio.h" 3 4 -extern __inline __attribute__ ((__gnu_inline__)) int -__attribute__ ((__nothrow__ , __leaf__)) feof_unlocked (FILE *__stream) -{ - return (((__stream)->_flags & 0x0010) != 0); -} - - -extern __inline __attribute__ ((__gnu_inline__)) int -__attribute__ ((__nothrow__ , __leaf__)) ferror_unlocked (FILE *__stream) -{ - return (((__stream)->_flags & 0x0020) != 0); -} -# 871 "/usr/include/stdio.h" 2 3 4 -# 879 "/usr/include/stdio.h" 3 4 - -# 2 "hello-1.c" 2 - - -# 3 "hello-1.c" -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201210/hello-1.c b/20201210/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20201210/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201210/hello-2.c b/20201210/hello-2.c deleted file mode 100644 index 1f2dbb2b8aa8984b4401f3f8425662a0171184c1..0000000000000000000000000000000000000000 --- a/20201210/hello-2.c +++ /dev/null @@ -1,5 +0,0 @@ -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201210/hello-3.c b/20201210/hello-3.c deleted file mode 100644 index 304452b8c501faf03fbd0afaa267e6ef0172807e..0000000000000000000000000000000000000000 --- a/20201210/hello-3.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int printf (const char *__restrict __format, ...); - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20201210/hello-gtk.c b/20201210/hello-gtk.c deleted file mode 100644 index 016867d41e42de57390a21653de467c061e5ded0..0000000000000000000000000000000000000000 --- a/20201210/hello-gtk.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201210/hexe.h b/20201210/hexe.h deleted file mode 100644 index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000 --- a/20201210/hexe.h +++ /dev/null @@ -1 +0,0 @@ -eine kleine Hexe. diff --git a/20201210/higher-math-1.c b/20201210/higher-math-1.c deleted file mode 100644 index 8bd228547b9dde9c5df71c45330df591b5fb593d..0000000000000000000000000000000000000000 --- a/20201210/higher-math-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -#define VIER 4 - -int main (void) -{ - printf ("3 * 4 = %d\n", 3 * VIER); -} diff --git a/20201210/higher-math-2.c b/20201210/higher-math-2.c deleted file mode 100644 index 784c63b156f8881bec9133910c7fe6c524b3004c..0000000000000000000000000000000000000000 --- a/20201210/higher-math-2.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -#define N 4 - -int prime[N] = { 2, 3, 5, 7 }; - -int main (void) -{ - for (int i = 0; i < N; i++) - printf ("prime[%d] = %d\n", i, prime[i]); -} diff --git a/20201210/higher-math-3.c b/20201210/higher-math-3.c deleted file mode 100644 index 4292be39ab64d0dd538f533ba82a3a4cdf0a046c..0000000000000000000000000000000000000000 --- a/20201210/higher-math-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -#define VIER 4; - -int main (void) -{ - printf ("3 * 4 = %d\n", 3 * VIER); -} diff --git a/20201210/higher-math-4.c b/20201210/higher-math-4.c deleted file mode 100644 index 99edb16ca410f6a10ae8b8c65c5b6bb9c80146e2..0000000000000000000000000000000000000000 --- a/20201210/higher-math-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -#define VIER 2 + 2 - -int main (void) -{ - printf ("3 * 4 = %d\n", 3 * VIER); -} diff --git a/20201210/higher-math-5.c b/20201210/higher-math-5.c deleted file mode 100644 index 3eba14e088add18642af9e3bd810a57460d88729..0000000000000000000000000000000000000000 --- a/20201210/higher-math-5.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2) - -int main (void) -{ - printf ("3 * 4 = %d\n", 3 * VIER); -} diff --git a/20201210/hp-20201210.pdf b/20201210/hp-20201210.pdf deleted file mode 100644 index f953230f19ab3cd0678eacb4d6ee9b102decc220..0000000000000000000000000000000000000000 Binary files a/20201210/hp-20201210.pdf and /dev/null differ diff --git a/20201210/hp-20201210.tex b/20201210/hp-20201210.tex deleted file mode 100644 index 9e8407703a644366ac8af831ed7de4b56021f9b7..0000000000000000000000000000000000000000 --- a/20201210/hp-20201210.tex +++ /dev/null @@ -1,1423 +0,0 @@ -% hp-20201210.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Präprozessor, Bibliotheken einbinden und verwenden - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{10.\ Dezember 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{12} -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 3, 12, 2020 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - -% \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 3; - (*d).month = 12; - (*d).year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - -% \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 3; - d->month = 12; - d->year = 2020; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Dateien und Fehlerbehandlung} - -\begin{frame}[fragile] - \showsubsection - \vspace*{-0.2925cm} - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <er¡ror.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \end{minipage}\pause\hspace*{-1.5cm}% - \begin{minipage}[t]{8.5cm} - \bigskip - \only<3->{\bigskip} - \begin{itemize} - \item - Wenn die Datei nicht geöffnet werden kann,\\ - gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück. - \pause - \medskip - \item - \addtolength{\leftskip}{1cm} - Die globale Variable \lstinline{int errno}\\ - enthält dann die Nummer des Fehlers.\\ - Benötigt: \lstinline{#include <errno.h>} - \pause - \medskip - \only<5->{\bigskip} - \item - Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\ - in einen Fehlermeldungstext um.\\ - Benötigt: \lstinline{#include <string.h>} - \pause - \medskip - \item - \addtolength{\leftskip}{-1.5cm} - Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\ - und beendet das Programm.\\ - Benötigt: \lstinline{#include <er¡¿ror.h>} - \pause - \medskip - \item - \textbf{Niemals Fehler einfach ignorieren!} - \end{itemize} - \addtolength{\leftskip}{0.5cm} - \end{minipage} -\end{frame} - -\subsection{Parameter des Hauptprogramms} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; *argv; i++, argv++) - printf ("argv[%d] = \"%s\"\n", i, *argv); - return 0; - } - \end{lstlisting} - -\end{frame} - -\subsection{String-Operationen} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \vspace*{-0.4cm} - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame} - - \showsection - - Sprachelemente weitgehend komplett - - \bigskip - Es fehlen: - \begin{itemize} - \item - Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile}) - \item - Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()}) - \arrowitem - werden eingeführt, wenn wir sie brauchen - \bigskip - \item - Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen) - \arrowitem - werden eingeführt, wenn wir sie brauchen, oder: - \arrowitem - Literatur\\[\smallskipamount] - (z.\,B.\ Wikibooks: C-Programmierung,\\ - Dokumentation zu Compiler und Bibliotheken) - \bigskip - \item - Praxiserfahrung - \arrowitem - Übung und Praktikum: nur Einstieg - \arrowitem - selbständig arbeiten - \end{itemize} -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{red} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \item[3.4] Projekt organisieren: make - \vspace*{-\smallskipamount} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - - \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} - \pause - \item - Kein Semikolon! - \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} - \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-3cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿ - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs - gtk+-3.0 -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<5> - \begin{picture}(0,0)(0.3,0.3) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - \end{onlyenv} - \pause - \pause - \item - Auf manchen Plattformen kommt es auf die Reihenfolge an: - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \ - hello-gtk.c $(pkg-config --libs gtk+-3.0) \ - -o hello-gtk¿ - \end{lstlisting} - (Backslash = "`Es geht in der nächsten Zeile weiter."') - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\iffalse - -\section{Algorithmen} -\subsection{Differentialgleichungen} - -%\begin{frame}[fragile] -% -% \showsection -% \showsubsection -% -% \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -% -% \begin{center} -% \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg} -% \end{center} -% -%\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\fi - -\end{document} diff --git a/20201210/hp-musterloesung-20201210.pdf b/20201210/hp-musterloesung-20201210.pdf deleted file mode 100644 index e2c19bae1421c7d78645e9af29bb242ca6c649c5..0000000000000000000000000000000000000000 Binary files a/20201210/hp-musterloesung-20201210.pdf and /dev/null differ diff --git a/20201210/hp-musterloesung-20201210.tex b/20201210/hp-musterloesung-20201210.tex deleted file mode 100644 index 9f1c06d864d055f41ba36c141ce532eb2dbffb1f..0000000000000000000000000000000000000000 --- a/20201210/hp-musterloesung-20201210.tex +++ /dev/null @@ -1,458 +0,0 @@ -% hp-musterloesung-20201114.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 10.\ Dezember 2020} - - \exercise{Ausgabe von Hexadezimalzahlen} - - Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)}, - die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x} - als Hexadezimalzahl ausgibt. - (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.) - - Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit - der Formatspezifikation \lstinline{%x} als fertige Lösung, - sondern programmieren Sie die nötige Ausgabe selbst. - (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.) - - Die Verwendung von \lstinline{printf()} - mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d} - oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig. - - \points{8} - - (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht, - aber nicht zwingend.) - - \solution - - Um die Ziffern von \lstinline{x} zur Basis 16 zu isolieren, - berechnen wir \lstinline{x % 16} (modulo 16 = Rest bei Division durch 16) - und dividieren anschließend \lstinline{x} durch 16, - solange bis \lstinline{x} den Wert 0 erreicht. - - Wenn wir die auf diese Weise ermittelten Ziffern direkt ausgeben, - sind sie \emph{Little-Endian}, erscheinen also in umgekehrter Reihenfolge. - Die Datei \gitfile{hp}{2020ws/20201210}{loesung-1-1.c} setzt diesen Zwischenschritt um. - - Die Ausgabe der Ziffern erfolgt in \gitfile{hp}{2020ws/20201210}{loesung-1-1.c} - über \lstinline{printf ("%d")} - für die Ziffern 0 bis 9. Für die darüberliegenden Ziffern - wird der Buchstabe \lstinline{a} um die Ziffer abzüglich 10 inkrementiert - und der erhaltene Wert mit \lstinline{printf ("%c")} als Zeichen ausgegeben. - - Um die umgekehrte Reihenfolge zu beheben, - speichern wir die Ziffern von \lstinline{x} - in einem Array \lstinline{digits[]} zwischen - und geben sie anschließend in einer zweiten Schleife - in umgekehrter Reihenfolge aus (siehe \gitfile{hp}{2020ws/20201210}{loesung-1-2.c}). - Da wir wissen, daß \lstinline{x} eine 32-Bit-Zahl ist - und daher höchstens 8 Hexadezimalziffern haben kann, - ist 8 eine sinnvolle Länge für das Ziffern-Array \lstinline{digits[8]}. - - Nun sind die Ziffern in der richtigen Reihenfolge, - aber wir erhalten zusätzlich zu den eigentlichen Ziffern führende Nullen. - Da in der Aufgabenstellung nicht von führenden Nullen die Rede war, - sind diese nicht verboten; \gitfile{hp}{2020ws/20201210}{loesung-1-2.c} ist daher - eine richtige Lösung der Aufgabe. - - \breath - - Wenn wir die führenden Nullen vermeiden wollen, - können wir die \lstinline{for}-Schleifen durch \lstinline{while}-Schleifen ersetzen. - Die erste Schleife zählt hoch, solange \lstinline{x} ungleich 0 ist; - die zweite zählt von dem erreichten Wert aus wieder herunter - -- siehe \gitfile{hp}{2020ws/20201210}{loesung-1-3.c}. - Da wir wissen, daß die Zahl \lstinline{x} höchstens 32 Bit, - also höchstens 8 Hexadezimalziffern hat, - wissen wir, daß \lstinline{i} höchstens den Wert 8 erreichen kann, - das Array also nicht überlaufen wird. - - Man beachte, daß der Array-Index nach der ersten Schleife "`um einen zu hoch"' ist. - In der zweiten Schleife muß daher \emph{zuerst\/} der Index dekrementiert werden. - Erst danach darf ein Zugriff auf \lstinline{digit[i]} erfolgen. - - \breath - - Alternativ können wir auch mitschreiben, - ob bereits eine Ziffer ungleich Null ausgegeben wurde, - und andernfalls die Ausgabe von Null-Ziffern unterdrücken - -- siehe \gitfile{hp}{2020ws/20201210}{loesung-1-4.c}. - - \breath - - Weitere Möglichkeiten ergeben sich, wenn man bedenkt, - daß eine Hexadezimalziffer genau einer Gruppe von vier Binärziffern entspricht. - Eine Bitverschiebung um 4 nach rechts - ist daher dasselbe wie eine Division durch 16, - und eine Und-Verknüpfung mit 15$_{10}$ = f$_{16}$ = 1111$_2$ - ist dasselbe wie die Operation Modulo 16. - Die Datei \gitfile{hp}{2020ws/20201210}{loesung-1-5.c} ist eine in dieser Weise abgewandelte Variante - von \gitfile{hp}{2020ws/20201210}{loesung-1-3.c}. - - Mit dieser Methode kann man nicht nur auf die jeweils unterste Ziffer, - sondern auf alle Ziffern direkt zugreifen. - Damit ist kein Array als zusätzlicher Speicher mehr nötig. - Die Datei \gitfile{hp}{2020ws/20201210}{loesung-1-6.c} setzt dies auf einfache Weise um. - Sie gibt wieder führende Nullen mit aus, - ist aber trotzdem eine weitere richtige Lösung der Aufgabe. - - Die führenden Nullen ließen sich auf die gleiche Weise vermeiden - wie in \gitfile{hp}{2020ws/20201210}{loesung-1-4.c}. - - Die Bitverschiebungsmethode hat den Vorteil, - daß kein zusätzliches Array benötigt wird. - Auch wird die als Parameter übergebene Zahl \lstinline{x} nicht verändert, - was bei größeren Zahlen, die über Zeiger übergeben werden, von Vorteil sein kann. - Demgegenüber steht der Nachteil, - daß diese Methode nur für eine ganze Anzahl von Bits funktioniert, - also für Basen, die Zweierpotenzen sind (z.\,B.\ 2, 8, 16, 256). - Für alle anderen Basen (z.\,B.\ 10) eignet sich nur die Methode - mit Division und Modulo-Operation. - - \exercise{Einfügen in Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20201210}{aufgabe-2.c}): -% \begin{lstlisting}[style=numbered] - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - void insert_into_string (char src, char *target, int pos) - { - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; - } - - int main (void) - { - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschhhhhhhhhhh} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{2} -% \workspace{13} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} -% \item -% Schreiben Sie eine Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)}, -% die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist -% und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle -% einfügt. Diese Funktion darf die bereits vorhandene Funktion -% \lstinline|insert_into_string()| aufrufen.\\ -% \points{4}\par -% Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: -% \begin{lstlisting}[gobble=8] -% char test[100] = ""; -% insert_into_string_sorted ('c', test); -% insert_into_string_sorted ('a', test); -% insert_into_string_sorted ('d', test); -% insert_into_string_sorted ('b', test); -% \end{lstlisting} -% Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. -% \workspace{14} -% \item -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet Ihre Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% und warum? -% \points{1} -% \workspace{10} -% \item -% Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% so gestalten kann,\\ -% daß sie in $\mathcal{O}(\log n)$ arbeitet. -% \points{3} -% \workspace{35} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie, wie die Ausgabe zustandekommt.} - - In der Schleife wird \emph{zuerst\/} der nächste Buchstabe \lstinline{target[i + 1]} - gleich dem aktuellen gesetzt - und \emph{danach\/} der Zähler \lstinline{i} erhöht. - Dadurch wird im nächsten Schleifendurchlauf der bereits verschobene Buchstabe - noch weiter geschoben und letztlich alle Buchstaben in \lstinline{target[]} - durch den an der Stelle \lstinline{pos} ersetzt. - - \item - \textbf{Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.}\par - \textbf{Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten.} - - Um im String "`Platz zu schaffen"', muß man von hinten beginnen, - also die Schleife umdrehen\\ - (siehe: \gitfile{hp}{2020ws/20201210}{loesung-2.c}): - \begin{lstlisting}{gobble=8} - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - \end{lstlisting} - - \item - \textbf{Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} - ersetzen und warum?} - - Die Schreibweise \lstinline{test[]} bedeutet, - daß der Compiler selbst zählt, wieviel Speicherplatz der String benötigt, - un dann genau die richtige Menge Speicher reserviert - (anstatt, wie wir es manuell getan haben, pauschal Platz für 100 Zeichen). - - Wenn wir nun in den String ein zusätzliches Zeichen einfügen, - ist dafür kein Speicherplatz reserviert worden, - und wir \textbf{überschreiben} dann Speicher, an dem sich andere Variable befinden, - was zu einem \textbf{Absturz} führen kann. - - Da wir hier nur ein einziges Zeichen schreiben, - wird dieser Fehler nicht sofort auffallen. - Dies ist schlimmer, als wenn das Programm direkt beim ersten Test abstürzt, - denn dadurch entsteht bei uns der Eindruck, es sei in Ordnung. - Wenn danach der Fehler in einer Produktivumgebung auftritt, - kann dadurch Schaden entstehen -- je nach Einsatzgebiet der Software - u.\,U.\ erheblicher Vermögens-, Sach- und/oder Personenschaden - (z.\,B.\ Absturz eines Raumflugkörpers). - - \item - \textbf{Was kann passieren, wenn Sie - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} - ersetzen und warum?} - - In diesem Fall wird der Speicher für den eigentlichen String - in einem unbenannten, \textbf{nicht schreibbaren} Teil des Speichers reserviert. - Unser Versuch, dorthin ein zusätzliches Zeichen zu schreiben, - fürt dann normalerweise zu einem \textbf{Absturz}. - - In manchen Systemen (Betriebssystem, Compiler, \dots) - ist der Speicherbereich tatsächlich sehr wohl schreibbar. - In diesem Fall tritt der Absturz nicht immer und nicht immer sofort auf -- - genau wie in Aufgabenteil (c). - - \end{enumerate} - - \exercise{Länge von Strings} - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{itemize} - \item[(a)] - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item[(b)] - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item[(c)] - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{itemize} - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{2020ws/20201210}{aufgabe-3.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{itemize} - \item[(d)] - Was bewirken die beiden Funktionen? - \points{2} - \item[(e)] -% Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. -% \points 3 -% \item[(f)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?} - - Ein String ist ein Array von \lstinline{char}s. - Nach den eigentlichen Zeichen des Strings enthält das Array - \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0, - nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung. - Die Länge eines Strings ist die Anzahl der Zeichen - \emph{vor\/} diesem Symbol. - - \item[(b)] - {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?} - - Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen; - das Null-Symbol, das das Ende markiert, zählt hier nicht mit) - und belegt Speicherplatz für 15 Zeichen - (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung). - - \item[(c)] - \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.} - - Siehe die Dateien \gitfile{hp}{2020ws/20201210}{loesung-3c-1.c} (mit Array-Index) - und \gitfile{hp}{2020ws/20201210}{loesung-3c-2.c} (mit Zeiger-Arithmetik). - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"} - kann normalerweise ignoriert werden; - auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()} - beim Linken Vorrang vor der selbstgeschriebenen, - so daß die selbstgeschriebene Funktion nie aufgerufen wird. - In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion - anders zu nennen (z.\,B.\ \lstinline{my_strlen()}). - - \item[(d)] - \textbf{Was bewirken die beiden Funktionen?} - - Beide addieren die Zahlenwerte der im String enthaltenen Zeichen - und geben die Summe als Funktionsergebnis zurück. - - Im Falle des Test-Strings \lstinline{"Hello, world!\n"} - lautet der Rückgabewert 1171 (siehe \gitfile{hp}{2020ws/20201210}{loesung-3d-1.c} und \gitfile{hp}{2020ws/20201210}{loesung-3d-2.c}). - - \item[(e)] -% \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.} -% -% Vorüberlegung: \lstinline{strlen()} greift in einer Schleife -% auf alle Zeichen des Strings der Länge $n$ zu, -% hat also $\mathcal{O}(n)$. -% -% \lstinline{fun_1()} ruft in jedem Schleifendurchlauf -% (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf -% und greift anschließend auf ein Zeichen des Strings zu, -% hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$. -% -% \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf -% und greift anschließend in einer Schleife auf alle Zeichen des Strings zu, -% hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$. -% -% \item[(f)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()}, - nur effizienter.} - - Die Funktion wird effizienter, - wenn man auf den Aufruf von \lstinline{strlen()} verzichtet - und stattdessen die Ende-Prüfung in derselben Schleife vornimmt, - in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert. - - Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{2020ws/20201210}{loesung-3e-1.c} - realisiert dies mit einem Array-Index, - Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{2020ws/20201210}{loesung-3e-2.c} - mit Zeiger-Arithmetik. - Beide Lösungen sind korrekt und arbeiten gleich schnell. - -% \textbf{Bemerkung:} Die effizientere Version der Funktion -% arbeitet doppelt so schnell wie die ursprüngliche, -% hat aber ebenfalls die Ordnung $\mathcal{O}(n)$. - - \end{itemize} - -\end{document} diff --git a/20201210/hp-uebung-20201210.pdf b/20201210/hp-uebung-20201210.pdf deleted file mode 100644 index 6d713c0cd332a21c28da29a719303a07ea65ccd7..0000000000000000000000000000000000000000 Binary files a/20201210/hp-uebung-20201210.pdf and /dev/null differ diff --git a/20201210/hp-uebung-20201210.tex b/20201210/hp-uebung-20201210.tex deleted file mode 100644 index c988102749d6d59d839394382d0222f845f97022..0000000000000000000000000000000000000000 --- a/20201210/hp-uebung-20201210.tex +++ /dev/null @@ -1,227 +0,0 @@ -% hp-uebung-20201210.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 10.\ Dezember 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 80 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 14 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Ausgabe von Hexadezimalzahlen} - - Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)}, - die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x} - als Hexadezimalzahl ausgibt. - (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.) - - Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit - der Formatspezifikation \lstinline{%x} als fertige Lösung, - sondern programmieren Sie die nötige Ausgabe selbst. - (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.) - - Die Verwendung von \lstinline{printf()} - mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d} - oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig. - - \points{8} - - (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht, - aber nicht zwingend.) - - \exercise{Einfügen in Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20201210}{aufgabe-2.c}): -% \begin{lstlisting}[style=numbered] - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - void insert_into_string (char src, char *target, int pos) - { - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; - } - - int main (void) - { - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschhhhhhhhhhh} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{2} -% \workspace{13} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} -% \item -% Schreiben Sie eine Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)}, -% die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist -% und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle -% einfügt. Diese Funktion darf die bereits vorhandene Funktion -% \lstinline|insert_into_string()| aufrufen.\\ -% \points{4}\par -% Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: -% \begin{lstlisting}[gobble=8] -% char test[100] = ""; -% insert_into_string_sorted ('c', test); -% insert_into_string_sorted ('a', test); -% insert_into_string_sorted ('d', test); -% insert_into_string_sorted ('b', test); -% \end{lstlisting} -% Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. -% \workspace{14} -% \item -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet Ihre Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% und warum? -% \points{1} -% \workspace{10} -% \item -% Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% so gestalten kann,\\ -% daß sie in $\mathcal{O}(\log n)$ arbeitet. -% \points{3} -% \workspace{35} - \end{enumerate} - - \exercise{Länge von Strings} - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{itemize} - \item[(a)] - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item[(b)] - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item[(c)] - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{itemize} - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{2020ws/20201210}{aufgabe-3.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{itemize} - \item[(d)] - Was bewirken die beiden Funktionen? - \points{2} - \item[(e)] -% Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. -% \points 3 -% \item[(f)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \end{itemize} - - \bigskip - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20201210/loesung-1-1.c b/20201210/loesung-1-1.c deleted file mode 100644 index 98b2f03f19d21aa2a794fef1f3f98feff95f5142..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - while (x) - { - int digit = x % 16; - if (digit < 10) - printf ("%d", digit); - else - printf ("%c", 'a' + digit - 10); - x /= 16; - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-1-2.c b/20201210/loesung-1-2.c deleted file mode 100644 index 35aa3b3aea6fc8faaa55c7d5382f0a8de9282aee..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - for (int i = 0; i < 8; i++) - { - digit[i] = x % 16; - x /= 16; - } - for (int i = 7; i >= 0; i--) - { - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-1-3.c b/20201210/loesung-1-3.c deleted file mode 100644 index 2462f2b537896722d8d1774a5d47f374ee5ef7fa..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-3.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - int i = 0; - while (x) - { - digit[i] = x % 16; - x /= 16; - i++; - } - while (i > 0) - { - i--; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-1-4.c b/20201210/loesung-1-4.c deleted file mode 100644 index 5083dcb865c86beafd43ce3e8837510b13cbe850..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-4.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - for (int i = 0; i < 8; i++) - { - digit[i] = x % 16; - x /= 16; - } - int printing = 0; - for (int i = 7; i >= 0; i--) - { - if (printing || digit[i] != 0) - { - printing = 1; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-1-5.c b/20201210/loesung-1-5.c deleted file mode 100644 index e3446edb4a40348ac14da420f344c208f8916f7e..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-5.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - int i = 0; - while (x) - { - digit[i] = x & 0x0000000f; - x >>= 4; - i++; - } - while (i > 0) - { - i--; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-1-6.c b/20201210/loesung-1-6.c deleted file mode 100644 index 7b8e8e1a9d7285b8a1e02ff1a91310f1dc02ed5b..0000000000000000000000000000000000000000 --- a/20201210/loesung-1-6.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - int i = 32; - while (i > 0) - { - i -= 4; - int digit = (x >> i) & 0x0000000f; - if (digit < 10) - printf ("%d", digit); - else - printf ("%c", 'a' + digit - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20201210/loesung-2.c b/20201210/loesung-2.c deleted file mode 100644 index 85abfcf3e1e4bacf454acd10f6832b757a64ac35..0000000000000000000000000000000000000000 --- a/20201210/loesung-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/20201210/loesung-3c-1.c b/20201210/loesung-3c-1.c deleted file mode 100644 index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000 --- a/20201210/loesung-3c-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20201210/loesung-3c-2.c b/20201210/loesung-3c-2.c deleted file mode 100644 index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000 --- a/20201210/loesung-3c-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20201210/loesung-3d-1.c b/20201210/loesung-3d-1.c deleted file mode 100644 index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000 --- a/20201210/loesung-3d-1.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20201210/loesung-3d-2.c b/20201210/loesung-3d-2.c deleted file mode 100644 index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000 --- a/20201210/loesung-3d-2.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20201210/loesung-3e-1.c b/20201210/loesung-3e-1.c deleted file mode 100644 index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000 --- a/20201210/loesung-3e-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_3 (char *s) -{ - int i = 0, x = 0; - while (s[i]) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_3 ("Hello, world!\n")); - return 0; -} diff --git a/20201210/loesung-3e-2.c b/20201210/loesung-3e-2.c deleted file mode 100644 index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000 --- a/20201210/loesung-3e-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_4 (char *s) -{ - int x = 0; - while (*s) - x += *s++; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_4 ("Hello, world!\n")); - return 0; -} diff --git a/20201210/logo-hochschule-bochum-cvh-text-v2.pdf b/20201210/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201210/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201210/logo-hochschule-bochum.pdf b/20201210/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201210/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201210/maerchen.c b/20201210/maerchen.c deleted file mode 100644 index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000 --- a/20201210/maerchen.c +++ /dev/null @@ -1,4 +0,0 @@ -Vor langer, langer Zeit -gab es einmal -#include "hexe.h" -Die lebte in einem Wald. diff --git a/20201210/pendulum.pdf b/20201210/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20201210/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20201210/pgscript.sty b/20201210/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201210/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201210/pgslides.sty b/20201210/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201210/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201210/philosophy-2.c b/20201210/philosophy-2.c deleted file mode 100644 index 0e02bd4bb3ffc61a3371932ab17ad36fa5a2c507..0000000000000000000000000000000000000000 --- a/20201210/philosophy-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include <answer.h> - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20201210/philosophy-3.c b/20201210/philosophy-3.c deleted file mode 100644 index c104bc5a96f892831c0c51daeea2ae2ad4b21f8c..0000000000000000000000000000000000000000 --- a/20201210/philosophy-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20201210/philosophy-4.c b/20201210/philosophy-4.c deleted file mode 100644 index 990eebf41e6438223558da8d528646fb78bbbaac..0000000000000000000000000000000000000000 --- a/20201210/philosophy-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.c" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20201210/philosophy.c b/20201210/philosophy.c deleted file mode 100644 index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000 --- a/20201210/philosophy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20201210/structs.c b/20201210/structs.c deleted file mode 100644 index 375be8691a3644b8a4da51be9390bdf28880912b..0000000000000000000000000000000000000000 --- a/20201210/structs.c +++ /dev/null @@ -1,103 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int day; - int month; - int year; -} -date; - -int isschaltjahr (int jahr) -{ - if (jahr % 4 == 0 && (jahr % 100 != 0 || jahr % 400 == 0)) - { - return 1; - } - return 0; -} - -void -set_date (date * d) -{ - int i=0; - while (i == 0) - { - int daysamonth; - (*d).day = 12; //Hier wird ein festes Datum verwendet. - (*d).month = 11; //Das Datum soll später abgefragt werden - (*d).year = 2020; //weshalb geprüft wird, ob das Datum gültig ist. - - switch ((*d).month) - { - case 1: - daysamonth = 31; - break; - case 2: - { - if (isschaltjahr ((*d).year)) - { - daysamonth = 29; - } - else - { - daysamonth = 28; - } - break; - } - case 3: - daysamonth = 31; - break; - case 4: - daysamonth = 30; - break; - case 5: - daysamonth = 31; - break; - case 6: - daysamonth = 30; - break; - case 7: - daysamonth = 31; - break; - case 8: - daysamonth = 31; - break; - case 9: - daysamonth = 30; - break; - case 10: - daysamonth = 31; - break; - case 11: - daysamonth = 30; - break; - case 12: - daysamonth = 31; - break; - } - if ((*d).day > daysamonth || (*d).month > 12) - { - printf ("Dies ist kein gültiges Datum: \n"); - } - else - { - i = 1; - } - - } -} - -void print_date (date (*d)) -{ - printf ("%d.%d.%d\n", (*d).day, (*d).month, (*d).year); -} - - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20201217/InstallationUndVerwendungGTKWin10.pdf b/20201217/InstallationUndVerwendungGTKWin10.pdf deleted file mode 100644 index 3757e05839ad8463e7da520b343a93af1f30d951..0000000000000000000000000000000000000000 Binary files a/20201217/InstallationUndVerwendungGTKWin10.pdf and /dev/null differ diff --git a/20201217/Makefile b/20201217/Makefile deleted file mode 120000 index d5f315bb0af8681b0b80a89de423cdc968cac0ba..0000000000000000000000000000000000000000 --- a/20201217/Makefile +++ /dev/null @@ -1 +0,0 @@ -Makefile-3 \ No newline at end of file diff --git a/20201217/Makefile-1 b/20201217/Makefile-1 deleted file mode 100644 index bfc1b10a929f22a8c2f4f0cf0368c78db14ad0b0..0000000000000000000000000000000000000000 --- a/20201217/Makefile-1 +++ /dev/null @@ -1,8 +0,0 @@ -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c diff --git a/20201217/Makefile-2 b/20201217/Makefile-2 deleted file mode 100644 index 60aab7c7d51b28879c41e8590ab422e9edfadee5..0000000000000000000000000000000000000000 --- a/20201217/Makefile-2 +++ /dev/null @@ -1,16 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - -philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20201217/Makefile-3 b/20201217/Makefile-3 deleted file mode 100644 index 0ac355bfddfd237fe0f1b5062c5a242ab0d3e97e..0000000000000000000000000000000000000000 --- a/20201217/Makefile-3 +++ /dev/null @@ -1,13 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -%.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20201217/answer.c b/20201217/answer.c deleted file mode 100644 index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000 --- a/20201217/answer.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 23; -} diff --git a/20201217/answer.h b/20201217/answer.h deleted file mode 100644 index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000 --- a/20201217/answer.h +++ /dev/null @@ -1 +0,0 @@ -extern int answer (void); diff --git a/20201217/aufgabe-2.c b/20201217/aufgabe-2.c deleted file mode 100644 index 5b0cb23fdd5ee15a4403808c18d2104ed49caf3f..0000000000000000000000000000000000000000 --- a/20201217/aufgabe-2.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double t = 0.0; -double dt = 0.2; - -int r = 5; - -double x = 10; -double y = 200; -double vx = 20; -double vy = -60; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; -} diff --git a/20201217/gtk-10.c b/20201217/gtk-10.c deleted file mode 100644 index f7fb2d5b1c4d3f1082a15b8f3a23fb5480fdd4f1..0000000000000000000000000000000000000000 --- a/20201217/gtk-10.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-11.c b/20201217/gtk-11.c deleted file mode 100644 index 1fa3d7169dc09ed0a5e89abffdce3cb297509842..0000000000000000000000000000000000000000 --- a/20201217/gtk-11.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-12.c b/20201217/gtk-12.c deleted file mode 100644 index e0c274336e1ea7a21983daaa95a563796b532e25..0000000000000000000000000000000000000000 --- a/20201217/gtk-12.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 5.0; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-13.c b/20201217/gtk-13.c deleted file mode 100644 index a91d9abf14066d773103a8fca1e2c41abad40be3..0000000000000000000000000000000000000000 --- a/20201217/gtk-13.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-14.c b/20201217/gtk-14.c deleted file mode 100644 index 75956a60c799d463b13ab45db1a6a62db96f7a20..0000000000000000000000000000000000000000 --- a/20201217/gtk-14.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 50.0; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (5000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-15.c b/20201217/gtk-15.c deleted file mode 100644 index abedb4d4988920c9a48cf4db12caf48a1d30d720..0000000000000000000000000000000000000000 --- a/20201217/gtk-15.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 50.0; -double dt = 0.2; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (200, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-16.c b/20201217/gtk-16.c deleted file mode 100644 index ccd1697d780457103a2c46d2be8572ac6f6d6d9e..0000000000000000000000000000000000000000 --- a/20201217/gtk-16.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.2; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (200, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-17.c b/20201217/gtk-17.c deleted file mode 100644 index 21786c759abcb452650aaa2358d3117acc15da52..0000000000000000000000000000000000000000 --- a/20201217/gtk-17.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.2; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - if (y + RADIUS >= HEIGHT) - vy = -vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (200, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-18.c b/20201217/gtk-18.c deleted file mode 100644 index 84f6081519114dbbd32e58ae495c60dbad83e279..0000000000000000000000000000000000000000 --- a/20201217/gtk-18.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.2; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - if (y + RADIUS <= 0) - vy = -vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (200, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-19.c b/20201217/gtk-19.c deleted file mode 100644 index 488ecb2f7e2e89c00119acc9c2a7a336129b0236..0000000000000000000000000000000000000000 --- a/20201217/gtk-19.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.2; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - if (y - RADIUS <= 0) - vy = -vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (200, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-20.c b/20201217/gtk-20.c deleted file mode 100644 index cf4c99aadff3cc1856b63176eebc1b66bb64acfb..0000000000000000000000000000000000000000 --- a/20201217/gtk-20.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.1; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - if (y - RADIUS <= 0) - vy = -vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (100, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-21.c b/20201217/gtk-21.c deleted file mode 100644 index e5227416e36dd16cb647142a2574bf2229f88456..0000000000000000000000000000000000000000 --- a/20201217/gtk-21.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.1; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - if (x - RADIUS <= 0) - vx = -vx; - if (y - RADIUS <= 0) - vy = -vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (100, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-22.c b/20201217/gtk-22.c deleted file mode 100644 index 5a141e5773fe36fc51adce4a69e71d76c898b8f6..0000000000000000000000000000000000000000 --- a/20201217/gtk-22.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.1; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -0.9 * vx; - if (x - RADIUS <= 0) - vx = -0.9 * vx; - if (y - RADIUS <= 0) - vy = -0.9 * vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (100, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-23.c b/20201217/gtk-23.c deleted file mode 100644 index 0a92ba411bab337fc882130556f463b81d919cfa..0000000000000000000000000000000000000000 --- a/20201217/gtk-23.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.1; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH && vx > 0) - vx = -0.9 * vx; - if (x - RADIUS <= 0 && vx < 0) - vx = -0.9 * vx; - if (y - RADIUS <= 0 && vy < 0) - vy = -0.9 * vy; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (100, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (1000, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/gtk-9.c b/20201217/gtk-9.c deleted file mode 100644 index 7beb24ccbed561b4f7451838ea1120fe71cf8b1c..0000000000000000000000000000000000000000 --- a/20201217/gtk-9.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20201217/hp-20201217.pdf b/20201217/hp-20201217.pdf deleted file mode 100644 index 440d46e10981db443b7be234834f08ba026b94fc..0000000000000000000000000000000000000000 Binary files a/20201217/hp-20201217.pdf and /dev/null differ diff --git a/20201217/hp-20201217.tex b/20201217/hp-20201217.tex deleted file mode 100644 index b64061a30d02b25cffbee5d64fc763758018f863..0000000000000000000000000000000000000000 --- a/20201217/hp-20201217.tex +++ /dev/null @@ -1,930 +0,0 @@ -% hp-20201217.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: make, Differentialgleichungen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{17.\ Dezember 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \vspace*{-\smallskipamount} - \item[\dots] - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - -% \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} -% \pause - \item - Kein Semikolon! -% \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} -% \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} -% \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<1->{.}{:} -% \pause - \begin{onlyenv}<1> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-3cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<2> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿ - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \begin{onlyenv}<3-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs - gtk+-3.0) -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{picture}(0,0)(0.3,0.3) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}\qquad\strut}}} - \end{picture} - \end{onlyenv} - \pause - \pause - \item - Auf manchen Plattformen kommt es auf die Reihenfolge an: - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \ - hello-gtk.c $(pkg-config --libs gtk+-3.0) \ - -o hello-gtk¿ - \end{lstlisting} - (Backslash = "`Es geht in der nächsten Zeile weiter."') - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - -% \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} -% \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - -% \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} -% \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} -% \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\section{Algorithmen} -\subsection{Differentialgleichungen} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{medgreen} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\iffalse - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\fi - -\end{document} diff --git a/20201217/hp-2020ws-p2.pdf b/20201217/hp-2020ws-p2.pdf deleted file mode 100644 index 0081d3c2667838cb911e8ca1086c615acc4f45b6..0000000000000000000000000000000000000000 Binary files a/20201217/hp-2020ws-p2.pdf and /dev/null differ diff --git a/20201217/hp-2020ws-p2.tex b/20201217/hp-2020ws-p2.tex deleted file mode 100644 index 12a39ac9fa8c9f5972caa4f98e6cae16a38128d8..0000000000000000000000000000000000000000 --- a/20201217/hp-2020ws-p2.tex +++ /dev/null @@ -1,201 +0,0 @@ -% hp-2020ws-p2.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 2: Weltraum-Simulation - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -%\usepackage{sfmath} - -\sloppy -\raggedcolumns -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC BY-SA (Version 4.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 2: Weltraum-Simulation} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2020/21\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein C-Programm, - das die Bahnen von beliebig vielen Massenpunkten unter Einfluß der Gravitation - simuliert und in bewegter Grafik darstellt. - - \begin{multicols}{2} - - \begin{itemize} - \item - Zwei Massenpunkte ("`Himmelskörper"') mit den Massen $m_i$ und $m_j$ - an den Orten $\vec{r}_i$ und $\vec{r}_j$ ziehen einander an. - Diese Kraft heißt Gravitation. Sie hat den Betrag: - \begin{equation} - |\vec{F}_{ij}| = \frac{m_j\cdot m_i\cdot G}{|\vec{r}_j - \vec{r}_i|^2} - \end{equation} - Hierbei ist $G$ eine Konstante (Gravitationskonstante). - - \item - Die auf einen Himmelskörper wirkende Gesamtkraft $\vec{F}_i$ - ergibt sich als Summe der von allen anderen Himmelskörpern herrührenden - Gravitationskräfte: - \begin{equation} - \vec{F}_i = \sum_{j=0,\,j\ne i}^{N - 1} \vec{F}_{ij} - \end{equation} - - \item - Die Gravitationskraft beschleunigt jeden Himmelskörper gemäß: - \begin{equation} - \vec{F_i} = m_i\cdot \vec{a_i} - \end{equation} - - \item - Beispiel: Wir betrachten zwei Himmelskörper. Einer davon ("`Zentralgestirn"') - ruht im Zentrum ($\vec{r}_0 = 0$, $\vec{v}_0 = 0$) - und hat eine wesentlich größere Masse als der andere - ("`Satellit"', $m_1 \ll m_0$). Mit geeignetem Anfangsort $\vec{r}_1$ - und geeigneter Anfangsgeschwindigkeit $\vec{v}_1$ beschreibt dann - der Satellit eine elliptische Umlaufbahn um das Zentralgestirn. - - \item - Wir rechnen in zwei Dimensionen $x$ und $y$. - - \item - Für die Zerlegung einer Kraft $\vec{F}_{ij}$ in $x$- und $y$-Komponenten - benötigen Sie nur die Grundrechenarten und die Wurzelfunktion, - jedoch insbesondere \emph{keine} trigonometrischen Funktionen: - \begin{equation} - \vec{F}_{ij} = |\vec{F}_{ij}| \cdot \frac{\vec{r}_j - \vec{r}_i}{|\vec{r}_j - \vec{r}_i|} - \end{equation} - - \item - Die Wurzelfunktion \lstinline{sqrt()} finden Sie - in der Mathematik-Bibliothek. - Um diese zu nutzen, verwenden Sie \lstinline{#include <math.h>} im Quelltext, - und geben Sie beim \lstinline[style=cmd]{gcc}-Aufruf - \lstinline[style=cmd]{-lm} mit an. - - \columnbreak - - \item - Für die Simulation betrachten wir das System in kurzen Zeitintervallen $dt$ - und berechnen die Änderungen des Ortes $\vec{r}_i = (x_i,y_i)$ - und der Geschwindigkeit $\vec{v}_i = (v_{xi},v_{yi})$ jedes Himmelskörpers - mit Hilfe des expliziten Eulerschen Polygonzugverfahrens. - \par - (Wer möchte, darf natürlich auch andere Verfahren anwenden, - beispielsweise das klassische Runge-Kutta-Verfahren 4.~Ordnung.) - - \item - Für eine derartige Simulation - einschließlich ihrer Darstellung als bewegte Grafik - können Sie sich von dem Beispiel-Programm \gitfile{hp}{2020ws/20201217}{gtk-16.c} - inspirieren lassen. -% (Compilieren mit: -% \lstinline[style=cmd]{gcc} -% \lstinline[style=cmd]{-Wall} -% \lstinline[style=cmd]{-O} -% \lstinline[style=cmd]{gtk-16.c} -% \lstinline[style=cmd]{$(pkg-config} -% \lstinline[style=cmd]{--cflags} -% \lstinline[style=cmd]{--libs} -% \lstinline[style=cmd]{gtk+-3.0)} -% \lstinline[style=cmd]{-o} -% \lstinline[style=cmd]{gtk-16}) - - \item - In einer \file{GTK+}-\lstinline{drawing_area} - liegt der Nullpunkt der Zeichnung oben links, - eine Längeneinheit entspricht einem Pixel, - und die $y$-Koordinate wächst nach unten. - Es empfiehlt sich, die Koordinaten so umzurechnen, - daß der Nullpunkt in der Mitte der Zeichnung liegt, - die Längeneinheit Ihrem persönlichen Geschmack entspricht - und die $y$-Koordinate nach oben wächst. - - \item - Beispiel-Szenarien für 3 oder mehr Körper: - \vspace{-\smallskipamount} - \begin{itemize}\itemsep0pt - \item - Planet mit Mond umkreist Sonne - \item - Sonne mit mehreren Planeten, die sich gegenseitig beeinflussen - \item - zwei Sonnen umkreisen sich gegenseitig, Planet kreist drumherum - \item - Raumsonde besucht nacheinander mehrere Planeten - \end{itemize} - - \item - \textbf{Hinweis:} - Speichern Sie die verschiedenen Körper nicht als separate Variable, - sondern in einem Array. Ihr Programm wird dadurch nicht nur flexibler, - sondern auch übersichtlicher und weniger fehleranfällig. - - \item - \textbf{Abgabe:} - Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte - per E-Mail an \file{peter.gerwinski@hs-bochum.de} - mit dem \textbf{Betreff:} \lstinline[style=terminal]{aezeev1C} - unter Angabe von Name, Matrikel-Nummer, - Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS). - - \end{itemize} - - \end{multicols} - - \vspace*{-\bigskipamount} - - \strut\hfill\emph{Viel Erfolg!}\qquad\qquad - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 17.\ Dezember 2020 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2018, 2019, 2020\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext - und Beispielprogramm herunterladen unter: - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20201217/hp-musterloesung-20201217.pdf b/20201217/hp-musterloesung-20201217.pdf deleted file mode 100644 index 6d28b21ef0e1d7d973b4e6d345c85fce9899181d..0000000000000000000000000000000000000000 Binary files a/20201217/hp-musterloesung-20201217.pdf and /dev/null differ diff --git a/20201217/hp-musterloesung-20201217.tex b/20201217/hp-musterloesung-20201217.tex deleted file mode 100644 index 96a1a73d756410ff9290f1c5ef7bb910f53bc97d..0000000000000000000000000000000000000000 --- a/20201217/hp-musterloesung-20201217.tex +++ /dev/null @@ -1,326 +0,0 @@ -% hp-musterloesung-20201217.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Kondensator, hüpfender Ball - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gnuplot-lua-tikz} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 17.\ Dezember 2020} - - \exercise{Kondensator} - - Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$ - ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen - und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen. - - \begin{enumerate}[(a)] - \item - Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt. - \points{5} - \item - Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist. - \points{4} - \item - Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve: - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}\\ - \points{3} - \end{enumerate} - - Hinweise: - \begin{itemize} - \item - Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$. - Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant - und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls - aus dem Kondensator herausfließt. - Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls. - \item - Für den Vergleich mit der exakten theoretischen Entladekurve - benötigen Sie die Exponentialfunktion \lstinline{exp()}. - Diese finden Sie in der Mathematik-Bibliothek: - \lstinline{#include <math.h>} im Quelltext, - beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben. - \item - $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$ - \end{itemize} - - \solution - - \begin{itemize} - \item - \textbf{Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt.} - - In dem Programm \gitfile{hp}{2020ws/20201217}{loesung-1a.c} - arbeiten wir, dem ersten Hinweis folgend, - mit einem Zeitintervall von \lstinline{dt = 0.01}. - Mit dieser Schrittweite lassen wir uns eine Tabelle ausgeben, - die jeweils die Zeit und durch die Simulation berechnete Spannung ausgibt. - - Wir simulieren, wie die Ladung $Q = C \cdot U$ des Kondensators - im Laufe der Zeit abfließt. - Dazu berechnen wir in jedem Zeitschritt zunächst den Strom $I = U / R$, - der aus dem Kondensator fließt. - Dieser Strom bewirkt, daß innerhalb des Zeitintervalls $dt$ - die Ladung $dQ = I \cdot dt$ aus dem Kondensator abfließt. - Am Ende des Zeitintervalls berechnen wir die zur neuen Ladung $Q$ - gehörende neue Spannung $U = Q / C$. - - Für eine einfache Ausgabe der Tabelle - verwenden wir die Formatspezifikationen \lstinline{%10.3lf} für drei - bzw.\ \lstinline{%15.8lf} für acht Nachkommastellen Genauigkeit. - Damit schreiben wir jeweils eine \emph{lange Fließkommazahl\/} (\lstinline{%lf}) - rechtsbündig in ein Feld der Breite 10 bzw.\ 15 - und lassen uns 3 bzw.\ 8 Nachkommastellen ausgeben. - - Wir compilieren das Programm mit: - \lstinline[style=cmd]{gcc -Wall -O loesung-1a.c -o loesung-1a} - - \item - \textbf{Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter \boldmath $0.1\,{\rm V}$ gefallen ist.} - - Wir ändern das Programm \gitfile{hp}{2020ws/20201217}{loesung-1a.c} so ab, - daß zum einen die Schleife abbricht, sobald die Spannung - den Wert $0.1\,{\rm V}$ unterschreitet (\gitfile{hp}{2020ws/20201217}{loesung-1b.c}), - und daß zum anderen nicht jedesmal eine Zeile für die Tabelle ausgegeben wird, - sondern erst am Ende die Zeit (und die Spannung). - - Der Ausgabe entnehmen wir, daß die Spannung bei etwa $t = 12.90\,{\rm s}$ - den Wert $0.1\,{\rm V}$ unterschreitet. - - \item - \textbf{Vergleichen Sie die berechneten Werte - mit der exakten theoretischen Entladekurve:\\[0.5\smallskipamount] - \boldmath - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}} - - Wir ändern das Programm \gitfile{hp}{2020ws/20201217}{loesung-1a.c} so ab, - daß es zusätzlich zur Zeit und zur simulierten Spannung - die exakte Spannung $U_0 \cdot e^{-\frac{t}{RC}}$ - gemäß der theoretischen Entladekurve ausgibt (\gitfile{hp}{2020ws/20201217}{loesung-1c.c}), - - Da dieses Programm die Exponentialfunktion verwendet, müssen wir nun - beim Compilieren zusätzlich \lstinline[style=cmd]{-lm}\hspace{1pt} - für das Einbinden der Mathematik-Bibliothek angeben. - - Der erweiterten Tabelle können wir entnehmen, - daß die durch die Simulation berechnete Spannung - mit der Spannung $U_0 \cdot e^{-\frac{t}{RC}}$ - gemäß der theoretischen Entladekurve - bis auf wenige Prozent übereinstimmt. - Dies ist für viele praktische Anwendungen ausreichend, - wenn auch nicht für Präzisionsmessungen. - - Wenn Sie die Ausgabe des Programms, z.\,B.\ mit - \lstinline[style=cmd]{./loesung-1c > loesung-1c.dat}, - in einer Datei \gitfile{hp}{2020ws/20201217}{loesung-1c.dat} speichern, - können Sie sich die beiden Kurven graphisch darstellen lassen, - z.\,B.\ mit \file{gnuplot} und dem folgenden Befehl: - \begin{lstlisting}[style=cmd,gobble=8] - plot "loesung-1c.dat" using 1:2 with lines title "Simulation", - "loesung-1c.dat" using 1:3 with lines title "Theorie" - \end{lstlisting} - \begin{center} - \input{loesung-1c.tikz} - \end{center} - - Der Unterschied zwischen der simulierten und der theoretischen Entladungskurve - ist mit bloßem Auge nicht sichtbar. - \end{itemize} - - \vfill - - \exercise{Fehlerhaftes Programm: Hüpfender Ball} - - Das auf der nächsten Seite abgedruckte GTK+-Programm - (Datei: \gitfile{hp}{2020ws/20201217}{aufgabe-2.c}) soll einen - hüpfenden Ball darstellen, ist jedoch fehlerhaft. - - \begin{enumerate}[\quad(a)] - \item - Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben? - \points{3} - \item - Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum? - \points{2} - \item - Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5} - \item - Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2} - \end{enumerate} - - Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung - ist ausdrücklich erlaubt -- auch in der Klausur. - - Allgemeiner Hinweis: - Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung - als PDF-Datei betrachten und darin auf die Dateinamen klicken, - können Sie die Beispiel-Programme direkt herunterladen. - Dadurch vermeiden Sie Übertragungsfehler. - - \clearpage - - \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting} - #include <gtk/gtk.h> - - #define WIDTH 320 - #define HEIGHT 240 - - double t = 0.0; - double dt = 0.2; - - int r = 5; - - double x = 10; - double y = 200; - double vx = 20; - double vy = -60; - double g = 9.81; - - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; - } - - gboolean timer (GtkWidget *widget) - { - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; - } - \end{lstlisting}\vss} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?} - - Die für das Zeichnen zuständige Callback-Funktion wurde zwar geschrieben, - aber nicht installiert. - Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm: - - \lstinline{g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);} - - Dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{2020ws/20201217}{gtk-16.c}. - - \item - \textbf{Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?} - - Die Timer-Callback-Funktion wurde zwar geschrieben, aber nicht installiert. - Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm: - - \lstinline{g_timeout_add (50, (GSourceFunc) timer, drawing_area);} - - Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{2020ws/20201217}{gtk-16.c}. - - \item - \textbf{Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft?} - - Die Geschwindigkeit in $y$-Richtung wächst immer weiter. - Der Grund dafür ist, daß die $y$-Komponente der Geschwindigkeit - nicht auf physikalisch sinnvolle Weise berechnet wird. - In der dafür zuständigen Zeile - \lstinline{vy = 0.5 * g * (t * t);} - wird stattdessen der Weg in $y$-Richtung bei einer gleichmäßig - beschleunigten Bewegung berechnet und als Geschwindigkeit verwendet. - - \item - \textbf{Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen?} - - Da der Ball am Boden abprallen soll, ist es \emph{nicht\/} sinnvoll, - die $y$-Komponente der Geschwindigkeit über die bekannte physikalische - Formel $v_y = -g\cdot t$ für die Geschwindigkeit in einer - gleichmäßig beschleunigten Bewegung zu berechnen. - - Stattdessen ist es sinnvoll, die \emph{Geschwindigkeitsänderung\/} - innerhalb des Zeitintervalls \lstinline{dt} - zur Geschwindigkeitskomponente zu addieren: - \lstinline{vy += g * dt;} - - Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{2020ws/20201217}{gtk-16.c}. - \end{enumerate} - -\end{document} diff --git a/20201217/hp-uebung-20201217.pdf b/20201217/hp-uebung-20201217.pdf deleted file mode 100644 index 9dabeb446661ba7dadcc3a7dbc49bf325c10e834..0000000000000000000000000000000000000000 Binary files a/20201217/hp-uebung-20201217.pdf and /dev/null differ diff --git a/20201217/hp-uebung-20201217.tex b/20201217/hp-uebung-20201217.tex deleted file mode 100644 index 6b9c11944f2215e1240d749a8d2cc744005497f7..0000000000000000000000000000000000000000 --- a/20201217/hp-uebung-20201217.tex +++ /dev/null @@ -1,193 +0,0 @@ -% hp-uebung-20201217.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Kondensator, hüpfender Ball - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 17.\ Dezember 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 12 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Kondensator} - - Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$ - ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen - und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen. - - \begin{enumerate}[(a)] - \item - Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt. - \points{5} - \item - Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist. - \points{4} - \item - Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve: - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}\\ - \points{3} - \end{enumerate} - - Hinweise: - \begin{itemize} - \item - Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$. - Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant - und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls - aus dem Kondensator herausfließt. - Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls. - \item - Für den Vergleich mit der exakten theoretischen Entladekurve - benötigen Sie die Exponentialfunktion \lstinline{exp()}. - Diese finden Sie in der Mathematik-Bibliothek: - \lstinline{#include <math.h>} im Quelltext, - beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben. - \item - $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$ - \end{itemize} - - \exercise{Fehlerhaftes Programm: Hüpfender Ball} - - Das auf der nächsten Seite abgedruckte GTK+-Programm - (Datei: \gitfile{hp}{2020ws/20201217}{aufgabe-2.c}) soll einen - hüpfenden Ball darstellen, ist jedoch fehlerhaft. - - \begin{enumerate}[\quad(a)] - \item - Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben? - \points{3} - \item - Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum? - \points{2} - \item - Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5} - \item - Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2} - \end{enumerate} - - Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung - ist ausdrücklich erlaubt -- auch in der Klausur. - - Allgemeiner Hinweis: - Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung - als PDF-Datei betrachten und darin auf die Dateinamen klicken, - können Sie die Beispiel-Programme direkt herunterladen. - Dadurch vermeiden Sie Übertragungsfehler. - - \bigskip - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \clearpage - - \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting} - #include <gtk/gtk.h> - - #define WIDTH 320 - #define HEIGHT 240 - - double t = 0.0; - double dt = 0.2; - - int r = 5; - - double x = 10; - double y = 200; - double vx = 20; - double vy = -60; - double g = 9.81; - - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; - } - - gboolean timer (GtkWidget *widget) - { - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; - } - \end{lstlisting}\vss} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20201217/loesung-1a.c b/20201217/loesung-1a.c deleted file mode 100644 index f355706a6ff6f95bd72897123a985fb2b7ead7c3..0000000000000000000000000000000000000000 --- a/20201217/loesung-1a.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U > 0.09) - { - printf ("%10.3lf%15.8lf\n", t, U); - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - return 0; -} diff --git a/20201217/loesung-1b.c b/20201217/loesung-1b.c deleted file mode 100644 index f5fc22022ef10a1b986bbd11fba8298a7547792d..0000000000000000000000000000000000000000 --- a/20201217/loesung-1b.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U >= 0.1) - { - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - printf ("%10.3lf%15.8lf\n", t, U); - return 0; -} diff --git a/20201217/loesung-1c.c b/20201217/loesung-1c.c deleted file mode 100644 index 71802e036dd56534470028b61f646d297d1d8840..0000000000000000000000000000000000000000 --- a/20201217/loesung-1c.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U > 0.09) - { - printf ("%10.3lf%15.8lf%15.8lf\n", t, U, U0 * exp (-t / (R * C))); - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - return 0; -} diff --git a/20201217/loesung-1c.dat b/20201217/loesung-1c.dat deleted file mode 100644 index 4df706295bde25a74e025c5335f43617d93129a8..0000000000000000000000000000000000000000 --- a/20201217/loesung-1c.dat +++ /dev/null @@ -1,1324 +0,0 @@ - 0.000 5.00000000 5.00000000 - 0.010 4.98484848 4.98487142 - 0.020 4.96974288 4.96978861 - 0.030 4.95468306 4.95475144 - 0.040 4.93966887 4.93975977 - 0.050 4.92470017 4.92481346 - 0.060 4.90977684 4.90991237 - 0.070 4.89489873 4.89505637 - 0.080 4.88006570 4.88024532 - 0.090 4.86527762 4.86547908 - 0.100 4.85053436 4.85075752 - 0.110 4.83583577 4.83608050 - 0.120 4.82118172 4.82144789 - 0.130 4.80657208 4.80685956 - 0.140 4.79200671 4.79231537 - 0.150 4.77748548 4.77781518 - 0.160 4.76300825 4.76335887 - 0.170 4.74857489 4.74894630 - 0.180 4.73418527 4.73457733 - 0.190 4.71983925 4.72025184 - 0.200 4.70553671 4.70596970 - 0.210 4.69127751 4.69173077 - 0.220 4.67706151 4.67753493 - 0.230 4.66288860 4.66338203 - 0.240 4.64875864 4.64927196 - 0.250 4.63467149 4.63520458 - 0.260 4.62062703 4.62117977 - 0.270 4.60662513 4.60719739 - 0.280 4.59266566 4.59325732 - 0.290 4.57874849 4.57935942 - 0.300 4.56487349 4.56550358 - 0.310 4.55104054 4.55168966 - 0.320 4.53724951 4.53791754 - 0.330 4.52350027 4.52418709 - 0.340 4.50979269 4.51049818 - 0.350 4.49612666 4.49685070 - 0.360 4.48250203 4.48324450 - 0.370 4.46891869 4.46967948 - 0.380 4.45537651 4.45615549 - 0.390 4.44187537 4.44267243 - 0.400 4.42841514 4.42923016 - 0.410 4.41499570 4.41582857 - 0.420 4.40161693 4.40246753 - 0.430 4.38827870 4.38914691 - 0.440 4.37498088 4.37586660 - 0.450 4.36172336 4.36262646 - 0.460 4.34850602 4.34942639 - 0.470 4.33532873 4.33626626 - 0.480 4.32219137 4.32314595 - 0.490 4.30909382 4.31006534 - 0.500 4.29603596 4.29702430 - 0.510 4.28301767 4.28402273 - 0.520 4.27003883 4.27106049 - 0.530 4.25709932 4.25813747 - 0.540 4.24419901 4.24525356 - 0.550 4.23133781 4.23240862 - 0.560 4.21851557 4.21960256 - 0.570 4.20573219 4.20683524 - 0.580 4.19298755 4.19410655 - 0.590 4.18028152 4.18141637 - 0.600 4.16761400 4.16876459 - 0.610 4.15498487 4.15615109 - 0.620 4.14239401 4.14357576 - 0.630 4.12984130 4.13103847 - 0.640 4.11732663 4.11853912 - 0.650 4.10484988 4.10607759 - 0.660 4.09241094 4.09365377 - 0.670 4.08000970 4.08126753 - 0.680 4.06764603 4.06891877 - 0.690 4.05531983 4.05660738 - 0.700 4.04303098 4.04433324 - 0.710 4.03077937 4.03209623 - 0.720 4.01856489 4.01989625 - 0.730 4.00638742 4.00773319 - 0.740 3.99424685 3.99560692 - 0.750 3.98214307 3.98351735 - 0.760 3.97007597 3.97146436 - 0.770 3.95804544 3.95944783 - 0.780 3.94605136 3.94746767 - 0.790 3.93409363 3.93552375 - 0.800 3.92217214 3.92361597 - 0.810 3.91028677 3.91174422 - 0.820 3.89843741 3.89990839 - 0.830 3.88662397 3.88810838 - 0.840 3.87484632 3.87634406 - 0.850 3.86310436 3.86461535 - 0.860 3.85139798 3.85292212 - 0.870 3.83972708 3.84126427 - 0.880 3.82809154 3.82964169 - 0.890 3.81649127 3.81805428 - 0.900 3.80492614 3.80650193 - 0.910 3.79339606 3.79498454 - 0.920 3.78190092 3.78350199 - 0.930 3.77044062 3.77205419 - 0.940 3.75901504 3.76064102 - 0.950 3.74762408 3.74926239 - 0.960 3.73626765 3.73791819 - 0.970 3.72494562 3.72660831 - 0.980 3.71365791 3.71533265 - 0.990 3.70240440 3.70409110 - 1.000 3.69118499 3.69288357 - 1.010 3.67999958 3.68170996 - 1.020 3.66884807 3.67057015 - 1.030 3.65773035 3.65946404 - 1.040 3.64664632 3.64839154 - 1.050 3.63559587 3.63735255 - 1.060 3.62457892 3.62634695 - 1.070 3.61359534 3.61537465 - 1.080 3.60264506 3.60443555 - 1.090 3.59172795 3.59352955 - 1.100 3.58084393 3.58265655 - 1.110 3.56999288 3.57181645 - 1.120 3.55917472 3.56100915 - 1.130 3.54838934 3.55023454 - 1.140 3.53763665 3.53949254 - 1.150 3.52691654 3.52878304 - 1.160 3.51622891 3.51810594 - 1.170 3.50557367 3.50746115 - 1.180 3.49495072 3.49684857 - 1.190 3.48435996 3.48626810 - 1.200 3.47380130 3.47571964 - 1.210 3.46327463 3.46520310 - 1.220 3.45277985 3.45471838 - 1.230 3.44231689 3.44426538 - 1.240 3.43188562 3.43384401 - 1.250 3.42148597 3.42345417 - 1.260 3.41111783 3.41309577 - 1.270 3.40078111 3.40276871 - 1.280 3.39047571 3.39247290 - 1.290 3.38020154 3.38220824 - 1.300 3.36995851 3.37197464 - 1.310 3.35974651 3.36177200 - 1.320 3.34956546 3.35160023 - 1.330 3.33941526 3.34145924 - 1.340 3.32929582 3.33134893 - 1.350 3.31920705 3.32126921 - 1.360 3.30914885 3.31122000 - 1.370 3.29912112 3.30120118 - 1.380 3.28912378 3.29121269 - 1.390 3.27915674 3.28125441 - 1.400 3.26921990 3.27132626 - 1.410 3.25931318 3.26142816 - 1.420 3.24943647 3.25156000 - 1.430 3.23958969 3.24172171 - 1.440 3.22977276 3.23191317 - 1.450 3.21998557 3.22213432 - 1.460 3.21022803 3.21238506 - 1.470 3.20050007 3.20266529 - 1.480 3.19080158 3.19297494 - 1.490 3.18113249 3.18331390 - 1.500 3.17149269 3.17368209 - 1.510 3.16188211 3.16407943 - 1.520 3.15230065 3.15450583 - 1.530 3.14274822 3.14496119 - 1.540 3.13322474 3.13544543 - 1.550 3.12373012 3.12595846 - 1.560 3.11426427 3.11650019 - 1.570 3.10482711 3.10707055 - 1.580 3.09541854 3.09766944 - 1.590 3.08603849 3.08829677 - 1.600 3.07668685 3.07895246 - 1.610 3.06736356 3.06963642 - 1.620 3.05806852 3.06034857 - 1.630 3.04880164 3.05108882 - 1.640 3.03956285 3.04185710 - 1.650 3.03035206 3.03265330 - 1.660 3.02116917 3.02347735 - 1.670 3.01201411 3.01432917 - 1.680 3.00288680 3.00520866 - 1.690 2.99378714 2.99611575 - 1.700 2.98471506 2.98705036 - 1.710 2.97567047 2.97801239 - 1.720 2.96665328 2.96900177 - 1.730 2.95766343 2.96001841 - 1.740 2.94870081 2.95106223 - 1.750 2.93976535 2.94213316 - 1.760 2.93085697 2.93323110 - 1.770 2.92197559 2.92435597 - 1.780 2.91312112 2.91550770 - 1.790 2.90429348 2.90668620 - 1.800 2.89549259 2.89789139 - 1.810 2.88671837 2.88912320 - 1.820 2.87797074 2.88038153 - 1.830 2.86924961 2.87166631 - 1.840 2.86055492 2.86297746 - 1.850 2.85188657 2.85431491 - 1.860 2.84324449 2.84567856 - 1.870 2.83462859 2.83706834 - 1.880 2.82603881 2.82848418 - 1.890 2.81747506 2.81992599 - 1.900 2.80893725 2.81139369 - 1.910 2.80042532 2.80288721 - 1.920 2.79193919 2.79440647 - 1.930 2.78347876 2.78595139 - 1.940 2.77504398 2.77752189 - 1.950 2.76663476 2.76911790 - 1.960 2.75825101 2.76073933 - 1.970 2.74989268 2.75238612 - 1.980 2.74155967 2.74405818 - 1.990 2.73325191 2.73575544 - 2.000 2.72496933 2.72747782 - 2.010 2.71671185 2.71922525 - 2.020 2.70847939 2.71099764 - 2.030 2.70027187 2.70279493 - 2.040 2.69208923 2.69461704 - 2.050 2.68393139 2.68646389 - 2.060 2.67579826 2.67833542 - 2.070 2.66768978 2.67023153 - 2.080 2.65960587 2.66215217 - 2.090 2.65154646 2.65409725 - 2.100 2.64351147 2.64606671 - 2.110 2.63550083 2.63806046 - 2.120 2.62751447 2.63007844 - 2.130 2.61955230 2.62212057 - 2.140 2.61161426 2.61418677 - 2.150 2.60370028 2.60627699 - 2.160 2.59581028 2.59839113 - 2.170 2.58794419 2.59052914 - 2.180 2.58010193 2.58269093 - 2.190 2.57228344 2.57487644 - 2.200 2.56448864 2.56708560 - 2.210 2.55671747 2.55931832 - 2.220 2.54896984 2.55157455 - 2.230 2.54124569 2.54385421 - 2.240 2.53354494 2.53615723 - 2.250 2.52586753 2.52848354 - 2.260 2.51821339 2.52083306 - 2.270 2.51058244 2.51320574 - 2.280 2.50297461 2.50560149 - 2.290 2.49538984 2.49802025 - 2.300 2.48782805 2.49046195 - 2.310 2.48028918 2.48292652 - 2.320 2.47277315 2.47541389 - 2.330 2.46527990 2.46792399 - 2.340 2.45780936 2.46045675 - 2.350 2.45036145 2.45301211 - 2.360 2.44293611 2.44558999 - 2.370 2.43553328 2.43819033 - 2.380 2.42815287 2.43081305 - 2.390 2.42079483 2.42345810 - 2.400 2.41345909 2.41612541 - 2.410 2.40614558 2.40881490 - 2.420 2.39885423 2.40152651 - 2.430 2.39158497 2.39426017 - 2.440 2.38433775 2.38701582 - 2.450 2.37711248 2.37979338 - 2.460 2.36990911 2.37259280 - 2.470 2.36272757 2.36541401 - 2.480 2.35556778 2.35825694 - 2.490 2.34842970 2.35112152 - 2.500 2.34131325 2.34400770 - 2.510 2.33421836 2.33691539 - 2.520 2.32714497 2.32984455 - 2.530 2.32009302 2.32279510 - 2.540 2.31306243 2.31576698 - 2.550 2.30605315 2.30876013 - 2.560 2.29906511 2.30177448 - 2.570 2.29209825 2.29480996 - 2.580 2.28515249 2.28786652 - 2.590 2.27822779 2.28094408 - 2.600 2.27132407 2.27404259 - 2.610 2.26444127 2.26716198 - 2.620 2.25757933 2.26030219 - 2.630 2.25073818 2.25346316 - 2.640 2.24391776 2.24664482 - 2.650 2.23711801 2.23984711 - 2.660 2.23033886 2.23306997 - 2.670 2.22358026 2.22631333 - 2.680 2.21684214 2.21957714 - 2.690 2.21012443 2.21286133 - 2.700 2.20342709 2.20616584 - 2.710 2.19675003 2.19949061 - 2.720 2.19009322 2.19283557 - 2.730 2.18345657 2.18620067 - 2.740 2.17684003 2.17958585 - 2.750 2.17024355 2.17299104 - 2.760 2.16366705 2.16641619 - 2.770 2.15711049 2.15986123 - 2.780 2.15057379 2.15332610 - 2.790 2.14405690 2.14681075 - 2.800 2.13755976 2.14031511 - 2.810 2.13108230 2.13383912 - 2.820 2.12462448 2.12738273 - 2.830 2.11818622 2.12094587 - 2.840 2.11176748 2.11452849 - 2.850 2.10536818 2.10813053 - 2.860 2.09898828 2.10175192 - 2.870 2.09262771 2.09539262 - 2.880 2.08628641 2.08905255 - 2.890 2.07996433 2.08273167 - 2.900 2.07366141 2.07642992 - 2.910 2.06737759 2.07014723 - 2.920 2.06111280 2.06388355 - 2.930 2.05486701 2.05763883 - 2.940 2.04864014 2.05141299 - 2.950 2.04243214 2.04520600 - 2.960 2.03624295 2.03901779 - 2.970 2.03007252 2.03284830 - 2.980 2.02392078 2.02669748 - 2.990 2.01778769 2.02056526 - 3.000 2.01167318 2.01445161 - 3.010 2.00557720 2.00835645 - 3.020 1.99949969 2.00227973 - 3.030 1.99344060 1.99622140 - 3.040 1.98739988 1.99018140 - 3.050 1.98137745 1.98415968 - 3.060 1.97537328 1.97815617 - 3.070 1.96938730 1.97217083 - 3.080 1.96341946 1.96620360 - 3.090 1.95746970 1.96025443 - 3.100 1.95153798 1.95432326 - 3.110 1.94562422 1.94841003 - 3.120 1.93972839 1.94251469 - 3.130 1.93385043 1.93663719 - 3.140 1.92799028 1.93077748 - 3.150 1.92214788 1.92493549 - 3.160 1.91632319 1.91911119 - 3.170 1.91051615 1.91330450 - 3.180 1.90472671 1.90751538 - 3.190 1.89895481 1.90174378 - 3.200 1.89320040 1.89598965 - 3.210 1.88746343 1.89025292 - 3.220 1.88174384 1.88453355 - 3.230 1.87604159 1.87883149 - 3.240 1.87035661 1.87314668 - 3.250 1.86468887 1.86747906 - 3.260 1.85903829 1.86182860 - 3.270 1.85340484 1.85619524 - 3.280 1.84778847 1.85057892 - 3.290 1.84218911 1.84497959 - 3.300 1.83660672 1.83939721 - 3.310 1.83104124 1.83383171 - 3.320 1.82549263 1.82828306 - 3.330 1.81996084 1.82275119 - 3.340 1.81444580 1.81723606 - 3.350 1.80894748 1.81173762 - 3.360 1.80346582 1.80625582 - 3.370 1.79800078 1.80079060 - 3.380 1.79255229 1.79534192 - 3.390 1.78712031 1.78990972 - 3.400 1.78170480 1.78449397 - 3.410 1.77630569 1.77909459 - 3.420 1.77092295 1.77371156 - 3.430 1.76555651 1.76834481 - 3.440 1.76020634 1.76299430 - 3.450 1.75487238 1.75765998 - 3.460 1.74955459 1.75234180 - 3.470 1.74425291 1.74703971 - 3.480 1.73896729 1.74175366 - 3.490 1.73369769 1.73648361 - 3.500 1.72844406 1.73122950 - 3.510 1.72320636 1.72599129 - 3.520 1.71798452 1.72076893 - 3.530 1.71277850 1.71556238 - 3.540 1.70758827 1.71037157 - 3.550 1.70241376 1.70519647 - 3.560 1.69725493 1.70003703 - 3.570 1.69211173 1.69489320 - 3.580 1.68698412 1.68976494 - 3.590 1.68187205 1.68465219 - 3.600 1.67677546 1.67955491 - 3.610 1.67169433 1.67447305 - 3.620 1.66662859 1.66940657 - 3.630 1.66157820 1.66435542 - 3.640 1.65654311 1.65931955 - 3.650 1.65152328 1.65429892 - 3.660 1.64651867 1.64929348 - 3.670 1.64152922 1.64430319 - 3.680 1.63655489 1.63932799 - 3.690 1.63159563 1.63436785 - 3.700 1.62665140 1.62942272 - 3.710 1.62172215 1.62449255 - 3.720 1.61680784 1.61957729 - 3.730 1.61190842 1.61467691 - 3.740 1.60702385 1.60979136 - 3.750 1.60215408 1.60492059 - 3.760 1.59729907 1.60006455 - 3.770 1.59245877 1.59522321 - 3.780 1.58763314 1.59039652 - 3.790 1.58282213 1.58558443 - 3.800 1.57802570 1.58078690 - 3.810 1.57324380 1.57600389 - 3.820 1.56847640 1.57123535 - 3.830 1.56372344 1.56648123 - 3.840 1.55898488 1.56174151 - 3.850 1.55426069 1.55701612 - 3.860 1.54955081 1.55230503 - 3.870 1.54485520 1.54760820 - 3.880 1.54017382 1.54292557 - 3.890 1.53550662 1.53825712 - 3.900 1.53085357 1.53360279 - 3.910 1.52621462 1.52896254 - 3.920 1.52158973 1.52433633 - 3.930 1.51697885 1.51972412 - 3.940 1.51238195 1.51512587 - 3.950 1.50779897 1.51054153 - 3.960 1.50322988 1.50597106 - 3.970 1.49867464 1.50141442 - 3.980 1.49413320 1.49687156 - 3.990 1.48960553 1.49234246 - 4.000 1.48509157 1.48782705 - 4.010 1.48059129 1.48332531 - 4.020 1.47610465 1.47883719 - 4.030 1.47163161 1.47436264 - 4.040 1.46717212 1.46990164 - 4.050 1.46272614 1.46545414 - 4.060 1.45829364 1.46102009 - 4.070 1.45387457 1.45659946 - 4.080 1.44946889 1.45219220 - 4.090 1.44507656 1.44779828 - 4.100 1.44069754 1.44341765 - 4.110 1.43633179 1.43905028 - 4.120 1.43197927 1.43469612 - 4.130 1.42763994 1.43035514 - 4.140 1.42331375 1.42602729 - 4.150 1.41900068 1.42171253 - 4.160 1.41470068 1.41741084 - 4.170 1.41041371 1.41312215 - 4.180 1.40613973 1.40884645 - 4.190 1.40187870 1.40458368 - 4.200 1.39763058 1.40033380 - 4.210 1.39339534 1.39609679 - 4.220 1.38917293 1.39187260 - 4.230 1.38496331 1.38766119 - 4.240 1.38076645 1.38346252 - 4.250 1.37658231 1.37927655 - 4.260 1.37241085 1.37510325 - 4.270 1.36825203 1.37094258 - 4.280 1.36410581 1.36679450 - 4.290 1.35997216 1.36265897 - 4.300 1.35585103 1.35853595 - 4.310 1.35174239 1.35442540 - 4.320 1.34764620 1.35032729 - 4.330 1.34356242 1.34624159 - 4.340 1.33949102 1.34216824 - 4.350 1.33543196 1.33810722 - 4.360 1.33138520 1.33405849 - 4.370 1.32735070 1.33002201 - 4.380 1.32332842 1.32599774 - 4.390 1.31931833 1.32198564 - 4.400 1.31532040 1.31798569 - 4.410 1.31133458 1.31399784 - 4.420 1.30736084 1.31002206 - 4.430 1.30339914 1.30605830 - 4.440 1.29944945 1.30210654 - 4.450 1.29551172 1.29816673 - 4.460 1.29158593 1.29423885 - 4.470 1.28767203 1.29032285 - 4.480 1.28376999 1.28641870 - 4.490 1.27987978 1.28252636 - 4.500 1.27600136 1.27864580 - 4.510 1.27213469 1.27477698 - 4.520 1.26827973 1.27091987 - 4.530 1.26443646 1.26707442 - 4.540 1.26060484 1.26324062 - 4.550 1.25678482 1.25941841 - 4.560 1.25297638 1.25560777 - 4.570 1.24917948 1.25180865 - 4.580 1.24539409 1.24802103 - 4.590 1.24162017 1.24424488 - 4.600 1.23785769 1.24048015 - 4.610 1.23410660 1.23672680 - 4.620 1.23036688 1.23298482 - 4.630 1.22663850 1.22925416 - 4.640 1.22292141 1.22553478 - 4.650 1.21921559 1.22182666 - 4.660 1.21552100 1.21812976 - 4.670 1.21183760 1.21444405 - 4.680 1.20816537 1.21076948 - 4.690 1.20450426 1.20710604 - 4.700 1.20085425 1.20345368 - 4.710 1.19721529 1.19981237 - 4.720 1.19358737 1.19618208 - 4.730 1.18997044 1.19256277 - 4.740 1.18636447 1.18895441 - 4.750 1.18276942 1.18535697 - 4.760 1.17918527 1.18177042 - 4.770 1.17561198 1.17819472 - 4.780 1.17204952 1.17462984 - 4.790 1.16849786 1.17107574 - 4.800 1.16495696 1.16753240 - 4.810 1.16142678 1.16399977 - 4.820 1.15790731 1.16047784 - 4.830 1.15439850 1.15696656 - 4.840 1.15090032 1.15346591 - 4.850 1.14741274 1.14997585 - 4.860 1.14393574 1.14649635 - 4.870 1.14046926 1.14302738 - 4.880 1.13701330 1.13956890 - 4.890 1.13356780 1.13612089 - 4.900 1.13013275 1.13268331 - 4.910 1.12670810 1.12925613 - 4.920 1.12329384 1.12583932 - 4.930 1.11988992 1.12243285 - 4.940 1.11649631 1.11903669 - 4.950 1.11311299 1.11565080 - 4.960 1.10973992 1.11227516 - 4.970 1.10637707 1.10890973 - 4.980 1.10302441 1.10555448 - 4.990 1.09968191 1.10220939 - 5.000 1.09634954 1.09887442 - 5.010 1.09302727 1.09554953 - 5.020 1.08971507 1.09223471 - 5.030 1.08641290 1.08892992 - 5.040 1.08312074 1.08563513 - 5.050 1.07983856 1.08235030 - 5.060 1.07656632 1.07907542 - 5.070 1.07330400 1.07581044 - 5.080 1.07005156 1.07255534 - 5.090 1.06680898 1.06931010 - 5.100 1.06357623 1.06607467 - 5.110 1.06035327 1.06284903 - 5.120 1.05714008 1.05963315 - 5.130 1.05393662 1.05642700 - 5.140 1.05074287 1.05323055 - 5.150 1.04755880 1.05004377 - 5.160 1.04438438 1.04686664 - 5.170 1.04121958 1.04369912 - 5.180 1.03806437 1.04054118 - 5.190 1.03491872 1.03739280 - 5.200 1.03178261 1.03425394 - 5.210 1.02865599 1.03112458 - 5.220 1.02553885 1.02800469 - 5.230 1.02243116 1.02489424 - 5.240 1.01933288 1.02179320 - 5.250 1.01624399 1.01870155 - 5.260 1.01316447 1.01561924 - 5.270 1.01009427 1.01254627 - 5.280 1.00703338 1.00948259 - 5.290 1.00398176 1.00642818 - 5.300 1.00093939 1.00338302 - 5.310 0.99790625 1.00034706 - 5.320 0.99488229 0.99732030 - 5.330 0.99186749 0.99430269 - 5.340 0.98886183 0.99129421 - 5.350 0.98586528 0.98829484 - 5.360 0.98287781 0.98530454 - 5.370 0.97989939 0.98232328 - 5.380 0.97693000 0.97935105 - 5.390 0.97396961 0.97638781 - 5.400 0.97101818 0.97343354 - 5.410 0.96807571 0.97048821 - 5.420 0.96514214 0.96755179 - 5.430 0.96221747 0.96462425 - 5.440 0.95930166 0.96170557 - 5.450 0.95639468 0.95879572 - 5.460 0.95349652 0.95589468 - 5.470 0.95060714 0.95300241 - 5.480 0.94772651 0.95011890 - 5.490 0.94485461 0.94724411 - 5.500 0.94199141 0.94437801 - 5.510 0.93913689 0.94152059 - 5.520 0.93629102 0.93867182 - 5.530 0.93345378 0.93583167 - 5.540 0.93062513 0.93300010 - 5.550 0.92780505 0.93017711 - 5.560 0.92499352 0.92736266 - 5.570 0.92219051 0.92455672 - 5.580 0.91939600 0.92175928 - 5.590 0.91660995 0.91897029 - 5.600 0.91383234 0.91618975 - 5.610 0.91106315 0.91341762 - 5.620 0.90830236 0.91065388 - 5.630 0.90554992 0.90789850 - 5.640 0.90280583 0.90515145 - 5.650 0.90007006 0.90241272 - 5.660 0.89734257 0.89968228 - 5.670 0.89462335 0.89696009 - 5.680 0.89191237 0.89424615 - 5.690 0.88920961 0.89154041 - 5.700 0.88651503 0.88884286 - 5.710 0.88382863 0.88615348 - 5.720 0.88115036 0.88347223 - 5.730 0.87848020 0.88079909 - 5.740 0.87581814 0.87813404 - 5.750 0.87316415 0.87547706 - 5.760 0.87051820 0.87282811 - 5.770 0.86788026 0.87018718 - 5.780 0.86525032 0.86755424 - 5.790 0.86262835 0.86492927 - 5.800 0.86001433 0.86231224 - 5.810 0.85740822 0.85970313 - 5.820 0.85481002 0.85710191 - 5.830 0.85221968 0.85450856 - 5.840 0.84963720 0.85192306 - 5.850 0.84706254 0.84934539 - 5.860 0.84449568 0.84677551 - 5.870 0.84193661 0.84421341 - 5.880 0.83938528 0.84165906 - 5.890 0.83684169 0.83911243 - 5.900 0.83430581 0.83657352 - 5.910 0.83177761 0.83404228 - 5.920 0.82925707 0.83151871 - 5.930 0.82674417 0.82900277 - 5.940 0.82423888 0.82649444 - 5.950 0.82174119 0.82399370 - 5.960 0.81925107 0.82150053 - 5.970 0.81676849 0.81901490 - 5.980 0.81429343 0.81653680 - 5.990 0.81182588 0.81406619 - 6.000 0.80936580 0.81160306 - 6.010 0.80691317 0.80914738 - 6.020 0.80446798 0.80669912 - 6.030 0.80203020 0.80425828 - 6.040 0.79959981 0.80182482 - 6.050 0.79717678 0.79939873 - 6.060 0.79476109 0.79697998 - 6.070 0.79235272 0.79456854 - 6.080 0.78995165 0.79216440 - 6.090 0.78755786 0.78976754 - 6.100 0.78517132 0.78737793 - 6.110 0.78279201 0.78499554 - 6.120 0.78041992 0.78262037 - 6.130 0.77805501 0.78025238 - 6.140 0.77569727 0.77789156 - 6.150 0.77334667 0.77553788 - 6.160 0.77100319 0.77319132 - 6.170 0.76866682 0.77085187 - 6.180 0.76633753 0.76851949 - 6.190 0.76401529 0.76619416 - 6.200 0.76170009 0.76387588 - 6.210 0.75939191 0.76156461 - 6.220 0.75709072 0.75926033 - 6.230 0.75479651 0.75696302 - 6.240 0.75250925 0.75467267 - 6.250 0.75022892 0.75238924 - 6.260 0.74795550 0.75011272 - 6.270 0.74568896 0.74784310 - 6.280 0.74342930 0.74558034 - 6.290 0.74117648 0.74332442 - 6.300 0.73893049 0.74107533 - 6.310 0.73669131 0.73883305 - 6.320 0.73445891 0.73659755 - 6.330 0.73223328 0.73436881 - 6.340 0.73001439 0.73214682 - 6.350 0.72780223 0.72993155 - 6.360 0.72559677 0.72772299 - 6.370 0.72339799 0.72552110 - 6.380 0.72120587 0.72332588 - 6.390 0.71902040 0.72113730 - 6.400 0.71684155 0.71895535 - 6.410 0.71466930 0.71677999 - 6.420 0.71250364 0.71461122 - 6.430 0.71034454 0.71244901 - 6.440 0.70819198 0.71029334 - 6.450 0.70604594 0.70814419 - 6.460 0.70390641 0.70600155 - 6.470 0.70177336 0.70386539 - 6.480 0.69964677 0.70173569 - 6.490 0.69752663 0.69961244 - 6.500 0.69541291 0.69749561 - 6.510 0.69330560 0.69538519 - 6.520 0.69120468 0.69328115 - 6.530 0.68911012 0.69118348 - 6.540 0.68702190 0.68909215 - 6.550 0.68494002 0.68700715 - 6.560 0.68286444 0.68492847 - 6.570 0.68079516 0.68285607 - 6.580 0.67873214 0.68078994 - 6.590 0.67667538 0.67873006 - 6.600 0.67462485 0.67667642 - 6.610 0.67258053 0.67462899 - 6.620 0.67054241 0.67258775 - 6.630 0.66851046 0.67055269 - 6.640 0.66648467 0.66852379 - 6.650 0.66446502 0.66650102 - 6.660 0.66245149 0.66448438 - 6.670 0.66044406 0.66247384 - 6.680 0.65844271 0.66046938 - 6.690 0.65644743 0.65847099 - 6.700 0.65445820 0.65647864 - 6.710 0.65247499 0.65449232 - 6.720 0.65049780 0.65251202 - 6.730 0.64852659 0.65053770 - 6.740 0.64656136 0.64856936 - 6.750 0.64460208 0.64660697 - 6.760 0.64264874 0.64465052 - 6.770 0.64070132 0.64269999 - 6.780 0.63875980 0.64075536 - 6.790 0.63682417 0.63881662 - 6.800 0.63489440 0.63688374 - 6.810 0.63297047 0.63495671 - 6.820 0.63105238 0.63303551 - 6.830 0.62914010 0.63112013 - 6.840 0.62723362 0.62921054 - 6.850 0.62533291 0.62730673 - 6.860 0.62343796 0.62540867 - 6.870 0.62154875 0.62351636 - 6.880 0.61966527 0.62162978 - 6.890 0.61778750 0.61974890 - 6.900 0.61591542 0.61787372 - 6.910 0.61404901 0.61600421 - 6.920 0.61218825 0.61414036 - 6.930 0.61033313 0.61228214 - 6.940 0.60848364 0.61042955 - 6.950 0.60663975 0.60858256 - 6.960 0.60480145 0.60674116 - 6.970 0.60296872 0.60490534 - 6.980 0.60114154 0.60307507 - 6.990 0.59931990 0.60125033 - 7.000 0.59750378 0.59943112 - 7.010 0.59569316 0.59761741 - 7.020 0.59388803 0.59580919 - 7.030 0.59208837 0.59400644 - 7.040 0.59029416 0.59220915 - 7.050 0.58850539 0.59041729 - 7.060 0.58672204 0.58863085 - 7.070 0.58494410 0.58684982 - 7.080 0.58317154 0.58507418 - 7.090 0.58140435 0.58330391 - 7.100 0.57964252 0.58153900 - 7.110 0.57788603 0.57977943 - 7.120 0.57613486 0.57802518 - 7.130 0.57438899 0.57627624 - 7.140 0.57264842 0.57453259 - 7.150 0.57091312 0.57279422 - 7.160 0.56918308 0.57106111 - 7.170 0.56745829 0.56933324 - 7.180 0.56573872 0.56761060 - 7.190 0.56402436 0.56589317 - 7.200 0.56231519 0.56418094 - 7.210 0.56061121 0.56247389 - 7.220 0.55891238 0.56077200 - 7.230 0.55721871 0.55907526 - 7.240 0.55553017 0.55738366 - 7.250 0.55384674 0.55569717 - 7.260 0.55216842 0.55401579 - 7.270 0.55049518 0.55233950 - 7.280 0.54882702 0.55066827 - 7.290 0.54716390 0.54900211 - 7.300 0.54550583 0.54734098 - 7.310 0.54385278 0.54568489 - 7.320 0.54220474 0.54403380 - 7.330 0.54056170 0.54238771 - 7.340 0.53892363 0.54074659 - 7.350 0.53729053 0.53911045 - 7.360 0.53566238 0.53747925 - 7.370 0.53403916 0.53585299 - 7.380 0.53242086 0.53423165 - 7.390 0.53080746 0.53261522 - 7.400 0.52919895 0.53100368 - 7.410 0.52759532 0.52939701 - 7.420 0.52599655 0.52779521 - 7.430 0.52440262 0.52619825 - 7.440 0.52281352 0.52460612 - 7.450 0.52122924 0.52301881 - 7.460 0.51964975 0.52143631 - 7.470 0.51807506 0.51985859 - 7.480 0.51650513 0.51828564 - 7.490 0.51493997 0.51671746 - 7.500 0.51337954 0.51515402 - 7.510 0.51182385 0.51359531 - 7.520 0.51027287 0.51204131 - 7.530 0.50872658 0.51049202 - 7.540 0.50718499 0.50894742 - 7.550 0.50564806 0.50740749 - 7.560 0.50411580 0.50587222 - 7.570 0.50258817 0.50434159 - 7.580 0.50106518 0.50281560 - 7.590 0.49954680 0.50129422 - 7.600 0.49803302 0.49977744 - 7.610 0.49652383 0.49826526 - 7.620 0.49501921 0.49675765 - 7.630 0.49351915 0.49525460 - 7.640 0.49202364 0.49375610 - 7.650 0.49053266 0.49226214 - 7.660 0.48904620 0.49077269 - 7.670 0.48756424 0.48928775 - 7.680 0.48608677 0.48780731 - 7.690 0.48461378 0.48633134 - 7.700 0.48314526 0.48485984 - 7.710 0.48168118 0.48339279 - 7.720 0.48022154 0.48193018 - 7.730 0.47876632 0.48047200 - 7.740 0.47731552 0.47901823 - 7.750 0.47586911 0.47756885 - 7.760 0.47442708 0.47612386 - 7.770 0.47298942 0.47468325 - 7.780 0.47155612 0.47324699 - 7.790 0.47012716 0.47181508 - 7.800 0.46870253 0.47038750 - 7.810 0.46728222 0.46896424 - 7.820 0.46586622 0.46754529 - 7.830 0.46445450 0.46613063 - 7.840 0.46304706 0.46472025 - 7.850 0.46164389 0.46331414 - 7.860 0.46024497 0.46191228 - 7.870 0.45885029 0.46051467 - 7.880 0.45745983 0.45912128 - 7.890 0.45607359 0.45773211 - 7.900 0.45469155 0.45634714 - 7.910 0.45331369 0.45496637 - 7.920 0.45194002 0.45358977 - 7.930 0.45057050 0.45221733 - 7.940 0.44920514 0.45084905 - 7.950 0.44784391 0.44948491 - 7.960 0.44648681 0.44812490 - 7.970 0.44513382 0.44676900 - 7.980 0.44378493 0.44541720 - 7.990 0.44244012 0.44406949 - 8.000 0.44109939 0.44272587 - 8.010 0.43976273 0.44138630 - 8.020 0.43843012 0.44005079 - 8.030 0.43710154 0.43871933 - 8.040 0.43577699 0.43739188 - 8.050 0.43445645 0.43606846 - 8.060 0.43313992 0.43474904 - 8.070 0.43182737 0.43343361 - 8.080 0.43051881 0.43212217 - 8.090 0.42921420 0.43081469 - 8.100 0.42791355 0.42951117 - 8.110 0.42661685 0.42821159 - 8.120 0.42532407 0.42691594 - 8.130 0.42403521 0.42562421 - 8.140 0.42275025 0.42433639 - 8.150 0.42146919 0.42305247 - 8.160 0.42019201 0.42177244 - 8.170 0.41891870 0.42049627 - 8.180 0.41764925 0.41922397 - 8.190 0.41638365 0.41795552 - 8.200 0.41512188 0.41669090 - 8.210 0.41386393 0.41543011 - 8.220 0.41260980 0.41417314 - 8.230 0.41135947 0.41291997 - 8.240 0.41011292 0.41167059 - 8.250 0.40887016 0.41042499 - 8.260 0.40763116 0.40918316 - 8.270 0.40639591 0.40794509 - 8.280 0.40516441 0.40671077 - 8.290 0.40393664 0.40548017 - 8.300 0.40271259 0.40425331 - 8.310 0.40149225 0.40303015 - 8.320 0.40027560 0.40181070 - 8.330 0.39906265 0.40059493 - 8.340 0.39785337 0.39938284 - 8.350 0.39664775 0.39817442 - 8.360 0.39544579 0.39696966 - 8.370 0.39424747 0.39576854 - 8.380 0.39305278 0.39457106 - 8.390 0.39186171 0.39337720 - 8.400 0.39067425 0.39218695 - 8.410 0.38949039 0.39100031 - 8.420 0.38831011 0.38981725 - 8.430 0.38713342 0.38863777 - 8.440 0.38596028 0.38746187 - 8.450 0.38479071 0.38628952 - 8.460 0.38362467 0.38512071 - 8.470 0.38246218 0.38395545 - 8.480 0.38130320 0.38279371 - 8.490 0.38014774 0.38163548 - 8.500 0.37899577 0.38048076 - 8.510 0.37784730 0.37932953 - 8.520 0.37670231 0.37818179 - 8.530 0.37556079 0.37703752 - 8.540 0.37442272 0.37589671 - 8.550 0.37328811 0.37475936 - 8.560 0.37215693 0.37362544 - 8.570 0.37102918 0.37249496 - 8.580 0.36990485 0.37136789 - 8.590 0.36878393 0.37024424 - 8.600 0.36766640 0.36912398 - 8.610 0.36655226 0.36800712 - 8.620 0.36544150 0.36689363 - 8.630 0.36433410 0.36578352 - 8.640 0.36323006 0.36467676 - 8.650 0.36212936 0.36357335 - 8.660 0.36103200 0.36247328 - 8.670 0.35993796 0.36137654 - 8.680 0.35884724 0.36028312 - 8.690 0.35775982 0.35919300 - 8.700 0.35667570 0.35810619 - 8.710 0.35559487 0.35702266 - 8.720 0.35451731 0.35594241 - 8.730 0.35344301 0.35486543 - 8.740 0.35237197 0.35379171 - 8.750 0.35130418 0.35272123 - 8.760 0.35023962 0.35165400 - 8.770 0.34917829 0.35058999 - 8.780 0.34812017 0.34952921 - 8.790 0.34706526 0.34847163 - 8.800 0.34601355 0.34741726 - 8.810 0.34496503 0.34636607 - 8.820 0.34391968 0.34531806 - 8.830 0.34287750 0.34427323 - 8.840 0.34183847 0.34323156 - 8.850 0.34080260 0.34219304 - 8.860 0.33976986 0.34115766 - 8.870 0.33874026 0.34012541 - 8.880 0.33771377 0.33909629 - 8.890 0.33669040 0.33807028 - 8.900 0.33567012 0.33704737 - 8.910 0.33465294 0.33602756 - 8.920 0.33363884 0.33501084 - 8.930 0.33262781 0.33399719 - 8.940 0.33161985 0.33298661 - 8.950 0.33061494 0.33197909 - 8.960 0.32961308 0.33097461 - 8.970 0.32861425 0.32997318 - 8.980 0.32761845 0.32897477 - 8.990 0.32662567 0.32797939 - 9.000 0.32563589 0.32698702 - 9.010 0.32464912 0.32599765 - 9.020 0.32366533 0.32501127 - 9.030 0.32268453 0.32402788 - 9.040 0.32170670 0.32304746 - 9.050 0.32073183 0.32207001 - 9.060 0.31975991 0.32109552 - 9.070 0.31879094 0.32012398 - 9.080 0.31782491 0.31915537 - 9.090 0.31686181 0.31818970 - 9.100 0.31590162 0.31722695 - 9.110 0.31494434 0.31626711 - 9.120 0.31398996 0.31531017 - 9.130 0.31303848 0.31435613 - 9.140 0.31208988 0.31340498 - 9.150 0.31114415 0.31245671 - 9.160 0.31020129 0.31151130 - 9.170 0.30926129 0.31056876 - 9.180 0.30832413 0.30962906 - 9.190 0.30738981 0.30869221 - 9.200 0.30645833 0.30775820 - 9.210 0.30552967 0.30682701 - 9.220 0.30460382 0.30589864 - 9.230 0.30368078 0.30497308 - 9.240 0.30276053 0.30405031 - 9.250 0.30184308 0.30313034 - 9.260 0.30092840 0.30221316 - 9.270 0.30001650 0.30129875 - 9.280 0.29910736 0.30038710 - 9.290 0.29820097 0.29947821 - 9.300 0.29729733 0.29857208 - 9.310 0.29639643 0.29766868 - 9.320 0.29549826 0.29676802 - 9.330 0.29460281 0.29587009 - 9.340 0.29371007 0.29497487 - 9.350 0.29282004 0.29408236 - 9.360 0.29193271 0.29319255 - 9.370 0.29104807 0.29230543 - 9.380 0.29016610 0.29142100 - 9.390 0.28928681 0.29053924 - 9.400 0.28841018 0.28966015 - 9.410 0.28753621 0.28878372 - 9.420 0.28666489 0.28790994 - 9.430 0.28579621 0.28703881 - 9.440 0.28493016 0.28617031 - 9.450 0.28406674 0.28530444 - 9.460 0.28320593 0.28444119 - 9.470 0.28234773 0.28358055 - 9.480 0.28149213 0.28272252 - 9.490 0.28063912 0.28186708 - 9.500 0.27978870 0.28101423 - 9.510 0.27894086 0.28016396 - 9.520 0.27809558 0.27931627 - 9.530 0.27725287 0.27847113 - 9.540 0.27641271 0.27762856 - 9.550 0.27557509 0.27678853 - 9.560 0.27474002 0.27595105 - 9.570 0.27390747 0.27511610 - 9.580 0.27307745 0.27428368 - 9.590 0.27224994 0.27345377 - 9.600 0.27142494 0.27262638 - 9.610 0.27060244 0.27180149 - 9.620 0.26978243 0.27097909 - 9.630 0.26896491 0.27015919 - 9.640 0.26814987 0.26934176 - 9.650 0.26733729 0.26852681 - 9.660 0.26652718 0.26771433 - 9.670 0.26571952 0.26690430 - 9.680 0.26491431 0.26609672 - 9.690 0.26411154 0.26529159 - 9.700 0.26331120 0.26448889 - 9.710 0.26251329 0.26368862 - 9.720 0.26171779 0.26289078 - 9.730 0.26092471 0.26209534 - 9.740 0.26013403 0.26130232 - 9.750 0.25934574 0.26051169 - 9.760 0.25855985 0.25972346 - 9.770 0.25777633 0.25893761 - 9.780 0.25699519 0.25815413 - 9.790 0.25621642 0.25737303 - 9.800 0.25544001 0.25659430 - 9.810 0.25466594 0.25581791 - 9.820 0.25389423 0.25504388 - 9.830 0.25312485 0.25427219 - 9.840 0.25235781 0.25350284 - 9.850 0.25159309 0.25273581 - 9.860 0.25083068 0.25197110 - 9.870 0.25007059 0.25120871 - 9.880 0.24931280 0.25044862 - 9.890 0.24855731 0.24969084 - 9.900 0.24780410 0.24893534 - 9.910 0.24705318 0.24818213 - 9.920 0.24630454 0.24743121 - 9.930 0.24555816 0.24668255 - 9.940 0.24481404 0.24593616 - 9.950 0.24407218 0.24519202 - 9.960 0.24333257 0.24445014 - 9.970 0.24259520 0.24371051 - 9.980 0.24186006 0.24297311 - 9.990 0.24112715 0.24223794 - 10.000 0.24039646 0.24150500 - 10.010 0.23966799 0.24077427 - 10.020 0.23894172 0.24004576 - 10.030 0.23821766 0.23931945 - 10.040 0.23749579 0.23859533 - 10.050 0.23677610 0.23787341 - 10.060 0.23605860 0.23715367 - 10.070 0.23534327 0.23643611 - 10.080 0.23463011 0.23572073 - 10.090 0.23391911 0.23500750 - 10.100 0.23321026 0.23429644 - 10.110 0.23250356 0.23358752 - 10.120 0.23179901 0.23288075 - 10.130 0.23109659 0.23217612 - 10.140 0.23039629 0.23147362 - 10.150 0.22969812 0.23077325 - 10.160 0.22900207 0.23007499 - 10.170 0.22830812 0.22937885 - 10.180 0.22761628 0.22868482 - 10.190 0.22692653 0.22799288 - 10.200 0.22623888 0.22730304 - 10.210 0.22555331 0.22661528 - 10.220 0.22486981 0.22592961 - 10.230 0.22418839 0.22524601 - 10.240 0.22350903 0.22456448 - 10.250 0.22283173 0.22388501 - 10.260 0.22215648 0.22320760 - 10.270 0.22148328 0.22253224 - 10.280 0.22081212 0.22185892 - 10.290 0.22014299 0.22118764 - 10.300 0.21947589 0.22051839 - 10.310 0.21881081 0.21985116 - 10.320 0.21814775 0.21918595 - 10.330 0.21748669 0.21852276 - 10.340 0.21682764 0.21786157 - 10.350 0.21617059 0.21720238 - 10.360 0.21551553 0.21654519 - 10.370 0.21486245 0.21588998 - 10.380 0.21421135 0.21523676 - 10.390 0.21356223 0.21458552 - 10.400 0.21291507 0.21393624 - 10.410 0.21226987 0.21328893 - 10.420 0.21162663 0.21264358 - 10.430 0.21098534 0.21200018 - 10.440 0.21034599 0.21135873 - 10.450 0.20970858 0.21071922 - 10.460 0.20907309 0.21008164 - 10.470 0.20843954 0.20944599 - 10.480 0.20780790 0.20881227 - 10.490 0.20717818 0.20818046 - 10.500 0.20655037 0.20755057 - 10.510 0.20592446 0.20692258 - 10.520 0.20530045 0.20629649 - 10.530 0.20467833 0.20567229 - 10.540 0.20405809 0.20504999 - 10.550 0.20343973 0.20442957 - 10.560 0.20282325 0.20381102 - 10.570 0.20220863 0.20319435 - 10.580 0.20159588 0.20257954 - 10.590 0.20098498 0.20196659 - 10.600 0.20037593 0.20135550 - 10.610 0.19976873 0.20074625 - 10.620 0.19916337 0.20013885 - 10.630 0.19855985 0.19953329 - 10.640 0.19795815 0.19892956 - 10.650 0.19735828 0.19832765 - 10.660 0.19676022 0.19772757 - 10.670 0.19616398 0.19712930 - 10.680 0.19556954 0.19653284 - 10.690 0.19497691 0.19593819 - 10.700 0.19438607 0.19534534 - 10.710 0.19379702 0.19475428 - 10.720 0.19320976 0.19416501 - 10.730 0.19262427 0.19357752 - 10.740 0.19204056 0.19299181 - 10.750 0.19145862 0.19240787 - 10.760 0.19087845 0.19182570 - 10.770 0.19030003 0.19124529 - 10.780 0.18972336 0.19066663 - 10.790 0.18914844 0.19008973 - 10.800 0.18857526 0.18951457 - 10.810 0.18800382 0.18894115 - 10.820 0.18743411 0.18836947 - 10.830 0.18686613 0.18779952 - 10.840 0.18629987 0.18723129 - 10.850 0.18573533 0.18666478 - 10.860 0.18517249 0.18609999 - 10.870 0.18461136 0.18553690 - 10.880 0.18405193 0.18497552 - 10.890 0.18349420 0.18441584 - 10.900 0.18293816 0.18385785 - 10.910 0.18238380 0.18330155 - 10.920 0.18183112 0.18274693 - 10.930 0.18128012 0.18219399 - 10.940 0.18073079 0.18164272 - 10.950 0.18018312 0.18109312 - 10.960 0.17963711 0.18054518 - 10.970 0.17909275 0.17999890 - 10.980 0.17855005 0.17945428 - 10.990 0.17800899 0.17891130 - 11.000 0.17746956 0.17836997 - 11.010 0.17693178 0.17783027 - 11.020 0.17639562 0.17729221 - 11.030 0.17586109 0.17675577 - 11.040 0.17532818 0.17622096 - 11.050 0.17479688 0.17568776 - 11.060 0.17426719 0.17515618 - 11.070 0.17373911 0.17462621 - 11.080 0.17321263 0.17409784 - 11.090 0.17268774 0.17357107 - 11.100 0.17216444 0.17304589 - 11.110 0.17164273 0.17252230 - 11.120 0.17112260 0.17200030 - 11.130 0.17060405 0.17147988 - 11.140 0.17008707 0.17096103 - 11.150 0.16957165 0.17044375 - 11.160 0.16905780 0.16992803 - 11.170 0.16854550 0.16941388 - 11.180 0.16803476 0.16890128 - 11.190 0.16752556 0.16839023 - 11.200 0.16701791 0.16788073 - 11.210 0.16651180 0.16737277 - 11.220 0.16600721 0.16686635 - 11.230 0.16550416 0.16636146 - 11.240 0.16500263 0.16585810 - 11.250 0.16450263 0.16535626 - 11.260 0.16400413 0.16485594 - 11.270 0.16350715 0.16435713 - 11.280 0.16301167 0.16385983 - 11.290 0.16251770 0.16336404 - 11.300 0.16202522 0.16286974 - 11.310 0.16153424 0.16237695 - 11.320 0.16104474 0.16188564 - 11.330 0.16055672 0.16139582 - 11.340 0.16007019 0.16090748 - 11.350 0.15958513 0.16042062 - 11.360 0.15910154 0.15993523 - 11.370 0.15861941 0.15945132 - 11.380 0.15813875 0.15896886 - 11.390 0.15765954 0.15848787 - 11.400 0.15718178 0.15800833 - 11.410 0.15670547 0.15753024 - 11.420 0.15623061 0.15705360 - 11.430 0.15575718 0.15657840 - 11.440 0.15528519 0.15610464 - 11.450 0.15481463 0.15563231 - 11.460 0.15434549 0.15516141 - 11.470 0.15387778 0.15469193 - 11.480 0.15341148 0.15422388 - 11.490 0.15294660 0.15375724 - 11.500 0.15248313 0.15329202 - 11.510 0.15202106 0.15282820 - 11.520 0.15156039 0.15236578 - 11.530 0.15110111 0.15190477 - 11.540 0.15064323 0.15144515 - 11.550 0.15018674 0.15098692 - 11.560 0.14973162 0.15053007 - 11.570 0.14927789 0.15007461 - 11.580 0.14882553 0.14962053 - 11.590 0.14837455 0.14916782 - 11.600 0.14792493 0.14871648 - 11.610 0.14747667 0.14826651 - 11.620 0.14702977 0.14781789 - 11.630 0.14658423 0.14737064 - 11.640 0.14614003 0.14692474 - 11.650 0.14569718 0.14648018 - 11.660 0.14525568 0.14603698 - 11.670 0.14481551 0.14559511 - 11.680 0.14437667 0.14515458 - 11.690 0.14393917 0.14471538 - 11.700 0.14350299 0.14427752 - 11.710 0.14306813 0.14384097 - 11.720 0.14263459 0.14340575 - 11.730 0.14220237 0.14297185 - 11.740 0.14177145 0.14253925 - 11.750 0.14134184 0.14210797 - 11.760 0.14091353 0.14167799 - 11.770 0.14048652 0.14124932 - 11.780 0.14006080 0.14082194 - 11.790 0.13963638 0.14039585 - 11.800 0.13921324 0.13997105 - 11.810 0.13879138 0.13954754 - 11.820 0.13837080 0.13912531 - 11.830 0.13795149 0.13870435 - 11.840 0.13753346 0.13828467 - 11.850 0.13711669 0.13786626 - 11.860 0.13670118 0.13744912 - 11.870 0.13628694 0.13703324 - 11.880 0.13587395 0.13661861 - 11.890 0.13546221 0.13620524 - 11.900 0.13505172 0.13579312 - 11.910 0.13464247 0.13538225 - 11.920 0.13423446 0.13497262 - 11.930 0.13382769 0.13456424 - 11.940 0.13342215 0.13415708 - 11.950 0.13301784 0.13375116 - 11.960 0.13261476 0.13334647 - 11.970 0.13221290 0.13294300 - 11.980 0.13181225 0.13254075 - 11.990 0.13141282 0.13213972 - 12.000 0.13101460 0.13173990 - 12.010 0.13061758 0.13134130 - 12.020 0.13022177 0.13094389 - 12.030 0.12982716 0.13054770 - 12.040 0.12943375 0.13015270 - 12.050 0.12904152 0.12975889 - 12.060 0.12865049 0.12936628 - 12.070 0.12826064 0.12897485 - 12.080 0.12787197 0.12858461 - 12.090 0.12748448 0.12819555 - 12.100 0.12709816 0.12780767 - 12.110 0.12671302 0.12742096 - 12.120 0.12632904 0.12703542 - 12.130 0.12594622 0.12665104 - 12.140 0.12556457 0.12626783 - 12.150 0.12518407 0.12588578 - 12.160 0.12480472 0.12550489 - 12.170 0.12442653 0.12512515 - 12.180 0.12404948 0.12474655 - 12.190 0.12367357 0.12436911 - 12.200 0.12329880 0.12399280 - 12.210 0.12292517 0.12361763 - 12.220 0.12255267 0.12324360 - 12.230 0.12218130 0.12287070 - 12.240 0.12181105 0.12249893 - 12.250 0.12144192 0.12212828 - 12.260 0.12107392 0.12175876 - 12.270 0.12070703 0.12139035 - 12.280 0.12034125 0.12102306 - 12.290 0.11997658 0.12065687 - 12.300 0.11961301 0.12029180 - 12.310 0.11925055 0.11992783 - 12.320 0.11888918 0.11956496 - 12.330 0.11852891 0.11920319 - 12.340 0.11816974 0.11884252 - 12.350 0.11781165 0.11848294 - 12.360 0.11745464 0.11812444 - 12.370 0.11709872 0.11776703 - 12.380 0.11674387 0.11741070 - 12.390 0.11639010 0.11705545 - 12.400 0.11603741 0.11670127 - 12.410 0.11568578 0.11634817 - 12.420 0.11533522 0.11599613 - 12.430 0.11498571 0.11564516 - 12.440 0.11463727 0.11529525 - 12.450 0.11428989 0.11494640 - 12.460 0.11394355 0.11459860 - 12.470 0.11359827 0.11425186 - 12.480 0.11325403 0.11390617 - 12.490 0.11291084 0.11356152 - 12.500 0.11256869 0.11321791 - 12.510 0.11222757 0.11287535 - 12.520 0.11188748 0.11253382 - 12.530 0.11154843 0.11219332 - 12.540 0.11121041 0.11185386 - 12.550 0.11087340 0.11151542 - 12.560 0.11053742 0.11117801 - 12.570 0.11020246 0.11084161 - 12.580 0.10986852 0.11050624 - 12.590 0.10953558 0.11017188 - 12.600 0.10920366 0.10983853 - 12.610 0.10887274 0.10950619 - 12.620 0.10854282 0.10917485 - 12.630 0.10821390 0.10884452 - 12.640 0.10788598 0.10851519 - 12.650 0.10755905 0.10818685 - 12.660 0.10723312 0.10785951 - 12.670 0.10690817 0.10753316 - 12.680 0.10658420 0.10720779 - 12.690 0.10626122 0.10688341 - 12.700 0.10593922 0.10656001 - 12.710 0.10561819 0.10623759 - 12.720 0.10529813 0.10591615 - 12.730 0.10497905 0.10559568 - 12.740 0.10466093 0.10527617 - 12.750 0.10434378 0.10495764 - 12.760 0.10402758 0.10464007 - 12.770 0.10371235 0.10432346 - 12.780 0.10339807 0.10400780 - 12.790 0.10308474 0.10369310 - 12.800 0.10277236 0.10337936 - 12.810 0.10246093 0.10306656 - 12.820 0.10215044 0.10275471 - 12.830 0.10184090 0.10244380 - 12.840 0.10153229 0.10213384 - 12.850 0.10122461 0.10182481 - 12.860 0.10091787 0.10151672 - 12.870 0.10061206 0.10120956 - 12.880 0.10030718 0.10090333 - 12.890 0.10000321 0.10059802 - 12.900 0.09970017 0.10029364 - 12.910 0.09939805 0.09999018 - 12.920 0.09909685 0.09968764 - 12.930 0.09879655 0.09938601 - 12.940 0.09849717 0.09908530 - 12.950 0.09819869 0.09878549 - 12.960 0.09790112 0.09848660 - 12.970 0.09760445 0.09818860 - 12.980 0.09730868 0.09789151 - 12.990 0.09701381 0.09759532 - 13.000 0.09671982 0.09730003 - 13.010 0.09642673 0.09700562 - 13.020 0.09613453 0.09671211 - 13.030 0.09584321 0.09641949 - 13.040 0.09555278 0.09612775 - 13.050 0.09526323 0.09583690 - 13.060 0.09497455 0.09554692 - 13.070 0.09468675 0.09525782 - 13.080 0.09439982 0.09496960 - 13.090 0.09411376 0.09468225 - 13.100 0.09382857 0.09439577 - 13.110 0.09354424 0.09411015 - 13.120 0.09326077 0.09382540 - 13.130 0.09297816 0.09354151 - 13.140 0.09269641 0.09325848 - 13.150 0.09241551 0.09297631 - 13.160 0.09213546 0.09269499 - 13.170 0.09185627 0.09241452 - 13.180 0.09157791 0.09213490 - 13.190 0.09130040 0.09185613 - 13.200 0.09102374 0.09157819 - 13.210 0.09074791 0.09130110 - 13.220 0.09047291 0.09102485 - 13.230 0.09019875 0.09074944 diff --git a/20201217/loesung-1c.tikz b/20201217/loesung-1c.tikz deleted file mode 100644 index e97073c442cd1f84adf842357e3cb254fb05e54c..0000000000000000000000000000000000000000 --- a/20201217/loesung-1c.tikz +++ /dev/null @@ -1,521 +0,0 @@ -\begin{tikzpicture}[gnuplot] -%% generated with GNUPLOT 5.0p5 (Lua 5.1; terminal rev. 99, script rev. 100) -%% Mi 14 Nov 2018 19:24:42 CET -\path (0.000,0.000) rectangle (12.500,8.750); -\gpcolor{color=gp lt color border} -\gpsetlinetype{gp lt border} -\gpsetdashtype{gp dt solid} -\gpsetlinewidth{1.00} -\draw[gp path] (1.012,0.616)--(1.192,0.616); -\draw[gp path] (11.947,0.616)--(11.767,0.616); -\node[gp node right] at (0.828,0.616) {$0$}; -\draw[gp path] (1.012,1.393)--(1.192,1.393); -\draw[gp path] (11.947,1.393)--(11.767,1.393); -\node[gp node right] at (0.828,1.393) {$0.5$}; -\draw[gp path] (1.012,2.169)--(1.192,2.169); -\draw[gp path] (11.947,2.169)--(11.767,2.169); -\node[gp node right] at (0.828,2.169) {$1$}; -\draw[gp path] (1.012,2.946)--(1.192,2.946); -\draw[gp path] (11.947,2.946)--(11.767,2.946); -\node[gp node right] at (0.828,2.946) {$1.5$}; -\draw[gp path] (1.012,3.722)--(1.192,3.722); -\draw[gp path] (11.947,3.722)--(11.767,3.722); -\node[gp node right] at (0.828,3.722) {$2$}; -\draw[gp path] (1.012,4.499)--(1.192,4.499); -\draw[gp path] (11.947,4.499)--(11.767,4.499); -\node[gp node right] at (0.828,4.499) {$2.5$}; -\draw[gp path] (1.012,5.275)--(1.192,5.275); -\draw[gp path] (11.947,5.275)--(11.767,5.275); -\node[gp node right] at (0.828,5.275) {$3$}; -\draw[gp path] (1.012,6.052)--(1.192,6.052); -\draw[gp path] (11.947,6.052)--(11.767,6.052); -\node[gp node right] at (0.828,6.052) {$3.5$}; -\draw[gp path] (1.012,6.828)--(1.192,6.828); -\draw[gp path] (11.947,6.828)--(11.767,6.828); -\node[gp node right] at (0.828,6.828) {$4$}; -\draw[gp path] (1.012,7.605)--(1.192,7.605); -\draw[gp path] (11.947,7.605)--(11.767,7.605); -\node[gp node right] at (0.828,7.605) {$4.5$}; -\draw[gp path] (1.012,8.381)--(1.192,8.381); -\draw[gp path] (11.947,8.381)--(11.767,8.381); -\node[gp node right] at (0.828,8.381) {$5$}; -\draw[gp path] (1.012,0.616)--(1.012,0.796); -\draw[gp path] (1.012,8.381)--(1.012,8.201); -\node[gp node center] at (1.012,0.308) {$0$}; -\draw[gp path] (2.574,0.616)--(2.574,0.796); -\draw[gp path] (2.574,8.381)--(2.574,8.201); -\node[gp node center] at (2.574,0.308) {$2$}; -\draw[gp path] (4.136,0.616)--(4.136,0.796); -\draw[gp path] (4.136,8.381)--(4.136,8.201); -\node[gp node center] at (4.136,0.308) {$4$}; -\draw[gp path] (5.698,0.616)--(5.698,0.796); -\draw[gp path] (5.698,8.381)--(5.698,8.201); -\node[gp node center] at (5.698,0.308) {$6$}; -\draw[gp path] (7.261,0.616)--(7.261,0.796); -\draw[gp path] (7.261,8.381)--(7.261,8.201); -\node[gp node center] at (7.261,0.308) {$8$}; -\draw[gp path] (8.823,0.616)--(8.823,0.796); -\draw[gp path] (8.823,8.381)--(8.823,8.201); -\node[gp node center] at (8.823,0.308) {$10$}; -\draw[gp path] (10.385,0.616)--(10.385,0.796); -\draw[gp path] (10.385,8.381)--(10.385,8.201); -\node[gp node center] at (10.385,0.308) {$12$}; -\draw[gp path] (11.947,0.616)--(11.947,0.796); -\draw[gp path] (11.947,8.381)--(11.947,8.201); -\node[gp node center] at (11.947,0.308) {$14$}; -\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle; -\node[gp node right] at (10.479,7.8) {Simulation}; -\gpcolor{rgb color={0.580,0.000,0.827}} -\draw[gp path] (10.663,7.8)--(11.579,7.8); -\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)% - --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)% - --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.035)--(1.137,8.013)% - --(1.145,7.991)--(1.153,7.968)--(1.160,7.946)--(1.168,7.924)--(1.176,7.901)--(1.184,7.879)% - --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)% - --(1.239,7.727)--(1.246,7.705)--(1.254,7.684)--(1.262,7.662)--(1.270,7.642)--(1.278,7.620)% - --(1.285,7.598)--(1.293,7.578)--(1.301,7.556)--(1.309,7.535)--(1.317,7.514)--(1.324,7.493)% - --(1.332,7.472)--(1.340,7.452)--(1.348,7.431)--(1.356,7.410)--(1.363,7.390)--(1.371,7.370)% - --(1.379,7.348)--(1.387,7.328)--(1.395,7.308)--(1.403,7.288)--(1.410,7.267)--(1.418,7.247)% - --(1.426,7.227)--(1.434,7.207)--(1.442,7.187)--(1.449,7.168)--(1.457,7.148)--(1.465,7.128)% - --(1.473,7.108)--(1.481,7.089)--(1.488,7.069)--(1.496,7.049)--(1.504,7.030)--(1.512,7.010)% - --(1.520,6.991)--(1.528,6.971)--(1.535,6.952)--(1.543,6.934)--(1.551,6.913)--(1.559,6.895)% - --(1.567,6.876)--(1.574,6.858)--(1.582,6.837)--(1.590,6.819)--(1.598,6.800)--(1.606,6.781)% - --(1.613,6.763)--(1.621,6.744)--(1.629,6.726)--(1.637,6.707)--(1.645,6.688)--(1.652,6.670)% - --(1.660,6.653)--(1.668,6.634)--(1.676,6.615)--(1.684,6.597)--(1.692,6.580)--(1.699,6.561)% - --(1.707,6.542)--(1.715,6.525)--(1.723,6.507)--(1.731,6.489)--(1.738,6.471)--(1.746,6.454)% - --(1.754,6.437)--(1.762,6.418)--(1.770,6.401)--(1.777,6.384)--(1.785,6.365)--(1.793,6.348)% - --(1.801,6.331)--(1.809,6.314)--(1.817,6.297)--(1.824,6.280)--(1.832,6.263)--(1.840,6.246)% - --(1.848,6.229)--(1.856,6.211)--(1.863,6.194)--(1.871,6.177)--(1.879,6.160)--(1.887,6.143)% - --(1.895,6.126)--(1.902,6.111)--(1.910,6.093)--(1.918,6.076)--(1.926,6.061)--(1.934,6.044)% - --(1.941,6.027)--(1.949,6.011)--(1.957,5.994)--(1.965,5.979)--(1.973,5.961)--(1.981,5.946)% - --(1.988,5.929)--(1.996,5.913)--(2.004,5.898)--(2.012,5.881)--(2.020,5.865)--(2.027,5.850)% - --(2.035,5.834)--(2.043,5.819)--(2.051,5.801)--(2.059,5.786)--(2.066,5.770)--(2.074,5.755)% - --(2.082,5.739)--(2.090,5.724)--(2.098,5.708)--(2.106,5.693)--(2.113,5.677)--(2.121,5.662)% - --(2.129,5.648)--(2.137,5.632)--(2.145,5.617)--(2.152,5.601)--(2.160,5.587)--(2.168,5.572)% - --(2.176,5.556)--(2.184,5.541)--(2.191,5.527)--(2.199,5.511)--(2.207,5.497)--(2.215,5.482)% - --(2.223,5.468)--(2.230,5.452)--(2.238,5.438)--(2.246,5.423)--(2.254,5.409)--(2.262,5.395)% - --(2.270,5.379)--(2.277,5.365)--(2.285,5.351)--(2.293,5.337)--(2.301,5.322)--(2.309,5.308)% - --(2.316,5.294)--(2.324,5.280)--(2.332,5.266)--(2.340,5.252)--(2.348,5.238)--(2.355,5.224)% - --(2.363,5.210)--(2.371,5.196)--(2.379,5.182)--(2.387,5.168)--(2.394,5.154)--(2.402,5.140)% - --(2.410,5.126)--(2.418,5.112)--(2.426,5.100)--(2.434,5.086)--(2.441,5.072)--(2.449,5.059)% - --(2.457,5.045)--(2.465,5.031)--(2.473,5.019)--(2.480,5.005)--(2.488,4.991)--(2.496,4.978)% - --(2.504,4.964)--(2.512,4.952)--(2.519,4.938)--(2.527,4.926)--(2.535,4.913)--(2.543,4.899)% - --(2.551,4.887)--(2.559,4.874)--(2.566,4.860)--(2.574,4.848)--(2.582,4.836)--(2.590,4.822)% - --(2.598,4.809)--(2.605,4.797)--(2.613,4.784)--(2.621,4.772)--(2.629,4.759)--(2.637,4.747)% - --(2.644,4.735)--(2.652,4.722)--(2.660,4.710)--(2.668,4.697)--(2.676,4.685)--(2.683,4.672)% - --(2.691,4.660)--(2.699,4.648)--(2.707,4.635)--(2.715,4.623)--(2.723,4.610)--(2.730,4.598)% - --(2.738,4.587)--(2.746,4.575)--(2.754,4.562)--(2.762,4.551)--(2.769,4.539)--(2.777,4.526)% - --(2.785,4.516)--(2.793,4.503)--(2.801,4.491)--(2.808,4.480)--(2.816,4.467)--(2.824,4.457)% - --(2.832,4.444)--(2.840,4.433)--(2.848,4.421)--(2.855,4.410)--(2.863,4.399)--(2.871,4.387)% - --(2.879,4.376)--(2.887,4.363)--(2.894,4.353)--(2.902,4.342)--(2.910,4.331)--(2.918,4.318)% - --(2.926,4.307)--(2.933,4.297)--(2.941,4.286)--(2.949,4.275)--(2.957,4.262)--(2.965,4.252)% - --(2.972,4.241)--(2.980,4.230)--(2.988,4.219)--(2.996,4.208)--(3.004,4.197)--(3.012,4.186)% - --(3.019,4.175)--(3.027,4.165)--(3.035,4.154)--(3.043,4.143)--(3.051,4.132)--(3.058,4.123)% - --(3.066,4.112)--(3.074,4.101)--(3.082,4.090)--(3.090,4.079)--(3.097,4.070)--(3.105,4.059)% - --(3.113,4.048)--(3.121,4.037)--(3.129,4.028)--(3.137,4.017)--(3.144,4.006)--(3.152,3.997)% - --(3.160,3.986)--(3.168,3.977)--(3.176,3.966)--(3.183,3.957)--(3.191,3.946)--(3.199,3.936)% - --(3.207,3.925)--(3.215,3.916)--(3.222,3.905)--(3.230,3.896)--(3.238,3.885)--(3.246,3.876)% - --(3.254,3.866)--(3.261,3.856)--(3.269,3.846)--(3.277,3.837)--(3.285,3.826)--(3.293,3.817)% - --(3.301,3.807)--(3.308,3.798)--(3.316,3.787)--(3.324,3.778)--(3.332,3.769)--(3.340,3.759)% - --(3.347,3.750)--(3.355,3.741)--(3.363,3.731)--(3.371,3.720)--(3.379,3.711)--(3.386,3.702)% - --(3.394,3.692)--(3.402,3.683)--(3.410,3.674)--(3.418,3.665)--(3.426,3.655)--(3.433,3.647)% - --(3.441,3.638)--(3.449,3.629)--(3.457,3.620)--(3.465,3.610)--(3.472,3.601)--(3.480,3.592)% - --(3.488,3.584)--(3.496,3.574)--(3.504,3.565)--(3.511,3.556)--(3.519,3.547)--(3.527,3.539)% - --(3.535,3.529)--(3.543,3.520)--(3.550,3.512)--(3.558,3.503)--(3.566,3.494)--(3.574,3.486)% - --(3.582,3.477)--(3.590,3.469)--(3.597,3.460)--(3.605,3.450)--(3.613,3.442)--(3.621,3.433)% - --(3.629,3.425)--(3.636,3.416)--(3.644,3.408)--(3.652,3.401)--(3.660,3.391)--(3.668,3.383)% - --(3.675,3.374)--(3.683,3.366)--(3.691,3.359)--(3.699,3.349)--(3.707,3.342)--(3.715,3.334)% - --(3.722,3.324)--(3.730,3.317)--(3.738,3.309)--(3.746,3.300)--(3.754,3.292)--(3.761,3.284)% - --(3.769,3.276)--(3.777,3.269)--(3.785,3.259)--(3.793,3.251)--(3.800,3.244)--(3.808,3.236)% - --(3.816,3.228)--(3.824,3.220)--(3.832,3.213)--(3.839,3.205)--(3.847,3.197)--(3.855,3.189)% - --(3.863,3.182)--(3.871,3.174)--(3.879,3.166)--(3.886,3.158)--(3.894,3.150)--(3.902,3.143)% - --(3.910,3.135)--(3.918,3.127)--(3.925,3.119)--(3.933,3.112)--(3.941,3.104)--(3.949,3.096)% - --(3.957,3.088)--(3.964,3.082)--(3.972,3.074)--(3.980,3.067)--(3.988,3.059)--(3.996,3.051)% - --(4.004,3.045)--(4.011,3.037)--(4.019,3.029)--(4.027,3.023)--(4.035,3.015)--(4.043,3.008)% - --(4.050,3.001)--(4.058,2.994)--(4.066,2.986)--(4.074,2.980)--(4.082,2.972)--(4.089,2.964)% - --(4.097,2.958)--(4.105,2.950)--(4.113,2.944)--(4.121,2.936)--(4.128,2.930)--(4.136,2.922)% - --(4.144,2.916)--(4.152,2.908)--(4.160,2.902)--(4.168,2.894)--(4.175,2.888)--(4.183,2.880)% - --(4.191,2.874)--(4.199,2.866)--(4.207,2.860)--(4.214,2.854)--(4.222,2.846)--(4.230,2.840)% - --(4.238,2.834)--(4.246,2.826)--(4.253,2.820)--(4.261,2.813)--(4.269,2.806)--(4.277,2.800)% - --(4.285,2.793)--(4.293,2.787)--(4.300,2.779)--(4.308,2.773)--(4.316,2.767)--(4.324,2.761)% - --(4.332,2.754)--(4.339,2.747)--(4.347,2.741)--(4.355,2.734)--(4.363,2.728)--(4.371,2.722)% - --(4.378,2.716)--(4.386,2.709)--(4.394,2.703)--(4.402,2.695)--(4.410,2.689)--(4.417,2.683)% - --(4.425,2.677)--(4.433,2.671)--(4.441,2.664)--(4.449,2.658)--(4.457,2.652)--(4.464,2.646)% - --(4.472,2.640)--(4.480,2.633)--(4.488,2.629)--(4.496,2.622)--(4.503,2.616)--(4.511,2.610)% - --(4.519,2.604)--(4.527,2.598)--(4.535,2.591)--(4.542,2.585)--(4.550,2.579)--(4.558,2.574)% - --(4.566,2.568)--(4.574,2.562)--(4.581,2.556)--(4.589,2.549)--(4.597,2.545)--(4.605,2.539)% - --(4.613,2.532)--(4.621,2.526)--(4.628,2.522)--(4.636,2.515)--(4.644,2.509)--(4.652,2.504)% - --(4.660,2.498)--(4.667,2.492)--(4.675,2.487)--(4.683,2.481)--(4.691,2.475)--(4.699,2.470)% - --(4.706,2.464)--(4.714,2.458)--(4.722,2.453)--(4.730,2.447)--(4.738,2.442)--(4.746,2.436)% - --(4.753,2.430)--(4.761,2.425)--(4.769,2.419)--(4.777,2.414)--(4.785,2.408)--(4.792,2.404)% - --(4.800,2.397)--(4.808,2.393)--(4.816,2.386)--(4.824,2.382)--(4.831,2.377)--(4.839,2.371)% - --(4.847,2.366)--(4.855,2.360)--(4.863,2.355)--(4.870,2.349)--(4.878,2.344)--(4.886,2.340)% - --(4.894,2.334)--(4.902,2.329)--(4.910,2.324)--(4.917,2.318)--(4.925,2.313)--(4.933,2.309)% - --(4.941,2.303)--(4.949,2.298)--(4.956,2.293)--(4.964,2.289)--(4.972,2.282)--(4.980,2.278)% - --(4.988,2.273)--(4.995,2.268)--(5.003,2.262)--(5.011,2.258)--(5.019,2.253)--(5.027,2.248)% - --(5.035,2.244)--(5.042,2.237)--(5.050,2.233)--(5.058,2.228)--(5.066,2.223)--(5.074,2.219)% - --(5.081,2.214)--(5.089,2.209)--(5.097,2.203)--(5.105,2.199)--(5.113,2.194)--(5.120,2.189)% - --(5.128,2.185)--(5.136,2.180)--(5.144,2.175)--(5.152,2.171)--(5.159,2.166)--(5.167,2.161)% - --(5.175,2.157)--(5.183,2.152)--(5.191,2.147)--(5.199,2.143)--(5.206,2.138)--(5.214,2.133)% - --(5.222,2.129)--(5.230,2.124)--(5.238,2.119)--(5.245,2.115)--(5.253,2.110)--(5.261,2.105)% - --(5.269,2.101)--(5.277,2.096)--(5.284,2.093)--(5.292,2.088)--(5.300,2.084)--(5.308,2.079)% - --(5.316,2.074)--(5.324,2.070)--(5.331,2.065)--(5.339,2.062)--(5.347,2.057)--(5.355,2.053)% - --(5.363,2.048)--(5.370,2.043)--(5.378,2.040)--(5.386,2.035)--(5.394,2.031)--(5.402,2.026)% - --(5.409,2.023)--(5.417,2.018)--(5.425,2.014)--(5.433,2.009)--(5.441,2.006)--(5.448,2.001)% - --(5.456,1.997)--(5.464,1.994)--(5.472,1.989)--(5.480,1.984)--(5.488,1.980)--(5.495,1.976)% - --(5.503,1.972)--(5.511,1.969)--(5.519,1.964)--(5.527,1.959)--(5.534,1.956)--(5.542,1.952)% - --(5.550,1.947)--(5.558,1.944)--(5.566,1.939)--(5.573,1.936)--(5.581,1.931)--(5.589,1.927)% - --(5.597,1.924)--(5.605,1.919)--(5.613,1.916)--(5.620,1.911)--(5.628,1.908)--(5.636,1.903)% - --(5.644,1.900)--(5.652,1.896)--(5.659,1.893)--(5.667,1.888)--(5.675,1.885)--(5.683,1.880)% - --(5.691,1.877)--(5.698,1.872)--(5.706,1.869)--(5.714,1.865)--(5.722,1.862)--(5.730,1.858)% - --(5.737,1.854)--(5.745,1.851)--(5.753,1.846)--(5.761,1.843)--(5.769,1.840)--(5.777,1.835)% - --(5.784,1.832)--(5.792,1.827)--(5.800,1.824)--(5.808,1.821)--(5.816,1.816)--(5.823,1.813)% - --(5.831,1.810)--(5.839,1.806)--(5.847,1.802)--(5.855,1.799)--(5.862,1.795)--(5.870,1.792)% - --(5.878,1.789)--(5.886,1.785)--(5.894,1.781)--(5.902,1.778)--(5.909,1.775)--(5.917,1.770)% - --(5.925,1.767)--(5.933,1.764)--(5.941,1.761)--(5.948,1.756)--(5.956,1.753)--(5.964,1.750)% - --(5.972,1.747)--(5.980,1.743)--(5.987,1.739)--(5.995,1.736)--(6.003,1.733)--(6.011,1.730)% - --(6.019,1.726)--(6.026,1.723)--(6.034,1.719)--(6.042,1.716)--(6.050,1.712)--(6.058,1.709)% - --(6.066,1.706)--(6.073,1.703)--(6.081,1.700)--(6.089,1.695)--(6.097,1.692)--(6.105,1.689)% - --(6.112,1.686)--(6.120,1.683)--(6.128,1.680)--(6.136,1.677)--(6.144,1.674)--(6.151,1.670)% - --(6.159,1.667)--(6.167,1.664)--(6.175,1.661)--(6.183,1.658)--(6.191,1.655)--(6.198,1.650)% - --(6.206,1.647)--(6.214,1.644)--(6.222,1.641)--(6.230,1.638)--(6.237,1.635)--(6.245,1.632)% - --(6.253,1.629)--(6.261,1.625)--(6.269,1.624)--(6.276,1.621)--(6.284,1.618)--(6.292,1.615)% - --(6.300,1.611)--(6.308,1.608)--(6.315,1.605)--(6.323,1.602)--(6.331,1.599)--(6.339,1.596)% - --(6.347,1.593)--(6.355,1.590)--(6.362,1.587)--(6.370,1.584)--(6.378,1.582)--(6.386,1.579)% - --(6.394,1.576)--(6.401,1.573)--(6.409,1.570)--(6.417,1.566)--(6.425,1.563)--(6.433,1.560)% - --(6.440,1.559)--(6.448,1.556)--(6.456,1.552)--(6.464,1.549)--(6.472,1.546)--(6.480,1.545)% - --(6.487,1.542)--(6.495,1.538)--(6.503,1.535)--(6.511,1.532)--(6.519,1.531)--(6.526,1.528)% - --(6.534,1.525)--(6.542,1.521)--(6.550,1.518)--(6.558,1.517)--(6.565,1.514)--(6.573,1.511)% - --(6.581,1.507)--(6.589,1.506)--(6.597,1.503)--(6.604,1.500)--(6.612,1.497)--(6.620,1.495)% - --(6.628,1.492)--(6.636,1.489)--(6.644,1.487)--(6.651,1.484)--(6.659,1.481)--(6.667,1.479)% - --(6.675,1.476)--(6.683,1.473)--(6.690,1.470)--(6.698,1.469)--(6.706,1.465)--(6.714,1.464)% - --(6.722,1.461)--(6.729,1.458)--(6.737,1.456)--(6.745,1.453)--(6.753,1.450)--(6.761,1.448)% - --(6.768,1.445)--(6.776,1.442)--(6.784,1.441)--(6.792,1.438)--(6.800,1.436)--(6.808,1.433)% - --(6.815,1.430)--(6.823,1.428)--(6.831,1.425)--(6.839,1.424)--(6.847,1.420)--(6.854,1.419)% - --(6.862,1.416)--(6.870,1.413)--(6.878,1.411)--(6.886,1.408)--(6.893,1.406)--(6.901,1.403)% - --(6.909,1.402)--(6.917,1.399)--(6.925,1.397)--(6.933,1.394)--(6.940,1.393)--(6.948,1.389)% - --(6.956,1.388)--(6.964,1.385)--(6.972,1.383)--(6.979,1.380)--(6.987,1.379)--(6.995,1.375)% - --(7.003,1.374)--(7.011,1.371)--(7.018,1.369)--(7.026,1.366)--(7.034,1.365)--(7.042,1.361)% - --(7.050,1.360)--(7.057,1.357)--(7.065,1.355)--(7.073,1.352)--(7.081,1.351)--(7.089,1.349)% - --(7.097,1.346)--(7.104,1.344)--(7.112,1.341)--(7.120,1.340)--(7.128,1.337)--(7.136,1.335)% - --(7.143,1.333)--(7.151,1.330)--(7.159,1.329)--(7.167,1.326)--(7.175,1.324)--(7.182,1.323)% - --(7.190,1.320)--(7.198,1.318)--(7.206,1.316)--(7.214,1.313)--(7.222,1.312)--(7.229,1.309)% - --(7.237,1.307)--(7.245,1.306)--(7.253,1.302)--(7.261,1.301)--(7.268,1.299)--(7.276,1.296)% - --(7.284,1.295)--(7.292,1.293)--(7.300,1.290)--(7.307,1.288)--(7.315,1.287)--(7.323,1.285)% - --(7.331,1.282)--(7.339,1.281)--(7.346,1.279)--(7.354,1.276)--(7.362,1.274)--(7.370,1.273)% - --(7.378,1.270)--(7.386,1.268)--(7.393,1.267)--(7.401,1.265)--(7.409,1.262)--(7.417,1.260)% - --(7.425,1.259)--(7.432,1.257)--(7.440,1.254)--(7.448,1.253)--(7.456,1.251)--(7.464,1.250)% - --(7.471,1.247)--(7.479,1.245)--(7.487,1.243)--(7.495,1.242)--(7.503,1.239)--(7.511,1.237)% - --(7.518,1.236)--(7.526,1.234)--(7.534,1.233)--(7.542,1.229)--(7.550,1.228)--(7.557,1.226)% - --(7.565,1.225)--(7.573,1.223)--(7.581,1.220)--(7.589,1.219)--(7.596,1.217)--(7.604,1.215)% - --(7.612,1.214)--(7.620,1.212)--(7.628,1.209)--(7.635,1.208)--(7.643,1.206)--(7.651,1.205)% - --(7.659,1.203)--(7.667,1.201)--(7.675,1.200)--(7.682,1.197)--(7.690,1.195)--(7.698,1.194)% - --(7.706,1.192)--(7.714,1.191)--(7.721,1.189)--(7.729,1.188)--(7.737,1.186)--(7.745,1.183)% - --(7.753,1.181)--(7.760,1.180)--(7.768,1.178)--(7.776,1.177)--(7.784,1.175)--(7.792,1.174)% - --(7.800,1.172)--(7.807,1.170)--(7.815,1.169)--(7.823,1.167)--(7.831,1.164)--(7.839,1.163)% - --(7.846,1.161)--(7.854,1.160)--(7.862,1.158)--(7.870,1.156)--(7.878,1.155)--(7.885,1.153)% - --(7.893,1.152)--(7.901,1.150)--(7.909,1.149)--(7.917,1.147)--(7.924,1.146)--(7.932,1.144)% - --(7.940,1.142)--(7.948,1.141)--(7.956,1.139)--(7.964,1.138)--(7.971,1.136)--(7.979,1.135)% - --(7.987,1.133)--(7.995,1.132)--(8.003,1.130)--(8.010,1.128)--(8.018,1.127)--(8.026,1.125)% - --(8.034,1.124)--(8.042,1.122)--(8.049,1.121)--(8.057,1.119)--(8.065,1.118)--(8.073,1.116)% - --(8.081,1.115)--(8.089,1.113)--(8.096,1.111)--(8.104,1.110)--(8.112,1.108)--(8.120,1.107)% - --(8.128,1.105)--(8.135,1.104)--(8.143,1.102)--(8.151,1.101)--(8.159,1.099)--(8.167,1.097)% - --(8.174,1.096)--(8.182,1.094)--(8.190,1.093)--(8.198,1.091)--(8.206,1.091)--(8.213,1.090)% - --(8.221,1.088)--(8.229,1.087)--(8.237,1.085)--(8.245,1.083)--(8.253,1.082)--(8.260,1.080)% - --(8.268,1.079)--(8.276,1.077)--(8.284,1.076)--(8.292,1.074)--(8.299,1.074)--(8.307,1.073)% - --(8.315,1.071)--(8.323,1.069)--(8.331,1.068)--(8.338,1.066)--(8.346,1.065)--(8.354,1.063)% - --(8.362,1.063)--(8.370,1.062)--(8.378,1.060)--(8.385,1.059)--(8.393,1.057)--(8.401,1.055)% - --(8.409,1.054)--(8.417,1.052)--(8.424,1.052)--(8.432,1.051)--(8.440,1.049)--(8.448,1.048)% - --(8.456,1.046)--(8.463,1.045)--(8.471,1.045)--(8.479,1.043)--(8.487,1.042)--(8.495,1.040)% - --(8.502,1.038)--(8.510,1.037)--(8.518,1.037)--(8.526,1.035)--(8.534,1.034)--(8.542,1.032)% - --(8.549,1.031)--(8.557,1.031)--(8.565,1.029)--(8.573,1.028)--(8.581,1.026)--(8.588,1.024)% - --(8.596,1.024)--(8.604,1.023)--(8.612,1.021)--(8.620,1.020)--(8.627,1.018)--(8.635,1.018)% - --(8.643,1.017)--(8.651,1.015)--(8.659,1.014)--(8.667,1.012)--(8.674,1.012)--(8.682,1.010)% - --(8.690,1.009)--(8.698,1.007)--(8.706,1.007)--(8.713,1.006)--(8.721,1.004)--(8.729,1.003)% - --(8.737,1.003)--(8.745,1.001)--(8.752,1.000)--(8.760,0.998)--(8.768,0.998)--(8.776,0.996)% - --(8.784,0.995)--(8.791,0.993)--(8.799,0.993)--(8.807,0.992)--(8.815,0.990)--(8.823,0.989)% - --(8.831,0.989)--(8.838,0.987)--(8.846,0.986)--(8.854,0.984)--(8.862,0.984)--(8.870,0.983)% - --(8.877,0.981)--(8.885,0.981)--(8.893,0.979)--(8.901,0.978)--(8.909,0.978)--(8.916,0.976)% - --(8.924,0.975)--(8.932,0.973)--(8.940,0.973)--(8.948,0.972)--(8.955,0.970)--(8.963,0.970)% - --(8.971,0.969)--(8.979,0.967)--(8.987,0.967)--(8.995,0.965)--(9.002,0.964)--(9.010,0.964)% - --(9.018,0.962)--(9.026,0.961)--(9.034,0.959)--(9.041,0.959)--(9.049,0.958)--(9.057,0.956)% - --(9.065,0.956)--(9.073,0.955)--(9.080,0.953)--(9.088,0.953)--(9.096,0.951)--(9.104,0.951)% - --(9.112,0.950)--(9.120,0.948)--(9.127,0.948)--(9.135,0.947)--(9.143,0.945)--(9.151,0.945)% - --(9.159,0.944)--(9.166,0.942)--(9.174,0.942)--(9.182,0.941)--(9.190,0.939)--(9.198,0.939)% - --(9.205,0.937)--(9.213,0.937)--(9.221,0.936)--(9.229,0.934)--(9.237,0.934)--(9.244,0.933)% - --(9.252,0.931)--(9.260,0.931)--(9.268,0.930)--(9.276,0.930)--(9.284,0.928)--(9.291,0.927)% - --(9.299,0.927)--(9.307,0.925)--(9.315,0.925)--(9.323,0.923)--(9.330,0.922)--(9.338,0.922)% - --(9.346,0.920)--(9.354,0.920)--(9.362,0.919)--(9.369,0.917)--(9.377,0.917)--(9.385,0.916)% - --(9.393,0.916)--(9.401,0.914)--(9.409,0.913)--(9.416,0.913)--(9.424,0.911)--(9.432,0.911)% - --(9.440,0.910)--(9.448,0.910)--(9.455,0.908)--(9.463,0.906)--(9.471,0.906)--(9.479,0.905)% - --(9.487,0.905)--(9.494,0.903)--(9.502,0.903)--(9.510,0.902)--(9.518,0.900)--(9.526,0.900)% - --(9.533,0.899)--(9.541,0.899)--(9.549,0.897)--(9.557,0.897)--(9.565,0.896)--(9.573,0.896)% - --(9.580,0.894)--(9.588,0.894)--(9.596,0.892)--(9.604,0.891)--(9.612,0.891)--(9.619,0.889)% - --(9.627,0.889)--(9.635,0.888)--(9.643,0.888)--(9.651,0.886)--(9.658,0.886)--(9.666,0.885)% - --(9.674,0.885)--(9.682,0.883)--(9.690,0.883)--(9.698,0.882)--(9.705,0.882)--(9.713,0.880)% - --(9.721,0.880)--(9.729,0.878)--(9.737,0.878)--(9.744,0.877)--(9.752,0.877)--(9.760,0.875)% - --(9.768,0.875)--(9.776,0.874)--(9.783,0.874)--(9.791,0.872)--(9.799,0.872)--(9.807,0.871)% - --(9.815,0.871)--(9.822,0.869)--(9.830,0.869)--(9.838,0.868)--(9.846,0.868)--(9.854,0.866)% - --(9.862,0.866)--(9.869,0.864)--(9.877,0.864)--(9.885,0.863)--(9.893,0.863)--(9.901,0.861)% - --(9.908,0.861)--(9.916,0.860)--(9.924,0.860)--(9.932,0.858)--(9.940,0.858)--(9.947,0.857)% - --(9.955,0.857)--(9.963,0.855)--(9.971,0.855)--(9.979,0.854)--(9.987,0.854)--(9.994,0.852)% - --(10.002,0.852)--(10.010,0.852)--(10.018,0.851)--(10.026,0.851)--(10.033,0.849)--(10.041,0.849)% - --(10.049,0.847)--(10.057,0.847)--(10.065,0.846)--(10.072,0.846)--(10.080,0.844)--(10.088,0.844)% - --(10.096,0.844)--(10.104,0.843)--(10.111,0.843)--(10.119,0.841)--(10.127,0.841)--(10.135,0.840)% - --(10.143,0.840)--(10.151,0.840)--(10.158,0.838)--(10.166,0.838)--(10.174,0.837)--(10.182,0.837)% - --(10.190,0.835)--(10.197,0.835)--(10.205,0.833)--(10.213,0.833)--(10.221,0.833)--(10.229,0.832)% - --(10.236,0.832)--(10.244,0.830)--(10.252,0.830)--(10.260,0.830)--(10.268,0.829)--(10.276,0.829)% - --(10.283,0.827)--(10.291,0.827)--(10.299,0.826)--(10.307,0.826)--(10.315,0.826)--(10.322,0.824)% - --(10.330,0.824)--(10.338,0.823)--(10.346,0.823)--(10.354,0.823)--(10.361,0.821)--(10.369,0.821)% - --(10.377,0.819)--(10.385,0.819)--(10.393,0.819)--(10.400,0.818)--(10.408,0.818)--(10.416,0.816)% - --(10.424,0.816)--(10.432,0.816)--(10.440,0.815)--(10.447,0.815)--(10.455,0.813)--(10.463,0.813)% - --(10.471,0.813)--(10.479,0.812)--(10.486,0.812)--(10.494,0.812)--(10.502,0.810)--(10.510,0.810)% - --(10.518,0.809)--(10.525,0.809)--(10.533,0.809)--(10.541,0.807)--(10.549,0.807)--(10.557,0.807)% - --(10.565,0.805)--(10.572,0.805)--(10.580,0.804)--(10.588,0.804)--(10.596,0.804)--(10.604,0.802)% - --(10.611,0.802)--(10.619,0.802)--(10.627,0.801)--(10.635,0.801)--(10.643,0.801)--(10.650,0.799)% - --(10.658,0.799)--(10.666,0.798)--(10.674,0.798)--(10.682,0.798)--(10.689,0.796)--(10.697,0.796)% - --(10.705,0.796)--(10.713,0.795)--(10.721,0.795)--(10.729,0.795)--(10.736,0.793)--(10.744,0.793)% - --(10.752,0.793)--(10.760,0.791)--(10.768,0.791)--(10.775,0.791)--(10.783,0.790)--(10.791,0.790)% - --(10.799,0.790)--(10.807,0.788)--(10.814,0.788)--(10.822,0.788)--(10.830,0.787)--(10.838,0.787)% - --(10.846,0.787)--(10.854,0.785)--(10.861,0.785)--(10.869,0.785)--(10.877,0.784)--(10.885,0.784)% - --(10.893,0.784)--(10.900,0.782)--(10.908,0.782)--(10.916,0.782)--(10.924,0.781)--(10.932,0.781)% - --(10.939,0.781)--(10.947,0.779)--(10.955,0.779)--(10.963,0.779)--(10.971,0.778)--(10.978,0.778)% - --(10.986,0.778)--(10.994,0.776)--(11.002,0.776)--(11.010,0.776)--(11.018,0.774)--(11.025,0.774)% - --(11.033,0.774)--(11.041,0.774)--(11.049,0.773)--(11.057,0.773)--(11.064,0.773)--(11.072,0.771)% - --(11.080,0.771)--(11.088,0.771)--(11.096,0.770)--(11.103,0.770)--(11.111,0.770)--(11.119,0.768)% - --(11.127,0.768)--(11.135,0.768)--(11.142,0.768)--(11.150,0.767)--(11.158,0.767)--(11.166,0.767)% - --(11.174,0.765)--(11.182,0.765)--(11.189,0.765)--(11.197,0.765)--(11.205,0.764)--(11.213,0.764)% - --(11.221,0.764)--(11.228,0.762)--(11.236,0.762)--(11.244,0.762)--(11.252,0.762)--(11.260,0.760)% - --(11.267,0.760)--(11.275,0.760)--(11.283,0.759)--(11.291,0.759)--(11.299,0.759)--(11.307,0.759)% - --(11.314,0.757)--(11.322,0.757)--(11.330,0.757)--(11.338,0.756)--(11.346,0.756); -\gpcolor{color=gp lt color border} -\node[gp node right] at (10.479,7.35) {Theorie}; -\gpcolor{rgb color={0.000,0.620,0.451}} -\draw[gp path] (10.663,7.35)--(11.579,7.35); -\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)% - --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)% - --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.036)--(1.137,8.013)% - --(1.145,7.991)--(1.153,7.969)--(1.160,7.946)--(1.168,7.924)--(1.176,7.903)--(1.184,7.881)% - --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)% - --(1.239,7.727)--(1.246,7.707)--(1.254,7.685)--(1.262,7.664)--(1.270,7.642)--(1.278,7.620)% - --(1.285,7.600)--(1.293,7.578)--(1.301,7.558)--(1.309,7.536)--(1.317,7.516)--(1.324,7.494)% - --(1.332,7.474)--(1.340,7.452)--(1.348,7.432)--(1.356,7.412)--(1.363,7.392)--(1.371,7.370)% - --(1.379,7.350)--(1.387,7.330)--(1.395,7.309)--(1.403,7.289)--(1.410,7.269)--(1.418,7.249)% - --(1.426,7.229)--(1.434,7.208)--(1.442,7.188)--(1.449,7.170)--(1.457,7.149)--(1.465,7.129)% - --(1.473,7.109)--(1.481,7.090)--(1.488,7.070)--(1.496,7.052)--(1.504,7.031)--(1.512,7.013)% - --(1.520,6.993)--(1.528,6.974)--(1.535,6.954)--(1.543,6.935)--(1.551,6.917)--(1.559,6.896)% - --(1.567,6.878)--(1.574,6.859)--(1.582,6.840)--(1.590,6.822)--(1.598,6.803)--(1.606,6.783)% - --(1.613,6.764)--(1.621,6.746)--(1.629,6.729)--(1.637,6.710)--(1.645,6.691)--(1.652,6.673)% - --(1.660,6.654)--(1.668,6.635)--(1.676,6.618)--(1.684,6.600)--(1.692,6.581)--(1.699,6.564)% - --(1.707,6.545)--(1.715,6.528)--(1.723,6.510)--(1.731,6.493)--(1.738,6.474)--(1.746,6.457)% - --(1.754,6.438)--(1.762,6.421)--(1.770,6.404)--(1.777,6.385)--(1.785,6.368)--(1.793,6.351)% - --(1.801,6.334)--(1.809,6.317)--(1.817,6.298)--(1.824,6.281)--(1.832,6.264)--(1.840,6.247)% - --(1.848,6.230)--(1.856,6.213)--(1.863,6.197)--(1.871,6.180)--(1.879,6.163)--(1.887,6.146)% - --(1.895,6.129)--(1.902,6.112)--(1.910,6.097)--(1.918,6.079)--(1.926,6.062)--(1.934,6.047)% - --(1.941,6.030)--(1.949,6.014)--(1.957,5.997)--(1.965,5.982)--(1.973,5.965)--(1.981,5.949)% - --(1.988,5.932)--(1.996,5.916)--(2.004,5.901)--(2.012,5.884)--(2.020,5.868)--(2.027,5.853)% - --(2.035,5.837)--(2.043,5.822)--(2.051,5.805)--(2.059,5.789)--(2.066,5.774)--(2.074,5.758)% - --(2.082,5.742)--(2.090,5.727)--(2.098,5.711)--(2.106,5.696)--(2.113,5.680)--(2.121,5.666)% - --(2.129,5.651)--(2.137,5.635)--(2.145,5.620)--(2.152,5.604)--(2.160,5.590)--(2.168,5.575)% - --(2.176,5.559)--(2.184,5.545)--(2.191,5.530)--(2.199,5.516)--(2.207,5.500)--(2.215,5.485)% - --(2.223,5.471)--(2.230,5.457)--(2.238,5.441)--(2.246,5.427)--(2.254,5.412)--(2.262,5.398)% - --(2.270,5.384)--(2.277,5.368)--(2.285,5.354)--(2.293,5.340)--(2.301,5.326)--(2.309,5.311)% - --(2.316,5.297)--(2.324,5.283)--(2.332,5.269)--(2.340,5.255)--(2.348,5.241)--(2.355,5.227)% - --(2.363,5.213)--(2.371,5.199)--(2.379,5.185)--(2.387,5.171)--(2.394,5.157)--(2.402,5.145)% - --(2.410,5.131)--(2.418,5.117)--(2.426,5.103)--(2.434,5.089)--(2.441,5.076)--(2.449,5.062)% - --(2.457,5.048)--(2.465,5.036)--(2.473,5.022)--(2.480,5.008)--(2.488,4.995)--(2.496,4.981)% - --(2.504,4.969)--(2.512,4.955)--(2.519,4.943)--(2.527,4.930)--(2.535,4.916)--(2.543,4.904)% - --(2.551,4.890)--(2.559,4.877)--(2.566,4.865)--(2.574,4.851)--(2.582,4.839)--(2.590,4.826)% - --(2.598,4.814)--(2.605,4.801)--(2.613,4.787)--(2.621,4.775)--(2.629,4.763)--(2.637,4.750)% - --(2.644,4.738)--(2.652,4.725)--(2.660,4.713)--(2.668,4.700)--(2.676,4.688)--(2.683,4.676)% - --(2.691,4.663)--(2.699,4.651)--(2.707,4.640)--(2.715,4.627)--(2.723,4.615)--(2.730,4.603)% - --(2.738,4.590)--(2.746,4.579)--(2.754,4.567)--(2.762,4.554)--(2.769,4.542)--(2.777,4.531)% - --(2.785,4.519)--(2.793,4.508)--(2.801,4.495)--(2.808,4.483)--(2.816,4.472)--(2.824,4.460)% - --(2.832,4.449)--(2.840,4.436)--(2.848,4.426)--(2.855,4.415)--(2.863,4.402)--(2.871,4.391)% - --(2.879,4.379)--(2.887,4.368)--(2.894,4.357)--(2.902,4.346)--(2.910,4.334)--(2.918,4.323)% - --(2.926,4.312)--(2.933,4.301)--(2.941,4.289)--(2.949,4.278)--(2.957,4.267)--(2.965,4.256)% - --(2.972,4.245)--(2.980,4.234)--(2.988,4.224)--(2.996,4.213)--(3.004,4.202)--(3.012,4.191)% - --(3.019,4.180)--(3.027,4.169)--(3.035,4.158)--(3.043,4.148)--(3.051,4.137)--(3.058,4.126)% - --(3.066,4.115)--(3.074,4.106)--(3.082,4.095)--(3.090,4.084)--(3.097,4.073)--(3.105,4.064)% - --(3.113,4.053)--(3.121,4.042)--(3.129,4.031)--(3.137,4.022)--(3.144,4.011)--(3.152,4.002)% - --(3.160,3.991)--(3.168,3.980)--(3.176,3.970)--(3.183,3.960)--(3.191,3.950)--(3.199,3.939)% - --(3.207,3.930)--(3.215,3.919)--(3.222,3.910)--(3.230,3.901)--(3.238,3.890)--(3.246,3.880)% - --(3.254,3.870)--(3.261,3.860)--(3.269,3.851)--(3.277,3.840)--(3.285,3.831)--(3.293,3.821)% - --(3.301,3.812)--(3.308,3.801)--(3.316,3.792)--(3.324,3.783)--(3.332,3.773)--(3.340,3.764)% - --(3.347,3.755)--(3.355,3.744)--(3.363,3.734)--(3.371,3.725)--(3.379,3.716)--(3.386,3.706)% - --(3.394,3.697)--(3.402,3.688)--(3.410,3.679)--(3.418,3.669)--(3.426,3.660)--(3.433,3.651)% - --(3.441,3.641)--(3.449,3.633)--(3.457,3.624)--(3.465,3.615)--(3.472,3.606)--(3.480,3.596)% - --(3.488,3.587)--(3.496,3.579)--(3.504,3.570)--(3.511,3.560)--(3.519,3.551)--(3.527,3.543)% - --(3.535,3.534)--(3.543,3.525)--(3.550,3.515)--(3.558,3.508)--(3.566,3.498)--(3.574,3.491)% - --(3.582,3.481)--(3.590,3.472)--(3.597,3.464)--(3.605,3.455)--(3.613,3.447)--(3.621,3.438)% - --(3.629,3.430)--(3.636,3.421)--(3.644,3.413)--(3.652,3.404)--(3.660,3.396)--(3.668,3.387)% - --(3.675,3.379)--(3.683,3.371)--(3.691,3.362)--(3.699,3.354)--(3.707,3.346)--(3.715,3.337)% - --(3.722,3.329)--(3.730,3.321)--(3.738,3.312)--(3.746,3.304)--(3.754,3.296)--(3.761,3.289)% - --(3.769,3.281)--(3.777,3.272)--(3.785,3.264)--(3.793,3.256)--(3.800,3.248)--(3.808,3.241)% - --(3.816,3.233)--(3.824,3.225)--(3.832,3.216)--(3.839,3.208)--(3.847,3.200)--(3.855,3.192)% - --(3.863,3.185)--(3.871,3.177)--(3.879,3.169)--(3.886,3.161)--(3.894,3.154)--(3.902,3.146)% - --(3.910,3.138)--(3.918,3.132)--(3.925,3.124)--(3.933,3.116)--(3.941,3.109)--(3.949,3.101)% - --(3.957,3.093)--(3.964,3.085)--(3.972,3.079)--(3.980,3.071)--(3.988,3.064)--(3.996,3.056)% - --(4.004,3.048)--(4.011,3.042)--(4.019,3.034)--(4.027,3.026)--(4.035,3.020)--(4.043,3.012)% - --(4.050,3.005)--(4.058,2.998)--(4.066,2.991)--(4.074,2.983)--(4.082,2.977)--(4.089,2.969)% - --(4.097,2.963)--(4.105,2.955)--(4.113,2.947)--(4.121,2.941)--(4.128,2.933)--(4.136,2.927)% - --(4.144,2.919)--(4.152,2.913)--(4.160,2.905)--(4.168,2.899)--(4.175,2.891)--(4.183,2.885)% - --(4.191,2.879)--(4.199,2.871)--(4.207,2.865)--(4.214,2.857)--(4.222,2.851)--(4.230,2.845)% - --(4.238,2.837)--(4.246,2.831)--(4.253,2.824)--(4.261,2.817)--(4.269,2.810)--(4.277,2.804)% - --(4.285,2.798)--(4.293,2.790)--(4.300,2.784)--(4.308,2.778)--(4.316,2.772)--(4.324,2.764)% - --(4.332,2.758)--(4.339,2.751)--(4.347,2.745)--(4.355,2.739)--(4.363,2.733)--(4.371,2.727)% - --(4.378,2.719)--(4.386,2.713)--(4.394,2.706)--(4.402,2.700)--(4.410,2.694)--(4.417,2.688)% - --(4.425,2.681)--(4.433,2.675)--(4.441,2.669)--(4.449,2.663)--(4.457,2.657)--(4.464,2.650)% - --(4.472,2.644)--(4.480,2.638)--(4.488,2.632)--(4.496,2.626)--(4.503,2.619)--(4.511,2.613)% - --(4.519,2.608)--(4.527,2.602)--(4.535,2.596)--(4.542,2.590)--(4.550,2.584)--(4.558,2.577)% - --(4.566,2.571)--(4.574,2.567)--(4.581,2.560)--(4.589,2.554)--(4.597,2.548)--(4.605,2.542)% - --(4.613,2.537)--(4.621,2.531)--(4.628,2.525)--(4.636,2.520)--(4.644,2.514)--(4.652,2.508)% - --(4.660,2.501)--(4.667,2.497)--(4.675,2.490)--(4.683,2.484)--(4.691,2.480)--(4.699,2.473)% - --(4.706,2.469)--(4.714,2.463)--(4.722,2.456)--(4.730,2.452)--(4.738,2.445)--(4.746,2.441)% - --(4.753,2.435)--(4.761,2.430)--(4.769,2.424)--(4.777,2.417)--(4.785,2.413)--(4.792,2.407)% - --(4.800,2.402)--(4.808,2.396)--(4.816,2.391)--(4.824,2.386)--(4.831,2.380)--(4.839,2.376)% - --(4.847,2.369)--(4.855,2.365)--(4.863,2.358)--(4.870,2.354)--(4.878,2.349)--(4.886,2.343)% - --(4.894,2.338)--(4.902,2.334)--(4.910,2.327)--(4.917,2.323)--(4.925,2.318)--(4.933,2.312)% - --(4.941,2.307)--(4.949,2.303)--(4.956,2.296)--(4.964,2.292)--(4.972,2.287)--(4.980,2.282)% - --(4.988,2.276)--(4.995,2.271)--(5.003,2.267)--(5.011,2.262)--(5.019,2.256)--(5.027,2.251)% - --(5.035,2.247)--(5.042,2.242)--(5.050,2.237)--(5.058,2.233)--(5.066,2.226)--(5.074,2.222)% - --(5.081,2.217)--(5.089,2.212)--(5.097,2.208)--(5.105,2.203)--(5.113,2.199)--(5.120,2.194)% - --(5.128,2.189)--(5.136,2.183)--(5.144,2.178)--(5.152,2.174)--(5.159,2.169)--(5.167,2.164)% - --(5.175,2.160)--(5.183,2.155)--(5.191,2.150)--(5.199,2.146)--(5.206,2.141)--(5.214,2.136)% - --(5.222,2.132)--(5.230,2.127)--(5.238,2.122)--(5.245,2.119)--(5.253,2.115)--(5.261,2.110)% - --(5.269,2.105)--(5.277,2.101)--(5.284,2.096)--(5.292,2.091)--(5.300,2.087)--(5.308,2.082)% - --(5.316,2.079)--(5.324,2.074)--(5.331,2.070)--(5.339,2.065)--(5.347,2.060)--(5.355,2.056)% - --(5.363,2.053)--(5.370,2.048)--(5.378,2.043)--(5.386,2.039)--(5.394,2.034)--(5.402,2.031)% - --(5.409,2.026)--(5.417,2.021)--(5.425,2.017)--(5.433,2.014)--(5.441,2.009)--(5.448,2.004)% - --(5.456,2.001)--(5.464,1.997)--(5.472,1.992)--(5.480,1.987)--(5.488,1.984)--(5.495,1.980)% - --(5.503,1.975)--(5.511,1.972)--(5.519,1.967)--(5.527,1.964)--(5.534,1.959)--(5.542,1.955)% - --(5.550,1.952)--(5.558,1.947)--(5.566,1.944)--(5.573,1.939)--(5.581,1.934)--(5.589,1.931)% - --(5.597,1.927)--(5.605,1.924)--(5.613,1.919)--(5.620,1.916)--(5.628,1.911)--(5.636,1.908)% - --(5.644,1.903)--(5.652,1.899)--(5.659,1.896)--(5.667,1.893)--(5.675,1.888)--(5.683,1.885)% - --(5.691,1.880)--(5.698,1.877)--(5.706,1.872)--(5.714,1.869)--(5.722,1.865)--(5.730,1.862)% - --(5.737,1.857)--(5.745,1.854)--(5.753,1.851)--(5.761,1.846)--(5.769,1.843)--(5.777,1.838)% - --(5.784,1.835)--(5.792,1.832)--(5.800,1.827)--(5.808,1.824)--(5.816,1.821)--(5.823,1.816)% - --(5.831,1.813)--(5.839,1.810)--(5.847,1.806)--(5.855,1.802)--(5.862,1.799)--(5.870,1.795)% - --(5.878,1.792)--(5.886,1.789)--(5.894,1.784)--(5.902,1.781)--(5.909,1.778)--(5.917,1.775)% - --(5.925,1.770)--(5.933,1.767)--(5.941,1.764)--(5.948,1.761)--(5.956,1.756)--(5.964,1.753)% - --(5.972,1.750)--(5.980,1.747)--(5.987,1.743)--(5.995,1.739)--(6.003,1.736)--(6.011,1.733)% - --(6.019,1.730)--(6.026,1.726)--(6.034,1.722)--(6.042,1.719)--(6.050,1.716)--(6.058,1.712)% - --(6.066,1.709)--(6.073,1.706)--(6.081,1.703)--(6.089,1.698)--(6.097,1.695)--(6.105,1.692)% - --(6.112,1.689)--(6.120,1.686)--(6.128,1.683)--(6.136,1.680)--(6.144,1.677)--(6.151,1.674)% - --(6.159,1.670)--(6.167,1.667)--(6.175,1.664)--(6.183,1.661)--(6.191,1.658)--(6.198,1.655)% - --(6.206,1.652)--(6.214,1.647)--(6.222,1.644)--(6.230,1.641)--(6.237,1.638)--(6.245,1.635)% - --(6.253,1.632)--(6.261,1.630)--(6.269,1.627)--(6.276,1.624)--(6.284,1.621)--(6.292,1.618)% - --(6.300,1.615)--(6.308,1.611)--(6.315,1.608)--(6.323,1.605)--(6.331,1.602)--(6.339,1.599)% - --(6.347,1.596)--(6.355,1.593)--(6.362,1.590)--(6.370,1.587)--(6.378,1.585)--(6.386,1.582)% - --(6.394,1.579)--(6.401,1.576)--(6.409,1.573)--(6.417,1.570)--(6.425,1.566)--(6.433,1.563)% - --(6.440,1.562)--(6.448,1.559)--(6.456,1.556)--(6.464,1.552)--(6.472,1.549)--(6.480,1.546)% - --(6.487,1.545)--(6.495,1.542)--(6.503,1.538)--(6.511,1.535)--(6.519,1.532)--(6.526,1.531)% - --(6.534,1.528)--(6.542,1.525)--(6.550,1.521)--(6.558,1.520)--(6.565,1.517)--(6.573,1.514)% - --(6.581,1.511)--(6.589,1.509)--(6.597,1.506)--(6.604,1.503)--(6.612,1.500)--(6.620,1.498)% - --(6.628,1.495)--(6.636,1.492)--(6.644,1.489)--(6.651,1.487)--(6.659,1.484)--(6.667,1.481)% - --(6.675,1.479)--(6.683,1.476)--(6.690,1.473)--(6.698,1.472)--(6.706,1.469)--(6.714,1.465)% - --(6.722,1.464)--(6.729,1.461)--(6.737,1.458)--(6.745,1.456)--(6.753,1.453)--(6.761,1.450)% - --(6.768,1.448)--(6.776,1.445)--(6.784,1.444)--(6.792,1.441)--(6.800,1.438)--(6.808,1.436)% - --(6.815,1.433)--(6.823,1.431)--(6.831,1.428)--(6.839,1.425)--(6.847,1.424)--(6.854,1.420)% - --(6.862,1.419)--(6.870,1.416)--(6.878,1.414)--(6.886,1.411)--(6.893,1.408)--(6.901,1.406)% - --(6.909,1.403)--(6.917,1.402)--(6.925,1.399)--(6.933,1.397)--(6.940,1.394)--(6.948,1.393)% - --(6.956,1.389)--(6.964,1.388)--(6.972,1.385)--(6.979,1.383)--(6.987,1.380)--(6.995,1.379)% - --(7.003,1.375)--(7.011,1.374)--(7.018,1.371)--(7.026,1.369)--(7.034,1.366)--(7.042,1.365)% - --(7.050,1.361)--(7.057,1.360)--(7.065,1.358)--(7.073,1.355)--(7.081,1.354)--(7.089,1.351)% - --(7.097,1.349)--(7.104,1.346)--(7.112,1.344)--(7.120,1.343)--(7.128,1.340)--(7.136,1.338)% - --(7.143,1.335)--(7.151,1.333)--(7.159,1.332)--(7.167,1.329)--(7.175,1.327)--(7.182,1.324)% - --(7.190,1.323)--(7.198,1.321)--(7.206,1.318)--(7.214,1.316)--(7.222,1.313)--(7.229,1.312)% - --(7.237,1.310)--(7.245,1.307)--(7.253,1.306)--(7.261,1.304)--(7.268,1.301)--(7.276,1.299)% - --(7.284,1.298)--(7.292,1.295)--(7.300,1.293)--(7.307,1.292)--(7.315,1.288)--(7.323,1.287)% - --(7.331,1.285)--(7.339,1.284)--(7.346,1.281)--(7.354,1.279)--(7.362,1.278)--(7.370,1.274)% - --(7.378,1.273)--(7.386,1.271)--(7.393,1.268)--(7.401,1.267)--(7.409,1.265)--(7.417,1.264)% - --(7.425,1.260)--(7.432,1.259)--(7.440,1.257)--(7.448,1.256)--(7.456,1.253)--(7.464,1.251)% - --(7.471,1.250)--(7.479,1.248)--(7.487,1.245)--(7.495,1.243)--(7.503,1.242)--(7.511,1.240)% - --(7.518,1.239)--(7.526,1.236)--(7.534,1.234)--(7.542,1.233)--(7.550,1.231)--(7.557,1.229)% - --(7.565,1.226)--(7.573,1.225)--(7.581,1.223)--(7.589,1.222)--(7.596,1.220)--(7.604,1.217)% - --(7.612,1.215)--(7.620,1.214)--(7.628,1.212)--(7.635,1.211)--(7.643,1.209)--(7.651,1.206)% - --(7.659,1.205)--(7.667,1.203)--(7.675,1.201)--(7.682,1.200)--(7.690,1.198)--(7.698,1.197)% - --(7.706,1.194)--(7.714,1.192)--(7.721,1.191)--(7.729,1.189)--(7.737,1.188)--(7.745,1.186)% - --(7.753,1.184)--(7.760,1.183)--(7.768,1.181)--(7.776,1.178)--(7.784,1.177)--(7.792,1.175)% - --(7.800,1.174)--(7.807,1.172)--(7.815,1.170)--(7.823,1.169)--(7.831,1.167)--(7.839,1.166)% - --(7.846,1.164)--(7.854,1.163)--(7.862,1.161)--(7.870,1.160)--(7.878,1.156)--(7.885,1.155)% - --(7.893,1.153)--(7.901,1.152)--(7.909,1.150)--(7.917,1.149)--(7.924,1.147)--(7.932,1.146)% - --(7.940,1.144)--(7.948,1.142)--(7.956,1.141)--(7.964,1.139)--(7.971,1.138)--(7.979,1.136)% - --(7.987,1.135)--(7.995,1.133)--(8.003,1.132)--(8.010,1.130)--(8.018,1.128)--(8.026,1.127)% - --(8.034,1.125)--(8.042,1.124)--(8.049,1.122)--(8.057,1.121)--(8.065,1.119)--(8.073,1.118)% - --(8.081,1.116)--(8.089,1.115)--(8.096,1.113)--(8.104,1.111)--(8.112,1.110)--(8.120,1.108)% - --(8.128,1.107)--(8.135,1.105)--(8.143,1.104)--(8.151,1.102)--(8.159,1.101)--(8.167,1.101)% - --(8.174,1.099)--(8.182,1.097)--(8.190,1.096)--(8.198,1.094)--(8.206,1.093)--(8.213,1.091)% - --(8.221,1.090)--(8.229,1.088)--(8.237,1.087)--(8.245,1.085)--(8.253,1.083)--(8.260,1.082)% - --(8.268,1.080)--(8.276,1.080)--(8.284,1.079)--(8.292,1.077)--(8.299,1.076)--(8.307,1.074)% - --(8.315,1.073)--(8.323,1.071)--(8.331,1.069)--(8.338,1.068)--(8.346,1.068)--(8.354,1.066)% - --(8.362,1.065)--(8.370,1.063)--(8.378,1.062)--(8.385,1.060)--(8.393,1.059)--(8.401,1.057)% - --(8.409,1.057)--(8.417,1.055)--(8.424,1.054)--(8.432,1.052)--(8.440,1.051)--(8.448,1.049)% - --(8.456,1.048)--(8.463,1.048)--(8.471,1.046)--(8.479,1.045)--(8.487,1.043)--(8.495,1.042)% - --(8.502,1.040)--(8.510,1.040)--(8.518,1.038)--(8.526,1.037)--(8.534,1.035)--(8.542,1.034)% - --(8.549,1.034)--(8.557,1.032)--(8.565,1.031)--(8.573,1.029)--(8.581,1.028)--(8.588,1.026)% - --(8.596,1.026)--(8.604,1.024)--(8.612,1.023)--(8.620,1.021)--(8.627,1.021)--(8.635,1.020)% - --(8.643,1.018)--(8.651,1.017)--(8.659,1.015)--(8.667,1.015)--(8.674,1.014)--(8.682,1.012)% - --(8.690,1.010)--(8.698,1.010)--(8.706,1.009)--(8.713,1.007)--(8.721,1.006)--(8.729,1.004)% - --(8.737,1.004)--(8.745,1.003)--(8.752,1.001)--(8.760,1.000)--(8.768,1.000)--(8.776,0.998)% - --(8.784,0.996)--(8.791,0.995)--(8.799,0.995)--(8.807,0.993)--(8.815,0.992)--(8.823,0.992)% - --(8.831,0.990)--(8.838,0.989)--(8.846,0.987)--(8.854,0.987)--(8.862,0.986)--(8.870,0.984)% - --(8.877,0.983)--(8.885,0.983)--(8.893,0.981)--(8.901,0.979)--(8.909,0.979)--(8.916,0.978)% - --(8.924,0.976)--(8.932,0.975)--(8.940,0.975)--(8.948,0.973)--(8.955,0.972)--(8.963,0.972)% - --(8.971,0.970)--(8.979,0.969)--(8.987,0.969)--(8.995,0.967)--(9.002,0.965)--(9.010,0.965)% - --(9.018,0.964)--(9.026,0.962)--(9.034,0.962)--(9.041,0.961)--(9.049,0.959)--(9.057,0.959)% - --(9.065,0.958)--(9.073,0.956)--(9.080,0.956)--(9.088,0.955)--(9.096,0.953)--(9.104,0.953)% - --(9.112,0.951)--(9.120,0.950)--(9.127,0.950)--(9.135,0.948)--(9.143,0.947)--(9.151,0.947)% - --(9.159,0.945)--(9.166,0.944)--(9.174,0.944)--(9.182,0.942)--(9.190,0.941)--(9.198,0.941)% - --(9.205,0.939)--(9.213,0.939)--(9.221,0.937)--(9.229,0.936)--(9.237,0.936)--(9.244,0.934)% - --(9.252,0.933)--(9.260,0.933)--(9.268,0.931)--(9.276,0.931)--(9.284,0.930)--(9.291,0.928)% - --(9.299,0.928)--(9.307,0.927)--(9.315,0.927)--(9.323,0.925)--(9.330,0.923)--(9.338,0.923)% - --(9.346,0.922)--(9.354,0.922)--(9.362,0.920)--(9.369,0.919)--(9.377,0.919)--(9.385,0.917)% - --(9.393,0.917)--(9.401,0.916)--(9.409,0.914)--(9.416,0.914)--(9.424,0.913)--(9.432,0.913)% - --(9.440,0.911)--(9.448,0.911)--(9.455,0.910)--(9.463,0.908)--(9.471,0.908)--(9.479,0.906)% - --(9.487,0.906)--(9.494,0.905)--(9.502,0.905)--(9.510,0.903)--(9.518,0.902)--(9.526,0.902)% - --(9.533,0.900)--(9.541,0.900)--(9.549,0.899)--(9.557,0.899)--(9.565,0.897)--(9.573,0.897)% - --(9.580,0.896)--(9.588,0.894)--(9.596,0.894)--(9.604,0.892)--(9.612,0.892)--(9.619,0.891)% - --(9.627,0.891)--(9.635,0.889)--(9.643,0.889)--(9.651,0.888)--(9.658,0.888)--(9.666,0.886)% - --(9.674,0.886)--(9.682,0.885)--(9.690,0.885)--(9.698,0.883)--(9.705,0.882)--(9.713,0.882)% - --(9.721,0.880)--(9.729,0.880)--(9.737,0.878)--(9.744,0.878)--(9.752,0.877)--(9.760,0.877)% - --(9.768,0.875)--(9.776,0.875)--(9.783,0.874)--(9.791,0.874)--(9.799,0.872)--(9.807,0.872)% - --(9.815,0.871)--(9.822,0.871)--(9.830,0.869)--(9.838,0.869)--(9.846,0.868)--(9.854,0.868)% - --(9.862,0.866)--(9.869,0.866)--(9.877,0.864)--(9.885,0.864)--(9.893,0.863)--(9.901,0.863)% - --(9.908,0.861)--(9.916,0.861)--(9.924,0.861)--(9.932,0.860)--(9.940,0.860)--(9.947,0.858)% - --(9.955,0.858)--(9.963,0.857)--(9.971,0.857)--(9.979,0.855)--(9.987,0.855)--(9.994,0.854)% - --(10.002,0.854)--(10.010,0.852)--(10.018,0.852)--(10.026,0.851)--(10.033,0.851)--(10.041,0.851)% - --(10.049,0.849)--(10.057,0.849)--(10.065,0.847)--(10.072,0.847)--(10.080,0.846)--(10.088,0.846)% - --(10.096,0.844)--(10.104,0.844)--(10.111,0.843)--(10.119,0.843)--(10.127,0.843)--(10.135,0.841)% - --(10.143,0.841)--(10.151,0.840)--(10.158,0.840)--(10.166,0.838)--(10.174,0.838)--(10.182,0.838)% - --(10.190,0.837)--(10.197,0.837)--(10.205,0.835)--(10.213,0.835)--(10.221,0.833)--(10.229,0.833)% - --(10.236,0.833)--(10.244,0.832)--(10.252,0.832)--(10.260,0.830)--(10.268,0.830)--(10.276,0.829)% - --(10.283,0.829)--(10.291,0.829)--(10.299,0.827)--(10.307,0.827)--(10.315,0.826)--(10.322,0.826)% - --(10.330,0.826)--(10.338,0.824)--(10.346,0.824)--(10.354,0.823)--(10.361,0.823)--(10.369,0.823)% - --(10.377,0.821)--(10.385,0.821)--(10.393,0.819)--(10.400,0.819)--(10.408,0.819)--(10.416,0.818)% - --(10.424,0.818)--(10.432,0.816)--(10.440,0.816)--(10.447,0.816)--(10.455,0.815)--(10.463,0.815)% - --(10.471,0.813)--(10.479,0.813)--(10.486,0.813)--(10.494,0.812)--(10.502,0.812)--(10.510,0.812)% - --(10.518,0.810)--(10.525,0.810)--(10.533,0.809)--(10.541,0.809)--(10.549,0.809)--(10.557,0.807)% - --(10.565,0.807)--(10.572,0.805)--(10.580,0.805)--(10.588,0.805)--(10.596,0.804)--(10.604,0.804)% - --(10.611,0.804)--(10.619,0.802)--(10.627,0.802)--(10.635,0.802)--(10.643,0.801)--(10.650,0.801)% - --(10.658,0.799)--(10.666,0.799)--(10.674,0.799)--(10.682,0.798)--(10.689,0.798)--(10.697,0.798)% - --(10.705,0.796)--(10.713,0.796)--(10.721,0.796)--(10.729,0.795)--(10.736,0.795)--(10.744,0.795)% - --(10.752,0.793)--(10.760,0.793)--(10.768,0.793)--(10.775,0.791)--(10.783,0.791)--(10.791,0.791)% - --(10.799,0.790)--(10.807,0.790)--(10.814,0.790)--(10.822,0.788)--(10.830,0.788)--(10.838,0.788)% - --(10.846,0.787)--(10.854,0.787)--(10.861,0.787)--(10.869,0.785)--(10.877,0.785)--(10.885,0.785)% - --(10.893,0.784)--(10.900,0.784)--(10.908,0.784)--(10.916,0.782)--(10.924,0.782)--(10.932,0.782)% - --(10.939,0.781)--(10.947,0.781)--(10.955,0.781)--(10.963,0.779)--(10.971,0.779)--(10.978,0.779)% - --(10.986,0.778)--(10.994,0.778)--(11.002,0.778)--(11.010,0.776)--(11.018,0.776)--(11.025,0.776)% - --(11.033,0.774)--(11.041,0.774)--(11.049,0.774)--(11.057,0.774)--(11.064,0.773)--(11.072,0.773)% - --(11.080,0.773)--(11.088,0.771)--(11.096,0.771)--(11.103,0.771)--(11.111,0.770)--(11.119,0.770)% - --(11.127,0.770)--(11.135,0.768)--(11.142,0.768)--(11.150,0.768)--(11.158,0.768)--(11.166,0.767)% - --(11.174,0.767)--(11.182,0.767)--(11.189,0.765)--(11.197,0.765)--(11.205,0.765)--(11.213,0.765)% - --(11.221,0.764)--(11.228,0.764)--(11.236,0.764)--(11.244,0.762)--(11.252,0.762)--(11.260,0.762)% - --(11.267,0.762)--(11.275,0.760)--(11.283,0.760)--(11.291,0.760)--(11.299,0.759)--(11.307,0.759)% - --(11.314,0.759)--(11.322,0.759)--(11.330,0.757)--(11.338,0.757)--(11.346,0.757); -\gpcolor{color=gp lt color border} -\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle; -%% coordinates of the plot area -\gpdefrectangularnode{gp plot 1}{\pgfpoint{1.012cm}{0.616cm}}{\pgfpoint{11.947cm}{8.381cm}} -\end{tikzpicture} -%% gnuplot variables diff --git a/20201217/logo-hochschule-bochum-cvh-text-v2.pdf b/20201217/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20201217/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20201217/logo-hochschule-bochum.pdf b/20201217/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20201217/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20201217/make-1.txt b/20201217/make-1.txt deleted file mode 100644 index a04a551c7c38556c87ae7c3644357cbf51d13df3..0000000000000000000000000000000000000000 --- a/20201217/make-1.txt +++ /dev/null @@ -1,27 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h -extern int answer (void); -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c -#include "answer.h" - -int answer (void) -{ - return 42; -} -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c -o philosophy -/usr/bin/ld: /tmp/ccCbFdy5.o: in function `main': -philosophy.c:(.text+0x5): undefined reference to `answer' -collect2: error: ld returned 1 exit status -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 42. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-10.txt b/20201217/make-10.txt deleted file mode 100644 index 5a731bbb980ec0a63c1caf3152fd690e81631e26..0000000000000000000000000000000000000000 --- a/20201217/make-10.txt +++ /dev/null @@ -1,30 +0,0 @@ -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - -philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - -clean: - rm -f $(OBJECTS) $(TARGET) -cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-2 -make: „philosophy“ ist bereits aktuell. -cassini/home/peter/bo/2020ws/hp/20201217> make answer.o -f Makefile-2 -make: „answer.o“ ist bereits aktuell. -cassini/home/peter/bo/2020ws/hp/20201217> make clean -f Makefile-2 -rm -f philosophy.o answer.o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> make answer.o -f Makefile-2 -gcc -Wall -O answer.c -c -cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-2 -gcc -Wall -O philosophy.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 23. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-11.txt b/20201217/make-11.txt deleted file mode 100644 index 972907b4742b95090fa2ab16b416c01f234894a3..0000000000000000000000000000000000000000 --- a/20201217/make-11.txt +++ /dev/null @@ -1,32 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile-3 -TARGET = philosophy -OBJECTS = philosophy.o answer.o -HEADERS = answer.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -%.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - -clean: - rm -f $(OBJECTS) $(TARGET) -cassini/home/peter/bo/2020ws/hp/20201217> make clean -make: *** Keine Regel, um „clean“ zu erstellen. Schluss. -cassini/home/peter/bo/2020ws/hp/20201217> make -make: *** Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden. Schluss. -cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-3 clean -rm -f philosophy.o answer.o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-3 -gcc -Wall -O philosophy.c -c -gcc -Wall -O answer.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ln -s Makefile-3 Makefile -cassini/home/peter/bo/2020ws/hp/20201217> make clean -rm -f philosophy.o answer.o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc -Wall -O philosophy.c -c -gcc -Wall -O answer.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-2.txt b/20201217/make-2.txt deleted file mode 100644 index 4143a77a2e45b57b3efe005456c99b173ca92b99..0000000000000000000000000000000000000000 --- a/20201217/make-2.txt +++ /dev/null @@ -1,10 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 137; -} -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 42. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-3.txt b/20201217/make-3.txt deleted file mode 100644 index ac0a49ddec4c3f6fcb3229abbe35640a7816e8d9..0000000000000000000000000000000000000000 --- a/20201217/make-3.txt +++ /dev/null @@ -1,25 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 137; -} -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 42. -cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-2.txt -#include "answer.h" - -int answer (void) -{ - return 137; -} -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 42. -cassini/home/peter/bo/2020ws/hp/20201217> -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 137. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-4.txt b/20201217/make-4.txt deleted file mode 100644 index d07bb9f28f390a394f55dbb9bf1a85a8a00419cf..0000000000000000000000000000000000000000 --- a/20201217/make-4.txt +++ /dev/null @@ -1,24 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h -extern int answer (void); -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c -#include "answer.h" - -int answer (void) -{ - return 137; -} -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O answer.c -c -cassini/home/peter/bo/2020ws/hp/20201217> gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 137. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-5.txt b/20201217/make-5.txt deleted file mode 100644 index 7033a7ff15ef20da449058e5955084573bec74c3..0000000000000000000000000000000000000000 --- a/20201217/make-5.txt +++ /dev/null @@ -1,25 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat philosophy.c -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.h -extern int answer (void); -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c -#include "answer.h" - -int answer (void) -{ - return 137; -} -cassini/home/peter/bo/2020ws/hp/20201217> for x in philsophy.c answer.c; do gcc -Wall -O $x -c; done -gcc: error: philsophy.c: Datei oder Verzeichnis nicht gefunden -gcc: fatal error: no input files -compilation terminated. -cassini/home/peter/bo/2020ws/hp/20201217> for x in philosophy.c answer.c; do gcc -Wall -O $x -c; done -cassini/home/peter/bo/2020ws/hp/20201217> gcc -Wall -O philosophy.c answer.c -c -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-6.txt b/20201217/make-6.txt deleted file mode 100644 index 8b369c1e14c49675d968324c8406a311eb3bbd66..0000000000000000000000000000000000000000 --- a/20201217/make-6.txt +++ /dev/null @@ -1,14 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 137. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-7.txt b/20201217/make-7.txt deleted file mode 100644 index 2237b1b84043ee3844d8d73c212a3321436b2e4d..0000000000000000000000000000000000000000 --- a/20201217/make-7.txt +++ /dev/null @@ -1,40 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 137. -cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-6.txt -cassini/home/peter/bo/2020ws/hp/20201217> cat Makefile -philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - -answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - -philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> ./philosophy -The answer is 137. -cassini/home/peter/bo/2020ws/hp/20201217> -cassini/home/peter/bo/2020ws/hp/20201217> sed -i answer.c -e 's/137/23/' -cassini/home/peter/bo/2020ws/hp/20201217> cat answer.c -#include "answer.h" - -int answer (void) -{ - return 23; -} -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc -Wall -O answer.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-8.txt b/20201217/make-8.txt deleted file mode 100644 index f2d502f113a0c393496efea008247677f643092b..0000000000000000000000000000000000000000 --- a/20201217/make-8.txt +++ /dev/null @@ -1,5 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc -Wall -O philosophy.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/make-9.txt b/20201217/make-9.txt deleted file mode 100644 index 13617e5285cbb625b8f27f070279508d80705c0a..0000000000000000000000000000000000000000 --- a/20201217/make-9.txt +++ /dev/null @@ -1,13 +0,0 @@ -cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc -Wall -O philosophy.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> cat >> make-8.txt -cassini/home/peter/bo/2020ws/hp/20201217> touch philosophy.c -cassini/home/peter/bo/2020ws/hp/20201217> make -gcc -Wall -O philosophy.c -c -gcc philosophy.o answer.o -o philosophy -cassini/home/peter/bo/2020ws/hp/20201217> -cassini/home/peter/bo/2020ws/hp/20201217> make -f Makefile-1 -make: „philosophy“ ist bereits aktuell. -cassini/home/peter/bo/2020ws/hp/20201217> diff --git a/20201217/pendulum-0.c b/20201217/pendulum-0.c deleted file mode 100644 index 6faebdc7ad779d89ab8e2eacd189240ace1fb406..0000000000000000000000000000000000000000 --- a/20201217/pendulum-0.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -int width = 320; -int height = 240; -int gap = height / 20; -int r = gap; -double visual_length = height - 2 * gap - r; - -double phi0 = -0.5; -double omega0 = 0.0; -double t0 = 0.0; -double g = 9.81; -double l = 1.0; -double dt = 0.02; - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - int x = width / 2 + visual_length * sin (phi); - int y = gap + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, width / 2, gap); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * sin (phi); - - gtk_widget_queue_draw_area (widget, 0, 0, width, height); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, width, height); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20201217/pendulum-1.c b/20201217/pendulum-1.c deleted file mode 100644 index 44f4c4fde79d96ed604882b0d5ce22a9035e1400..0000000000000000000000000000000000000000 --- a/20201217/pendulum-1.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * sin (phi); - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20201217/pendulum-2.c b/20201217/pendulum-2.c deleted file mode 100644 index 4fbad9a50cc595e92fbb1075dd01405a08e84001..0000000000000000000000000000000000000000 --- a/20201217/pendulum-2.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 }; - - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &orange); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * phi; - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20201217/pendulum-3.c b/20201217/pendulum-3.c deleted file mode 100644 index 35b0b67aeb0d11aa2a81aba204c97ca96504ad89..0000000000000000000000000000000000000000 --- a/20201217/pendulum-3.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi_with_sin = phi0; -double omega_with_sin= omega0; -double phi_without_sin = phi0; -double omega_without_sin= omega0; - -void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour) -{ - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, colour); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); -} - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 }; - GdkRGBA green = { 0.0, 0.5, 0.0, 1.0 }; - - double A = phi0; - double B = 0.5 * M_PI; /* 90° */ - double phi_analytic = A * sin (sqrt (g / l) * t + B); - - draw_pendulum (c, phi_with_sin, &blue); - draw_pendulum (c, phi_without_sin, &orange); - draw_pendulum (c, phi_analytic, &green); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi_with_sin += omega_with_sin * dt; - omega_with_sin += - dt * g / l * sin (phi_with_sin); - phi_without_sin += omega_without_sin * dt; - omega_without_sin += - dt * g / l * phi_without_sin; - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20201217/pendulum-4.c b/20201217/pendulum-4.c deleted file mode 100644 index 1a08e32735336064af72ce6f332299d14ff66218..0000000000000000000000000000000000000000 --- a/20201217/pendulum-4.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-5.0 / 180.0 * M_PI) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi_with_sin = phi0; -double omega_with_sin= omega0; -double phi_without_sin = phi0; -double omega_without_sin= omega0; - -void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour) -{ - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, colour); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); -} - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 }; - GdkRGBA green = { 0.0, 0.5, 0.0, 1.0 }; - - double A = phi0; - double B = 0.5 * M_PI; /* 90° */ - double phi_analytic = A * sin (sqrt (g / l) * t + B); - - draw_pendulum (c, phi_with_sin, &blue); - draw_pendulum (c, phi_without_sin, &orange); - draw_pendulum (c, phi_analytic, &green); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi_with_sin += omega_with_sin * dt; - omega_with_sin += - dt * g / l * sin (phi_with_sin); - phi_without_sin += omega_without_sin * dt; - omega_without_sin += - dt * g / l * phi_without_sin; - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20201217/pendulum.pdf b/20201217/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20201217/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20201217/pgscript.sty b/20201217/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20201217/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20201217/pgslides.sty b/20201217/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20201217/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20201217/philosophy.c b/20201217/philosophy.c deleted file mode 100644 index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000 --- a/20201217/philosophy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/20210107/Tower_of_Hanoi.jpeg b/20210107/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/20210107/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/20210107/aufgabe-1.c b/20210107/aufgabe-1.c deleted file mode 100644 index abbf364a3db17611e41d086591826e98a8a3672b..0000000000000000000000000000000000000000 --- a/20210107/aufgabe-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int fak (int n) -{ - if (n <= 0) - return 1; - else - return n * fak (n - 1); -} - -int main (void) -{ - for (int n = 0; n <= 5; n++) - printf ("%d\n", fak (n)); - return 0; -} diff --git a/20210107/aufgabe-2.c b/20210107/aufgabe-2.c deleted file mode 100644 index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000 --- a/20210107/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <string.h> - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} diff --git a/20210107/aufgabe-3.c b/20210107/aufgabe-3.c deleted file mode 100644 index 2bcd5e63a71f212b7243d1f7d9c92406d1e41e77..0000000000000000000000000000000000000000 --- a/20210107/aufgabe-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); -} diff --git a/20210107/bsort-1.c b/20210107/bsort-1.c deleted file mode 100644 index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000 --- a/20210107/bsort-1.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/bsort-1a.c b/20210107/bsort-1a.c deleted file mode 100644 index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000 --- a/20210107/bsort-1a.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/bsort-2.c b/20210107/bsort-2.c deleted file mode 100644 index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000 --- a/20210107/bsort-2.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/bsort-3.c b/20210107/bsort-3.c deleted file mode 100644 index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000 --- a/20210107/bsort-3.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int done = 0; - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0 && !done) - { - done = 1; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - done = 0; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/bsort-4.c b/20210107/bsort-4.c deleted file mode 100644 index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000 --- a/20210107/bsort-4.c +++ /dev/null @@ -1,57 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - int new_sorted = 0; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - new_sorted = i; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted = new_sorted; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/hanoi-0.c b/20210107/hanoi-0.c deleted file mode 100644 index 83b5f081e33e699f2d5eaa1f858320530e1b2820..0000000000000000000000000000000000000000 --- a/20210107/hanoi-0.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = 0; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20210107/hanoi-1.c b/20210107/hanoi-1.c deleted file mode 100644 index 6d005f0b12afa6086afb65e1794fb5c977b474e2..0000000000000000000000000000000000000000 --- a/20210107/hanoi-1.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = 4; - tower[0][0] = 4; - tower[0][1] = 3; - tower[0][2] = 2; - tower[0][3] = 1; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20210107/hanoi-2.c b/20210107/hanoi-2.c deleted file mode 100644 index c928c1130539da08d0882249bdffc877d72289b2..0000000000000000000000000000000000000000 --- a/20210107/hanoi-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20210107/hanoi-3.c b/20210107/hanoi-3.c deleted file mode 100644 index 4b59c046962c1f79eca315882d93faf6b6c298c1..0000000000000000000000000000000000000000 --- a/20210107/hanoi-3.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - move (2, 0, 1); - display (); - return 0; -} diff --git a/20210107/hanoi-4.c b/20210107/hanoi-4.c deleted file mode 100644 index 162a5ba7cccedf64bff8ae9a514aaf146088e3a4..0000000000000000000000000000000000000000 --- a/20210107/hanoi-4.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - move (0, 2, 1); - display (); - return 0; -} diff --git a/20210107/hanoi-5.c b/20210107/hanoi-5.c deleted file mode 100644 index e04ad85f63fe92e5c15d22646beb9e9107bf78d6..0000000000000000000000000000000000000000 --- a/20210107/hanoi-5.c +++ /dev/null @@ -1,45 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, 1); - return 0; -} diff --git a/20210107/hanoi-6.c b/20210107/hanoi-6.c deleted file mode 100644 index 1267605f802246e857c32d29cc0a132609cb24ce..0000000000000000000000000000000000000000 --- a/20210107/hanoi-6.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20210107/hanoi-7.c b/20210107/hanoi-7.c deleted file mode 100644 index f71fcdc0c3f66047ee3ad870d019a06eb328050f..0000000000000000000000000000000000000000 --- a/20210107/hanoi-7.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 5 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20210107/hanoi-8.c b/20210107/hanoi-8.c deleted file mode 100644 index 6d804063531d424a82924a89d85424c33994793b..0000000000000000000000000000000000000000 --- a/20210107/hanoi-8.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 64 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20210107/hanoi-9.c b/20210107/hanoi-9.c deleted file mode 100644 index 7694b373b7011e96f6be0ad0f00ba54b67086158..0000000000000000000000000000000000000000 --- a/20210107/hanoi-9.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 64 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - static int counter = 1; - if (counter++ >= 100000000) - { - display (); - counter = 1; - } - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - display (); - return 0; -} diff --git a/20210107/hanoi-9a.c b/20210107/hanoi-9a.c deleted file mode 100644 index 55e8d74db6d7284d6db225a6f8f3e08ab4efdc06..0000000000000000000000000000000000000000 --- a/20210107/hanoi-9a.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 32 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - static int counter = 1; - if (counter++ >= 100000000) - { - display (); - counter = 1; - } - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - display (); - return 0; -} diff --git a/20210107/hanoi.xcf.gz b/20210107/hanoi.xcf.gz deleted file mode 100644 index 77c7ad5d82486563f7ae1188a7de539f9bad3663..0000000000000000000000000000000000000000 Binary files a/20210107/hanoi.xcf.gz and /dev/null differ diff --git a/20210107/hp-20210107.pdf b/20210107/hp-20210107.pdf deleted file mode 100644 index 0503488856a9624499caa49b82e1a83ce6e35f04..0000000000000000000000000000000000000000 Binary files a/20210107/hp-20210107.pdf and /dev/null differ diff --git a/20210107/hp-20210107.tex b/20210107/hp-20210107.tex deleted file mode 100644 index 0e48bfed60b59e2731f579314252ee949a00019c..0000000000000000000000000000000000000000 --- a/20210107/hp-20210107.tex +++ /dev/null @@ -1,852 +0,0 @@ -% hp-20210107.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Rekursion, Aufwandsabschätzungen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{7.\ Januar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{medgreen} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{red} - \item[5.2] Rekursion - \item[5.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - -% \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} -% \pause - \item - Kein Semikolon! -% \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} -% \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} -% \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<1->{.}{:} -% \pause - \begin{onlyenv}<1> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-3cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<2> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿ - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \begin{onlyenv}<3-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs - gtk+-3.0) -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{picture}(0,0)(0.3,0.3) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}\qquad\strut}}} - \end{picture} - \end{onlyenv} - \pause - \pause - \item - Auf manchen Plattformen kommt es auf die Reihenfolge an: - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -O $(pkg-config --cflags gtk+-3.0) \ - hello-gtk.c $(pkg-config --libs gtk+-3.0) \ - -o hello-gtk¿ - \end{lstlisting} - (Backslash = "`Es geht in der nächsten Zeile weiter."') - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - -% \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} -% \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - -% \pause - \begin{picture}(0,0)(-0.07,0.2) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} -% \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} -% \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\section{Algorithmen} -\subsection{Differentialgleichungen} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{medgreen} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{red} - \item[5.2] Rekursion - \item[5.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\subsection{Rekursion} - -\begin{frame}[fragile] - - \showsubsection - - Vollständige Induktion: - \vspace*{-0.725cm} - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - \vspace*{-0.5cm} - - \pause - - Türme von Hanoi - - \begin{onlyenv}<2> - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - \end{center} - \end{onlyenv} - - \begin{onlyenv}<3-> - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, - \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\ - immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben\\ - auf größeren liegen. - \bigskip - \pause - \pause - \item - $n = 1$ Scheibe: fertig - \item - Wenn $n - 1$ Scheiben verschiebbar:\\ - schiebe $n - 1$ Scheiben auf Hilfsplatz,\\ - verschiebe die darunterliegende,\\ - hole $n - 1$ Scheiben von Hilfsplatz - \end{itemize} - \begin{onlyenv}<5> - \vspace{-4.3cm} - \begin{lstlisting}[gobble=8,xleftmargin=6.4cm] - void move (int from, int to, int disks) - { - if (disks == 1) - move_one_disk (from, to); - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<6-> - \vspace{-5.0cm} - \hspace*{7.4cm}\begin{minipage}[t]{5cm} - 32 Scheiben: - \begin{lstlisting}[gobble=10,style=terminal] - $ ¡time ./hanoi-9a¿ - ... - real 0m32,712s - user 0m32,708s - sys 0m0,000s - \end{lstlisting} - \pause[7] - \begin{itemize} - \arrowitem - etwas über 1 Minute\\ - für 64 Scheiben - \end{itemize} - \pause - \vspace*{-0.5cm} - \begin{picture}(0,0) - \color{red} - \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}} - \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}} - \end{picture} - - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{minipage} - \end{onlyenv} - \end{onlyenv} - -\end{frame} - -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - -% \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.6,-0.5){% - \begin{minipage}[t]{5.3cm} -% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} - \vspace*{-1.0cm}\alt<16->{\includegraphics{landau-symbols-3.pdf}}% - {\alt<15->{\includegraphics{landau-symbols-2.pdf}}% - {\includegraphics{landau-symbols.pdf}}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-\bigskipamount} - - Wann ist ein Programm "`schnell"'? - - \medskip - - \begin{onlyenv}<1-2> - Türme von Hanoi: $\mathcal{O}(2^n)$ - \par\medskip - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<2-> - Faustregel:\\Schachtelung der Schleifen zählen\\ - $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<3-13> - \textbf{Beispiel: Sortieralgorithmen} - - \smallskip - - Anzahl der Vergleiche bei $n$ Strings - \begin{itemize} - \item - Maximum suchen \pause[4]mit Schummeln\pause: $\mathcal{O}(1)$ - \pause - \item - Maximum suchen\pause: $\mathcal{O}(n)$ - \pause - \item - Selection-Sort\pause: $\mathcal{O}(n^2)$ - \pause - \item - Bubble-Sort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ - \pause - \item - Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$ - \end{itemize} - - \end{onlyenv} - - \begin{onlyenv}<14> - \textbf{Wie schnell ist RSA-Verschlüsselung?} - - \smallskip - - \begin{math} - c = m^e\,\%\,N - \end{math} - \quad - ("`$\%$"' = "`modulo"') - - \medskip - - \begin{lstlisting}[gobble=6,xleftmargin=2em] - int c = 1; - for (int i = 0; i < e; i++) - c = (c * m) % N; - \end{lstlisting} - - \smallskip - - \begin{itemize} - \item - $\mathcal{O}(e)$ Iterationen -% \item -% wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: -% $\mathcal{O}(2^n)$ Iterationen - \item - mit Trick: - $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) - \end{itemize} - - \smallskip - - Jede Iteration enthält eine Multiplikation und eine Division.\\ - Aufwand dafür: $\mathcal{O}(\log e)$\\ - \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ - - \end{onlyenv} - - \begin{onlyenv}<15-> - - \textbf{Wie schnell ist RSA?}\\ - - \smallskip - - ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) - - \begin{itemize} - \item - Ver- und Entschlüsselung (Exponentiation):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Schlüsselerzeugung (Berechnung von $d$):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Verschlüsselung brechen (Primfaktorzerlegung):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}} - \end{itemize} - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - - \end{onlyenv} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \item[5.1] Differentialgleichungen - \color{medgreen} - \item[5.2] Rekursion - \item[5.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\end{document} diff --git a/20210107/hp-musterloesung-20210107.pdf b/20210107/hp-musterloesung-20210107.pdf deleted file mode 100644 index c154a59ec11e00019d6653f8a309f770ce37a0e6..0000000000000000000000000000000000000000 Binary files a/20210107/hp-musterloesung-20210107.pdf and /dev/null differ diff --git a/20210107/hp-musterloesung-20210107.tex b/20210107/hp-musterloesung-20210107.tex deleted file mode 100644 index 2027ef6d209d940a82a925f8d8fee50f54ab0048..0000000000000000000000000000000000000000 --- a/20210107/hp-musterloesung-20210107.tex +++ /dev/null @@ -1,357 +0,0 @@ -% hp-musterloesung-20210107.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Fakultät, Länge von Strings (Neuauflage), Hexdumps - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gnuplot-lua-tikz} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 7.\ Januar 2021} - - \exercise{Fakultät} - - Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als: - \begin{eqnarray*} - 1 & \mbox{für} & n = 0, \\ - n \cdot (n-1)! & \mbox{für} & n > 0. - \end{eqnarray*} - - Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$. - - Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv} - (Datei: \gitfile{hp}{2020ws/20210107}{aufgabe-1.c}): - - \begin{lstlisting} - int fak (int n) - { - if (n <= 0) - return 1; - else - return n * fak (n - 1); - } - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion. - \points{3} - \item - Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{2} - \item - Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{3} - \end{enumerate} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.} - - Datei: \gitfile{hp}{2020ws/20210107}{loesung-1.c} - \begin{lstlisting}[gobble=8] - int fak (int n) - { - int f = 1; - for (int i = 2; i <= n; i++) - f *= i; - return f; - } - \end{lstlisting} - - \item[(b)] - \textbf{Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort.} - - In beiden Fällen werden $n$ Zahlen miteinander multipliziert -- - oder $n - 1$, wenn man Multiplikationen mit 1 ausspart. - In jedem Fall hängt die Anzahl der Multiplikationen - linear von $n$ ab; es sind $\mathcal{O}(n)$ Multiplikationen. - Insbesondere arbeiten also beide Versionen gleich schnell. - - \item[(c)] - \textbf{Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort.} - - Die iterative Version der Funktion benötigt 2 Variable vom Typ \lstinline{int}, - nämlich \lstinline{n} und \lstinline{f}. - Dies ist eine konstante Zahl; - der Speicherplatzverbrauch ist daher $\mathcal{O}(1)$. - - Die rekursive Version der Funktion erzeugt - jedesmal, wenn sie sich selbst aufruft, - eine zusätzliche Variable \lstinline{n}. - Es sind $n + 1$ Aufrufe; die Anzahl der Variablen \lstinline{n} - hängt linear von $n$ ab; der Speicherplatzverbrauch ist also $\mathcal{O}(n)$. - \end{itemize} - - \exercise{Länge von Strings} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 14.\ November 2019,\\ - ergänzt um die Teilaufgaben (f) und (g). - - \medskip - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{enumerate}[\quad(a)] - \item - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{enumerate} - - \goodbreak - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{2020ws/20210107}{aufgabe-2.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{enumerate}[\quad(a)]\setcounter{enumi}{3} - \item - Was bewirken die beiden Funktionen? - \points{2} - \item - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \item - Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. - \points{3} - \item - Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort. - \points{1} - \end{enumerate} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?} - - Ein String ist ein Array von \lstinline{char}s. - Nach den eigentlichen Zeichen des Strings enthält das Array - \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0, - nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung. - Die Länge eines Strings ist die Anzahl der Zeichen - \emph{vor\/} diesem Symbol. - - \item[(b)] - {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?} - - Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen; - das Null-Symbol, das das Ende markiert, zählt hier nicht mit) - und belegt Speicherplatz für 15 Zeichen - (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung). - - \item[(c)] - \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.} - - Siehe die Dateien \gitfile{hp}{2020ws/20210107}{loesung-2c-1.c} (mit Array-Index) - und \gitfile{hp}{2020ws/20210107}{loesung-2c-2.c} (mit Zeiger-Arithmetik). - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"} - kann normalerweise ignoriert werden; - auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()} - beim Linken Vorrang vor der selbstgeschriebenen, - so daß die selbstgeschriebene Funktion nie aufgerufen wird. - In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion - anders zu nennen (z.\,B.\ \lstinline{my_strlen()}). - - \item[(d)] - \textbf{Was bewirken die beiden Funktionen?} - - Beide addieren die Zahlenwerte der im String enthaltenen Zeichen - und geben die Summe als Funktionsergebnis zurück. - - Im Falle des Test-Strings \lstinline{"Hello, world!\n"} - lautet der Rückgabewert 1171 (siehe \gitfile{hp}{2020ws/20210107}{loesung-2d-1.c} und \gitfile{hp}{2020ws/20210107}{loesung-2d-2.c}). - - \item[(e)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()}, - nur effizienter.} - - Die Funktion wird effizienter, - wenn man auf den Aufruf von \lstinline{strlen()} verzichtet - und stattdessen die Ende-Prüfung in derselben Schleife vornimmt, - in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert. - - Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{2020ws/20210107}{loesung-2e-1.c} - realisiert dies mit einem Array-Index, - Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{2020ws/20210107}{loesung-2e-2.c} - mit Zeiger-Arithmetik. - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - \textbf{Bemerkung:} Die effizientere Version der Funktion - arbeitet doppelt so schnell wie die ursprüngliche, - hat aber ebenfalls die Ordnung $\mathcal{O}(n)$ -- siehe unten. - - \item[(f)] - \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.} - - Vorüberlegung: \lstinline{strlen()} greift in einer Schleife - auf alle Zeichen des Strings der Länge $n$ zu, - hat also $\mathcal{O}(n)$. - - \lstinline{fun_1()} ruft in jedem Schleifendurchlauf - (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf - und greift anschließend auf ein Zeichen des Strings zu, - hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$. - - \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf - und greift anschließend in einer Schleife auf alle Zeichen des Strings zu, - hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$. - - \item[(g)] - \textbf{Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort.} - - In beiden o.\,a.\ Lösungsvarianten - -- \gitfile{hp}{2020ws/20210107}{loesung-2e-1.c} - und \gitfile{hp}{2020ws/20210107}{loesung-2e-2.c} -- - arbeitet die Funktion mit einer einzigen Schleife, - die gleichzeitig die Zahlenwerte addiert und das Ende des Strings sucht. - - Mit jeweils einer einzigen Schleife - haben beide Funktionen die Ordnung $\mathcal{O}(n)$. - - \end{itemize} - - \exercise{Hexdumps} - - Das folgende Programm (\gitfile{hp}{2020ws/20210107}{aufgabe-2.c}) liest - einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus. - (Anders als z.\,B.\ \lstinline{scanf()} - akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen, - und sie vermeidet Pufferüberläufe.) - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int main (void) - { - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); - } - \end{lstlisting} - Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.} - erscheint die Ausgabe\\ - \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}. - - Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt, - also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt. - - \points{6} - - Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend. - - \solution - - Siehe \gitfile{hp}{2020ws/20210107}{loesung-2.c}. - - Das Programm macht mehrfach davon Gebrauch, - daß in C Zeichen und Zahlen äquivalent sind. - Wenn z.\,B.\ die \lstinline{char}-Variable \lstinline{c} - den Wert \lstinline{'3'} (Ziffer 3) enthält, - dann hat der Ausdruck \lstinline{c - '0'} den Wert \lstinline{3} (Zahlenwert 3). - Hierfür ist es insbesondere nicht nötig, vorauszusetzen, - daß wir den ASCII-Zeichensatz verwenden und \lstinline{'0'} - den Wert \lstinline{48} hat. - - Bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - gibt das Programm zusätzlich eine Leerzeile aus. - Die liegt daran, daß das \lstinline[style=cmd]{0a} am Ende - bereits eine Zeilenschaltung enthält und das Programm mit - \lstinline{printf ("\n")} eine zusätzliche Zeilenschaltung ausgibt. - -\end{document} diff --git a/20210107/hp-uebung-20210107.pdf b/20210107/hp-uebung-20210107.pdf deleted file mode 100644 index 068a5c491dd2622ecc9223c9fc0cf9ffed8fd762..0000000000000000000000000000000000000000 Binary files a/20210107/hp-uebung-20210107.pdf and /dev/null differ diff --git a/20210107/hp-uebung-20210107.tex b/20210107/hp-uebung-20210107.tex deleted file mode 100644 index 3e06f4d7420fa1182fce1741aa6bf718df3c7ce5..0000000000000000000000000000000000000000 --- a/20210107/hp-uebung-20210107.tex +++ /dev/null @@ -1,203 +0,0 @@ -% hp-uebung-20210107.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Fakultät, Länge von Strings (Neuauflage), Hexdumps - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 7.\ Januar 2021} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 85 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 15 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Fakultät} - - Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als: - \begin{eqnarray*} - 1 & \mbox{für} & n = 0, \\ - n \cdot (n-1)! & \mbox{für} & n > 0. - \end{eqnarray*} - - Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$. - - Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv} - (Datei: \gitfile{hp}{2020ws/20210107}{aufgabe-1.c}): - - \begin{lstlisting} - int fak (int n) - { - if (n <= 0) - return 1; - else - return n * fak (n - 1); - } - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion. - \points{3} - \item - Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{2} - \item - Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{3} - \end{enumerate} - - \exercise{Länge von Strings} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 10.\ Dezember 2020,\\ - ergänzt um die Teilaufgaben (f) und (g). - - \medskip - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{enumerate}[\quad(a)] - \item - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{enumerate} - - \goodbreak - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{2020ws/20210107}{aufgabe-2.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{enumerate}[\quad(a)]\setcounter{enumi}{3} - \item - Was bewirken die beiden Funktionen? - \points{2} - \item - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \item - Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. - \points{3} - \item - Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort. - \points{1} - \end{enumerate} - - \exercise{Hexdumps} - - Das folgende Programm (\gitfile{hp}{2020ws/20210107}{aufgabe-3.c}) liest - einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus. - (Anders als z.\,B.\ \lstinline{scanf()} - akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen, - und sie vermeidet Pufferüberläufe.) - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int main (void) - { - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); - } - \end{lstlisting} - Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.} - erscheint die Ausgabe\\ - \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}. - - Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt, - also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt. - - \points{6} - - Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend. - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20210107/landau-symbols-2.pdf b/20210107/landau-symbols-2.pdf deleted file mode 120000 index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000 --- a/20210107/landau-symbols-2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20210107/landau-symbols-3.pdf b/20210107/landau-symbols-3.pdf deleted file mode 120000 index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000 --- a/20210107/landau-symbols-3.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20210107/landau-symbols.pdf b/20210107/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20210107/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20210107/loesung-1.c b/20210107/loesung-1.c deleted file mode 100644 index c2d6f6003924627ae97831407c191eaac42a09c1..0000000000000000000000000000000000000000 --- a/20210107/loesung-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int fak (int n) -{ - int f = 1; - for (int i = 2; i <= n; i++) - f *= i; - return f; -} - -int main (void) -{ - for (int n = 0; n <= 5; n++) - printf ("%d\n", fak (n)); - return 0; -} diff --git a/20210107/loesung-2c-1.c b/20210107/loesung-2c-1.c deleted file mode 100644 index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000 --- a/20210107/loesung-2c-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-2c-2.c b/20210107/loesung-2c-2.c deleted file mode 100644 index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000 --- a/20210107/loesung-2c-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-2d-1.c b/20210107/loesung-2d-1.c deleted file mode 100644 index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000 --- a/20210107/loesung-2d-1.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-2d-2.c b/20210107/loesung-2d-2.c deleted file mode 100644 index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000 --- a/20210107/loesung-2d-2.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-2e-1.c b/20210107/loesung-2e-1.c deleted file mode 100644 index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000 --- a/20210107/loesung-2e-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_3 (char *s) -{ - int i = 0, x = 0; - while (s[i]) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_3 ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-2e-2.c b/20210107/loesung-2e-2.c deleted file mode 100644 index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000 --- a/20210107/loesung-2e-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_4 (char *s) -{ - int x = 0; - while (*s) - x += *s++; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_4 ("Hello, world!\n")); - return 0; -} diff --git a/20210107/loesung-3.c b/20210107/loesung-3.c deleted file mode 100644 index 872058ac9fecdcb59ac1104ca67841cb3dc974a9..0000000000000000000000000000000000000000 --- a/20210107/loesung-3.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -int read_hex (char c) -{ - if (c >= '0' && c <= '9') - return c - '0'; - else if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - else if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - else - { - fprintf (stderr, "invalid hex digit '%c'\n", c); - return 0; - } -} - -int main (void) -{ - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; p[0] && p[1]; p += 2) - { - char c = 16 * read_hex (p[0]) + read_hex (p[1]); - printf ("%c", c); - } - printf ("\n"); -} diff --git a/20210107/loesung-3d-0f.c b/20210107/loesung-3d-0f.c deleted file mode 100644 index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000 --- a/20210107/loesung-3d-0f.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210107/loesung-3d-1.c b/20210107/loesung-3d-1.c deleted file mode 100644 index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000 --- a/20210107/loesung-3d-1.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210107/loesung-3d-2.c b/20210107/loesung-3d-2.c deleted file mode 100644 index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000 --- a/20210107/loesung-3d-2.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210107/loesung-3e.c b/20210107/loesung-3e.c deleted file mode 100644 index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000 --- a/20210107/loesung-3e.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - duck.b.type = WITH_WINGS; - duck.b.name = "duck"; - duck.w.wings = 2; - - animal cow; - a[1] = &cow; - cow.b.type = WITH_LEGS; - cow.b.name = "cow"; - cow.l.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210107/loesung-3f.c b/20210107/loesung-3f.c deleted file mode 100644 index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000 --- a/20210107/loesung-3f.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210107/loesung-3g.c b/20210107/loesung-3g.c deleted file mode 100644 index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000 --- a/20210107/loesung-3g.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -union animal; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); -} base; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int legs; -} with_legs; - -typedef union animal -{ - base b; - with_wings w; - with_legs l; -} animal; - -void print_with_wings (animal *this) -{ - printf ("A %s has %d wings.\n", this->b.name, this->w.wings); -} - -void print_with_legs (animal *this) -{ - printf ("A %s has %d legs.\n", this->b.name, this->l.legs); -} - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->b.print = print_with_wings; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->b.print = print_with_legs; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - for (int i = 0; i < 2; i++) - a[i]->b.print (a[i]); - return 0; -} diff --git a/20210107/logo-hochschule-bochum-cvh-text-v2.pdf b/20210107/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210107/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210107/logo-hochschule-bochum.pdf b/20210107/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210107/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210107/pendulum.pdf b/20210107/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20210107/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20210107/pgscript.sty b/20210107/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210107/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210107/pgslides.sty b/20210107/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210107/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210107/qsort-1.c b/20210107/qsort-1.c deleted file mode 100644 index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000 --- a/20210107/qsort-1.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20210107/qsort-1a.c b/20210107/qsort-1a.c deleted file mode 100644 index a3d4d0011834aa3d85907c2a0d0e90e3bf80799e..0000000000000000000000000000000000000000 --- a/20210107/qsort-1a.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2 - 1; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20210107/qsort-2.c b/20210107/qsort-2.c deleted file mode 100644 index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000 --- a/20210107/qsort-2.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20210107/qsort-3.c b/20210107/qsort-3.c deleted file mode 100644 index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000 --- a/20210107/qsort-3.c +++ /dev/null @@ -1,74 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (r > left) - quicksort (name, left, r); - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20210107/sort-0.c b/20210107/sort-0.c deleted file mode 100644 index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000 --- a/20210107/sort-0.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int find_first (char **name) -{ - return 2; -} - -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); - printf ("%s\n", name[first]); - return 0; -} diff --git a/20210107/sort-1.c b/20210107/sort-1.c deleted file mode 100644 index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000 --- a/20210107/sort-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (strcmp (name[i], name[first]) < 0) - first = 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 }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/20210107/sort-2.c b/20210107/sort-2.c deleted file mode 100644 index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000 --- a/20210107/sort-2.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = 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 }; - int first = find_first (name); - display (name, first, -1); - return 0; -} diff --git a/20210107/sort-3.c b/20210107/sort-3.c deleted file mode 100644 index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000 --- a/20210107/sort-3.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = 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 }; - int first = find_first (name, 0); - display (name, first, -1); - return 0; -} diff --git a/20210107/sort-4.c b/20210107/sort-4.c deleted file mode 100644 index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000 --- a/20210107/sort-4.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/sort-5.c b/20210107/sort-5.c deleted file mode 100644 index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000 --- a/20210107/sort-5.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/sort-6.c b/20210107/sort-6.c deleted file mode 100644 index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000 --- a/20210107/sort-6.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; -// display (name, left, right); -// usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210107/sort-7.c b/20210107/sort-7.c deleted file mode 100644 index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000 --- a/20210107/sort-7.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = sorted; - for (int i = sorted + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20210114/400_points_breadboard.jpg b/20210114/400_points_breadboard.jpg deleted file mode 100644 index 8ba048255851581a84db16c4d5a50802f7521486..0000000000000000000000000000000000000000 Binary files a/20210114/400_points_breadboard.jpg and /dev/null differ diff --git a/20210114/Makefile b/20210114/Makefile deleted file mode 100644 index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000 --- a/20210114/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -%.elf: %.c - avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ - -%.hex: %.elf - avr-objcopy -O ihex $< $@ - -download: - ./download.sh diff --git a/20210114/Tower_of_Hanoi.jpeg b/20210114/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/20210114/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/20210114/aufgabe-2.c b/20210114/aufgabe-2.c deleted file mode 100644 index 1afa7b1260506cb307aff5f929c6357c7bdcb708..0000000000000000000000000000000000000000 --- a/20210114/aufgabe-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; -} diff --git a/20210114/aufgabe-3.c b/20210114/aufgabe-3.c deleted file mode 100644 index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000 --- a/20210114/aufgabe-3.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/20210114/bit-operations.txt b/20210114/bit-operations.txt deleted file mode 100644 index 72160be53e7c5ae912714d2d9cb709747536f6f7..0000000000000000000000000000000000000000 --- a/20210114/bit-operations.txt +++ /dev/null @@ -1,78 +0,0 @@ -a = 0100 1111 Bit Nr. 4 auf 1 setzen - ^ - 0100 1111 - | 0001 0000 bitweise Oder-Verknüpfung mit Bit-Maske - --------- ~~~~~ - 0101 1111 b = a | mask; - -a = 0100 1111 Bit Nr. 4 auf 0 setzen - & 1110 1111 bitweise Und-Verknüpfung mit Bit-Maske - --------- ~~~~~ - 0100 1111 b = a & mask; - - a = a & mask; - a &= mask; - -a = 0100 1111 Bit Nr. 6 auf 0 setzen - & 1011 1111 bitweise Und-Verknüpfung mit Bit-Maske - --------- ~~~~~ - 0000 1111 a &= mask; - -Woher bekomme ich die Maske? - - Verschiebe-Operationen: - 1001 0010 << 2 = 0100 1000 (Die 1 ganz links wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.) - 1001 0010 >> 2 = 0010 0100 (Die 1 rechts wurde aus der 8-Bit-Zahl herausgeschoben und geht verloren.) - - Zahl << 3 = Zahl * 2 hoch 3 = Zahl * 8 - - Was wurde herausgeschoben? - - 1001 0010 >> 2 - ~~ - = 1001 0010 - & 0000 0011 Maske für die 2 Bits, die gleich herausgeschoben werden - --------- - 0000 0010 Wert ermittelt, der durch ">> 2" verloren gehen wird - -Bei Bitverschiebungen schiebt man normalerweise Nullen hinein. -Ausnahme: negative Zahlen (int) nach rechts schieben --> mit Einsen aufgefüllt - (in der Praxis eher unüblich) - -Daher verwendet man für Bit-Operationen normalerweise vorzeichenlose Variablen (unsigned) -anstelle von vorzeichenbehafteten (int) - -Maske bauen: 1 << Nr. des Bits - -a = 0100 1111 Bit Nr. 4 auf 1 setzen - ^ - 0100 1111 - | 0001 0000 Maske = 1 << 4 - --------- - 0101 1111 a |= 1 << 4; - -a = 0100 1111 Bit Nr. 6 auf 0 setzen - & 1011 1111 Maske = ~(1 << 6) - --------- - 0000 1111 a &= ~(1 << 6); - -a = 0100 1111 Zweites Bit von links auf 0 setzen - & 1011 1111 Maske = ~(0x80 >> (2 - 1)) - --------- - 0000 1111 a &= ~(0x80 >> 1); - -Exklusiv-Oder - -a = 0100 1111 Bit Nr. 4 umklappen - ^ - 0100 1111 - ^ 0001 0000 Maske = 1 << 4 - --------- - 0101 1111 a ^= 1 << 4; - -a = 0100 1111 Bit Nr. 6 umklappen - ^ - 0100 1111 - ^ 0100 0000 Maske = 1 << 6 - --------- - 0000 1111 a ^= 1 << 6; diff --git a/20210114/blink-0.c b/20210114/blink-0.c deleted file mode 100644 index eebbd9e5380e1d38a7e04def7099db9d56cf7770..0000000000000000000000000000000000000000 --- a/20210114/blink-0.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210114/blink-0.hex b/20210114/blink-0.hex deleted file mode 100644 index 4a3ecbb32f186d6c742777b223473148e1cef0a4..0000000000000000000000000000000000000000 --- a/20210114/blink-0.hex +++ /dev/null @@ -1,10 +0,0 @@ -:100000000C9434000C943E000C943E000C943E0082 -:100010000C943E000C943E000C943E000C943E0068 -:100020000C943E000C943E000C943E000C943E0058 -:100030000C943E000C943E000C943E000C943E0048 -:100040000C943E000C943E000C943E000C943E0038 -:100050000C943E000C943E000C943E000C943E0028 -:100060000C943E000C943E0011241FBECFEFD8E04C -:10007000DEBFCDBF0E9440000C9445000C940000F0 -:0E0080008CE78AB980E48BB9FFCFF894FFCFEC -:00000001FF diff --git a/20210114/blink-0a.c b/20210114/blink-0a.c deleted file mode 100644 index 569e7c5b9160c1fe750f1b34492dec99ef814012..0000000000000000000000000000000000000000 --- a/20210114/blink-0a.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - PORTD = 0x41; /* binär: 0100 0001 */ - while (1); - return 0; -} diff --git a/20210114/blink-0b.c b/20210114/blink-0b.c deleted file mode 100644 index 1f9ee2b0d4bd483103e56c571180f6e50f11dba9..0000000000000000000000000000000000000000 --- a/20210114/blink-0b.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - _delay_ms (1); - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210114/blink-0c.c b/20210114/blink-0c.c deleted file mode 100644 index 28fe2e148c88fa68547d55e5ba025a70c5ea42ae..0000000000000000000000000000000000000000 --- a/20210114/blink-0c.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7d; /* binär: 0111 1101 */ - _delay_ms (1); - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210114/blink-1.c b/20210114/blink-1.c deleted file mode 100644 index 1b1b89bfc8426b37c6c10e6dd4583c53604d28e1..0000000000000000000000000000000000000000 --- a/20210114/blink-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; - PORTD |= 0x40; - while (1) - { - _delay_ms (500); - PORTD &= ~0x40; - _delay_ms (500); - PORTD |= 0x40; - } - return 0; -} diff --git a/20210114/blink-2.c b/20210114/blink-2.c deleted file mode 100644 index 008bfd0c34ba4943318bb1aa1389cd6c96303f27..0000000000000000000000000000000000000000 --- a/20210114/blink-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; - PORTD = 0x40; - while (1) - { - _delay_ms (250); - PORTD ^= 0x40; - } - return 0; -} diff --git a/20210114/blink-3.c b/20210114/blink-3.c deleted file mode 100644 index 590b6197d1f070e58b01354970410c217c5e3228..0000000000000000000000000000000000000000 --- a/20210114/blink-3.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; - PORTD = 0x40; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x40; - _delay_ms (200); - } - return 0; -} diff --git a/20210114/blink-3a.c b/20210114/blink-3a.c deleted file mode 100644 index 388ed658bb7494d5483f311908a1251892aef196..0000000000000000000000000000000000000000 --- a/20210114/blink-3a.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - PORTD = 0x42; /* binär: 0100 0010: PORT für Input für 1 setzen = internen Pull-Up-Widerstand aktivieren */ - while (1) - { - while ((PIND & 0x02) == 0) /* binär: 0000 0010 */ - ; /* just wait */ - PORTD ^= 0x40; - _delay_ms (200); - } - return 0; -} diff --git a/20210114/blink-3c.c b/20210114/blink-3c.c deleted file mode 100644 index d978187a6dd73fb489ef5a231c92032405715aa7..0000000000000000000000000000000000000000 --- a/20210114/blink-3c.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - PORTD = 0xc0; /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */ - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x40; - _delay_ms (200); - } - return 0; -} diff --git a/20210114/blink-3d.c b/20210114/blink-3d.c deleted file mode 100644 index 7940918580dac53ea5ca7cb717062a6a2e4fc4d9..0000000000000000000000000000000000000000 --- a/20210114/blink-3d.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x7c; /* binär: 0111 1100 */ - PORTD = 0xc0; /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */ - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x80; - _delay_ms (200); - } - return 0; -} diff --git a/20210114/blink-3e.c b/20210114/blink-3e.c deleted file mode 100644 index 20dd315377a479c739502993dcb88b28015e9ebc..0000000000000000000000000000000000000000 --- a/20210114/blink-3e.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0xfc; /* binär: 1111 1100 */ - PORTD = 0xc0; /* 0x40 = 0100 0000; 0xc0 = 1100 0000 */ - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x80; - _delay_ms (200); - } - return 0; -} diff --git a/20210114/download.sh b/20210114/download.sh deleted file mode 100755 index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000 --- a/20210114/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -port=$(ls -rt /dev/ttyACM* | tail -1) -echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) -avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20210114/hp-2020ws-p3.pdf b/20210114/hp-2020ws-p3.pdf deleted file mode 100644 index 95e1f2fb877e9e32d0f8d5709938bd291ae1ca09..0000000000000000000000000000000000000000 Binary files a/20210114/hp-2020ws-p3.pdf and /dev/null differ diff --git a/20210114/hp-2020ws-p3.tex b/20210114/hp-2020ws-p3.tex deleted file mode 100644 index 42026861efdff7a93709aefd072eff2704db654d..0000000000000000000000000000000000000000 --- a/20210114/hp-2020ws-p3.tex +++ /dev/null @@ -1,195 +0,0 @@ -% hp-2020ws-p3.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 3: Druckknopfampel - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{amsmath} -\usepackage{sfmath} - -\sloppy -\raggedcolumns -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC BY-SA (Version 4.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 2: Druckknopfampel} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2020/21\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Programmieren Sie in C einen Mikrocontroller so, - daß er eine Druckknopfampel steuern kann. - - \begin{multicols}{2} - - \begin{itemize} - \item - Normalerweise zeigt eine Druckknopfampel rotes Licht für die - Fußgänger und grünes Licht für die Straße. - \item - Nach Knopfdruck wechselt die Straße über Gelb nach Rot. - Danach bekommen die Fußgänger Grün. - Nach einer gewissen Zeit bekommen die Fußgänger wieder Rot, - und die Straße wechselt über Rot-Gelb wieder zu Grün. - - \medskip - \item - Als Mikrocontroller-Entwicklungsplattform eignet sich u.\,a.\ - ein \emph{Arduino Uno\/}. \textbf{Wenn Sie keinen Zugang zu einer - geeigneten Mi\-kro\-con\-trol\-ler-Ent\-wick\-lungs\-platt\-form haben, - sprechen Sie uns an.} - \item - Software-Entwiklung für den Arduino geschieht üblicherweise - mit Hilfe der Entwicklungswerkzeuge \emph{GCC, binutils und - glibc für AVR} sowie \emph{avrdude\/} für das Herunterladen - des geschriebenen Programms vom PC auf den Mikrocontroller. - - Die Arduino-Entwicklungsumgebung (siehe z.\,B.\ - \url{https://www.arduino.cc/en/Main/Software}) integriert - alle diese Komponenten. - \item - Wir schreiben unser Programm \textbf{in C und nicht in der INO-Sprache}. - Wenn die Quelltext-Dateien in der Arduino-Entwicklungsumgebung - die Endung \file{.ino} haben, ist das kein Problem, - sofern der Inhalt der Datei in C geschrieben ist. - \item - Den Schaltplan des Arduino Uno sowie das Datenblatt des - ATmega328p finden Sie per Web-Recherche. - - \columnbreak - - \item - Sie können Ihr Programm direkt aus der Arduino-Entwicklungsumgebung heraus - compilieren und auf den Mikrocontroller herunterladen. - Wenn Sie dies von der Kommandozeile aus machen möchten, - geht dies folgendermaßen: - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p \}\\ - \lstinline[style=cmd]{dateiname.c -o dateiname.elf} - - \lstinline[style=cmd]{avr-objcopy -O ihex \}\\ - \lstinline[style=cmd]{dateiname-4.elf dateiname-4.hex} - - \lstinline[style=cmd]{avrdude -P /dev/ttyACM0 -c arduino \}\\ - \lstinline[style=cmd]{-p m328p -U flash:w:dateiname.hex} - - Bei Zugriffsproblemen auf die Schnittstelle - (hier: \lstinline[style=terminal]{/dev/ttyACM0}) fügen Sie Ihr - Benutzerkonto der entsprechenden Gruppe hinzu (normalerweise: - \lstinline[style=terminal]{dialout}). - - Notfalls: \lstinline[style=cmd]{sudo chmod 666 /dev/ttyACM0} - - \medskip - \item - Die Verdrahtung erfolgt üblicherweise auf einer Steckplatine - -- siehe Abb.~\ref{Steckplatine}. - Die mit roten und blauen Streifen markierten Lochreihen sind - in Längsrichtung elektrisch verbunden, alle anderen in - Querrichtung mit einer Trennung in der Mitte. Üblicherweise - verwendet man die Längsrichtung für die Stromversorgung: Rot - = Versorgungsspannung, Blau = 0\,V. - \item - LEDs sind keine Glühlampen! Sie haben einen Pluspol (länger) - und einen Minuspol (kürzer, Gehäuse abgeflacht), und sie dürfen - \textbf{nur mit Vorwiderstand} betrieben werden, - andernfalls besteht die Gefahr einer Zerstörung der LED - und/oder des Arduino. - \item - Anstelle eines Drucktasters kann man auch ein Stück Draht verwenden. - \item - \textbf{Abgabe:} - Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte - per E-Mail an \file{peter.gerwinski@hs-bochum.de} - mit dem \textbf{Betreff:} \lstinline[style=terminal]{PaoJ6nae} - unter Angabe von Name, Matrikel-Nummer, - Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS). - - \end{itemize} - - \vspace*{-\medskipamount} - - \strut\hfill\emph{Viel Erfolg!}\\[-3.5cm] - - \end{multicols} - - \vspace*{-5\bigskipamount} - - \begin{figure}[h] - \begin{minipage}{7.3cm} - \includegraphics[width=8cm]{400_points_breadboard.jpg} - \vspace*{-1cm} - \caption{Steckplatine\label{Steckplatine}\hspace*{1.2cm}} - \vspace*{1cm} - \end{minipage}% - \begin{picture}(0,0) - \put(-1.6,0.0){\makebox(0,0)[tl]{% - \begin{minipage}{9cm} - \small\raggedright - \vspace*{1cm} - Bildquelle: - \href{https://commons.wikimedia.org/wiki/File:400_points_breadboard.jpg}% - {\nolinkurl{https://commons.wikimedia.org/}\\ - \nolinkurl{wiki/File:400_points_breadboard.jpg}}\\ - Autor: \url{https://www.flickr.com/people/33504192@N00}\\ - Lizenz: CC-BY-SA 2.0 Generic - \end{minipage}}} - \end{picture} - \end{figure} - - \vspace*{-1.5\bigskipamount} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 14.\ Januar 2021 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019, 2021\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20210114/hp-20210114.pdf b/20210114/hp-20210114.pdf deleted file mode 100644 index 4c5f6beafed5f1166fdb79405c8a180115978dfb..0000000000000000000000000000000000000000 Binary files a/20210114/hp-20210114.pdf and /dev/null differ diff --git a/20210114/hp-20210114.tex b/20210114/hp-20210114.tex deleted file mode 100644 index 6b5b28769da539ce5f220a8938da7dad16b86e32..0000000000000000000000000000000000000000 --- a/20210114/hp-20210114.tex +++ /dev/null @@ -1,762 +0,0 @@ -% hp-20210114.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Hardwarenahe Programmierung: Bit-Operationen, I/O-Ports - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{14.\ Januar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \item[4.1] Differentialgleichungen - \color{medgreen} - \item[4.2] Rekursion - \item[4.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{black} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Algorithmen} -\subsection{Differentialgleichungen} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -- Schräger Wurf - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% -% \only<1>{\hspace*{9.49cm}}\strut - \only<1->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<1> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<1->{= \int v_{0x}\,dt} - \visible<1->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<1->{= \int v_{0y} - g\cdot t\,dt} - \visible<1->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<1->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<1->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<2-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - -% \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\subsection{Rekursion} - -\begin{frame}[fragile] - - \showsubsection - - Vollständige Induktion: - \vspace*{-0.725cm} - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - \vspace*{-0.5cm} - -% \pause - - Türme von Hanoi - -% \begin{onlyenv}<1> -% \begin{center} -% \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} -% \end{center} -% \end{onlyenv} - - \begin{onlyenv}<1-> - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, - \only<1>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\ - immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben\\ - auf größeren liegen. - \bigskip -% \pause -% \pause - \item - $n = 1$ Scheibe: fertig - \item - Wenn $n - 1$ Scheiben verschiebbar:\\ - schiebe $n - 1$ Scheiben auf Hilfsplatz,\\ - verschiebe die darunterliegende,\\ - hole $n - 1$ Scheiben von Hilfsplatz - \end{itemize} - \begin{onlyenv}<2> - \vspace{-4.3cm} - \begin{lstlisting}[gobble=8,xleftmargin=6.4cm] - void move (int from, int to, int disks) - { - if (disks == 1) - move_one_disk (from, to); - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3-> - \vspace{-5.0cm} - \hspace*{7.4cm}\begin{minipage}[t]{5cm} - 32 Scheiben: - \begin{lstlisting}[gobble=10,style=terminal] - $ ¡time ./hanoi-9a¿ - ... - real 0m32,712s - user 0m32,708s - sys 0m0,000s - \end{lstlisting} -% \pause[7] - \begin{itemize} - \arrowitem - etwas über 1 Minute\\ - für 64 Scheiben - \end{itemize} -% \pause - \vspace*{-0.5cm} - \begin{picture}(0,0) - \color{red} - \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}} - \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}} - \end{picture} - - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{minipage} - \end{onlyenv} - \end{onlyenv} - -\end{frame} - -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - -% \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.6,-0.5){% - \begin{minipage}[t]{5.3cm} -% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} - \vspace*{-1.0cm}\alt<16->{\includegraphics{landau-symbols-3.pdf}}% - {\alt<15->{\includegraphics{landau-symbols-2.pdf}}% - {\includegraphics{landau-symbols.pdf}}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-\bigskipamount} - - Wann ist ein Programm "`schnell"'? - - \medskip - - \begin{onlyenv}<1-2> - Türme von Hanoi: $\mathcal{O}(2^n)$ - \par\medskip - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<2-> - Faustregel:\\Schachtelung der Schleifen zählen\\ - $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<3-13> - \textbf{Beispiel: Sortieralgorithmen} - - \smallskip - - Anzahl der Vergleiche bei $n$ Strings - \begin{itemize} - \item - Maximum suchen \pause[4]mit Schummeln\pause: $\mathcal{O}(1)$ - \pause - \item - Maximum suchen\pause: $\mathcal{O}(n)$ - \pause - \item - Selection-Sort\pause: $\mathcal{O}(n^2)$ - \pause - \item - Bubble-Sort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ - \pause - \item - Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$ - \end{itemize} - - \end{onlyenv} - - \begin{onlyenv}<14> - \textbf{Wie schnell ist RSA-Verschlüsselung?} - - \smallskip - - \begin{math} - c = m^e\,\%\,N - \end{math} - \quad - ("`$\%$"' = "`modulo"') - - \medskip - - \begin{lstlisting}[gobble=6,xleftmargin=2em] - int c = 1; - for (int i = 0; i < e; i++) - c = (c * m) % N; - \end{lstlisting} - - \smallskip - - \begin{itemize} - \item - $\mathcal{O}(e)$ Iterationen -% \item -% wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: -% $\mathcal{O}(2^n)$ Iterationen - \item - mit Trick: - $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) - \end{itemize} - - \smallskip - - Jede Iteration enthält eine Multiplikation und eine Division.\\ - Aufwand dafür: $\mathcal{O}(\log e)$\\ - \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ - - \end{onlyenv} - - \begin{onlyenv}<15-> - - \textbf{Wie schnell ist RSA?}\\ - - \smallskip - - ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) - - \begin{itemize} - \item - Ver- und Entschlüsselung (Exponentiation):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Schlüsselerzeugung (Berechnung von $d$):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Verschlüsselung brechen (Primfaktorzerlegung):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss} - \only<16->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}} - \end{itemize} - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - - \end{onlyenv} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \item[4.1] Differentialgleichungen - \color{medgreen} - \item[4.2] Rekursion - \item[4.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{black} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}5.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\end{document} diff --git a/20210114/hp-musterloesung-20210114.pdf b/20210114/hp-musterloesung-20210114.pdf deleted file mode 100644 index c154a59ec11e00019d6653f8a309f770ce37a0e6..0000000000000000000000000000000000000000 Binary files a/20210114/hp-musterloesung-20210114.pdf and /dev/null differ diff --git a/20210114/hp-musterloesung-20210114.tex b/20210114/hp-musterloesung-20210114.tex deleted file mode 100644 index cb7514e9303ffa538c78d1a9ca7bc5efc8e9b141..0000000000000000000000000000000000000000 --- a/20210114/hp-musterloesung-20210114.tex +++ /dev/null @@ -1,392 +0,0 @@ -% hp-musterloesung-20210114.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Zahlensysteme, Mikrocontroller - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gnuplot-lua-tikz} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 14.\ Januar 2021} - - \exercise{Zahlensysteme} - - Wandeln Sie ohne Hilfsmittel - - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - 0010\,0000$_2$ - \item[(b)] - 42$_{16}$ - \item[(c)] - 17$_8$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - 0010\,0000$_2$ - \item[(e)] - 42$_{10}$ - \item[(f)] - 192.168.20.254$_{256}$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - 750$_8$ - \item[(h)] - 42$_{10}$ - \item[(i)] - AFFE$_{16}$ - \end{itemize} - \end{itemize} - \end{minipage} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - 750$_8$ \& 666$_8$ - \item[(k)] - A380$_{16}$ + B747$_{16}$ - \item[(l)] - AFFE$_{16} >> 1$ - \end{itemize} - - Die tiefgestellte Zahl steht für die Basis des Zahlensystems. - Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12} - - (In der Klausur sind Hilfsmittel zugelassen, - daher ist dies \emph{keine\/} typische Klausuraufgabe.) - - \solution - - Wandeln Sie ohne Hilfsmittel - - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - $0010\,0000_2 = 32_{10}$ - - Eine Eins mit fünf Nullen dahinter steht binär für $2^5 = 32$:\\ - mit $1$ anfangen und fünfmal verdoppeln. - \item[(b)] - $42_{16} = 4 \cdot 16 + 2 \cdot 1 = 64 + 2 = 66$ - \item[(c)] - $17_8 = 1 \cdot 8 + 7 \cdot 1 = 8 + 7 = 15$ - \end{itemize} - Umwandlung von und nach Dezimal ist immer rechenaufwendig. - Umwandlungen zwischen Binär, Oktal und Hexadezimal gehen ziffernweise - und sind daher wesentlich einfacher. - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - $0010\,0000_2 = 20_{16}$ - - Umwandlung von Binär nach Hexadezimal geht ziffernweise:\\ - Vier Binärziffern werden zu einer Hex-Ziffer. - \item[(e)] - $\rm 42_{10} = 32_{10} + 10_{10} = 20_{16} + A_{16} = 2A_{16}$ - \item[(f)] - $\rm 192.168.20.254_{256} = C0\,A8\,14\,FE_{16}$ - - Umwandlung von der Basis 256 nach Hexadezimal geht ziffernweise:\\ - Eine 256er-Ziffer wird zu zwei Hex-Ziffern. - - Da die 256er-Ziffern dezimal angegeben sind, - müssen wir viermal Dezimal nach Hexadezimal umwandeln. - Hierfür bieten sich unterschiedliche Wege an. - - $\rm 192_{10} = 128_{10} + 64_{10} = 1100\,0000_{2} = C0_{16}$ - - $\rm 168_{10} = 10_{10} \cdot 16_{10} + 8_{10} = A_{16} \cdot 10_{16} + 8_{16} = A8_{16}$ - - $20_{10} = 16_{10} + 4_{10} = 10_{16} + 4_{16} = 14$ - - $\rm 254_{10} = 255_{10} - 1_{10} = FF_{16} - 1_{16} = FE_{16}$ - \end{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - $750_8 = 111\,101\,000_2$ - - Umwandlung von Oktal nach Binär geht ziffernweise:\\ - Eine Oktalziffer wird zu drei Binärziffern. - \item[(h)] - $\rm 42_{10} = 2A_{16}$ (siehe oben) $= 0010\,1010_{16}$ - - Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\ - Eine Hex-Ziffer wird zu vier Binärziffern. - \item[(i)] - $\rm AFFE_{16} = 1010\,1111\,1111\,1110_2$ - - Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\ - Eine Hex-Ziffer wird zu vier Binärziffern. - \end{itemize} - \end{itemize} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - $750_8\,\&\,666_8 - = 111\,101\,000_2\,\&\,110\,110\,110_2 - = 110\,100\,000_2 - = 640_8$ - - Binäre Und-Operationen lassen sich am leichtesten - in binärer Schreibweise durchführen. - Umwandlung zwischen Oktal und Binär geht ziffernweise: - Eine Oktalziffer wird zu drei Binärziffern und umgekehrt. - - Mit etwas Übung funktionieren diese Operationen - auch direkt mit Oktalzahlen im Kopf. - - \item[(k)] - $\rm\phantom{+}A380_{16}$\\ - $\rm+\kern2ptB747_{16}$\\[-\medskipamount] - \rule{1.4cm}{0.5pt}\\ - $\rm 15AC7_{16}$ - \begin{picture}(0,0) - \put(-1.4,0.35){\mbox{\scriptsize\bf 1}} - \end{picture} - - Mit Hexadezimalzahlen (und Binär- und Oktal- und sonstigen Zahlen) - kann man genau wie mit Dezimalzahlen schriftlich rechnen. - Man muß nur daran denken, daß der "`Zehner"'-Überlauf nicht bei - $10_{10}$ stattfindet, sondern erst bei $10_{16} = 16_{10}$ - (hier: $\rm 8_{16} + 4_{16} = C_{16}$ und - $\rm 3_{16} + 7_{16} = A_{16}$, aber - $\rm A_{16} + B_{16} = 10_{10} + 11_{10} - = 21_{10} = 16_{10} + 5_{10} = 10_{16} + 5_{16} = 15_{16}$). - - \item[(l)] - $\rm AFFE_{16} >> 1 - = 1010\,1111\,1111\,1110_2 >> 1 - = 0101\,0111\,1111\,1111_2 - = 57FF_{16}$ - - Bit-Verschiebungen lassen sich am leichtesten - in binärer Schreibweise durchführen. - Umwandlung zwischen Hexadezimal und Binär geht ziffernweise: - Eine Hex-Ziffer wird zu vier Binärziffern und umgekehrt. - - Mit etwas Übung funktionieren diese Operationen - auch direkt mit Hexadezimalzahlen im Kopf. - - \end{itemize} - - \exercise{Mikrocontroller} - - \begin{minipage}[t]{10cm} - An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen: - \begin{itemize} - \item - von links nach rechts an die Ports A, B, C und D, - \item - von oben nach unten an die Bits Nr.\ 0 bis 7. - \end{itemize} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210114}{aufgabe-2.c}): - - \begin{lstlisting}[gobble=6] - #include <avr/io.h> - - int main (void) - { - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{3cm} - \strut\\[-\baselineskip] - \includegraphics[width=3cm]{leds.jpg} - \end{minipage} - - \vspace*{-3cm} - - \strut\hfill - \begin{minipage}{11.8cm} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? \points{4} - \item[(b)] - Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2} - \item[(c)] - Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken? - \points{2} - \item[(d)] - Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3} - \item[(e)] - Wozu dient das \lstinline{while (1)}? \points{2} - \item - Alle Antworten bitte mit Begründung. - \end{itemize} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm?} - - \newcommand{\x}{$\bullet$} - \renewcommand{\o}{$\circ$} - - \begin{minipage}[t]{0.75\textwidth}\parskip\smallskipamount - Es läßt die LEDs in dem rechts abgebildeten Muster aufleuchten,\\ - das z.\,B.\ als die Ziffer 4 gelesen werden kann. - - (Das Zeichen \x\ steht für eine leuchtende, \o\ für eine nicht leuchtende LED.) - - Die erste Spalte (Port A) von unten nach oben gelesen (Bit 7 bis 0)\\ - entspricht der Binärdarstellung von \lstinline{0x1f}: 0001\,1111. - - Die dritte Spalte (Port C) von unten nach oben gelesen (Bit 7 bis 0)\\ - entspricht der Binärdarstellung von \lstinline{0xfc}: 1111\,1100. - - Die zweite und vierte Spalte (Port B und D) von unten nach oben gelesen\\ - (Bit 7 bis 0) entsprechen der Binärdarstellung von \lstinline{0x10}: 0001\,0000. - - Achtung: Die Zuweisung der Werte an die Ports erfolgt im Programm\\ - \emph{nicht\/} in der Reihenfolge A B C D, sondern in der Reihenfolge A B D C. - \end{minipage}\hfill - \begin{minipage}[t]{0.15\textwidth} - \vspace*{-0.5cm}% - \begin{tabular}{cccc} - \x & \o & \o & \o \\ - \x & \o & \o & \o \\ - \x & \o & \x & \o \\ - \x & \o & \x & \o \\ - \x & \x & \x & \x \\ - \o & \o & \x & \o \\ - \o & \o & \x & \o \\ - \o & \o & \x & \o \\ - \end{tabular} - \end{minipage} - - \item[(b)] - \textbf{Wozu dienen die ersten vier Zeilen des Hauptprogramms?} - - Mit diesen Zeilen werden alle jeweils 8 Bits aller 4 Ports - als Output-Ports konfiguriert. - - \item[(c)] - \textbf{Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken?} - - Der Komma-Operator in C bewirkt, daß der erste Wert berechnet - und wieder verworfen wird und stattdessen der zweite Wert weiterverarbeitet wird. - Konkret hier hätte das zur Folge, - daß \lstinline{DDRA}, \lstinline{DDRB} und \lstinline{DDRC} - gelesen und die gelesenen Werte ignoriert werden; - anschließend wird \lstinline{DDRD} der Wert \lstinline{0xff} zugewiesen. - Damit würde also nur einer von vier Ports überhaupt konfiguriert. - - Da es sich bei den \lstinline{DDR}-Variablen - um \lstinline{volatile}-Variable handelt, - nimmt der Compiler an, daß der Lesezugriff schon irgendeinen Sinn hätte. - Der Fehler bliebe also unbemerkt. - - \item[(d)] - \textbf{Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint.} - - Hierzu vertauschen wir die Zuweisungen - an \lstinline{PORTA} und \lstinline{PORTD} - sowie die Zuweisungen - an \lstinline{PORTB} und \lstinline{PORTC}: - - \begin{lstlisting}[gobble=8] - PORTD = 0x1f; - PORTC = 0x10; - PORTA = 0x10; - PORTB = 0xfc; - \end{lstlisting} - - Damit ergibt sich eine Spiegelung an der vertikalen Achse. - - Alternativ kann man auch an der horizontalen Achse spiegeln. - Dafür muß man die Bits in den Hexadezimalzahlen umdrehen: - - \begin{lstlisting}[gobble=8] - PORTA = 0xf8; - PORTB = 0x08; - PORTD = 0x08; - PORTC = 0x3f; - \end{lstlisting} - - Die Frage, welche der beiden Spiegelungen gewünscht ist, - wäre übrigens \emph{auch in der Klausur zulässig}. - - \item[(e)] - \textbf{Wozu dient das \lstinline{while (1)}?} - - Mit dem \lstinline{return}-Befehl am Ende des Hauptprogramms - gibt das Programm die Kontrolle an das Betriebssystem zurück. - - Dieses Programm jedoch läuft auf einem Mikrocontroller, - auf dem es kein Betriebssystem gibt. - Wenn das \lstinline{return} ausgeführt würde, - hätte es ein undefiniertes Verhalten zur Folge. - - Um dies zu verhindern, endet das Programm in einer Endlosschleife, - mit der wir den Mikrocontroller anweisen, - nach der Ausführung des Programms \emph{nichts mehr\/} zu tun - (im Gegensatz zu: \emph{irgendetwas Undefiniertes\/} zu tun). - - \end{itemize} - -\end{document} diff --git a/20210114/hp-uebung-20210114.pdf b/20210114/hp-uebung-20210114.pdf deleted file mode 100644 index 785187e80cc5dd88b94bb022298fd377113c2202..0000000000000000000000000000000000000000 Binary files a/20210114/hp-uebung-20210114.pdf and /dev/null differ diff --git a/20210114/hp-uebung-20210114.tex b/20210114/hp-uebung-20210114.tex deleted file mode 100644 index 952f3ed10fd5e8a8a2565351c1c14c176e92462b..0000000000000000000000000000000000000000 --- a/20210114/hp-uebung-20210114.tex +++ /dev/null @@ -1,266 +0,0 @@ -% hp-uebung-20210114.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Zahlensysteme, Mikrocontroller, Einfügen in Strings (Ergänzung) - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 14.\ Januar 2021} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 85 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 17 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Zahlensysteme} - - Wandeln Sie ohne Hilfsmittel - - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - 0010\,0000$_2$ - \item[(b)] - 42$_{16}$ - \item[(c)] - 17$_8$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - 0010\,0000$_2$ - \item[(e)] - 42$_{10}$ - \item[(f)] - 192.168.20.254$_{256}$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - 750$_8$ - \item[(h)] - 42$_{10}$ - \item[(i)] - AFFE$_{16}$ - \end{itemize} - \end{itemize} - \end{minipage} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - 750$_8$ \& 666$_8$ - \item[(k)] - A380$_{16}$ + B747$_{16}$ - \item[(l)] - AFFE$_{16} >> 1$ - \end{itemize} - - Die tiefgestellte Zahl steht für die Basis des Zahlensystems. - Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12} - - (In der Klausur sind Hilfsmittel zugelassen, - daher ist dies \emph{keine\/} typische Klausuraufgabe.) - - \exercise{Mikrocontroller} - - \begin{minipage}[t]{10cm} - An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen: - \begin{itemize} - \item - von links nach rechts an die Ports A, B, C und D, - \item - von oben nach unten an die Bits Nr.\ 0 bis 7. - \end{itemize} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210114}{aufgabe-2.c}): - - \begin{lstlisting}[gobble=6] - #include <avr/io.h> - - int main (void) - { - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{3cm} - \strut\\[-\baselineskip] - \includegraphics[width=3cm]{leds.jpg} - \end{minipage} - - \vspace*{-3cm} - - \strut\hfill - \begin{minipage}{11.8cm} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? \points{4} - \item[(b)] - Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2} - \item[(c)] - Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken? - \points{2} - \item[(d)] - Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3} - \item[(e)] - Wozu dient das \lstinline{while (1)}? \points{2} - \item - Alle Antworten bitte mit Begründung. - \end{itemize} - \end{minipage} - - \exercise{Einfügen in Strings (Ergänzung)} - - Diese Aufgabe ist eine Ergänzung von Aufgabe 2 der Übung vom 10.\ Dezember - 2020 um die Teilaufgaben (e), (f) und (g). Für den "`Klausur-Modus"' können - Sie die Teilaufgaben (a) bis (d) als "`bereits gelöst"' voraussetzen. - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210114}{aufgabe-3.c}): -% \begin{lstlisting}[style=numbered] - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - void insert_into_string (char src, char *target, int pos) - { - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; - } - - int main (void) - { - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschhhhhhhhhhh} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. -% \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. -% \points{2} -% \workspace{13} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. -% \points{2} -% \workspace{10} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. -% \points{2} -% \workspace{10} - \item - Schreiben Sie eine Funktion - \lstinline{void insert_into_string_sorted (char src, char *target)}, - die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist - und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle - einfügt. Diese Funktion darf die bereits vorhandene Funktion - \lstinline|insert_into_string()| aufrufen.\\ - \points{4}\par - Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: - \begin{lstlisting}[gobble=8] - char test[100] = ""; - insert_into_string_sorted ('c', test); - insert_into_string_sorted ('a', test); - insert_into_string_sorted ('d', test); - insert_into_string_sorted ('b', test); - \end{lstlisting} - Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. -% \workspace{14} - \item - Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) - arbeitet Ihre Funktion - \lstinline{void insert_into_string_sorted (char src, char *target)}? - Begründen Sie Ihre Antwort. - \points{1} -% \workspace{10} - \item - Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ - \lstinline{void insert_into_string_sorted (char src, char *target)} - so gestalten kann,\\ - daß sie in $\mathcal{O}(\log n)$ arbeitet. - \points{3} -% \workspace{35} - \end{enumerate} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20210114/io-ports-and-interrupts.pdf b/20210114/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20210114/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20210114/landau-symbols-2.pdf b/20210114/landau-symbols-2.pdf deleted file mode 120000 index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000 --- a/20210114/landau-symbols-2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20210114/landau-symbols-3.pdf b/20210114/landau-symbols-3.pdf deleted file mode 120000 index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000 --- a/20210114/landau-symbols-3.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20210114/landau-symbols.pdf b/20210114/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20210114/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20210114/leds.jpg b/20210114/leds.jpg deleted file mode 120000 index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000 --- a/20210114/leds.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/leds.jpg \ No newline at end of file diff --git a/20210114/logo-hochschule-bochum-cvh-text-v2.pdf b/20210114/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210114/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210114/logo-hochschule-bochum.pdf b/20210114/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210114/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210114/pendulum.pdf b/20210114/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20210114/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20210114/pgscript.sty b/20210114/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210114/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210114/pgslides.sty b/20210114/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210114/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210114/pull-down-widerstand.png b/20210114/pull-down-widerstand.png deleted file mode 100644 index 3bb39aba9aef4c9e20af37078c00c65395347e7c..0000000000000000000000000000000000000000 Binary files a/20210114/pull-down-widerstand.png and /dev/null differ diff --git a/20210114/pull-up-kurzschluss.png b/20210114/pull-up-kurzschluss.png deleted file mode 100644 index c46e8af0f82ae804b3533d5d9f790125ee330a31..0000000000000000000000000000000000000000 Binary files a/20210114/pull-up-kurzschluss.png and /dev/null differ diff --git a/20210114/pull-up-pull-down-widerstaende.xcf.gz b/20210114/pull-up-pull-down-widerstaende.xcf.gz deleted file mode 100644 index 6de47102589e3bf76089bc42397388183d077ac3..0000000000000000000000000000000000000000 Binary files a/20210114/pull-up-pull-down-widerstaende.xcf.gz and /dev/null differ diff --git a/20210114/pull-up-widerstand-intern.png b/20210114/pull-up-widerstand-intern.png deleted file mode 100644 index b30258e23cb31aef227e982a7911f5fc7223d8c7..0000000000000000000000000000000000000000 Binary files a/20210114/pull-up-widerstand-intern.png and /dev/null differ diff --git a/20210114/pull-up-widerstand.png b/20210114/pull-up-widerstand.png deleted file mode 100644 index cce8f393763a0364d793953295b5b9322f288681..0000000000000000000000000000000000000000 Binary files a/20210114/pull-up-widerstand.png and /dev/null differ diff --git a/20210121/Makefile b/20210121/Makefile deleted file mode 100644 index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000 --- a/20210121/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -%.elf: %.c - avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ - -%.hex: %.elf - avr-objcopy -O ihex $< $@ - -download: - ./download.sh diff --git a/20210121/alignment-1.c b/20210121/alignment-1.c deleted file mode 100644 index 815b4562a8f1c4aac3dac5ff3ddc3f5452bbaee7..0000000000000000000000000000000000000000 --- a/20210121/alignment-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint8_t a = 42; - uint16_t b = 1117; - uint8_t c = 23; - printf ("a = %d, b = %d, c = %d\n", a, b, c); -} diff --git a/20210121/alignment-2.c b/20210121/alignment-2.c deleted file mode 100644 index 23de308c39c5f7301c7c8b90c0078a003de21bd0..0000000000000000000000000000000000000000 --- a/20210121/alignment-2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint8_t a = 42; - uint16_t b = 1117; - uint8_t c = 23; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - a = 0; - b = 0; - c = 0; - printf ("a = %d, b = %d, c = %d\n", a, b, c); -} diff --git a/20210121/alignment-3.c b/20210121/alignment-3.c deleted file mode 100644 index 6a7dd0a3c8debd1fdc0e06912d0895820c08311c..0000000000000000000000000000000000000000 --- a/20210121/alignment-3.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint8_t a = 42; - uint16_t b = 1117; - uint8_t c = 23; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - uint32_t *p = &a; - *p = 0; - printf ("a = %d, b = %d, c = %d\n", a, b, c); -} diff --git a/20210121/alignment-4.c b/20210121/alignment-4.c deleted file mode 100644 index e073043765778ba75a1a002b5e86a672f1e03cea..0000000000000000000000000000000000000000 --- a/20210121/alignment-4.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint8_t a = 42; - uint16_t b = 1117; - uint8_t c = 23; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - uint32_t *p = (uint32_t *) &a; - *p = 0; - printf ("a = %d, b = %d, c = %d\n", a, b, c); -} diff --git a/20210121/alignment-5-32.s b/20210121/alignment-5-32.s deleted file mode 100644 index d4df40706c2e1e59bd3c15f2df1cba1bebafb722..0000000000000000000000000000000000000000 --- a/20210121/alignment-5-32.s +++ /dev/null @@ -1,83 +0,0 @@ - .file "alignment-5.c" - .text - .section .rodata -.LC0: - .string "a = %d, b = %d, c = %d\n" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - leal 4(%esp), %ecx - .cfi_def_cfa 1, 0 - andl $-16, %esp - pushl -4(%ecx) - pushl %ebp - .cfi_escape 0x10,0x5,0x2,0x75,0 - movl %esp, %ebp - pushl %ebx - pushl %ecx - .cfi_escape 0xf,0x3,0x75,0x78,0x6 - .cfi_escape 0x10,0x3,0x2,0x75,0x7c - subl $16, %esp - call __x86.get_pc_thunk.bx - addl $_GLOBAL_OFFSET_TABLE_, %ebx - movb $42, -17(%ebp) # #include <stdio.h> - movw $1117, -10(%ebp) # #include <stdint.h> - movb $23, -11(%ebp) # - movzbl -11(%ebp), %ecx # int main (void) - movzwl -10(%ebp), %edx # { - movzbl -17(%ebp), %eax # uint8_t a = 42; - movzbl %al, %eax # uint16_t b = 1117; - pushl %ecx # uint8_t c = 23; - pushl %edx # printf ("a = %d, b = %d, c = %d\n", a, b, c); - pushl %eax # uint64_t *p = (uint64_t *) &a; - leal .LC0@GOTOFF(%ebx), %eax # *p = 0; - pushl %eax # printf ("a = %d, b = %d, c = %d\n", a, b, c); - call printf@PLT # } - addl $16, %esp - leal -17(%ebp), %eax - movl %eax, -16(%ebp) - movl -16(%ebp), %eax - movl $0, (%eax) - movl $0, 4(%eax) # -9 \ b - movzbl -11(%ebp), %ecx # -10 / -. - movzwl -10(%ebp), %edx # -11 - c | - movzbl -17(%ebp), %eax # -12 | - movzbl %al, %eax # -13 } auf 0 gesetzt - pushl %ecx # -14 | - pushl %edx # -15 | - pushl %eax # -16 | - leal .LC0@GOTOFF(%ebx), %eax # -17 - a -' - pushl %eax - call printf@PLT - addl $16, %esp - movl $0, %eax - leal -8(%ebp), %esp - popl %ecx - .cfi_restore 1 - .cfi_def_cfa 1, 0 - popl %ebx - .cfi_restore 3 - popl %ebp - .cfi_restore 5 - leal -4(%ecx), %esp - .cfi_def_cfa 4, 4 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat - .globl __x86.get_pc_thunk.bx - .hidden __x86.get_pc_thunk.bx - .type __x86.get_pc_thunk.bx, @function -__x86.get_pc_thunk.bx: -.LFB1: - .cfi_startproc - movl (%esp), %ebx - ret - .cfi_endproc -.LFE1: - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20210121/alignment-5.c b/20210121/alignment-5.c deleted file mode 100644 index 913c5c8a81eedddf8463acee10262875bd6c84d7..0000000000000000000000000000000000000000 --- a/20210121/alignment-5.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint8_t a = 42; - uint16_t b = 1117; - uint8_t c = 23; - printf ("a = %d, b = %d, c = %d\n", a, b, c); - uint64_t *p = (uint64_t *) &a; - *p = 0; - printf ("a = %d, b = %d, c = %d\n", a, b, c); -} diff --git a/20210121/answer-32.s b/20210121/answer-32.s deleted file mode 100644 index d8649e6678dfed4bb2abeb06533fa123c195c861..0000000000000000000000000000000000000000 --- a/20210121/answer-32.s +++ /dev/null @@ -1,68 +0,0 @@ - .file "answer.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - leal 4(%esp), %ecx - .cfi_def_cfa 1, 0 - andl $-16, %esp - pushl -4(%ecx) - pushl %ebp - .cfi_escape 0x10,0x5,0x2,0x75,0 # #include <stdio.h> - movl %esp, %ebp # - pushl %ebx # int answer = 23; - pushl %ecx # - .cfi_escape 0xf,0x3,0x75,0x78,0x6 # int main (void) - .cfi_escape 0x10,0x3,0x2,0x75,0x7c # { - call __x86.get_pc_thunk.bx # answer += 19; - addl $_GLOBAL_OFFSET_TABLE_, %ebx # printf ("%d\n", answer); - movl answer@GOTOFF(%ebx), %eax # return 0; - addl $19, %eax # } - movl %eax, answer@GOTOFF(%ebx) - subl $8, %esp - pushl %eax - leal .LC0@GOTOFF(%ebx), %eax - pushl %eax - call printf@PLT - addl $16, %esp - movl $0, %eax - leal -8(%ebp), %esp - popl %ecx - .cfi_restore 1 - .cfi_def_cfa 1, 0 - popl %ebx - .cfi_restore 3 - popl %ebp - .cfi_restore 5 - leal -4(%ecx), %esp - .cfi_def_cfa 4, 4 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .globl answer - .data - .align 4 - .type answer, @object - .size answer, 4 -answer: - .long 23 - .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat - .globl __x86.get_pc_thunk.bx - .hidden __x86.get_pc_thunk.bx - .type __x86.get_pc_thunk.bx, @function -__x86.get_pc_thunk.bx: -.LFB12: - .cfi_startproc - movl (%esp), %ebx - ret - .cfi_endproc -.LFE12: - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20210121/answer.c b/20210121/answer.c deleted file mode 100644 index 2da5fc39c50955e3ac5588d12fa1ca6d9ac949eb..0000000000000000000000000000000000000000 --- a/20210121/answer.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int answer = 23; - -int main (void) -{ - answer += 19; - printf ("%d\n", answer); - return 0; -} diff --git a/20210121/answer.disassemble b/20210121/answer.disassemble deleted file mode 100644 index d5682bdc46f53067217941a2fdc00d082637b515..0000000000000000000000000000000000000000 --- a/20210121/answer.disassemble +++ /dev/null @@ -1,16 +0,0 @@ -(gdb) disassemble /r main -Dump of assembler code for function main: - 0x0000000000001135 <+0>: 48 83 ec 08 sub $0x8,%rsp - 0x0000000000001139 <+4>: 8b 05 f1 2e 00 00 mov 0x2ef1(%rip),%eax # 0x4030 <answer> - 0x000000000000113f <+10>: 8d 70 13 lea 0x13(%rax),%esi - 0x0000000000001142 <+13>: 89 35 e8 2e 00 00 mov %esi,0x2ee8(%rip) # 0x4030 <answer> - 0x0000000000001148 <+19>: 48 8d 3d b5 0e 00 00 lea 0xeb5(%rip),%rdi # 0x2004 - 0x000000000000114f <+26>: b8 00 00 00 00 mov $0x0,%eax - 0x0000000000001154 <+31>: e8 d7 fe ff ff callq 0x1030 <printf@plt> - 0x0000000000001159 <+36>: b8 00 00 00 00 mov $0x0,%eax - 0x000000000000115e <+41>: 48 83 c4 08 add $0x8,%rsp - 0x0000000000001162 <+45>: c3 retq -End of assembler dump. - - ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^ - Maschinensprache Assembler diff --git a/20210121/answer.s b/20210121/answer.s deleted file mode 100644 index 69cf9a26f4abc713b067f4231c831f80fd3a7e31..0000000000000000000000000000000000000000 --- a/20210121/answer.s +++ /dev/null @@ -1,35 +0,0 @@ - .file "answer.c" - .text - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 # #include <stdio.h> - movl answer(%rip), %eax # - leal 19(%rax), %esi # int answer = 23; - movl %esi, answer(%rip) # - leaq .LC0(%rip), %rdi # int main (void) - movl $0, %eax # { - call printf@PLT # answer += 19; - movl $0, %eax # printf ("%d\n", answer); - addq $8, %rsp # return 0; - .cfi_def_cfa_offset 8 # } - ret - .cfi_endproc -.LFE11: - .size main, .-main - .globl answer - .data - .align 4 - .type answer, @object - .size answer, 4 -answer: - .long 23 - .ident "GCC: (Debian 8.3.0-6) 8.3.0" - .section .note.GNU-stack,"",@progbits diff --git a/20210121/aufgabe-1.c b/20210121/aufgabe-1.c deleted file mode 100644 index 2afae773ac2d564771ab6dfb473eed664070d3e2..0000000000000000000000000000000000000000 --- a/20210121/aufgabe-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; -} diff --git a/20210121/aufgabe-3.c b/20210121/aufgabe-3.c deleted file mode 100644 index 4c95eb6ad4881c904448309c6b7c46fa101cc109..0000000000000000000000000000000000000000 --- a/20210121/aufgabe-3.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdint.h> -#include <avr/io.h> -#include <avr/interrupt.h> - -uint8_t counter = 1; -uint8_t leds = 0; - -ISR (TIMER0_COMP_vect) -{ - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; -} - -void init (void) -{ - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; -} - -int main (void) -{ - init (); - while (1) - ; /* do nothing */ - return 0; -} diff --git a/20210121/blink-10.c b/20210121/blink-10.c deleted file mode 100644 index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000 --- a/20210121/blink-10.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20210121/blink-11.c b/20210121/blink-11.c deleted file mode 100644 index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000 --- a/20210121/blink-11.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - _delay_ms (1); - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20210121/blink-4.c b/20210121/blink-4.c deleted file mode 100644 index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000 --- a/20210121/blink-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - _delay_ms (200); - } - return 0; -} diff --git a/20210121/blink-5.c b/20210121/blink-5.c deleted file mode 100644 index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000 --- a/20210121/blink-5.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> - -ISR (TIMER0_COMPB_vect) -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210121/blink-6.c b/20210121/blink-6.c deleted file mode 100644 index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000 --- a/20210121/blink-6.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (TIMER0_COMPB_vect) -{ - static uint8_t counter = 0; - if (counter++ == 0) - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210121/blink-7.c b/20210121/blink-7.c deleted file mode 100644 index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000 --- a/20210121/blink-7.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210121/blink-8.c b/20210121/blink-8.c deleted file mode 100644 index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000 --- a/20210121/blink-8.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xff; /* binär: 1111 1111 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20210121/blink-9.c b/20210121/blink-9.c deleted file mode 100644 index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000 --- a/20210121/blink-9.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20210121/download.sh b/20210121/download.sh deleted file mode 100755 index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000 --- a/20210121/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -port=$(ls -rt /dev/ttyACM* | tail -1) -echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) -avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20210121/hp-20210121.pdf b/20210121/hp-20210121.pdf deleted file mode 100644 index e0f51da4e38d05cbe6d9579219c40989592e5691..0000000000000000000000000000000000000000 Binary files a/20210121/hp-20210121.pdf and /dev/null differ diff --git a/20210121/hp-20210121.tex b/20210121/hp-20210121.tex deleted file mode 100644 index a6704ae89220c1bbcc3c97ac9253f5e579342ee9..0000000000000000000000000000000000000000 --- a/20210121/hp-20210121.tex +++ /dev/null @@ -1,909 +0,0 @@ -% hp-20210121.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Hardwarenahe Programmierung: Interrupts, volatile-Variable, Byte-Reihenfolge – Endianness, Binärdarstellung negativer Zahlen, Speicherausrichtung – Alignment - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{21.\ Januar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{red} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{4} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}5.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\subsection{Interrupts} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: eingebaute Uhr\hfill - \makebox(0,0)[tr]{% - \only<1->{\begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt Zählschleife (\lstinline{_delay_ms}):\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}}% - } - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - - ... - - - ISR (TIMER0B_COMP_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}} - \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} - \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}} - \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}} - \end{picture} - - Initialisierung über spezielle Ports: - \lstinline{TCCR0B}, \lstinline{TIMSK0} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster\hfill - \makebox(0,0)[tr]{% - \begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt \newterm{Busy Waiting\/}:\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}} - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - ... - - ISR (INT0_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - - \medskip - - Initialisierung über spezielle Ports: - \lstinline{EICRA}, \lstinline{EIMSK} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster - - \vspace*{-2.5pt} - - \begin{minipage}[t]{5cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - volatile uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - ... - - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; - }¿ - \end{lstlisting} - \end{minipage} - - \pause - \begin{picture}(0,0) - \color{red} - \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm} - \begin{center} - \textbf{volatile}:\\ - Speicherzugriff\\ - nicht wegoptimieren - \end{center} - \end{minipage}}} - \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Was ist eigentlich \lstinline{PORTD}? - - \bigskip - \pause - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E} - - \bigskip - \pause - \lstinline{PORTD = 0x01;}\\ - \textarrow\quad - \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\ - \pause - \begin{picture}(0,2)(0,-1.7) - \color{red} - \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$} - \pause - \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\ - auf \lstinline|volatile uint8_t|}}}$} - \pause - \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}} - \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}} - \end{picture} - - \pause - \textarrow\quad - \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B| - - \pause - \bigskip - \bigskip - - \textarrow\quad - \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee. - -\end{frame} - -\subsection{Byte-Reihenfolge -- Endianness} -\subsubsection{Konzept} - -\begin{frame}[fragile] - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \pause - \bigskip - - $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$ - - \pause - \bigskip - Speicherzellen: - - \medskip - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & \pause für Menschen leichter lesbar \pause \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & \pause bei Additionen effizienter - \end{tabular} - - \pause - \medskip - \textarrow\ Geschmackssache - \pause\\ - \quad\textbf{\dots\ außer bei Datenaustausch!} - -% \pause -% \bigskip -% -% Aber: nicht verwechseln! \qquad $0304_{16} = 772$ - -\end{frame} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \medskip - - \textarrow\ Geschmackssache\\ - \textbf{\dots\ außer bei Datenaustausch!} - - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - -\end{frame} - -\subsubsection{Dateiformate} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian - \pause - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - - \pause - \bigskip - - Grafik-Formate: Reihenfolge der Bits in den Bytes - \begin{itemize} - \item - PBM-Dateien: Big-Endian\only<4->{, MSB first} - \item - XBM-Dateien: Little-Endian\only<4->{, LSB first} - \end{itemize} - \only<4->{MSB/LSB = most/least significant bit} - -\end{frame} - -\subsubsection{Datenübertragung} - -\begin{frame} - - \showsubsection - \showsubsubsection - - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): LSB first - \item - I$^2$C: MSB first - \item - USB: beides - \pause - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - -\end{frame} - -\subsection{Binärdarstellung negativer Zahlen} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\ - \pause - \textarrow\ 255 + 1 = 0 - - \pause - \medskip - - 8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\ - \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\ - \pause - \textarrow\ Zweierkomplement - - \pause - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 127 + 1 = $-128$ - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 16-Bit-Zahlen ohne Vorzeichen: - \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff} - = 0 bis 65535\hfill 0 bis 255\\ - \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0 - - \medskip - - 16-Bit-Zahlen mit Vorzeichen: - \lstinline{int16_t}\hfill\lstinline{int8_t}\\ - \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill - \lstinline{0xff} = 255 = $-1$\\ - \textarrow\ Zweierkomplement - - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 32767 + 1 = $-32768$ - - \bigskip - Literatur: \url{http://xkcd.com/571/} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Frage: \emph{Für welche Zahl steht der Speicherinhalt\, - \raisebox{2pt}{% - \tabcolsep0.25em - \begin{tabular}{|c|c|}\hline - \rule{0pt}{11pt}a3 & 90 \\\hline - \end{tabular}} - (hexadezimal)?} - - \pause - \smallskip - Antwort: \emph{Das kommt darauf an.} ;--) - - \pause - \medskip - Little-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - - \pause - \medskip - Big-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-23664$\\ - als \lstinline,uint16_t,: & $41872$\\ als \lstinline,int32_t,: & $-1550843904$ & (zusätzliche Bytes\\ - als \lstinline,uint32_t,: & $2744123392$ & mit Nullen aufgefüllt)\\ - als \lstinline,int64_t,: & $-6660823848880963584$\\ - als \lstinline,uint64_t,: & $11785920224828588032$\\ - \end{tabular} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Speicherausrichtung -- Alignment} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - - \pause - \bigskip - - Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"' - \begin{itemize} - \item - 2-Byte-Operation: effizienter - \pause - \item - \dots\ oder sogar nur dann erlaubt - \pause - \arrowitem - Compiler optimiert Speicherausrichtung - \end{itemize} - - \medskip - - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t dummy; - uint16_t b; - uint8_t c;¿ - \end{lstlisting} - \end{minipage} - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t c; - uint16_t b;¿ - \end{lstlisting} - \end{minipage} - - \pause - \vspace{-1.75cm} - \strut\hfill - \begin{minipage}{6.5cm} - Fazit: - \begin{itemize} - \item - \textbf{Adressen von Variablen\\ - sind systemabhängig} - \item - Bei Definition von Datenformaten\\ - Alignment beachten \textarrow\ effizienter - \end{itemize} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \begin{itemize} - \item[4.1] Differentialgleichungen - \item[4.2] Rekursion - \item[4.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{medgreen} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20210121/hp-musterloesung-20210121.pdf b/20210121/hp-musterloesung-20210121.pdf deleted file mode 100644 index 4d248668921e1a7249fc1a824d203d91111b5ec4..0000000000000000000000000000000000000000 Binary files a/20210121/hp-musterloesung-20210121.pdf and /dev/null differ diff --git a/20210121/hp-musterloesung-20210121.tex b/20210121/hp-musterloesung-20210121.tex deleted file mode 100644 index fed8134934bf225fd302175327ef4566c6c29482..0000000000000000000000000000000000000000 --- a/20210121/hp-musterloesung-20210121.tex +++ /dev/null @@ -1,417 +0,0 @@ -% hp-musterloesung-20210121.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus, LED-Blinkmuster - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gensymb} - -\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} -\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 21.\ Januar 2021} - - \exercise{Trickprogrammierung} - - Wir betrachten das folgende Programm (Datei: \gitfile{hp}{2020ws/20210121}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - int main (void) - { - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; - } - \end{lstlisting} - Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿ - aufgabe-1.c: In function `main': - aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...] - $ ¡./aufgabe-1¿ - Hallo - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die Warnung beim Compilieren. \points{2} - \item[(b)] - Erklären Sie die Ausgabe des Programms. \points{5} - \item[(c)] - Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3} - \end{itemize} - Hinweis: Modifizieren Sie das Programm - und lassen Sie sich Speicherinhalte ausgeben. - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie die Warnung beim Compilieren.} - - Zeile 7 des Programms enthält eine Zuweisung von \lstinline{&x} - an die Variable \lstinline{s}. - Der Ausdruck \lstinline{&x} steht für die Speicheradresse der Variablen \lstinline{x}, - ist also ein Zeiger auf \lstinline{x}, - also ein Zeiger auf eine \lstinline{uint64_t}. - Die Variable \lstinline{s} hingegen ist ein Zeiger auf \lstinline{char}, - also ein Zeiger auf eine viel kleinere Zahl, - also ein anderer Zeigertyp. - - \item[(b)] - \textbf{Erklären Sie die Ausgabe des Programms.} - - Die 64-Bit-Zahl (\lstinline{uint64_t}) \lstinline{x} - belegt 8 Speicherzellen (Bytes) von jeweils 8 Bit. - Um herauszufinden, was diese enthalten, - lassen wir uns \lstinline{x} als Hexadezimalzahl ausgeben, - z.\,B.\ mittels \lstinline{printf ("%lx\n", x)} - (auf 32-Bit-Rechnern: \lstinline{"%llx\n"}) - oder mittels \lstinline{printf ("%" PRIx64 "\n", x)} - (erfordert \lstinline{#include <inttypes.h>} - -- siehe die Datei \gitfile{hp}{2020ws/20210121}{loesung-1-1.c}). - Das Ergebnis lautet: - \begin{lstlisting}[style=terminal,gobble=8] - 3b29006f6c6c6148 - \end{lstlisting} - Auf einzelne Bytes verteilt: - \begin{lstlisting}[style=terminal,gobble=8] - 3b 29 00 6f 6c 6c 61 48 - \end{lstlisting} - Auf einem Little-Endian-Rechner - ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt: - \begin{lstlisting}[style=terminal,gobble=8] - 48 61 6c 6c 6f 00 29 3b - \end{lstlisting} - Wenn wir uns diese Bytes als Zeichen ausgeben lassen - (\lstinline{printf()} mit \lstinline{%c} -- siehe die Datei \gitfile{hp}{2020ws/20210121}{loesung-1-2.c}), - erhalten wir: - \begin{lstlisting}[style=terminal,gobble=8] - H a l l o ) ; - \end{lstlisting} - Das Zeichen hinter "`Hallo"' ist ein Null-Symbol (Zahlenwert 0) - und wird von \lstinline{printf ("%s")} als Ende des Strings erkannt. - Damit ist die Ausgabe \lstinline[style=terminal]{Hallo} - des Programms erklärt. - - \goodbreak - \item[(c)] - \textbf{Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten?} - - Auf einem Big-Endian-Computer (egal, wieviele Bits die Prozessorregister haben) - ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt - wie auf einem Little-Endian-Computer, hier also: - \begin{lstlisting}[style=terminal,gobble=8] - 3b 29 00 6f 6c 6c 61 48 - \end{lstlisting} - \lstinline{printf ("%s")} gibt in diesem Fall die Hexadezimalzahlen - \lstinline[style=terminal]{3b} und \lstinline[style=terminal]{29} - als Zeichen aus. Danach steht das String-Ende-Symbol mit Zahlenwert 0, - und die Ausgabe bricht ab. - Da, wie oben ermittelt, die Hexadezimalzahl \lstinline[style=terminal]{3b} - für das Zeichen \lstinline[style=terminal]{;} - und \lstinline[style=terminal]{29} - für das Zeichen \lstinline[style=terminal]{)} steht, - lautet somit die Ausgabe: - \begin{lstlisting}[style=terminal,gobble=8] - ;) - \end{lstlisting} - Um die Aufgabe zu lösen, können Sie übrigens auch - auf einem Little-Endian-Computer (Standard-Notebook) - einen Big-Endian-Computer simulieren, - indem Sie die Reihenfolge der Bytes in der Zahl \lstinline{x} umdrehen - -- siehe die Datei \gitfile{hp}{2020ws/20210121}{loesung-1-3.c}. - \end{itemize} - - \exercise{Thermometer-Baustein an \ITWOC-Bus} - - Eine Firma stellt einen elektronischen Thermometer-Baustein her, - den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann, - um die Temperatur auszulesen. - Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt, - die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt. - - Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt, - das langsam auf Zimmertemperatur abkühlt. - Alle 10 Minuten liest ein Programm, das auf dem PC läuft, - die gemessene Temperatur über beide Schnittstellen aus - und erzeugt daraus die folgende Tabelle: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94 & 122 \\\hline - 10 & 47 & 244 \\\hline - 20 & 30 & 120 \\\hline - 30 & 24 & \phantom{0}24 \\\hline - 40 & 21 & 168 \\\hline - \end{tabular} - \end{center} - - \begin{itemize} - \item[(a)] - Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen.\\ - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten? - \points{5} - \item[(b)] - Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert. - \points{5} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen. - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten?} - - Sowohl RS-232 als auch \ItwoC\ übertragen die Daten Bit für Bit. - Für die Fehlersuche ist es daher sinnvoll, - die Meßwerte als Binärzahlen zu betrachten: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94$_{10}$ = 01011110$_2$ & 122$_{10}$ = 01111010$_2$ \\\hline - 10 & 47$_{10}$ = 00101111$_2$ & 244$_{10}$ = 11110100$_2$ \\\hline - 20 & 30$_{10}$ = 00011110$_2$ & 120$_{10}$ = 01111000$_2$ \\\hline - 30 & 24$_{10}$ = 00011000$_2$ & \phantom{0}24$_{10}$ = 00011000$_2$ \\\hline - 40 & 21$_{10}$ = 00010101$_2$ & 168$_{10}$ = 10101000$_2$ \\\hline - \end{tabular} - \end{center} - - Man erkennt, daß die Reihenfolge der Bits in den (fehlerhaften) \ItwoC-Meßwerten - genau die umgekehrte Reihenfolge der Bits in den (korrekten) RS-232-Mewßwerten ist. - Der Übertragungsfehler besteht also darin, - daß die Bits in der falschen Reihenfolge übertragen wurden. - - Dies paßt gut damit zusammen, - daß die Bit-Reihenfolge von \ItwoC\ \emph{MSB First}, die von RS-232 hingegen \emph{LSB First\/} ist. - Offenbar haben die Entwickler der \ItwoC-Schnittstelle dies übersehen - und die \ItwoC-Daten ebenfalls \emph{LSB First\/} übertragen. - - \goodbreak - \item[(b)] - \textbf{Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.} - - Die Aufgabe der Funktion besteht darin, - eine 8-Bit-Zahl \lstinline{data} entgegenzunehmen, - die Reihenfolge der 8 Bits genau umzudrehen - und das Ergebnis mittels \lstinline{return} zurückzugeben. - - Zu diesem Zweck gehen wir die 8 Bits in einer Schleife durch - -- siehe die Datei \gitfile{hp}{2020ws/20210121}{loesung-2.c}. - Wir lassen eine Lese-Maske \lstinline{mask_data} von rechts nach links - und gleichzeitig eine Schreib-Maske \lstinline{mask_result} - von links nach rechts wandern. - Immer wenn die Lese-Maske in \lstinline{data} eine 1 findet, - schreibt die Schreib-Maske diese in die Ergebnisvariable \lstinline{result}. - - Da \lstinline{result} auf 0 initialisiert wurde, - brauchen wir Nullen nicht hineinzuschreiben. - Ansonsten wäre dies mit \lstinline{result &= ~mask_result} möglich. - - Um die Schleife bis 8 zählen zu lassen, - könnte man eine weitere Zähler-Variable von 0 bis 7 zählen lassen, - z.\,B.\ \lstinline{for (int i = 0; i < 8; i++)}. - Dies ist jedoch nicht nötig, wenn man beachtet, - daß die Masken den Wert 0 annehmen, - sobald das Bit aus der 8-Bit-Variablen herausgeschoben wurde. - In \gitfile{hp}{2020ws/20210121}{loesung-2.c} wird \lstinline{mask_data} auf 0 geprüft; - genausogut könnte man auch \lstinline{mask_result} prüfen. - - Das \lstinline{return result} ist notwendig. - Eine Ausgabe des Ergebnisses per \lstinline{printf()} o.\,ä.\ - erfüllt \emph{nicht\/} die Aufgabenstellung. - (In \gitfile{hp}{2020ws/20210121}{loesung-2.c} erfolgt entsprechend \lstinline{printf()} - nur im Testprogramm \lstinline{main()}.) - \end{itemize} - - \exercise{LED-Blinkmuster} - - Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller - (Datei: \gitfile{hp}{2020ws/20210121}{aufgabe-3.c}). - - \begin{minipage}[t]{7cm} - \begin{lstlisting}[gobble=6] - #include <stdint.h> - #include <avr/io.h> - #include <avr/interrupt.h> - - uint8_t counter = 1; - uint8_t leds = 0; - - ISR (TIMER0_COMP_vect) - { - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; - } - \end{lstlisting} - \end{minipage}\hfill\begin{minipage}[t]{8.5cm} - \begin{lstlisting}[gobble=6] - void init (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; - } - - int main (void) - { - init (); - while (1) - ; /* do nothing */ - return 0; - } - \end{lstlisting} - \end{minipage} - - An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\ - Sobald das Programm läuft, blinken diese in charakteristischer Weise: - \begin{quote} - \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}} - \begin{tabular}{|c|c|c|c|}\hline - \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline - 1 & aus & aus & an \\\hline - 2 & aus & an & aus \\\hline - 3 & aus & an & an \\\hline - 4 & an & aus & aus \\\hline - 5 & an & aus & an \\\hline - 6 & an & an & aus \\\hline - 7 & an & an & an \\\hline - 8 & aus & aus & aus \\\hline - \end{tabular} - \end{quote} - Jede Phase dauert etwas länger als eine halbe Sekunde. - Nach 8 Phasen wiederholt sich das Schema. - - Erklären Sie das Verhalten des Programms anhand des Quelltextes: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item[(a)] - Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert? - \points{1} - \item[(b)] - Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird? - \points{2} - \item[(c)] - Wie kommt das oben beschriebene Blinkmuster zustande? - \points{2} - \item[(d)] - Wieso dauert eine Phase ungefähr eine halbe Sekunde? - \points{2} - \item[(e)] - Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'? - \points{1} - \end{itemize} - - \goodbreak - Hinweis: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers - etwa 488mal pro Sekunde aufgerufen wird. - Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports. - Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären. - \end{itemize} - - \solution - - \begin{itemize}\itemsep0pt - \item[(a)] - \textbf{Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert?} - - Das Blinken wird durch einen Interrupt-Handler implementiert. - Dieser wird nicht durch das Hauptprogramm, - sondern durch ein Hardware-Ereignis (hier: Uhr) aufgerufen. - - \item[(b)] - \textbf{Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird?} - - Die vorzeichenlose 8-Bit-Variable \lstinline{counter} kann nur - Werte von 0 bis 255 annehmen; bei einem weiteren - INkrementieren springt sie wieder auf 0 (Überlauf), - und die \lstinline{if}-Bedingung ist erfüllt. - - \item[(c)] - \textbf{Wie kommt das oben beschriebene Blinkmuster zustande?} - - In jedem Aufruf des Interrupt-Handlers wird die Variable - \lstinline{leds} um 1 erhöht und anschließend modulo 8 genommen. - Sie durchläuft daher immer wieder die Zahlen von 0 bis 7. - - Durch die Schiebeoperation \lstinline{leds << 4} werden die 3 Bits - der Variablen \lstinline{leds} an diejenigen Stellen im Byte - geschoben, an denen die LEDs an den Mikro-Controller - angeschlossen sind (Bits 4, 5 und 6). - - Entsprechend durchläuft das Blinkmuster immer wieder - die Binärdarstellungen der Zahlen von 0 bis 7 - (genauer: von 1 bis 7 und danach 0). - - \item[(d)] - \textbf{Wieso dauert eine Phase ungefähr eine halbe Sekunde?} - - Der Interrupt-Handler wird gemäß Hinweis 488mal pro Sekunde aufgerufen. - Bei jedem 256sten Aufruf ändert sich das LED-Muster. - Eine Phase dauert somit $\frac{256}{488} \approx 0.52$ Sekunden. - - \item[(e)] - \textbf{Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?} - - Deklaration eines Interrupt-Handlers für den Timer-Interrupt Nr.\ 0 - \end{itemize} - -\end{document} diff --git a/20210121/hp-uebung-20210121.pdf b/20210121/hp-uebung-20210121.pdf deleted file mode 100644 index e792a29159a340d20df23d0c722b5cf89a06c88a..0000000000000000000000000000000000000000 Binary files a/20210121/hp-uebung-20210121.pdf and /dev/null differ diff --git a/20210121/hp-uebung-20210121.tex b/20210121/hp-uebung-20210121.tex deleted file mode 100644 index 354a9448ea8c30fd5086f932d7cf55ab51b00b7d..0000000000000000000000000000000000000000 --- a/20210121/hp-uebung-20210121.tex +++ /dev/null @@ -1,226 +0,0 @@ -% hp-uebung-20210121.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus, LED-Blinkmuster - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gensymb} - -\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} -\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 21.\ Januar 2021} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 80 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 14 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Trickprogrammierung} - - Wir betrachten das folgende Programm (Datei: \gitfile{hp}{2020ws/20210121}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - int main (void) - { - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; - } - \end{lstlisting} - Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿ - aufgabe-1.c: In function `main': - aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...] - $ ¡./aufgabe-1¿ - Hallo - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die Warnung beim Compilieren. \points{2} - \item[(b)] - Erklären Sie die Ausgabe des Programms. \points{5} - \item[(c)] - Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3} - \end{itemize} - Hinweis: Modifizieren Sie das Programm - und lassen Sie sich Speicherinhalte ausgeben. - - \exercise{Thermometer-Baustein an \ITWOC-Bus} - - Eine Firma stellt einen elektronischen Thermometer-Baustein her, - den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann, - um die Temperatur auszulesen. - Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt, - die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt. - - Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt, - das langsam auf Zimmertemperatur abkühlt. - Alle 10 Minuten liest ein Programm, das auf dem PC läuft, - die gemessene Temperatur über beide Schnittstellen aus - und erzeugt daraus die folgende Tabelle: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94 & 122 \\\hline - 10 & 47 & 244 \\\hline - 20 & 30 & 120 \\\hline - 30 & 24 & \phantom{0}24 \\\hline - 40 & 21 & 168 \\\hline - \end{tabular} - \end{center} - - \begin{itemize} - \item[(a)] - Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen.\\ - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten? - \points{5} - \item[(b)] - Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert. - \points{5} - \end{itemize} - - \exercise{LED-Blinkmuster} - - Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller - (Datei: \gitfile{hp}{2020ws/20210121}{aufgabe-3.c}). - - \begin{minipage}[t]{7cm} - \begin{lstlisting}[gobble=6] - #include <stdint.h> - #include <avr/io.h> - #include <avr/interrupt.h> - - uint8_t counter = 1; - uint8_t leds = 0; - - ISR (TIMER0_COMP_vect) - { - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; - } - \end{lstlisting} - \end{minipage}\hfill\begin{minipage}[t]{8.5cm} - \begin{lstlisting}[gobble=6] - void init (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; - } - - int main (void) - { - init (); - while (1) - ; /* do nothing */ - return 0; - } - \end{lstlisting} - \end{minipage} - - An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\ - Sobald das Programm läuft, blinken diese in charakteristischer Weise: - \begin{quote} - \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}} - \begin{tabular}{|c|c|c|c|}\hline - \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline - 1 & aus & aus & an \\\hline - 2 & aus & an & aus \\\hline - 3 & aus & an & an \\\hline - 4 & an & aus & aus \\\hline - 5 & an & aus & an \\\hline - 6 & an & an & aus \\\hline - 7 & an & an & an \\\hline - 8 & aus & aus & aus \\\hline - \end{tabular} - \end{quote} - Jede Phase dauert etwas länger als eine halbe Sekunde. - Nach 8 Phasen wiederholt sich das Schema. - - Erklären Sie das Verhalten des Programms anhand des Quelltextes: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item[(a)] - Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert? - \points{1} - \item[(b)] - Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird? - \points{2} - \item[(c)] - Wie kommt das oben beschriebene Blinkmuster zustande? - \points{2} - \item[(d)] - Wieso dauert eine Phase ungefähr eine halbe Sekunde? - \points{2} - \item[(e)] - Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'? - \points{1} - \end{itemize} - - Hinweis: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers - etwa 488mal pro Sekunde aufgerufen wird. - Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports. - Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären. - \end{itemize} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20210121/io-ports-and-interrupts.pdf b/20210121/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20210121/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20210121/loesung-1-1.c b/20210121/loesung-1-1.c deleted file mode 100644 index 26fcc817796b3da118b5dda92f45bfb870e315b6..0000000000000000000000000000000000000000 --- a/20210121/loesung-1-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%lx\n", x); - printf ("%" PRIx64 "\n", x); - printf ("%s\n", s); - return 0; -} diff --git a/20210121/loesung-1-2.c b/20210121/loesung-1-2.c deleted file mode 100644 index 7151db69b2e675f17517d7b7c3814bbda3b1fa89..0000000000000000000000000000000000000000 --- a/20210121/loesung-1-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%lx\n", x); - printf ("%" PRIx64 "\n", x); - printf ("%c %c %c %c %c %c %c %c\n", - 0x48, 0x61, 0x6c, 0x6c, 0x6f, 0x00, 0x29, 0x3b); - printf ("%s\n", s); - return 0; -} diff --git a/20210121/loesung-1-3.c b/20210121/loesung-1-3.c deleted file mode 100644 index fadccdef1155e4d16b5da0c8a82d8e7ae76ca3cc..0000000000000000000000000000000000000000 --- a/20210121/loesung-1-3.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 0x48616c6c6f00293b; - char *s = &x; - printf ("%s\n", s); - return 0; -} diff --git a/20210121/loesung-2.c b/20210121/loesung-2.c deleted file mode 100644 index b02d98b51b9bc525a567afea2f0dce5a8e6413a5..0000000000000000000000000000000000000000 --- a/20210121/loesung-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -uint8_t repair (uint8_t data) -{ - uint8_t result = 0; - uint8_t mask_data = 0x01; - uint8_t mask_result = 0x80; - while (mask_data) - { - if (data & mask_data) - result |= mask_result; - mask_data <<= 1; - mask_result >>= 1; - } - return result; -} - -int main (void) -{ - int data[] = { 122, 244, 120, 24, 168, -1 }; - int i = 0; - while (data[i] >= 0) - printf ("%d\n", repair (data[i++])); - return 0; -} diff --git a/20210121/logo-hochschule-bochum-cvh-text-v2.pdf b/20210121/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210121/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210121/logo-hochschule-bochum.pdf b/20210121/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210121/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210121/pgscript.sty b/20210121/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210121/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210121/pgslides.sty b/20210121/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210121/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210128/aufgabe-1.c b/20210128/aufgabe-1.c deleted file mode 100644 index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000 --- a/20210128/aufgabe-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; -} diff --git a/20210128/aufgabe-2.c b/20210128/aufgabe-2.c deleted file mode 100644 index 47595ef0658e94d76a42263e82200f94895cdeea..0000000000000000000000000000000000000000 --- a/20210128/aufgabe-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20210128/aufgabe-3a.c b/20210128/aufgabe-3a.c deleted file mode 100644 index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000 --- a/20210128/aufgabe-3a.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210128/aufgabe-3b.c b/20210128/aufgabe-3b.c deleted file mode 100644 index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000 --- a/20210128/aufgabe-3b.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210128/dynmem-1.c b/20210128/dynmem-1.c deleted file mode 100644 index 129ae368b75355aecac8fca803af968e196bf720..0000000000000000000000000000000000000000 --- a/20210128/dynmem-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < 3; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-1.png b/20210128/dynmem-1.png deleted file mode 100644 index 0101156f78c381c9d6d60936169e1e7a93219139..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem-1.png and /dev/null differ diff --git a/20210128/dynmem-10.c b/20210128/dynmem-10.c deleted file mode 100644 index 277cf78b0436195f2935d12e38d927024bfa80b7..0000000000000000000000000000000000000000 --- a/20210128/dynmem-10.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - free (new_name); - name[N - 1] = "Dieter"; - - N++; - new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - free (new_name); - name[N - 1] = "Emma"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-11.c b/20210128/dynmem-11.c deleted file mode 100644 index 6ec1aeb467cef507991f32afa47d47478a8346f6..0000000000000000000000000000000000000000 --- a/20210128/dynmem-11.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - free (name); - name = new_name; - name[N - 1] = "Dieter"; - - N++; - new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - free (name); - name = new_name; - name[N - 1] = "Emma"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-12.c b/20210128/dynmem-12.c deleted file mode 100644 index 646fab6f8a4f1266715b4307b9dc7db4b04dd75d..0000000000000000000000000000000000000000 --- a/20210128/dynmem-12.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - { - new_name[i] = name[i]; - free (name[i]); - } - free (name); - name = new_name; - name[N - 1] = "Dieter"; - - N++; - new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - { - new_name[i] = name[i]; - free (name[i]); - } - free (name); - name = new_name; - name[N - 1] = "Emma"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-13.c b/20210128/dynmem-13.c deleted file mode 100644 index 05edde0ad90c61c4b297ba400352df62f326f1de..0000000000000000000000000000000000000000 --- a/20210128/dynmem-13.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int N = 3; -char **name = NULL; - -void insert_string (char *s) -{ - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - free (name); - name = new_name; - name[N - 1] = s; -} - -int main (void) -{ - name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - insert_string ("Dieter"); - insert_string ("Emma"); - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-14.c b/20210128/dynmem-14.c deleted file mode 100644 index f337059fba37de6f43964354863d04e7123284d0..0000000000000000000000000000000000000000 --- a/20210128/dynmem-14.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int N = 3; -char **name = NULL; - -void insert_string (char *s) -{ - N++; - name = realloc (name, N * sizeof (char *)); - name[N - 1] = s; -} - -int main (void) -{ - name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - insert_string ("Dieter"); - insert_string ("Emma"); - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-2.c b/20210128/dynmem-2.c deleted file mode 100644 index e002b3326b70b6fd2b2fb76e033c0b0b13abfb84..0000000000000000000000000000000000000000 --- a/20210128/dynmem-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < 3; i++) - printf ("name[%d] = %s\n", i, name[i]); - - name[3] = "Dieter"; - - printf ("\n"); - for (int i = 0; i < 4; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-2.png b/20210128/dynmem-2.png deleted file mode 100644 index 21cd6b75758a8202ee7ddeca930a85d728e3d1a4..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem-2.png and /dev/null differ diff --git a/20210128/dynmem-3.c b/20210128/dynmem-3.c deleted file mode 100644 index ae842579f633fcee8bae8a91047360a142786635..0000000000000000000000000000000000000000 --- a/20210128/dynmem-3.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - name[3] = "Dieter"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-3.png b/20210128/dynmem-3.png deleted file mode 100644 index bbd582d32eea3d7d76701c5a881538e30874165e..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem-3.png and /dev/null differ diff --git a/20210128/dynmem-4.c b/20210128/dynmem-4.c deleted file mode 100644 index 2aecf6de2971501e4519c78a69aefe08269968e7..0000000000000000000000000000000000000000 --- a/20210128/dynmem-4.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - for (int i = 0; i < 10; i++) - { - N++; - name[3] = "Dieter"; - } - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-4.png b/20210128/dynmem-4.png deleted file mode 100644 index ff2d7f4029dd0263f124ed802062a354350c60c6..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem-4.png and /dev/null differ diff --git a/20210128/dynmem-5.c b/20210128/dynmem-5.c deleted file mode 100644 index 25dfd9363aa601db04ac7209b76fcafebdc971ef..0000000000000000000000000000000000000000 --- a/20210128/dynmem-5.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; /* Falsch! */ - name[3] = "Dieter"; - N++; - name[4] = "Emma"; /* Ausgabe führt zu Absturz! */ - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-5.png b/20210128/dynmem-5.png deleted file mode 100644 index 460a66351b2f6bce9e491cb9c2139b2b29661e79..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem-5.png and /dev/null differ diff --git a/20210128/dynmem-6.c b/20210128/dynmem-6.c deleted file mode 100644 index be115dbf74d7c0585b7b46be3c4b8bab9ddcc0b1..0000000000000000000000000000000000000000 --- a/20210128/dynmem-6.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -void print_names (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - /* Speicherleck: Der Zeiger "name" verschwindet, aber die 24 Bytes, - auf die er zeigt, sind weiterhin belegt. */ -} - -int main (void) -{ - print_names (); - print_names (); - print_names (); - print_names (); - print_names (); - return 0; -} diff --git a/20210128/dynmem-7.c b/20210128/dynmem-7.c deleted file mode 100644 index e6f4605ce35755f425af2018b51121e97f8b323d..0000000000000000000000000000000000000000 --- a/20210128/dynmem-7.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -void print_names (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - - /* Kein Speicherleck: Bevor der Zeiger "name" verschwindet, - geben wir die 24 Bytes, auf die er zeigt, wieder frei. */ - - /* Garbage Collection: Die Standard-Bibliothek der Programmiersprache - sorgt dafür, daß nicht mehr benötigte Speicherbereiche automatisch - wieder freigegeben werden. C macht das nicht. */ -} - -int main (void) -{ - print_names (); - print_names (); - print_names (); - print_names (); - print_names (); - return 0; -} diff --git a/20210128/dynmem-8.c b/20210128/dynmem-8.c deleted file mode 100644 index 235b7be5f8360ff3764a6453ff2716aaa5142167..0000000000000000000000000000000000000000 --- a/20210128/dynmem-8.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - name[N - 1] = "Dieter"; - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - name[N - 1] = "Emma"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem-9.c b/20210128/dynmem-9.c deleted file mode 100644 index ff863c1e4324ae44d1528b5aff13e9a9722fe4a7..0000000000000000000000000000000000000000 --- a/20210128/dynmem-9.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - int N = 3; - char **name = malloc (N * sizeof (char *)); - name[0] = "Anna"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - N++; - char **new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - name[N - 1] = "Dieter"; - - N++; - new_name = malloc (N * sizeof (char *)); - for (int i = 0; i < N - 1; i++) - new_name[i] = name[i]; - name = new_name; - name[N - 1] = "Emma"; - - printf ("\n"); - for (int i = 0; i < N; i++) - printf ("name[%d] = %s\n", i, name[i]); - - free (name); - return 0; -} diff --git a/20210128/dynmem.xcf.gz b/20210128/dynmem.xcf.gz deleted file mode 100644 index 9277bf3e60bafc997d8f4bc4fe6f163c364b57f6..0000000000000000000000000000000000000000 Binary files a/20210128/dynmem.xcf.gz and /dev/null differ diff --git a/20210128/hello-gtk.png b/20210128/hello-gtk.png deleted file mode 120000 index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000 --- a/20210128/hello-gtk.png +++ /dev/null @@ -1 +0,0 @@ -../common/hello-gtk.png \ No newline at end of file diff --git a/20210128/hp-20210128.pdf b/20210128/hp-20210128.pdf deleted file mode 100644 index 2f7012a249447a82c6d97afb9afd8378019fdefa..0000000000000000000000000000000000000000 Binary files a/20210128/hp-20210128.pdf and /dev/null differ diff --git a/20210128/hp-20210128.tex b/20210128/hp-20210128.tex deleted file mode 100644 index f291a0036f102c6dd7f28748db0e62e580a0745c..0000000000000000000000000000000000000000 --- a/20210128/hp-20210128.tex +++ /dev/null @@ -1,1404 +0,0 @@ -% hp-20210128.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Programmierung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{tikz} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{28.\ Januar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{medgreen} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{red} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \vspace*{-\smallskipamount} - \item[\dots] -% \item[6.2] Beispiel: Zahlen und Buchstaben -% \color{red} -% \item[6.3] Unions -% \item[6.4] Virtuelle Methoden -% \color{black} -% \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) -% \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\setcounter{section}{4} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\nosectionnonumber{Aufgabe} - -\begin{frame}[fragile] - - \shownosectionnonumber - - Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - - \bigskip - - Diese Aufgabe berührt die Themen - "`Umgang mit Arrays und Zeigern"', "`Bit-Manipulation"' - und je nach Implementierung auch "`objektorientierte Programmierung"'. - Dies zu begründen, ist Teil der Aufgabe. - -\end{frame} - -\addtocounter{subsection}{1} - -\subsection{Interrupts} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: eingebaute Uhr\hfill - \makebox(0,0)[tr]{% - \only<1->{\begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt Zählschleife (\lstinline{_delay_ms}):\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}}% - } - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - - ... - - - ISR (TIMER0B_COMP_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}} - \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} - \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}} - \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}} - \end{picture} - - Initialisierung über spezielle Ports: - \lstinline{TCCR0B}, \lstinline{TIMSK0} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster\hfill - \makebox(0,0)[tr]{% - \begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt \newterm{Busy Waiting\/}:\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}} - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - ... - - ISR (INT0_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - - \medskip - - Initialisierung über spezielle Ports: - \lstinline{EICRA}, \lstinline{EIMSK} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster - - \vspace*{-2.5pt} - - \begin{minipage}[t]{5cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - volatile uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - ... - - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; - }¿ - \end{lstlisting} - \end{minipage} - - \pause - \begin{picture}(0,0) - \color{red} - \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm} - \begin{center} - \textbf{volatile}:\\ - Speicherzugriff\\ - nicht wegoptimieren - \end{center} - \end{minipage}}} - \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Was ist eigentlich \lstinline{PORTD}? - - \bigskip -% \pause - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E} - - \bigskip -% \pause - \lstinline{PORTD = 0x01;}\\ - \textarrow\quad - \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\ -% \pause - \begin{picture}(0,2)(0,-1.7) - \color{red} - \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$} -% \pause - \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\ - auf \lstinline|volatile uint8_t|}}}$} -% \pause - \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}} - \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}} - \end{picture} - -% \pause - \textarrow\quad - \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B| - -% \pause - \bigskip - \bigskip - - \textarrow\quad - \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee. - -\end{frame} - -\subsection{Byte-Reihenfolge -- Endianness} -\subsubsection{Konzept} - -\begin{frame}[fragile] - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - -% \pause - \bigskip - - $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$ - -% \pause - \bigskip - Speicherzellen: - - \medskip - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & für Menschen leichter lesbar \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & bei Additionen effizienter - \end{tabular} - -% \pause - \medskip - \textarrow\ Geschmackssache -% \pause\\ - \quad\textbf{\dots\ außer bei Datenaustausch!} - -% \pause -% \bigskip -% -% Aber: nicht verwechseln! \qquad $0304_{16} = 772$ - -\end{frame} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \medskip - - \textarrow\ Geschmackssache\\ - \textbf{\dots\ außer bei Datenaustausch!} - - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - -\end{frame} - -\subsubsection{Dateiformate} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian -% \pause - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - -% \pause - \bigskip - - Grafik-Formate: Reihenfolge der Bits in den Bytes - \begin{itemize} - \item - PBM-Dateien: Big-Endian\only<1->{, MSB first} - \item - XBM-Dateien: Little-Endian\only<1->{, LSB first} - \end{itemize} - \only<1->{MSB/LSB = most/least significant bit} - - \smallskip - - Verwechselungsgefahr: most/least significant byte - -\end{frame} - -\subsubsection{Datenübertragung} - -\begin{frame} - - \showsubsection - \showsubsubsection - - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): LSB first - \item - I$^2$C: MSB first - \item - USB: beides -% \pause - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - -\end{frame} - -\subsection{Binärdarstellung negativer Zahlen} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\ -% \pause - \textarrow\ 255 + 1 = 0 - -% \pause - \medskip - - 8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\ - \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\ -% \pause - \textarrow\ Zweierkomplement - -% \pause - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 127 + 1 = $-128$ - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 16-Bit-Zahlen ohne Vorzeichen: - \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff} - = 0 bis 65535\hfill 0 bis 255\\ - \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0 - - \medskip - - 16-Bit-Zahlen mit Vorzeichen: - \lstinline{int16_t}\hfill\lstinline{int8_t}\\ - \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill - \lstinline{0xff} = 255 = $-1$\\ - \textarrow\ Zweierkomplement - - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 32767 + 1 = $-32768$ - - \bigskip - Literatur: \url{http://xkcd.com/571/} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Frage: \emph{Für welche Zahl steht der Speicherinhalt\, - \raisebox{2pt}{% - \tabcolsep0.25em - \begin{tabular}{|c|c|}\hline - \rule{0pt}{11pt}a3 & 90 \\\hline - \end{tabular}} - (hexadezimal)?} - -% \pause - \smallskip - Antwort: \emph{Das kommt darauf an.} ;--) - -% \pause - \medskip - Little-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - -% \pause - \medskip - Big-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-23664$\\ - als \lstinline,uint16_t,: & $41872$\\ als \lstinline,int32_t,: & $-1550843904$ & (zusätzliche Bytes\\ - als \lstinline,uint32_t,: & $2744123392$ & mit Nullen aufgefüllt)\\ - als \lstinline,int64_t,: & $-6660823848880963584$\\ - als \lstinline,uint64_t,: & $11785920224828588032$\\ - \end{tabular} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Speicherausrichtung -- Alignment} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - -% \pause - \bigskip - - Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"' - \begin{itemize} - \item - 2-Byte-Operation: effizienter -% \pause - \item - \dots\ oder sogar nur dann erlaubt -% \pause - \arrowitem - Compiler optimiert Speicherausrichtung - \end{itemize} - - \medskip - -% \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t dummy; - uint16_t b; - uint8_t c;¿ - \end{lstlisting} - \end{minipage} -% \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t c; - uint16_t b;¿ - \end{lstlisting} - \end{minipage} - -% \pause - \vspace{-1.75cm} - \strut\hfill - \begin{minipage}{6.5cm} - Fazit: - \begin{itemize} - \item - \textbf{Adressen von Variablen\\ - sind systemabhängig} - \item - Bei Definition von Datenformaten\\ - Alignment beachten \textarrow\ effizienter - \end{itemize} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \item[5.1] Bit-Operationen - \item[5.2] I/O-Ports - \color{medgreen} - \item[5.3] Interrupts - \item[5.4] volatile-Variable - \item[5.6] Byte-Reihenfolge -- Endianness - \item[5.7] Binärdarstellung negativer Zahlen - \item[5.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{red} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \vspace*{-\smallskipamount} - \item[\dots] -% \item[6.2] Beispiel: Zahlen und Buchstaben -% \color{red} -% \item[6.3] Unions -% \item[6.4] Virtuelle Methoden -% \color{black} -% \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) -% \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\section{Objektorientierte Programmierung} - -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name); - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - Problem: Die Elemente sind unterschiedlich groß (Speicherplatz). - \item - Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf. - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.05){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.05){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} - \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ -% kommt gleich - nächste Woche - \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassenhierarchie} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} -% \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{medgreen} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \item[6.3] Unions - \item[6.4] Virtuelle Methoden - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20210128/hp-musterloesung-20210128.pdf b/20210128/hp-musterloesung-20210128.pdf deleted file mode 100644 index 05884e3ee698a07f1924d6b18f57a8c29c7374e9..0000000000000000000000000000000000000000 Binary files a/20210128/hp-musterloesung-20210128.pdf and /dev/null differ diff --git a/20210128/hp-musterloesung-20210128.tex b/20210128/hp-musterloesung-20210128.tex deleted file mode 100644 index 93131492c646f3186f1715c1f7e4bf4a1bb23b88..0000000000000000000000000000000000000000 --- a/20210128/hp-musterloesung-20210128.tex +++ /dev/null @@ -1,763 +0,0 @@ -% hp-musterloesung-20210128.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Speicherformate von Zahlen, Personen-Datenbank, objektorientierte Tier-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 28.\ Januar 2021} - - \exercise{Speicherformate von Zahlen} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - typedef struct - { - uint32_t a; - uint64_t b; - uint8_t c; - } three_numbers; - - int main (void) - { - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; - } - \end{lstlisting} - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but - argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hallo, Welt! - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die beim Compilieren auftretende Warnung. - \points{2} - \item - Erklären Sie die Ausgabe des Programms. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.) - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par - Erklären Sie die geänderte Ausgabe des Programms. - \points{3} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die beim Compilieren auftretende Warnung.} - - Die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s} - erwartet als Parameter einen String, d.\,h.\ einen Zeiger auf \lstinline{char}. - Die Adresse (\lstinline{&}) der Variablen \lstinline{xyz} - ist zwar ein Zeiger, aber nicht auf \lstinline{char}, - sondern auf einen \lstinline{struct} vom Typ \lstinline{three_numbers}. - Eine implizite Umwandlung des Zeigertyps ist zwar möglich, - aber normalerweise nicht das, was man beabsichtigt. - - \item - \textbf{Erklären Sie die Ausgabe des Programms.} - - Ein String in C ist ein Array von \lstinline{char}s - bzw.\ ein Zeiger auf \lstinline{char}. - Da die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s} - einen String erwartet, wird sie das, worauf der übergebene Zeiger zeigt, - als ein Array von \lstinline{char}s interpretieren. - Ein \lstinline{char} entspricht einer 8-Bit-Speicherzelle. - Um die Ausgabe des Programms zu erklären, müssen wir daher - die Speicherung der Zahlen in den einzelnen 8-Bit-Speicherzellen betrachten. - - Hierfür wandeln wir zunächst die Zahlen von Dezimal nach Hexadezimal um. - Sofern nötig (hier nicht der Fall) füllen wir von links mit Nullen auf, - um den gesamten von der Variablen belegten Speicherplatz zu füllen - (hier: 32 Bit, 64 Bit, 8 Bit). - Jeweils 2 Hex-Ziffern stehen für 8 Bit. - \begin{center} - \begin{tabular}{rcl} - dezimal & & hexadezimal \\[\smallskipamount] - 1\,819\,042\,120 & = & 6C\,6C\,61\,48 \\ - 2\,410\,670\,883\,059\,281\,007 & = & 21\,74\,6C\,65\,57\,20\,2C\,6F \\ - 0 & = & 00 - \end{tabular} - \end{center} - Die Anordnung dieser 8-Bit-Zellen im Speicher lautet - \textbf{auf einem Big-Endian-Rechner} wie folgt: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 6C & 6C & 61 & 48 & - 21 & 74 & 6C & 65 & 57 & 20 & 2C & 6F & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - \textbf{Auf einem Little-Endian-Rechner} lautet sie hingegen: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline -% \raisebox{0.5ex}{\strut} -% H & a & l & l & -% o & , & & W & e & l & t & ! & \\\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Anhand einer ASCII-Tabelle erkennt man, - daß die Big-Endian-Variante dem String \lstinline{"llaH!tleW ,o"} - und die Little-Endian-Variante dem String \lstinline{"Hallo, Welt!"} - entspricht -- jeweils mit einem Null-Symbol am Ende, - das von der Variablen \lstinline{c} herrührt. - - Auf einem Little-Endian-Rechner wird daher - \lstinline[style=terminal]{Hallo, Welt!} ausgegeben. - - \item - \textbf{Welche Endianness hat der verwendete Rechner?} - - Little-Endian (Begründung siehe oben) - - \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?} - - \lstinline[style=terminal]{llaH!tleW ,o} (Begründung siehe oben) - - \item - \textbf{Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)} - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - \textbf{(Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)}\par - \textbf{Erklären Sie die geänderte Ausgabe des Programms.} - - \goodbreak - - Auf einem 64-Bit-Rechner hat eine 64-Bit-Variable - ein \textbf{64-Bit-Alignment}, - d.\,h.\ ihre Speicheradresse muß durch 8 teilbar sein. - - Der Compiler legt die Variablen daher wie folgt im Speicher ab (Little-Endian): - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & ?? & ?? & ?? & ?? & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Der Inhalt der Füll-Bytes ist undefiniert. - Im Beispiel aus der Aufgabenstellung entsteht hier die Ausgabe - \lstinline[style=terminal]{5V}, was den (zufälligen) hexadezimalen Werten - 35 56 entspricht: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & 35 & 56 & 00 & ?? & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Da danach die Ausgabe aufhört, muß an der nächsten Stelle - ein Null-Symbol stehen, das das Ende des Strings anzeigt. - Der Inhalt der darauf folgenden Speicherzelle bleibt unbekannt. - \end{enumerate} - - \exercise{Personen-Datenbank} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-2.c}): - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - typedef struct - { - char first_name[10]; - char family_name[20]; - char day, month; - int year; - } person; - - int main (void) - { - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; - } - \end{lstlisting} - - Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings - von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten - \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}. - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿ - $ ¡./aufgabe-2¿ - Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren. - Speicherzugriffsfehler - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort. - \points{1} - \item - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.) - \points{2} - \end{enumerate} - - \goodbreak - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.} - - Der String \lstinline{"Leutheusser-Schnarrenberger"} - hat 27 Zeichen und daher mehr als die in der Variablen - \lstinline{sls.family_name} vorgesehenen 20 Zeichen. - Das \lstinline{"nberger"} paßt nicht mehr in die String-Variable. - - Die Zuweisung \lstinline{strcpy (sls.family_name, "Leutheusser-Schnarrenberger")} - überschreibt daher 8 Speicherzellen außerhalb der String-Variablen - \lstinline{sls.family_name} mit dem String \lstinline{"nberger"} - (7 Buchstaben zzgl.\ String-Ende-Symbol) -- und damit insbesondere die Variablen - \lstinline{sls.day}, \lstinline{sls.month} und \lstinline{sls.year}. - - Die überschriebenen Speicherzellen sehen demnach folgendermaßen aus: - \begin{center} - \begin{picture}(8,1.5)(0,-0.5) - \put(0,0){\line(1,0){8}} - \put(0,1){\line(1,0){8}} - \multiput(0,0)(1,0){9}{\line(0,1){1}} - \put(0.4,0.38){\lstinline{n}} - \put(1.4,0.38){\lstinline{b}} - \put(2.4,0.38){\lstinline{e}} - \put(3.4,0.38){\lstinline{r}} - \put(4.4,0.38){\lstinline{g}} - \put(5.4,0.38){\lstinline{e}} - \put(6.4,0.38){\lstinline{r}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}} - \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}} - \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}} - \end{picture} - \end{center} - ("`?"' steht für zwei Speicherzellen, von denen wir nicht wissen, - wofür sie genutzt werden.) - - Wenn wir die ASCII-Zeichen in Hexadezimalzahlen umrechnen, entspricht dies: - \begin{center} - \begin{picture}(7,1.5)(0,-0.5) - \put(0,0){\line(1,0){8}} - \put(0,1){\line(1,0){8}} - \multiput(0,0)(1,0){9}{\line(0,1){1}} - \put(0.5,0.5){\makebox(0,0){\lstinline{0x6e}}} - \put(1.5,0.5){\makebox(0,0){\lstinline{0x62}}} - \put(2.5,0.5){\makebox(0,0){\lstinline{0x65}}} - \put(3.5,0.5){\makebox(0,0){\lstinline{0x72}}} - \put(4.5,0.5){\makebox(0,0){\lstinline{0x67}}} - \put(5.5,0.5){\makebox(0,0){\lstinline{0x65}}} - \put(6.5,0.5){\makebox(0,0){\lstinline{0x72}}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}} - \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}} - \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}} - \end{picture} - \end{center} - Dies entspricht bereits genau den Werten \lstinline{110} und \lstinline{98} - für die Variablen \lstinline{sls.day} bzw.\ \lstinline{sls.month}. - - Für die Variable \lstinline{sls.year} müssen wir ihre vier Speicherzellen - unter der Berücksichtigung der Endianness des Rechners zusammenziehen. - Für Big-Endian ergibt dies \lstinline{0x65726765 == 1701996389}. - Für Little-Endian ergibt sich der Wert \lstinline{0x65677265 == 1701278309}, - der auch in der Ausgabe des Programms auftaucht. - - \item - \textbf{Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort.} - - Wie in (a) begründet, ergibt sich die Ausgabe von - \lstinline[style=terminal]{1701278309} für das Jahr - aus dem Speicherformat Little-Endian. - - \item - \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?} - - Wie in (a) begründet, ergäbe sich aus dem Speicherformat Big-Endian - die Ausgabe von \lstinline[style=terminal]{1701996389} für das Jahr. - - \item - \textbf{Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.)} - - Die zwei in (a) mit "`?"' bezeichneten Speicherzellen - wurden ebenfalls überschrieben. - Dies ist in der Ausgabe zunächst nicht sichtbar, - bewirkt aber später den Speicherzugriffsfehler. - - (Tatsächlich handelt es sich bei den überschriebenen Speicherzellen - um einen Teil der Rücksprungadresse, die \lstinline{main()} verwendet, - um mit \lstinline{return 0} an das Betriebssystem zurückzugeben.) - - \end{enumerate} - - \textbf{Hinweis 1:} - Um auf einen solchen Lösungsweg zu kommen, wird empfohlen, - "`geheimnisvolle"' Zahlen nach hexadezimal umzurechnen - und in Speicherzellen (Zweiergruppen von Hex-Ziffern) zu zerlegen. - Oft erkennt man dann direkt ASCII-Zeichen: - Großbuchstaben beginnen mit der Hex-Ziffer \lstinline{4} oder \lstinline{5}, - Kleinbuchstaben mit \lstinline{6} oder \lstinline{7}. - - \textbf{Hinweis 2:} - Um derartige Programmierfehler in der Praxis von vorneherein zu vermeiden, - wird empfohlen, anstelle von \lstinline{strcpy()} - grundsätzlich die Funktion \lstinline{strncpy()} zu verwenden. - Diese erwartet einen zusätzlichen Parameter, - der die maximal zulässige Länge des Strings enthält. - Ohne einen derartigen expliziten Parameter kann die Funktion nicht wissen, - wie lang die Variable ist, in der der String gespeichert werden soll. - - \exercise{Objektorientierte Tier-Datenbank} - - Das unten dargestellte Programm (Datei: \gitfile{hp}{2020ws/20210128}{aufgabe-3a.c}) - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿ - aufgabe-2a.c: In function 'main': - aufgabe-2a.c:31: error: 'animal' has no member named 'wings' - aufgabe-2a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{2020ws/20210128}{aufgabe-3b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿ - $ ¡./aufgabe-2b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. - \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? - \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. - \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\ - \points{4} -% \item[(e)] -% Schreiben Sie das Programm so um, -% daß es keine expliziten Typumwandlungen mehr benötigt.\par -% Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} -% \item[(f)] -% Schreiben Sie das Programm weiter um, -% so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} -% dynamisch erzeugt.\par -% Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} -% \item[(g)] -% Schreiben Sie das Programm weiter um, -% so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, -% sondern stattdessen eine virtuelle Methode \lstinline{print()} -% aufgerufen wird.\par -% Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, -% und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.} - - \lstinline{a[0]} und \lstinline{a[1]} - sind gemäß der Deklaration \lstinline{animal *a[2]} - Zeiger auf Variablen vom Typ \lstinline{animal} (ein \lstinline{struct}). - Wenn man diesen Zeiger dereferenziert (\lstinline{->}), - erhält man eine \lstinline{animal}-Variable. - Diese enthält keine Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(b)] - \textbf{Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?} - - Durch die \emph{explizite Typumwandlung des Zeigers\/} - erhalten wir einen Zeiger auf eine \lstinline{with_wings}- - bzw.\ auf eine \lstinline{with_legs}-Variable. - Diese enthalten die Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(c)] - \textbf{Erklären Sie die Ausgabe des Programms.} - - Durch die explizite Typumwandlung des Zeigers - zeigt \lstinline{a[0]} auf eine \lstinline{with_wings}-Variable. - Diese enthält nur ein einziges Datenfeld \lstinline{wings}, - das an genau derselben Stelle im Speicher liegt - wie \lstinline{a[0]->type}, also das Datenfeld \lstinline{type} - der \lstinline{animal}-Variable, auf die der Zeiger \lstinline{a[0]} zeigt. - Durch die Zuweisung der Zahl \lstinline{2} - an \lstinline{((with_wings *) a[0])->wings} - überschreiben wir also \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[0]} als \lstinline{WITH_LEGS} erkennt. - - Bei der Ausgabe \lstinline[style=terminal]{A duck has 2 legs.} - wird das Datenfeld \lstinline{((with_legs *)a[0])->legs} als Zahl ausgegeben. - Dieses Datenfeld befindet sich in denselben Speicherzellen wie - \lstinline{a[0]->type} und \lstinline{((with_wings *)} % :-( - \lstinline{a[0]->wings} - und hat daher ebenfalls den Wert 2. - - Auf die gleiche Weise überschreiben wir durch die Zuweisung der Zahl 4 - an \lstinline{((with_legs *) a[1])->legs} - das Datenfeld \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[1]} als unbekanntes Tier (Nr.\ 4) erkennt und - \lstinline[style=terminal]{Error in animal: cow} ausgibt. - - \item[(d)] - \textbf{Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.} - - Damit die \emph{Vererbung\/} zwischen den Objekten - \lstinline{animal}, \lstinline{with_wings} und \lstinline{with_legs} - funktioniert, müssen die abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - alle Datenfelder der Basisklasse \lstinline{animal} erben. - In C geschieht dies explizit; die Datenfelder müssen in den - abgeleiteten Klassen neu angegeben werden - (siehe \gitfile{hp}{2020ws/20210128}{loesung-3d-1.c}): - - \begin{lstlisting}[gobble=8] - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int type; - char *name; - int wings; - } with_wings; - - typedef struct with_legs - { - int type; - char *name; - int legs; - } with_legs; - \end{lstlisting} - - Zusätzlich ist es notwendig, - die Instanzen \lstinline{duck} und \lstinline{cow} - der abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - auch als solche zu deklarieren, - damit für sie genügend Speicher reserviert wird: - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - \end{lstlisting} - - Wenn man dies vergißt und sie nur als \lstinline{animal} deklariert, - wird auch nur Speicherplatz für (kleinere) - \lstinline{animal}-Variable angelegt. - Dadurch kommt es zu Speicherzugriffen außerhalb der - deklarierten Variablen, was letztlich zu einem Absturz führt - (siehe \gitfile{hp}{2020ws/20210128}{loesung-3d-0f.c}). - - Für die Zuweisung eines Zeigers auf \lstinline{duck} - an \lstinline{a[0]}, also an einen Zeiger auf \lstinline{animal} - wird eine weitere explizite Typumwandlung notwendig. - Entsprechendes gilt für die Zuweisung eines Zeigers auf \lstinline{cow} - an \lstinline{a[1]}. - - Es ist sinnvoll, explizite Typumwandlungen so weit wie möglich zu vermeiden. - Es ist einfacher und gleichzeitig sicherer, - direkt in die Variablen \lstinline{duck} und \lstinline{cow} - zu schreiben, anstatt dies über die Zeiger \lstinline{a[0]} - und \lstinline{a[1]} zu tun - (siehe \gitfile{hp}{2020ws/20210128}{loesung-3d-2.c}): - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - \end{lstlisting} - - \item[(e)] - \textbf{Schreiben Sie das Programm so um, - daß es keine expliziten Typumwandlungen mehr benötigt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{union}.} - - Siehe \gitfile{hp}{2020ws/20210128}{loesung-3e.c}. - - Diese Lösung basiert auf \gitfile{hp}{2020ws/20210128}{loesung-3d-2.c}, - da diese bereits weniger explizite Typumwandlungen enthält - als \gitfile{hp}{2020ws/20210128}{loesung-3d-1.c}. - - Arbeitsschritte: - \begin{itemize} - \item - Umbenennen des Basistyps \lstinline{animal} in \lstinline{base}, - damit wir den Bezeichner \lstinline{animal} - für die \lstinline{union} verwenden können - \item - Schreiben einer \lstinline{union animal}, - die die drei Klassen \lstinline{base}, - \lstinline{with_wings} und \lstinline{with_legs} - als Datenfelder enthält - \item - Umschreiben der Initialisierungen: - Zugriff auf Datenfelder erfolgt nun durch - z.\,B.\ \lstinline{a[0]->b.name}. - Hierbei ist \lstinline{b} der Name des \lstinline{base}-Datenfelds - innerhalb der \lstinline{union animal}. - \item - Auf gleiche Weise schreiben wir die \lstinline{if}-Bedingungen - innerhalb der \lstinline{for}-Schleife - sowie die Parameter der \lstinline{printf()}-Aufrufe um. - \end{itemize} - Explizite Typumwandlungen sind nun nicht mehr nötig. - - Nachteil dieser Lösung: - Jede Objekt-Variable belegt nun Speicherplatz - für die gesamte \lstinline{union animal}, - anstatt nur für die benötigte Variable vom Typ - \lstinline{with_wings} oder \lstinline{with_legs}. - Dies kann zu einer Verschwendung von Speicherplatz führen, - auch wenn dies in diesem Beispielprogramm tatsächlich nicht der Fall ist. - - \item[(f)] - \textbf{Schreiben Sie das Programm weiter um, - so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} - dynamisch erzeugt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.} - - Siehe \gitfile{hp}{2020ws/20210128}{loesung-3f.c}. - - \item[(g)] - \textbf{Schreiben Sie das Programm weiter um, - so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, - sondern stattdessen eine virtuelle Methode \lstinline{print()} - aufgerufen wird.}\par - \textbf{Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, - und initialisieren Sie diese in den Konstruktoren.} - - Siehe \gitfile{hp}{2020ws/20210128}{loesung-3g.c}. - - \end{itemize} - -\end{document} diff --git a/20210128/hp-uebung-20210128.pdf b/20210128/hp-uebung-20210128.pdf deleted file mode 100644 index 350451858390509e6e1c0b4e13eee0ebf42d2f8f..0000000000000000000000000000000000000000 Binary files a/20210128/hp-uebung-20210128.pdf and /dev/null differ diff --git a/20210128/hp-uebung-20210128.tex b/20210128/hp-uebung-20210128.tex deleted file mode 100644 index 49b831bc5b00720a0e3ff714da0aff587878253b..0000000000000000000000000000000000000000 --- a/20210128/hp-uebung-20210128.tex +++ /dev/null @@ -1,305 +0,0 @@ -% hp-uebung-20210128.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Speicherformate von Zahlen, Personen-Datenbank, objektorientierte Tier-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 28.\ Januar 2021} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 17 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Speicherformate von Zahlen} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - typedef struct - { - uint32_t a; - uint64_t b; - uint8_t c; - } three_numbers; - - int main (void) - { - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; - } - \end{lstlisting} - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but - argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hallo, Welt! - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die beim Compilieren auftretende Warnung. - \points{2} - \item - Erklären Sie die Ausgabe des Programms. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.) - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par - Erklären Sie die geänderte Ausgabe des Programms. - \points{3} - \end{enumerate} - - \clearpage - \exercise{Personen-Datenbank} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210128}{aufgabe-2.c}): - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - typedef struct - { - char first_name[10]; - char family_name[20]; - char day, month; - int year; - } person; - - int main (void) - { - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; - } - \end{lstlisting} - - Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings - von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten - \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}. - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿ - $ ¡./aufgabe-2¿ - Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren. - Speicherzugriffsfehler - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort. - \points{1} - \item - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.) - \points{2} - \end{enumerate} - - \clearpage - \exercise{Objektorientierte Tier-Datenbank} - - Das unten dargestellte Programm (Datei: \gitfile{hp}{2020ws/20210128}{aufgabe-3a.c}) - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿ - aufgabe-2a.c: In function 'main': - aufgabe-2a.c:31: error: 'animal' has no member named 'wings' - aufgabe-2a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{2020ws/20210128}{aufgabe-3b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿ - $ ¡./aufgabe-2b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. - \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? - \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. - \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\ - \points{4} -% \item[(e)] -% Schreiben Sie das Programm so um, -% daß es keine expliziten Typumwandlungen mehr benötigt.\par -% Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} -% \item[(f)] -% Schreiben Sie das Programm weiter um, -% so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} -% dynamisch erzeugt.\par -% Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} -% \item[(g)] -% Schreiben Sie das Programm weiter um, -% so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, -% sondern stattdessen eine virtuelle Methode \lstinline{print()} -% aufgerufen wird.\par -% Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, -% und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20210128/loesung-1-1.c b/20210128/loesung-1-1.c deleted file mode 100644 index 175923f7250d0747a21df5f33f8a3761393d1d7f..0000000000000000000000000000000000000000 --- a/20210128/loesung-1-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%x %x %x\n", xyz.a, xyz.b, xyz.c); - printf ("%08x %016x %02x\n", xyz.a, xyz.b, xyz.c); - printf ("%s\n", &xyz); - return 0; -} diff --git a/20210128/loesung-1-2.c b/20210128/loesung-1-2.c deleted file mode 100644 index 07ca06832cc58c1b8243f9afd05aec57bb12b1c4..0000000000000000000000000000000000000000 --- a/20210128/loesung-1-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%x %lx %x\n", xyz.a, xyz.b, xyz.c); - printf ("%08x %016lx %02x\n", xyz.a, xyz.b, xyz.c); - printf ("%s\n", &xyz); - return 0; -} diff --git a/20210128/loesung-2-1.c b/20210128/loesung-2-1.c deleted file mode 100644 index 416c5dfa2cba2f7dc68b72551ec6a5c8ce8bab79..0000000000000000000000000000000000000000 --- a/20210128/loesung-2-1.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - sls.day = 26; - sls.month = 7; - sls.year = 1951; - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20210128/loesung-2-2.c b/20210128/loesung-2-2.c deleted file mode 100644 index 825373e61475ebc67e9cac6929b6e004715a7cad..0000000000000000000000000000000000000000 --- a/20210128/loesung-2-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 10); - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 20); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20210128/loesung-2-3.c b/20210128/loesung-2-3.c deleted file mode 100644 index 7a4b1bfaf9e67a164ee865a0ae4ef69606255de0..0000000000000000000000000000000000000000 --- a/20210128/loesung-2-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 9); - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20210128/loesung-2-4.c b/20210128/loesung-2-4.c deleted file mode 100644 index 3c635dfa7e3923eb678469166bf218e1640927a2..0000000000000000000000000000000000000000 --- a/20210128/loesung-2-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 9); - sls.first_name[9] = 0; - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19); - sls.family_name[19] = 0; - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20210128/loesung-3d-0f.c b/20210128/loesung-3d-0f.c deleted file mode 100644 index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000 --- a/20210128/loesung-3d-0f.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210128/loesung-3d-1.c b/20210128/loesung-3d-1.c deleted file mode 100644 index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000 --- a/20210128/loesung-3d-1.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210128/loesung-3d-2.c b/20210128/loesung-3d-2.c deleted file mode 100644 index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000 --- a/20210128/loesung-3d-2.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210128/loesung-3e.c b/20210128/loesung-3e.c deleted file mode 100644 index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000 --- a/20210128/loesung-3e.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - duck.b.type = WITH_WINGS; - duck.b.name = "duck"; - duck.w.wings = 2; - - animal cow; - a[1] = &cow; - cow.b.type = WITH_LEGS; - cow.b.name = "cow"; - cow.l.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210128/loesung-3f.c b/20210128/loesung-3f.c deleted file mode 100644 index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000 --- a/20210128/loesung-3f.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210128/loesung-3g.c b/20210128/loesung-3g.c deleted file mode 100644 index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000 --- a/20210128/loesung-3g.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -union animal; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); -} base; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int legs; -} with_legs; - -typedef union animal -{ - base b; - with_wings w; - with_legs l; -} animal; - -void print_with_wings (animal *this) -{ - printf ("A %s has %d wings.\n", this->b.name, this->w.wings); -} - -void print_with_legs (animal *this) -{ - printf ("A %s has %d legs.\n", this->b.name, this->l.legs); -} - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->b.print = print_with_wings; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->b.print = print_with_legs; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - for (int i = 0; i < 2; i++) - a[i]->b.print (a[i]); - return 0; -} diff --git a/20210128/logo-hochschule-bochum-cvh-text-v2.pdf b/20210128/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210128/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210128/logo-hochschule-bochum.pdf b/20210128/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210128/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210128/objects-1.c b/20210128/objects-1.c deleted file mode 100644 index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000 --- a/20210128/objects-1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { &i, &s }; - - return 0; -} diff --git a/20210128/objects-2.c b/20210128/objects-2.c deleted file mode 100644 index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000 --- a/20210128/objects-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - return 0; -} diff --git a/20210128/objects-3.c b/20210128/objects-3.c deleted file mode 100644 index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000 --- a/20210128/objects-3.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", object[i]->content); - - return 0; -} diff --git a/20210128/objects-3a.c b/20210128/objects-3a.c deleted file mode 100644 index a285a87d72694f5259a8a736ab448383e7004580..0000000000000000000000000000000000000000 --- a/20210128/objects-3a.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { &i, &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", object[i]->content); - - return 0; -} diff --git a/20210128/objects-4.c b/20210128/objects-4.c deleted file mode 100644 index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000 --- a/20210128/objects-4.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", (t_integer *) object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", (t_string *) object[i]->content); - - return 0; -} diff --git a/20210128/objects-5.c b/20210128/objects-5.c deleted file mode 100644 index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000 --- a/20210128/objects-5.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", ((t_integer *) object[i])->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", ((t_string *) object[i])->content); - - return 0; -} diff --git a/20210128/objects-5a.c b/20210128/objects-5a.c deleted file mode 100644 index 14f1cadd3a7d0954abdd844249d73656322c9e89..0000000000000000000000000000000000000000 --- a/20210128/objects-5a.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int nutzlos; - int type; -} t_base; - -typedef struct -{ - int content; - int type; -} t_integer; - -typedef struct -{ - char *content; - int type; -} t_string; - -int main (void) -{ - t_integer i = { 42, 1 }; - t_string s = { "Hello, world!", 2 }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", ((t_integer *) object[i])->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", ((t_string *) object[i])->content); - - return 0; -} diff --git a/20210128/objects-6.c b/20210128/objects-6.c deleted file mode 100644 index 86847c9085083e2d5093026619550fb272b5f4ec..0000000000000000000000000000000000000000 --- a/20210128/objects-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == 1) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == 2) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-7.c b/20210128/objects-7.c deleted file mode 100644 index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000 --- a/20210128/objects-7.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -int main (void) -{ - t_integer i = { T_INTEGER, 42 }; - t_string s = { T_STRING, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-8.c b/20210128/objects-8.c deleted file mode 100644 index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000 --- a/20210128/objects-8.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -t_integer *new_integer (int i) -{ - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; -} - -t_string *new_string (char *s) -{ - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; -} - -int main (void) -{ - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-8a.c b/20210128/objects-8a.c deleted file mode 100644 index 76c3cc56ab586e07d5342c4421e7e77be1ead15d..0000000000000000000000000000000000000000 --- a/20210128/objects-8a.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -char *content = "Ätsch."; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -t_integer *new_integer (int i) -{ - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; -} - -t_string *new_string (char *s) -{ - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; -} - -int main (void) -{ - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-8b.c b/20210128/objects-8b.c deleted file mode 100644 index a9d7b5a296a8fb0c822ae0274773dbe6f1c372c7..0000000000000000000000000000000000000000 --- a/20210128/objects-8b.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -t_base *new_integer (int i) -{ - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return (t_base *) p; -} - -t_base *new_string (char *s) -{ - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return (t_base *) p; -} - -int main (void) -{ - t_base *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-9.c b/20210128/objects-9.c deleted file mode 100644 index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000 --- a/20210128/objects-9.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_object (t_object *this) -{ - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20210128/objects-9a.c b/20210128/objects-9a.c deleted file mode 100644 index 46431c9dbd4366c8175a6e3284a271080f175822..0000000000000000000000000000000000000000 --- a/20210128/objects-9a.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_object (t_object *this) -{ - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - for (int i = 0; object[i]; i++) - free (object[i]); - return 0; -} diff --git a/20210128/pgscript.sty b/20210128/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210128/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210128/pgslides.sty b/20210128/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210128/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210128/strings-1.c b/20210128/strings-1.c deleted file mode 100644 index a3d7c16599ce22bcdccce64b5c3abbe0cffbe08e..0000000000000000000000000000000000000000 --- a/20210128/strings-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *hello = "Hello"; - hello[1] = 'a'; - printf ("%s\n", hello); - return 0; -} diff --git a/20210128/strings-1.png b/20210128/strings-1.png deleted file mode 100644 index 842fcec427c07479e65f5a75610891c3448b01b6..0000000000000000000000000000000000000000 Binary files a/20210128/strings-1.png and /dev/null differ diff --git a/20210128/strings-2.c b/20210128/strings-2.c deleted file mode 100644 index 9e0ede926f7ff007f5d3f900af45e59328825302..0000000000000000000000000000000000000000 --- a/20210128/strings-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello"; - hello[1] = 'a'; - printf ("%s\n", hello); - return 0; -} diff --git a/20210128/strings-2.png b/20210128/strings-2.png deleted file mode 100644 index fe399a77a49858d585d47927267baa5b98a13d6e..0000000000000000000000000000000000000000 Binary files a/20210128/strings-2.png and /dev/null differ diff --git a/20210128/unions-1.c b/20210128/unions-1.c deleted file mode 100644 index b75a6063b50193e13e9a2fd0ce140db6a8827499..0000000000000000000000000000000000000000 --- a/20210128/unions-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - int8_t i; - uint8_t u; -} num8_t; - -int main (void) -{ - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; -} diff --git a/20210128/unions-2.c b/20210128/unions-2.c deleted file mode 100644 index 8f3c5d8411b6f68e25a1e981e0a811d8015e3526..0000000000000000000000000000000000000000 --- a/20210128/unions-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - char s[8]; - uint64_t x; -} num_char_t; - -int main (void) -{ - num_char_t test = { "Hello" }; - printf ("%lx\n", test.x); - return 0; -} diff --git a/20210128/unions-3.c b/20210128/unions-3.c deleted file mode 100644 index 2162c065714146572a88da29babe54246afe61c6..0000000000000000000000000000000000000000 --- a/20210128/unions-3.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - char s[8]; - uint64_t x; -} num_char_t; - -int main (void) -{ - num_char_t test = { "Hello" }; - printf ("%ld\n", test.x); - return 0; -} diff --git a/20210128/unions-4.c b/20210128/unions-4.c deleted file mode 100644 index 5838bc1c2d6eef69ac36dad50e1ebc14d0b64f68..0000000000000000000000000000000000000000 --- a/20210128/unions-4.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - char s[8]; - uint64_t x; -} num_char_t; - -int main (void) -{ - num_char_t test = { x: 478560413000 }; - printf ("%s\n", test.s); - return 0; -} diff --git a/20210204/aufgabe-1a.c b/20210204/aufgabe-1a.c deleted file mode 100644 index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000 --- a/20210204/aufgabe-1a.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210204/aufgabe-1b.c b/20210204/aufgabe-1b.c deleted file mode 100644 index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000 --- a/20210204/aufgabe-1b.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210204/aufgabe-2.c b/20210204/aufgabe-2.c deleted file mode 100644 index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000 --- a/20210204/aufgabe-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void even_or_odd (int x) -{ - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); -} - -int main (void) -{ - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; -} diff --git a/20210204/hello-gtk.png b/20210204/hello-gtk.png deleted file mode 120000 index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000 --- a/20210204/hello-gtk.png +++ /dev/null @@ -1 +0,0 @@ -../common/hello-gtk.png \ No newline at end of file diff --git a/20210204/hp-2020ws-p4.pdf b/20210204/hp-2020ws-p4.pdf deleted file mode 100644 index 1f17c91ca4ab823ea9f3781f79b36d148b0d36c6..0000000000000000000000000000000000000000 Binary files a/20210204/hp-2020ws-p4.pdf and /dev/null differ diff --git a/20210204/hp-2020ws-p4.tex b/20210204/hp-2020ws-p4.tex deleted file mode 100644 index bb2a1a765df1d1bcf2cf122b32fc68e0df2b75fa..0000000000000000000000000000000000000000 --- a/20210204/hp-2020ws-p4.tex +++ /dev/null @@ -1,200 +0,0 @@ -% hp-2020ws-p4.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 4: Objektorientiertes Grafik-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{amsmath} -\usepackage{sfmath} - -\sloppy -%\pagestyle{empty} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 4: Objektorientiertes Grafik-Programm} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2020/21\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein GTK+-Programm, - mit dem man verschiedene Objekte (z.\,B.\ Rechtecke, Kreise, Dreiecke) - in eine Grafik einfügen und nachträglich verändern kann - (z.\,B.\ Position, Größe, Farbe). - - (Beispiel: Ich füge zunächst zwei Rechtecke und einen Kreis in eine Grafik ein, - wähle anschließend das erste Rechteck aus und ändere dessen Farbe.) - - \bigskip - - Hinweise: - \vspace*{-\medskipamount} - - \begin{itemize} - \item - Das Beispielprogramm \gitfile{hp}{2020ws/20210128}{objects-9.c} zeigt, - wie man in C verschiedenartige Objekte - in einem Array von Zeigern verwaltet. - \item - Das Beispielprogramm \gitfile{hp}{2020ws/script}{gtk-6.c} zeigt, - wie man mit Hilfe der GUI-Bibliothek GTK+ - verschiedene Objekte in ein Fenster zeichnet. - \item - Das Beispielprogramm \gitfile{hp}{2020ws/script}{gtk-7.c} zeigt, - wie man in der GUI-Bibliothek GTK+ - Tastatur- und Maus-Eingaben entgegennimmt und verarbeitet. - \item - Das Auswählen eines bereits vorhandenen Objekts geht am einfachsten - mittels Tastatur-Eingaben (z.\,B.\ Ziffer 1 für das erste Objekt usw.). - Auswahl mit der Maus ist auch möglich, aber schwieriger. - \item - Mit Hilfe der Funktion \lstinline{gtk_widget_queue_draw()} - teilen Sie GTK+ mit, daß Sie ein \lstinline{GtkWidget} - neu zeichnen lassen möchten. - \item - Das Compilieren eines GTK+-Programms - (z.\,B.\ \gitfile{hp}{2020ws/script}{gtk-7.c}) geschieht wie folgt: - \begin{lstlisting}[style=cmd,gobble=8] - gcc $(pkg-config --cflags gtk+-3.0) -Wall -O gtk-7.c \ - $(pkg-config --libs gtk+-3.0) -o gtk-7 - \end{lstlisting} - (Den Backslash am Ende der ersten Zeile entfällt, - wenn Sie den ganzen Befehl in eine einzige Zeile schreiben.) - \item - \textbf{Abgabe:} - Ihre Quelltexte mit den Lösungen der Praktikumsaufgabe schicken Sie bitte - per E-Mail an \file{peter.gerwinski@hs-bochum.de} - mit dem \textbf{Betreff:} \lstinline[style=terminal]{eif7booD} - unter Angabe von Name, Matrikel-Nummer, - Studiengang (MI/MP/TI) und Studienmodell (KIA/KIS/GS). - \end{itemize} - - \bigskip - \textbf{GTK+ unter GNU/Linux} - \begin{itemize} - \item - Installieren Sie das Entwickler-Paket für GTK+-3,\\ - z.\,B.\ unter Debian GNU/Linux und darauf basierenden Systemen: - \begin{lstlisting}[style=cmd,gobble=8] - apt-get install libgtk-3-dev - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter MacOS X} - \begin{itemize} - \item - Zuerst den Paketmanager "`Homebrew"' installieren: - \begin{lstlisting}[style=cmd,gobble=8] - ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ - Homebrew/install/2020ws/install)" - \end{lstlisting} - (Die URL nicht trennen, sondern in einer Zeile schreiben.) - \item - Danach mit Hilfe von \lstinline[style=cmd]{brew} GTK+ installieren: - \begin{lstlisting}[style=cmd,gobble=8] - brew install gtk+3 - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter Microsoft Windows: Cygwin} - \begin{itemize} - \item - Im Cygwin-Setup-Programm die Pakete \file{libgtk3-devel}, - \file{xorg-server} und \file{dbus-x11} installieren. - \item - Bevor Sie GTK+-Programme starten können, - müssen Sie einmalig den X-Server starten: - \begin{lstlisting}[style=cmd,gobble=8] - XWin -multiwindow & - \end{lstlisting} - \item - Bevor Sie GTK+-Programme starten können, - müssen Sie einmalig pro Shell-Sitzung\\ - die \lstinline[style=cmd]{DISPLAY}-Variable setzen: - \begin{lstlisting}[style=cmd,gobble=8] - export DISPLAY=:0.0 - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter Microsoft Windows: MinGW} - \begin{itemize} - \item - Installieren Sie \file{MSYS2} (Installer). - \item - Installieren Sie von der MinGW-Shell aus GTK+ - und weitere Entwicklungswerkzeuge: - \begin{lstlisting}[style=cmd,gobble=8] - pacman -S mingw-w64-x86_64-gcc - pacman -S mingw-w64-x86_64-gtk3 - pacman -S mingw-w64-x86_64-pkg-config - \end{lstlisting} - \item - Falls nötig, ergänzen Sie in der MinGW-Shell - den Pfad zu den neu installierten Programmen: - \begin{lstlisting}[style=cmd,gobble=8] - export PATH=$PATH:/mingw64/bin - \end{lstlisting} - \end{itemize} - - \bigskip - - \strut\hfill\emph{Viel Erfolg!} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 4.\ Februar 2021 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2018, 2019, 2020, 2021\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20210204/hp-20210204.pdf b/20210204/hp-20210204.pdf deleted file mode 100644 index 1906c32d866445597b7611b8a74ccda92b49806a..0000000000000000000000000000000000000000 Binary files a/20210204/hp-20210204.pdf and /dev/null differ diff --git a/20210204/hp-20210204.tex b/20210204/hp-20210204.tex deleted file mode 100644 index 037525827465f0a7f481dfd24dcfb969fed21905..0000000000000000000000000000000000000000 --- a/20210204/hp-20210204.tex +++ /dev/null @@ -1,702 +0,0 @@ -% hp-20210204.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Programmierung: virtuelle Methoden - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{tikz} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{4.\ Februar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{medgreen} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \item[6.3] Unions - \color{red} - \item[6.4] Virtuelle Methoden - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\setcounter{section}{5} -\section{Objektorientierte Programmierung} - -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name); - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - Problem: Die Elemente sind unterschiedlich groß (Speicherplatz). - \item - Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf. - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.05){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.05){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} - \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ - kommt gleich -% nächste Woche - \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassenhierarchie} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} -% \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡tobject *this; - - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \item[6.3] Unions - \color{medgreen} - \item[6.4] Virtuelle Methoden - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20210204/hp-musterloesung-20210204.pdf b/20210204/hp-musterloesung-20210204.pdf deleted file mode 100644 index 2e8c876bf111098365da8cf9547fdf3296c55cc6..0000000000000000000000000000000000000000 Binary files a/20210204/hp-musterloesung-20210204.pdf and /dev/null differ diff --git a/20210204/hp-musterloesung-20210204.tex b/20210204/hp-musterloesung-20210204.tex deleted file mode 100644 index 458400cdc557311597c6efaaee6783d61491971e..0000000000000000000000000000000000000000 --- a/20210204/hp-musterloesung-20210204.tex +++ /dev/null @@ -1,629 +0,0 @@ -% hp-musterloesung-20210204.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Tier-Datenbank (Neuauflage), Iterationsfunktionen, dynamisches Bit-Array - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 4.\ Februar 2021} - - \exercise{Objektorientierte Tier-Datenbank (Neuauflage)} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 28.\ Januar 2021,\\ - ergänzt um die Teilaufgaben (e) bis (g). - - \medskip - - Das auf der nächsten Seite dargestellte Programm - (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1a.c}) - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-1a.c -o aufgabe-1a¿ - aufgabe-1a.c: In function 'main': - aufgabe-1a.c:31: error: 'animal' has no member named 'wings' - aufgabe-1a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-1b.c -o aufgabe-1b¿ - $ ¡./aufgabe-1b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. -% \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? -% \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. -% \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt. % \\ -% \points{4} - \item[(e)] - Schreiben Sie das Programm so um, - daß es keine expliziten Typumwandlungen mehr benötigt.\par - Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} - \item[(f)] - Schreiben Sie das Programm weiter um, - so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} - dynamisch erzeugt.\par - Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} - \item[(g)] - Schreiben Sie das Programm weiter um, - so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, - sondern stattdessen eine virtuelle Methode \lstinline{print()} - aufgerufen wird.\par - Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, - und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.} - - \lstinline{a[0]} und \lstinline{a[1]} - sind gemäß der Deklaration \lstinline{animal *a[2]} - Zeiger auf Variablen vom Typ \lstinline{animal} (ein \lstinline{struct}). - Wenn man diesen Zeiger dereferenziert (\lstinline{->}), - erhält man eine \lstinline{animal}-Variable. - Diese enthält keine Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(b)] - \textbf{Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?} - - Durch die \emph{explizite Typumwandlung des Zeigers\/} - erhalten wir einen Zeiger auf eine \lstinline{with_wings}- - bzw.\ auf eine \lstinline{with_legs}-Variable. - Diese enthalten die Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(c)] - \textbf{Erklären Sie die Ausgabe des Programms.} - - Durch die explizite Typumwandlung des Zeigers - zeigt \lstinline{a[0]} auf eine \lstinline{with_wings}-Variable. - Diese enthält nur ein einziges Datenfeld \lstinline{wings}, - das an genau derselben Stelle im Speicher liegt - wie \lstinline{a[0]->type}, also das Datenfeld \lstinline{type} - der \lstinline{animal}-Variable, auf die der Zeiger \lstinline{a[0]} zeigt. - Durch die Zuweisung der Zahl \lstinline{2} - an \lstinline{((with_wings *) a[0])->wings} - überschreiben wir also \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[0]} als \lstinline{WITH_LEGS} erkennt. - - Bei der Ausgabe \lstinline[style=terminal]{A duck has 2 legs.} - wird das Datenfeld \lstinline{((with_legs *)a[0])->legs} als Zahl ausgegeben. - Dieses Datenfeld befindet sich in denselben Speicherzellen wie - \lstinline{a[0]->type} und \lstinline{((with_wings *)} % :-( - \lstinline{a[0]->wings} - und hat daher ebenfalls den Wert 2. - - Auf die gleiche Weise überschreiben wir durch die Zuweisung der Zahl 4 - an \lstinline{((with_legs *) a[1])->legs} - das Datenfeld \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[1]} als unbekanntes Tier (Nr.\ 4) erkennt und - \lstinline[style=terminal]{Error in animal: cow} ausgibt. - - \item[(d)] - \textbf{Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.} - - Damit die \emph{Vererbung\/} zwischen den Objekten - \lstinline{animal}, \lstinline{with_wings} und \lstinline{with_legs} - funktioniert, müssen die abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - alle Datenfelder der Basisklasse \lstinline{animal} erben. - In C geschieht dies explizit; die Datenfelder müssen in den - abgeleiteten Klassen neu angegeben werden - (siehe \gitfile{hp}{2020ws/20210204}{loesung-1d-1.c}): - - \begin{lstlisting}[gobble=8] - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int type; - char *name; - int wings; - } with_wings; - - typedef struct with_legs - { - int type; - char *name; - int legs; - } with_legs; - \end{lstlisting} - - Zusätzlich ist es notwendig, - die Instanzen \lstinline{duck} und \lstinline{cow} - der abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - auch als solche zu deklarieren, - damit für sie genügend Speicher reserviert wird: - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - \end{lstlisting} - - Wenn man dies vergißt und sie nur als \lstinline{animal} deklariert, - wird auch nur Speicherplatz für (kleinere) - \lstinline{animal}-Variable angelegt. - Dadurch kommt es zu Speicherzugriffen außerhalb der - deklarierten Variablen, was letztlich zu einem Absturz führt - (siehe \gitfile{hp}{2020ws/20210204}{loesung-1d-0f.c}). - - Für die Zuweisung eines Zeigers auf \lstinline{duck} - an \lstinline{a[0]}, also an einen Zeiger auf \lstinline{animal} - wird eine weitere explizite Typumwandlung notwendig. - Entsprechendes gilt für die Zuweisung eines Zeigers auf \lstinline{cow} - an \lstinline{a[1]}. - - Es ist sinnvoll, explizite Typumwandlungen so weit wie möglich zu vermeiden. - Es ist einfacher und gleichzeitig sicherer, - direkt in die Variablen \lstinline{duck} und \lstinline{cow} - zu schreiben, anstatt dies über die Zeiger \lstinline{a[0]} - und \lstinline{a[1]} zu tun - (siehe \gitfile{hp}{2020ws/20210204}{loesung-1d-2.c}): - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - \end{lstlisting} - - \item[(e)] - \textbf{Schreiben Sie das Programm so um, - daß es keine expliziten Typumwandlungen mehr benötigt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{union}.} - - Siehe \gitfile{hp}{2020ws/20210204}{loesung-1e.c}. - - Diese Lösung basiert auf \gitfile{hp}{2020ws/20210204}{loesung-1d-2.c}, - da diese bereits weniger explizite Typumwandlungen enthält - als \gitfile{hp}{2020ws/20210204}{loesung-1d-1.c}. - - Arbeitsschritte: - \begin{itemize} - \item - Umbenennen des Basistyps \lstinline{animal} in \lstinline{base}, - damit wir den Bezeichner \lstinline{animal} - für die \lstinline{union} verwenden können - \item - Schreiben einer \lstinline{union animal}, - die die drei Klassen \lstinline{base}, - \lstinline{with_wings} und \lstinline{with_legs} - als Datenfelder enthält - \item - Umschreiben der Initialisierungen: - Zugriff auf Datenfelder erfolgt nun durch - z.\,B.\ \lstinline{a[0]->b.name}. - Hierbei ist \lstinline{b} der Name des \lstinline{base}-Datenfelds - innerhalb der \lstinline{union animal}. - \item - Auf gleiche Weise schreiben wir die \lstinline{if}-Bedingungen - innerhalb der \lstinline{for}-Schleife - sowie die Parameter der \lstinline{printf()}-Aufrufe um. - \end{itemize} - Explizite Typumwandlungen sind nun nicht mehr nötig. - - Nachteil dieser Lösung: - Jede Objekt-Variable belegt nun Speicherplatz - für die gesamte \lstinline{union animal}, - anstatt nur für die benötigte Variable vom Typ - \lstinline{with_wings} oder \lstinline{with_legs}. - Dies kann zu einer Verschwendung von Speicherplatz führen, - auch wenn dies in diesem Beispielprogramm tatsächlich nicht der Fall ist. - - \item[(f)] - \textbf{Schreiben Sie das Programm weiter um, - so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} - dynamisch erzeugt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.} - - Siehe \gitfile{hp}{2020ws/20210204}{loesung-1f.c}. - - \item[(g)] - \textbf{Schreiben Sie das Programm weiter um, - so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, - sondern stattdessen eine virtuelle Methode \lstinline{print()} - aufgerufen wird.}\par - \textbf{Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, - und initialisieren Sie diese in den Konstruktoren.} - - Siehe \gitfile{hp}{2020ws/20210204}{loesung-1g.c}. - - \end{itemize} - - \clearpage - - \exercise{Iterationsfunktionen} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210204}{loesung-1.c}): - - \begin{minipage}[t]{0.4\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void foreach (int *a, void (*fun) (int x)) - { - for (int *p = a; *p >= 0; p++) - fun (*p); - } - - void even_or_odd (int x) - { - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.52\textwidth} - \begin{lstlisting}[gobble=6] - int main (void) - { - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; - } - \end{lstlisting} - \begin{enumerate}[\quad(a)] - \item - Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}? -% \points{2} - \item - Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen. -% \points{4} - \end{enumerate} - \end{minipage} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?} - - \lstinline{void (*fun) (int x)} deklariert einen Zeiger \lstinline{fun}, - der auf Funktionen zeigen kann, die einen Parameter \lstinline{x} - vom Typ \lstinline{int} erwarten und keinen Wert zurückgeben (\lstinline{void}). - - Durch die Übergabe eines derartigen Parameters an die Funktion \lstinline{foreach()} - lassen wir dem Aufrufer die Wahl, - welche Aktion für alle Elemente des Arrays aufgerufen werden soll. - - \item - \textbf{Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.} - - Siehe: \gitfile{hp}{2020ws/20210204}{loesung-1.c} - - Damit die Funktion \lstinline{add_up()} Zugriff auf die Variable \lstinline{sum} hat, - muß diese global sein - und vor der Funktion \lstinline{add_up()} deklariert werden. - - Die Bedingung, daß nur positive Zahlen summiert werden sollen, - ist durch die Arbeitsweise der Funktion \lstinline{foreach()} - bereits gewährleistet, da negative Zahlen als Ende-Markierungen dienen. - - Wichtig ist, daß die Variable \lstinline{sum} - vor dem Aufruf der Funktion \lstinline{foreach()} - auf den Wert \lstinline{0} gesetzt wird. - In \gitfile{hp}{2020ws/20210204}{loesung-1.c} geschieht dies - durch die Initialisierung von \lstinline{sum}. - Wenn mehrere Summen berechnet werden sollen, - muß dies durch explizite Zuweisungen \lstinline{sum = 0} - vor den Aufrufen von \lstinline{foreach()} erfolgen. - \end{enumerate} - - \exercise{Dynamisches Bit-Array} - - Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays: - \begin{itemize} - \item - \lstinline{void bit_array_init (int n)}\\ - Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\ - Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\ - Die Bits sollen auf den Anfangswert 0 initialisiert werden. - \item - \lstinline{void bit_array_set (int i, int value)}\\ - Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen; - der Wert \lstinline{value} darf 1 oder 0 sein. - \item - \lstinline{void bit_array_flip (int i)}\\ - Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\ - also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{int bit_array_get (int i)}\\ - Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{void bit_array_resize (int new_n)}\\ - Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\ - Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\ - Neu hinzukommende Bits sollen auf 0 initialisiert werden. - \item - \lstinline{void bit_array_done (void)}\\ - Den vom Array belegten Speicherplatz wieder freigeben. - \end{itemize} - Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben, - beispielsweise um mehrere Arrays parallel verwalten zu können. - (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this}, - der auf die Objekt-Struktur zeigt.) - - Die Bits sollen möglichst effizient gespeichert werden, - z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen. - - Die Funktionen sollen möglichst robust sein, - d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen, - sondern soll eine Fehlermeldung ausgeben. - - \medskip - - Die folgenden \textbf{Hinweise} beschreiben - einen möglichen Weg, die Aufgabe zu lösen. - Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen. - \begin{itemize} - \item - Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}. - \item - Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt. - \item - Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß. - \item - Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}. - \end{itemize} - -% \points{14} -% -% \medskip -% -% (Hinweis für die Klausur: -% Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.) - - \solution - - Die hier vorgestellte Lösung folgt den Hinweisen. - \begin{itemize} - \item - \textbf{Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}.} - - Siehe: \gitfile{hp}{2020ws/20210204}{loesung-3-1.c} - - Wir speichern in jedem der acht Bit einer \lstinline{uint8_t}-Variablen - jeweils eine Zahl, die 0 oder 1 sein kann. - Dies geschieht durch Setzen bzw.\ Löschen bzw.\ Umklappen einzelner Bits - in der Variablen. - - Das Programm enthält zusätzlich eine Funktion \lstinline{output()}, - mit der man sich den Inhalt des Arrays anzeigen lassen kann, - sowie ein Hauptprogramm \lstinline{main()}, um die Funktionen zu testen. - - \item - \textbf{Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt.} - - Siehe: \gitfile{hp}{2020ws/20210204}{loesung-3-2.c} - - In diesem Programm setzen wir die Länge auf konstant \lstinline{LENGTH} Bits, - wobei es sich um eine Präprozessor-Konstante mit dem Wert 32 handelt. - - Um \lstinline{LENGTH} Bits zu speichern, benötigen wir ein Array - der Länge \lstinline{LENGTH / 8} Bytes. - - Um auf ein einzelnes Bit zuzugreifen, müssen wir zunächst ermitteln, - in welchem der Bytes sich befindet. Außerdem interessieren wir uns - für die Nummer des Bits innerhalb des Bytes. - Den Array-Index des Bytes erhalten wir, indem wir den Index des Bits - durch 8 dividieren. Der bei dieser Division verbleibende Rest ist die - Nummer des Bits innerhalb des Bytes. - - Diese Rechnungen führen wir in den drei Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()} durch. - (Diese ist eine eher unelegante Code-Verdopplung -- hier sogar eine Verdreifachung. - Für den Produktiveinsatz lohnt es sich, darüber nachzudenken, - wie man diese vermeiden kann, ohne gleichzeitig an Effizienz einzubüßen. - Hierfür käme z.\,B.\ ein Präprozessor-Makro in Frage. - Für die Lösung der Übungsaufgabe wird dies hingegen nicht verlangt.) - - \item - \textbf{Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß.} - - Siehe: \gitfile{hp}{2020ws/20210204}{loesung-3-3.c} - - Um weitere Code-Verdopplungen zu vermeiden, - führen wir eine Funktion \lstinline{check_index()} ein, - die alle Prüfungen durchführt. - - Wenn die Länge des Arrays kein Vielfaches von 8 ist, - wird das letzte Byte nicht vollständig genutzt. - Die einzige Schwierigkeit besteht darin, die korrekte Anzahl von Bytes - zu ermitteln, nämlich die Länge dividiert durch 8, aber nicht ab-, sondern - aufgerundet. Am elegantesten geht dies durch vorherige Addition von 7: - \lstinline{#define BYTES ((LENGTH + 7) / 8)}. - Es ist aber auch zulässig, die Anzahl der Bytes mit Hilfe einer - \lstinline{if}-Anweisung zu ermitteln: Länge durch 8 teilen und abrunden; - falls die Division nicht glatt aufging, um 1 erhöhen. - - \item - \textbf{Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}.} - - Siehe: \gitfile{hp}{2020ws/20210204}{loesung-3-4.c}. - Damit ist die Aufgabe gelöst. - - Aus den Präprozessor-Konstanten \lstinline{LENGTH} und \lstinline{BYTES} - werden nun globale \lstinline{int}-Variable. - Die Funktion \lstinline{bit_array_init()} berechnet die korrekten Werte - für diese Variablen und legt das Array mittels \lstinline{malloc()} dynamisch - an. Eine Größenänderung des Arrays erfolgt mittels \lstinline{realloc()}, - das Freigeben mittels \lstinline{free()}. - - Das Programm setzt Variable, die aktuell nicht verwendet werden, - auf den Wert \lstinline{0} bzw.\ \lstinline{NULL}. - Dies ermöglicht es der Funktion \lstinline{check_index()}, - auch zu prüfen, ob das Array vorher korrekt mit \lstinline{bit_array_init()} - erzeugt wurde -- oder ob es vielleicht schon wieder mit - \lstinline{bit_array_done()} freigegeben wurde. - - \end{itemize} - -\end{document} diff --git a/20210204/hp-uebung-20210204.pdf b/20210204/hp-uebung-20210204.pdf deleted file mode 100644 index b0b178e5c4573e66b3c4dad8392afd2fcd61f901..0000000000000000000000000000000000000000 Binary files a/20210204/hp-uebung-20210204.pdf and /dev/null differ diff --git a/20210204/hp-uebung-20210204.tex b/20210204/hp-uebung-20210204.tex deleted file mode 100644 index bef613ff2e7feff1584b6a485869365486b95933..0000000000000000000000000000000000000000 --- a/20210204/hp-uebung-20210204.tex +++ /dev/null @@ -1,303 +0,0 @@ -% hp-uebung-20210204.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Tier-Datenbank (Neuauflage), Iterationsfunktionen, dynamisches Bit-Array - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 4.\ Februar 2021} - -% Diese Übung enthält Punkteangaben wie in einer Klausur. -% Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten -% unter Verwendung ausschließlich zugelassener Hilfsmittel -% 17 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Objektorientierte Tier-Datenbank (Neuauflage)} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 28.\ Januar 2021,\\ - ergänzt um die Teilaufgaben (e) bis (g). - - \medskip - - Das auf der nächsten Seite dargestellte Programm - (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1a.c}) - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-1a.c -o aufgabe-1a¿ - aufgabe-1a.c: In function 'main': - aufgabe-1a.c:31: error: 'animal' has no member named 'wings' - aufgabe-1a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{2020ws/20210204}{aufgabe-1b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-1b.c -o aufgabe-1b¿ - $ ¡./aufgabe-1b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. -% \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? -% \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. -% \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt. %\\ -% \points{4} - \item[(e)] - Schreiben Sie das Programm so um, - daß es keine expliziten Typumwandlungen mehr benötigt.\par - Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} - \item[(f)] - Schreiben Sie das Programm weiter um, - so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} - dynamisch erzeugt.\par - Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} - \item[(g)] - Schreiben Sie das Programm weiter um, - so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, - sondern stattdessen eine virtuelle Methode \lstinline{print()} - aufgerufen wird.\par - Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, - und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \exercise{Iterationsfunktionen} - - Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210204}{aufgabe-2.c}): - - \begin{minipage}[t]{0.4\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void foreach (int *a, void (*fun) (int x)) - { - for (int *p = a; *p >= 0; p++) - fun (*p); - } - - void even_or_odd (int x) - { - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.52\textwidth} - \begin{lstlisting}[gobble=6] - int main (void) - { - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; - } - \end{lstlisting} - \begin{enumerate}[\quad(a)] - \item - Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}? -% \points{2} - \item - Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen. -% \points{4} - \end{enumerate} - \end{minipage} - - \clearpage - - \exercise{Dynamisches Bit-Array} - - Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays: - \begin{itemize} - \item - \lstinline{void bit_array_init (int n)}\\ - Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\ - Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\ - Die Bits sollen auf den Anfangswert 0 initialisiert werden. - \item - \lstinline{void bit_array_set (int i, int value)}\\ - Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen; - der Wert \lstinline{value} darf 1 oder 0 sein. - \item - \lstinline{void bit_array_flip (int i)}\\ - Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\ - also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{int bit_array_get (int i)}\\ - Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{void bit_array_resize (int new_n)}\\ - Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\ - Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\ - Neu hinzukommende Bits sollen auf 0 initialisiert werden. - \item - \lstinline{void bit_array_done (void)}\\ - Den vom Array belegten Speicherplatz wieder freigeben. - \end{itemize} - Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben, - beispielsweise um mehrere Arrays parallel verwalten zu können. - (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this}, - der auf die Objekt-Struktur zeigt.) - - Die Bits sollen möglichst effizient gespeichert werden, - z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen. - - Die Funktionen sollen möglichst robust sein, - d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen, - sondern soll eine Fehlermeldung ausgeben. - - \medskip - - Die folgenden \textbf{Hinweise} beschreiben - einen möglichen Weg, die Aufgabe zu lösen. - Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen. - \begin{itemize} - \item - Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}. - \item - Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt. - \item - Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß. - \item - Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren Sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}. - \end{itemize} - -% \points{14} -% -% \medskip -% -% (Hinweis für die Klausur: -% Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.) - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20210204/loesung-1d-0f.c b/20210204/loesung-1d-0f.c deleted file mode 100644 index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000 --- a/20210204/loesung-1d-0f.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210204/loesung-1d-1.c b/20210204/loesung-1d-1.c deleted file mode 100644 index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000 --- a/20210204/loesung-1d-1.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210204/loesung-1d-2.c b/20210204/loesung-1d-2.c deleted file mode 100644 index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000 --- a/20210204/loesung-1d-2.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20210204/loesung-1e.c b/20210204/loesung-1e.c deleted file mode 100644 index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000 --- a/20210204/loesung-1e.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - duck.b.type = WITH_WINGS; - duck.b.name = "duck"; - duck.w.wings = 2; - - animal cow; - a[1] = &cow; - cow.b.type = WITH_LEGS; - cow.b.name = "cow"; - cow.l.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210204/loesung-1f.c b/20210204/loesung-1f.c deleted file mode 100644 index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000 --- a/20210204/loesung-1f.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20210204/loesung-1g.c b/20210204/loesung-1g.c deleted file mode 100644 index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000 --- a/20210204/loesung-1g.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -union animal; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); -} base; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int legs; -} with_legs; - -typedef union animal -{ - base b; - with_wings w; - with_legs l; -} animal; - -void print_with_wings (animal *this) -{ - printf ("A %s has %d wings.\n", this->b.name, this->w.wings); -} - -void print_with_legs (animal *this) -{ - printf ("A %s has %d legs.\n", this->b.name, this->l.legs); -} - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->b.print = print_with_wings; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->b.print = print_with_legs; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - for (int i = 0; i < 2; i++) - a[i]->b.print (a[i]); - return 0; -} diff --git a/20210204/loesung-3-1.c b/20210204/loesung-3-1.c deleted file mode 100644 index 11ad08a28a2c16e645e4b55c1b0f4556246fd692..0000000000000000000000000000000000000000 --- a/20210204/loesung-3-1.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -uint8_t buffer = 0; - -void bit_array_set (int i, int value) -{ - uint8_t mask = 1 << i; - if (value) - buffer |= mask; - else - buffer &= ~mask; -} - -void bit_array_flip (int i) -{ - uint8_t mask = 1 << i; - buffer ^= mask; -} - -int bit_array_get (int i) -{ - uint8_t mask = 1 << i; - if (buffer & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < 8; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (2, 1); - output (); - bit_array_flip (7); - output (); - bit_array_set (2, 0); - output (); -} diff --git a/20210204/loesung-3-2.c b/20210204/loesung-3-2.c deleted file mode 100644 index e510904b033cf7d55737cee55ad08ecb9510f324..0000000000000000000000000000000000000000 --- a/20210204/loesung-3-2.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#define LENGTH 32 - -uint8_t buffer[LENGTH / 8] = { 0, 0, 0, 0 }; - -void bit_array_set (int i, int value) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < LENGTH; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (31); - output (); - bit_array_set (12, 0); - output (); -} diff --git a/20210204/loesung-3-3.c b/20210204/loesung-3-3.c deleted file mode 100644 index 4177464aebf41205169a6bb02b27ac972e3a4f4e..0000000000000000000000000000000000000000 --- a/20210204/loesung-3-3.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <error.h> - -#define LENGTH 29 -#define BYTES ((LENGTH + 7) / 8) - -uint8_t buffer[BYTES] = { 0, 0, 0, 0 }; - -void check_index (int i) -{ - if (i < 0 || i >= LENGTH) - error (1, 0, "index %d out of range (0, ..., %d)", i, LENGTH - 1); -} - -void bit_array_set (int i, int value) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < LENGTH; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (28); - output (); - bit_array_set (12, 0); - output (); - bit_array_flip (31); - output (); -} diff --git a/20210204/loesung-3-4.c b/20210204/loesung-3-4.c deleted file mode 100644 index 1930580aae8e8b24528852d1dacf58051f6bd6cc..0000000000000000000000000000000000000000 --- a/20210204/loesung-3-4.c +++ /dev/null @@ -1,101 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <error.h> -#include <stdlib.h> - -int length = 0; -int bytes = 0; -uint8_t *buffer = NULL; - -void bit_array_init (int n) -{ - length = n; - bytes = (length + 7) / 8; - if (buffer) - free (buffer); - buffer = malloc (bytes * sizeof (uint8_t)); - for (int i = 0; i < bytes; i++) - buffer[i] = 0; -} - -void bit_array_resize (int new_n) -{ - length = new_n; - bytes = (length + 7) / 8; - buffer = realloc (buffer, bytes * sizeof (uint8_t)); -} - -void bit_array_done (void) -{ - free (buffer); - buffer = NULL; - length = 0; - bytes = 0; -} - -void check_index (int i) -{ - if (!buffer) - error (1, 0, "array not initialised"); - if (i < 0 || i >= length) - error (1, 0, "index %d out of range (0, ..., %d)", i, length - 1); -} - -void bit_array_set (int i, int value) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < length; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - bit_array_init (29); - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (28); - output (); - bit_array_set (12, 0); - output (); - bit_array_flip (31); - output (); - bit_array_done (); -} diff --git a/20210204/logo-hochschule-bochum-cvh-text-v2.pdf b/20210204/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210204/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210204/logo-hochschule-bochum.pdf b/20210204/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210204/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210204/objects-10.c b/20210204/objects-10.c deleted file mode 100644 index ac47c0ed5479be655b7d76aba558526b2dc774a3..0000000000000000000000000000000000000000 --- a/20210204/objects-10.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; - void (* print) (t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (t_object *this); - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-11.c b/20210204/objects-11.c deleted file mode 100644 index a15c8eb239b2315845f24f3b4f111d3670d7ea33..0000000000000000000000000000000000000000 --- a/20210204/objects-11.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-11a.c b/20210204/objects-11a.c deleted file mode 100644 index 8be8d4eb28ccc2ea950d601a2b1da4c2a38270dc..0000000000000000000000000000000000000000 --- a/20210204/objects-11a.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-11b.c b/20210204/objects-11b.c deleted file mode 100644 index 3b3a798df03399f69f6704ac1391d22781c6fd30..0000000000000000000000000000000000000000 --- a/20210204/objects-11b.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-11c.c b/20210204/objects-11c.c deleted file mode 100644 index 50c5c3acfe2e66f7b847f4120419c6044447ee1f..0000000000000000000000000000000000000000 --- a/20210204/objects-11c.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-11d.c b/20210204/objects-11d.c deleted file mode 100644 index 283a3ec68063dbb6da72efa2cf64e20897dff296..0000000000000000000000000000000000000000 --- a/20210204/objects-11d.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i], "Dies ist ein Test."); - - return 0; -} diff --git a/20210204/objects-11e.c b/20210204/objects-11e.c deleted file mode 100644 index 47184be39f60e173479bf93e40361b77d93a2bb0..0000000000000000000000000000000000000000 --- a/20210204/objects-11e.c +++ /dev/null @@ -1,76 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i], "Dies ist ein Test."); - - return 0; -} diff --git a/20210204/objects-11f.c b/20210204/objects-11f.c deleted file mode 100644 index 6c4673803a82e0f4ab055d536cdc3b12f37afc2b..0000000000000000000000000000000000000000 --- a/20210204/objects-11f.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this, char *comment) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); - (void) comment; -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i], "Dies ist ein Test."); - - return 0; -} diff --git a/20210204/objects-11g.c b/20210204/objects-11g.c deleted file mode 100644 index 80b6e8a012850dab7c62fe326a7e76104f7ff035..0000000000000000000000000000000000000000 --- a/20210204/objects-11g.c +++ /dev/null @@ -1,82 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this, char *comment); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, char *comment) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - printf ("Kommentar: %s\n", comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -void print_string (t_object *this, char *comment) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); - printf ("Kommentar: %s\n", comment); -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i], "Dies ist ein Test."); - - return 0; -} diff --git a/20210204/objects-11h.c b/20210204/objects-11h.c deleted file mode 100644 index 717922a974268fb97ee62cea074ef99545b34c08..0000000000000000000000000000000000000000 --- a/20210204/objects-11h.c +++ /dev/null @@ -1,81 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this, void *data); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this, void *data); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this, void *data); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this, void *data) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - if (data) - { - char *comment = data; - printf ("Kommentar: %s\n", comment); - } -} - -void print_string (t_object *this, void *data) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); - (void) data; -} - -t_object *new_integer (int i) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i], "Dies ist ein Test."); - - return 0; -} diff --git a/20210204/objects-11i.c b/20210204/objects-11i.c deleted file mode 100644 index bda518a83af77239e526a86b329abf34d10ffd2f..0000000000000000000000000000000000000000 --- a/20210204/objects-11i.c +++ /dev/null @@ -1,79 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - int content; - char *comment; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) /* virtuelle Methode des Objekts t_integer */ -{ - printf ("Integer: %d\n", this->integer.content); - if (this->integer.comment) - printf ("Kommentar: %s\n", this->integer.comment); -} - -void print_string (t_object *this) /* virtuelle Methode des Objekts t_string */ -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i, char *comment) /* Konstruktor des Objekts t_integer */ -{ - t_object *p = malloc (sizeof (t_integer)); /* Anforderung von Speicherplatz */ - p->integer.type = T_INTEGER; - p->integer.print = print_integer; /* Zuweisung der virtuellen Methode */ - p->integer.content = i; /* Initialisierung des Objekts */ - p->integer.comment = comment; /* Initialisierung des Objekts */ - return p; -} - -t_object *new_string (char *s) /* Konstruktor des Objekts t_string */ -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42, "Dies ist ein Test."), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-12.c b/20210204/objects-12.c deleted file mode 100644 index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000 --- a/20210204/objects-12.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; - -typedef struct -{ - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20210204/objects-13.c b/20210204/objects-13.c deleted file mode 100644 index 8cbf2d435ce6642568a809660b8d63866963450a..0000000000000000000000000000000000000000 --- a/20210204/objects-13.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - return 0; -} diff --git a/20210204/objects-13a.c b/20210204/objects-13a.c deleted file mode 100644 index 83d01abade9685d4f591570e03ea080fbde8b6d2..0000000000000000000000000000000000000000 --- a/20210204/objects-13a.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->base.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->base.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - return 0; -} diff --git a/20210204/objects-14.c b/20210204/objects-14.c deleted file mode 100644 index acd20b5af1a6a425da4d6af47e03185e224e3461..0000000000000000000000000000000000000000 --- a/20210204/objects-14.c +++ /dev/null @@ -1,82 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_integer_with_comment (t_object *this, char *comment) -{ - printf ("%s: %d\n", comment, this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->base.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->base.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - print_integer_with_comment (object[1], "Die Antwort lautet"); - - return 0; -} diff --git a/20210204/objects-15.c b/20210204/objects-15.c deleted file mode 100644 index b0ef5540e78cd00ce615ae19b34a23157d9f13ef..0000000000000000000000000000000000000000 --- a/20210204/objects-15.c +++ /dev/null @@ -1,82 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_integer_with_comment (t_object *this, char *comment) -{ - printf ("%s: %d\n", comment, this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->base.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->base.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - print_integer_with_comment (object[0], "Die Antwort lautet"); - - return 0; -} diff --git a/20210204/objects-16.cpp b/20210204/objects-16.cpp deleted file mode 100644 index ea40a139bacadb6ce4de30312bb0c1b6c21d9c8e..0000000000000000000000000000000000000000 --- a/20210204/objects-16.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -struct TBase -{ - virtual void print () = 0; -}; - -struct TInteger: TBase -{ - int content; - virtual void print (); - TInteger (int i); -}; - -struct TString: TBase -{ - char *content; - virtual void print (); - TString (char *s); -}; - -void TInteger::print () -{ - printf ("Integer: %d\n", content); -} - -void TString::print () -{ - printf ("String: \"%s\"\n", content); -} - -TInteger::TInteger (int i) -{ - content = i; -} - -TString::TString (char *s) -{ - content = s; -} - -int main (void) -{ - TBase *object[] = { new TInteger (42), - new TString ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->print (); - - return 0; -} diff --git a/20210204/pgscript.sty b/20210204/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210204/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210204/pgslides.sty b/20210204/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210204/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210211/aufgabe-1.c b/20210211/aufgabe-1.c deleted file mode 100644 index 82e5b1ca9e2f896bcbec98bc5c34cdf15d086e26..0000000000000000000000000000000000000000 --- a/20210211/aufgabe-1.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20210211/aufgabe-2.c b/20210211/aufgabe-2.c deleted file mode 100644 index f26ce5d665012e2cdbaac8b0f43f01d40f338254..0000000000000000000000000000000000000000 --- a/20210211/aufgabe-2.c +++ /dev/null @@ -1,47 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -void output_list (node *first) -{ - for (node *p = first; p; p = p->next) - printf ("%d ", p->content); - printf ("\n"); -} - -void insert_into_list (node *what, node *where) -{ - what->next = where->next; - where->next = what; -} - -int main (void) -{ - node *element3 = malloc (sizeof (node)); - node *element7 = malloc (sizeof (node)); - node *element137 = malloc (sizeof (node)); - - element3->content = 3; - element7->content = 7; - element137->content = 137; - - node *first = element3; - element3->next = element7; - element7->next = element137; - element137->next = NULL; - - output_list (first); - - node *element5 = malloc (sizeof (node)); - element5->content = 5; - insert_into_list (element5, element3); - - output_list (first); - - return 0; -} diff --git a/20210211/baeume-1.txt b/20210211/baeume-1.txt deleted file mode 100644 index c397a0bfab179bee2d9cf5fb74731fc89b8337ed..0000000000000000000000000000000000000000 --- a/20210211/baeume-1.txt +++ /dev/null @@ -1,20 +0,0 @@ -Zahlen von 0 bis 14 in einem Baum - -best case: O(log n) - "ausbalancierter Baum" - - 7 - - - 3 11 - 1 5 9 13 - 0 2 4 6 8 10 12 14 - -worst case: O(n) - "entarteter Baum" - - 0 - 1 - 2 - 3 - 4 - ... - 14 diff --git a/20210211/fifo-1.c b/20210211/fifo-1.c deleted file mode 100644 index 8bce6c07c152381c11ce367027b980a9330be3e0..0000000000000000000000000000000000000000 --- a/20210211/fifo-1.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - return fifo[0]; - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-2.c b/20210211/fifo-2.c deleted file mode 100644 index f95579893f62180b408ecb10756ac8938b3c9848..0000000000000000000000000000000000000000 --- a/20210211/fifo-2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ - return fifo[0]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-3.c b/20210211/fifo-3.c deleted file mode 100644 index 5214e1b28fb1b060bdaeea7be09e346a644e7f5d..0000000000000000000000000000000000000000 --- a/20210211/fifo-3.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-4.c b/20210211/fifo-4.c deleted file mode 100644 index 957d5f18f6c8fe9d7c057db3d2467221b9dc463e..0000000000000000000000000000000000000000 --- a/20210211/fifo-4.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-5.c b/20210211/fifo-5.c deleted file mode 100644 index 092c1cdb5863d5c7bdac98f48ca8527ca3520e6b..0000000000000000000000000000000000000000 --- a/20210211/fifo-5.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-6.c b/20210211/fifo-6.c deleted file mode 100644 index 2f055d6ce6df4c2fca950192053a6e008bed38b4..0000000000000000000000000000000000000000 --- a/20210211/fifo-6.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - fifo_pointer--; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-6a.c b/20210211/fifo-6a.c deleted file mode 100644 index 6a7b2d3c138908cb7eb06379b9c574f262717af0..0000000000000000000000000000000000000000 --- a/20210211/fifo-6a.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < fifo_pointer; i++) - fifo[i - 1] = fifo[i]; - fifo_pointer--; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-7.c b/20210211/fifo-7.c deleted file mode 100644 index 0d739115c136639f64c4d98c439af7e4d72fe420..0000000000000000000000000000000000000000 --- a/20210211/fifo-7.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - fifo[fifo_write_pointer++] = x; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; -} - -int pop (void) -{ - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-8.c b/20210211/fifo-8.c deleted file mode 100644 index b4ff68713645e0a5782b516071022bf71a8c50ac..0000000000000000000000000000000000000000 --- a/20210211/fifo-8.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - fifo[fifo_write_pointer++] = x; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; - if (fifo_write_pointer == fifo_read_pointer) - { - fprintf (stderr, "fifo overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (fifo_read_pointer == fifo_write_pointer) - { - fprintf (stderr, "fifo underflow\n"); - exit (1); - } - else - { - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/fifo-9.c b/20210211/fifo-9.c deleted file mode 100644 index 27f77412bac52fd70c52378c25531f03bd93d734..0000000000000000000000000000000000000000 --- a/20210211/fifo-9.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - int old_fifo_write_pointer = fifo_write_pointer; - fifo_write_pointer++; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; - if (fifo_write_pointer == fifo_read_pointer) - { - fprintf (stderr, "fifo overflow\n"); - exit (1); - } - else - fifo[old_fifo_write_pointer] = x; -} - -int pop (void) -{ - if (fifo_read_pointer == fifo_write_pointer) - { - fprintf (stderr, "fifo underflow\n"); - exit (1); - } - else - { - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - for (int i = 0; i < 42; i++) - push (i); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/hello-gtk.png b/20210211/hello-gtk.png deleted file mode 120000 index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000 --- a/20210211/hello-gtk.png +++ /dev/null @@ -1 +0,0 @@ -../common/hello-gtk.png \ No newline at end of file diff --git a/20210211/hp-20210211.pdf b/20210211/hp-20210211.pdf deleted file mode 100644 index 1a7c24d02c73d27c93d48f4e4eb307e255ec0952..0000000000000000000000000000000000000000 Binary files a/20210211/hp-20210211.pdf and /dev/null differ diff --git a/20210211/hp-20210211.tex b/20210211/hp-20210211.tex deleted file mode 100644 index e7641ee2847378b4e1e5b17bb60f1ffa2bf79d62..0000000000000000000000000000000000000000 --- a/20210211/hp-20210211.tex +++ /dev/null @@ -1,1187 +0,0 @@ -% hp-20210211.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Programmierung: virtuelle Methoden - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{rotating} -\usepackage{tikz} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{11.\ Februar 2021} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \item[6.3] Unions - \color{medgreen} - \item[6.4] Virtuelle Methoden - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\setcounter{section}{5} -\section{Objektorientierte Programmierung} - -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name); - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - Problem: Die Elemente sind unterschiedlich groß (Speicherplatz). - \item - Lösung: Im Array nicht die Objekte selbst speichern, sondern Zeiger darauf. - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.05){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.05){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} -% \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ -% kommt gleich -% nächste Woche -% \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern \textarrow\ \newterm{Objekt} - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassenhierarchie} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} -% \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡tobject *this; - - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \item[6.0] Dynamische Speicherverwaltung - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \item[6.3] Unions - \color{medgreen} - \item[6.4] Virtuelle Methoden - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \item[\textbf{7}] \textbf{Datenstrukturen} - \begin{itemize} - \color{red} - \item[7.1] Stack und FIFO - \item[7.2] Verkettete Listen - \item[7.3] Bäume - \end{itemize} - \vspace*{-1cm} - \end{itemize} - -\end{frame} - -\section{Datenstrukturen} -\subsection{Stack und FIFO} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{minipage}{0.48\textwidth} - Im letzten Praktikumsversuch: - \begin{itemize} - \item - Array nur zum Teil benutzt - \item - Variable speichert genutzte Länge - \item - Elemente hinten anfügen\\ - oder entfernen - \arrowitem - Stack\\ - \strut - \end{itemize} - \bigskip - \begin{itemize} - \item - hinten anfügen/entfernen: $\mathcal{O}(1)$\hspace*{-1cm} - \item - vorne oder in der Mitte einfügen/entfernen: $\mathcal{O}(n)$ - \end{itemize} - \end{minipage}\hfill - \begin{minipage}{0.52\textwidth} - Auch möglich: - \begin{itemize} - \item - Array nur zum Teil benutzt - \item - 2 Variable speichern\\genutzte Länge (ringförmig) - \item - Elemente hinten anfügen\\ - oder vorne entfernen - \arrowitem - FIFO - \end{itemize} - \bigskip - \begin{itemize} - \item - vorne oder hinten\\ - anfügen oder entfernen: $\mathcal{O}(1)$ - \item - in der Mitte einfügen/entfernen: $\mathcal{O}(n)$ - \end{itemize} - \end{minipage}\hspace*{-1.5mm} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{minipage}[b]{6cm} - \begin{center} - "`First In -- First Out"' - - \bigskip - - \begin{picture}(6,4) - \thicklines - \color{structure} - \put(0.5,0){\line(1,0){5}} - - \put(3.5,0){\only<1-5>{\line(0,1){1}}} - \put(4.5,0){\only<1-4>{\line(0,1){1}}} - \put(3.5,1){\only<1-4>{\line(1,0){1}}} - \put(4.0,0.5){\only<1-4>{\makebox(0,0){\lstinline{3}}}} - \put(3.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(3.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}} - - \put(2.5,0){\only<2-6>{\line(0,1){1}}} - \put(2.5,1){\only<2-5>{\line(1,0){1}}} - \put(3.0,0.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}} - \put(2.0,1.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,1.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}} - - \put(1.5,0){\only<3-6>{\line(0,1){1}}} - \put(1.5,1){\only<3-6>{\line(1,0){1}}} - \put(2.0,0.5){\only<3-6>{\makebox(0,0){\lstinline{137}}}} - \put(1.0,1.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(1.0,1.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} - - \put(4.55,1.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(5.00,1.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}} - - \put(3.55,1.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,1.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} - - \put(2.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(3.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}} - \end{picture} - - \bigskip - - FIFO = Queue = Reihe - \end{center} - \end{minipage}\hfill - \begin{minipage}[b]{6cm} - \begin{center} - "`Last In -- First Out"' - - \bigskip - - \begin{picture}(6,4) - \thicklines - \color{structure} - \put(1.5,0){\line(1,0){3}} - - \put(2.5,0){\line(0,1){1}} - \put(3.5,0){\line(0,1){1}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,0.5){\makebox(0,0){\lstinline{3}}} - \put(2.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}} - - \put(2.5,1){\only<2-5>{\line(0,1){1}}} - \put(3.5,1){\only<2-5>{\line(0,1){1}}} - \put(2.5,2){\only<2-5>{\line(1,0){1}}} - \put(3.0,1.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}} - \put(2.0,2.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,2.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}} - - \put(2.5,2){\only<3-4>{\line(0,1){1}}} - \put(3.5,2){\only<3-4>{\line(0,1){1}}} - \put(2.5,3){\only<3-4>{\line(1,0){1}}} - \put(3.0,2.5){\only<3-4>{\makebox(0,0){\lstinline{137}}}} - \put(2.0,3.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,3.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} - - \put(3.55,3.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,3.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}} - - \put(3.55,2.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,2.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} - - \put(3.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}} - \end{picture} - - \bigskip - - LIFO = Stack = Stapel - \end{center} - \end{minipage} - -% -% \dots - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \bigskip - - \begin{minipage}[t]{6cm} - Array (Stack, FIFO):\\ - in der Mitte einfügen - \begin{center} - \begin{picture}(6,3.8) - \thicklines - \color{structure} - \put(1.5,0){\line(1,0){3}} - - \put(2.5,0){\line(0,1){3}} - \put(3.5,0){\line(0,1){3}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,0.5){\makebox(0,0){\lstinline{3}}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,1.5){\makebox(0,0){\lstinline{7}}} - \put(2.5,2){\line(1,0){1}} - \put(3.0,2.5){\makebox(0,0){\lstinline{137}}} - \put(2.5,3){\line(1,0){1}} - - \put(1.5,1.5){\makebox(0,0)[b]{\lstinline{push (5)}}} - \put(1.5,1.45){\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.95,-0.45);}}} - - \put(3.55,2.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}} - \put(3.55,1.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}} - - \pause - \color{red} - \put(4.1,3.0){\makebox(0,0)[l]{\textbf{1.}}} - \put(4.1,2.0){\makebox(0,0)[l]{\textbf{2.}}} - \put(1.5,1.9){\makebox(0,0)[b]{\textbf{3.}}} - - \pause - \put(6.0,1.5){\makebox(0,0)[tl]{$\mathcal{O}(n)$}} - \put(5.95,1.45){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,0.4);}}} - \put(5.95,1.49){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,1.1);}}} - \end{picture} - \end{center} - \end{minipage}\pause\hfill - \begin{minipage}[t]{5cm} - In Array (Stack, FIFO) \dots - \begin{itemize} - \item - einfügen: $\mathcal{O}(n)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage} - -\end{frame} - -\subsection{Verkettete Listen} - -\begin{frame} - - \showsection - \showsubsection - - \begin{tikzpicture} - \color{structure} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \only<1>{\draw[-latex](3)--(7);} - \only<2>{\draw[-latex](3) to[out=0] (5);} - \only<2>{\draw[-latex](5) to[in=180] (7);} - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \begin{itemize} - \item - Jeder Datensatz enthält einen Zeiger auf das nächste Element. - \item - Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}. - \item - Eine Variable zeigt auf das erste Element. - \item - Wenn die Liste leer ist, zeigt die Variable auf \lstinline{NULL}. - \arrowitem - (einfach) \textbf{verkettete Liste} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{minipage}[t]{5cm} - In Array (Stack, FIFO) \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(n)$ - \item - wahlfreier Zugriff: $\mathcal{O}(1)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - In (einfach) verkettete/r Liste \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(1)$ - \item - wahlfreier Zugriff: $\mathcal{O}(n)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt \hspace*{-1.7cm}\tikz{\draw[red](-1.7,0)--(0,0.2);\draw[red](-1.7,0.2)--(0,0);} - suchen: {\color{red}$\mathcal{O}(n)$} - \item - beim Einfügen sortieren: - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage} - \pause - \medskip - \begin{center} - \begin{minipage}[t]{6cm} - In (ausbalancierten) Bäumen \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(\log n)$ - \item - wahlfreier Zugriff: $\mathcal{O}(\log n)$ - \item - suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren: - $\mathcal{O}(n \log n)$ - \end{itemize} - \end{minipage} - \end{center} - \vspace*{-1cm} - -\end{frame} - -\subsection{Bäume} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{minipage}[t]{5cm} - \vspace*{-6cm} - \begin{lstlisting}[gobble=6] - ¡typedef struct node - { - int content; - struct node *left, *right; - } node;¿ - \end{lstlisting} -% \bigskip - \bigskip - \begin{onlyenv}<6-> - \begin{itemize} - \item - Einfügen: rekursiv, $\mathcal{O}(\log n)$ - \item - Suchen: rekursiv, $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - rekursiv, $\mathcal{O}(n\log n)$ - \begin{onlyenv}<7-> - \smallskip - \item - {\color{red} - \emph{Worst Case\/}: $\mathcal{O}(n^2)$\\ - vorher bereits sortiert}\\ - \textarrow\ balancierte Bäume\\ - \hspace*{2.15em}Anwendung: Datenbanken\hspace*{-2cm} - \end{onlyenv} - \end{itemize} - \vspace*{-1cm} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{7cm} - \begin{center} - \begin{tikzpicture} - \color{structure} - \node(root) at (0,0) {\lstinline{node *root;}}; - \begin{onlyenv}<2> - \node(3) at (-2,-3) {\lstinline{NULL}}; - \node(137) at (2,-3) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<2-> - \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7}; - \draw[-latex](root)--(7); - \draw[-latex](7)--(3); - \draw[-latex](7)--(137); - \end{onlyenv} - \begin{onlyenv}<3> - \node(3) at (-2,-3) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<3-> - \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137}; - \node(137_left) at (1,-4.5) {\lstinline{NULL}}; - \node(137_right) at (3,-4.5) {\lstinline{NULL}}; - \draw[-latex](137)--(137_left); - \draw[-latex](137)--(137_right); - \end{onlyenv} - \begin{onlyenv}<4> - \node(5) at (-1,-4.5) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<4-> - \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3}; - \node(3_left) at (-3,-4.5) {\lstinline{NULL}}; - \draw[-latex](3)--(3_left); - \draw[-latex](3)--(5); - \end{onlyenv} - \begin{onlyenv}<5-> - \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5}; - \node(5_left) at (-2,-6) {\lstinline{NULL}}; - \node(5_right) at (0,-6) {\lstinline{NULL}}; - \draw[-latex](5)--(5_left); - \draw[-latex](5)--(5_right); - \end{onlyenv} - \end{tikzpicture} - \end{center} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \item[\textbf{7}] \textbf{Datenstrukturen} - \begin{itemize} - \color{medgreen} - \item[7.1] Stack und FIFO - \item[7.2] Verkettete Listen - \item[7.3] Bäume - \end{itemize} - \end{itemize} - -\end{frame} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Algorithmen} - \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \item[\textbf{7}] \textbf{Datenstrukturen} - \begin{itemize} - \item[7.1] Stack und FIFO - \item[7.2] Verkettete Listen - \item[7.3] Bäume - \end{itemize} - \end{itemize} - - \begin{flushright} - \large\bf\em\color{medgreen}Vielen Dank für Ihre Aufmerksamkeit\\ - und viel Erfolg bei den Prüfungen! - \end{flushright} - -\end{frame} - -\end{document} diff --git a/20210211/hp-musterloesung-20210211.pdf b/20210211/hp-musterloesung-20210211.pdf deleted file mode 100644 index dabd16ee9cad834b0785b2fb6bd1f82980e60dec..0000000000000000000000000000000000000000 Binary files a/20210211/hp-musterloesung-20210211.pdf and /dev/null differ diff --git a/20210211/hp-musterloesung-20210211.tex b/20210211/hp-musterloesung-20210211.tex deleted file mode 100644 index f0c1dd2e22b4afe80c6ccd1b2f2749a4651a948f..0000000000000000000000000000000000000000 --- a/20210211/hp-musterloesung-20210211.tex +++ /dev/null @@ -1,604 +0,0 @@ -% hp-musterloesung-20210211.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Stack-Operationen, einfach und doppelt verkettete Listen, ternärer Baum - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{tikz} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 11.\ Februar 2021} - - \exercise{Stack-Operationen} - - Das folgende Programm (\gitfile{hp}{2020ws/20210211}{aufgabe-1.c}) - implementiert einen Stapelspeicher (Stack). - Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer) - tatsächlich genutzt wird. - An dieser Obergrenze kann man Elemente hinzufügen (push). - - In dieser Aufgabe sollen zusätzlich Elemente - in der Mitte eingefügt werden (insert). - Die dafür bereits existierenden Funktionen \lstinline{insert()} - und \lstinline{insert_sorted()} sind jedoch fehlerhaft. - - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - #define STACK_SIZE 10 - - int stack[STACK_SIZE]; - int stack_pointer = 0; - - void push (int x) - { - stack[stack_pointer++] = x; - } - - void show (void) - { - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - void insert (int x, int pos) - { - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; - } - - void insert_sorted (int x) - { - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); - } - - int main (void) - { - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; - } - \end{lstlisting} - \end{minipage} - - \begin{enumerate}[\quad(a)] - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört. - \points{3} - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.) - \points{2} - \item - Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt -- oder die Zahl - \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen. - \points{3} - \item - Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen. - \points{4} - \end{enumerate} - - \goodbreak - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt, - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört.} - - Die \lstinline{for}-Schleife in der Funktion \lstinline{insert()} - durchläuft das Array von unten nach oben. - Um den Inhalt des Arrays von unten nach oben zu verschieben, - muß man die Schleife jedoch von oben nach unten durchlaufen. - - \goodbreak - Um die Funktion zu reparieren, ersetze man also - \begin{lstlisting}[gobble=8] - for (int i = pos; i < stack_pointer; i++) - \end{lstlisting} - durch: - \begin{lstlisting}[gobble=8] - for (int i = stack_pointer - 1; i >= pos; i--) - \end{lstlisting} - (Siehe auch: \gitfile{hp}{2020ws/20210211}{loesung-1.c}) - - \item - \textbf{Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.)} - - Der Vergleich \lstinline{x < stack[i]} - als Bestandteil der \lstinline{while}-Bedingung - paßt nicht zur Durchlaufrichtung der Schleife (von unten nach oben). - - Um die Funktion zu reparieren, kann man daher entweder - das Kleinerzeichen durch ein Größerzeichen ersetzen - (\lstinline{x > stack[i]} -- siehe \gitfile{hp}{2020ws/20210211}{loesung-1b-1.c}) - oder die Schleife von oben nach unten durchlaufen - (siehe \gitfile{hp}{2020ws/20210211}{loesung-1b-2.c}). - - Eine weitere Möglichkeit besteht darin, - das Suchen nach der Einfügeposition - mit dem Verschieben des Arrays zu kombinieren - (siehe \gitfile{hp}{2020ws/20210211}{loesung-1.c}). - Hierdurch spart man sich eine Schleife; das Programm wird schneller. - (Es bleibt allerdings bei $\mathcal{O}(n)$.) - - \item - \textbf{Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt - -- oder \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen.} - - Man geht in einer Schleife den Stack (= den genutzten Teil des Arrays) durch. - Bei Gleichheit gibt man direkt mit \lstinline{return} den Index zurück. - Nach dem Schleifendurchlauf steht fest, - daß \lstinline{x} nicht im Stack vorhanden ist; - man kann dann direkt \lstinline{-1} zurückgeben - (siehe \gitfile{hp}{2020ws/20210211}{loesung-1c.c}). - - Da es sich um eine einzelne Schleife handelt, - ist die Ordnung $\mathcal{O}(n)$. - - \item - \textbf{Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen.} - - Um $\mathcal{O}(\log n)$ zu erreichen, - halbiert man fortwährend das Intervall von (einschließlich) \lstinline{0} - bis (ausschließlich) \lstinline{stack_pointer} - (siehe \gitfile{hp}{2020ws/20210211}{loesung-1d.c}) -- - wie in der Funktion \lstinline{push_sorted()} - im Beispiel-Programm \gitfile{hp}{2020ws/20210211}{stack-11.c}. - - Ein wichtiger Unterschied besteht darin, - daß man nach dem Durchlauf der Schleife noch auf die Gleichheit - \lstinline{x == stack[left]} (insbesondere nicht: \lstinline{stack[right]}) - prüfen und ggf.\ \lstinline{left} bzw.\ \lstinline{-1} zurückgeben muß. - \end{enumerate} - - \goodbreak - - \exercise{Einfach und doppelt verkettete Listen} - - Das Beispiel-Programm \gitfile{hp}{2020ws/20210211}{aufgabe-2.c} - demonstriert zwei Funktionen zur Verwaltung einfach verketteter Listen: - \lstinline{output_list()} zum Ausgeben der Liste auf den Bildschirm und - \lstinline{insert_into_list()} zum Einfügen in die Liste. - - \begin{enumerate}[\quad(a)] - \item - Ergänzen Sie eine Funktion \lstinline{delete_from_list()} - zum Löschen eines Elements aus der Liste - mit Freigabe des Speicherplatzes. - \points{5} - \item - Ergänzen Sie eine Funktion \lstinline{reverse_list()} - die die Reihenfolge der Elemente in der Liste umdreht.\\ - \points{3} - \end{enumerate} - - Eine doppelt verkettete Liste hat in jedem Knotenpunkt (\lstinline{node}) - \emph{zwei\/} Zeiger -- einen auf das nächste Element (\lstinline{next}) - und einen auf das vorherige Element (z.\,B.\ \lstinline{prev} für "`previous"'). - Dadurch ist es leichter als bei einer einfach verketteten Liste, - die Liste in umgekehrter Reihenfolge durchzugehen. - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,3.5) {first}; - \node(NULL1) at (-1,1.25) {NULL}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL2) at (7,2.75) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3) to[out=45,in=135] (7); - \draw[-latex](3) to[out=-135,in=0] (NULL1); - \draw[-latex](7) to[out=-135,in=-45] (3); - \draw[-latex](7) to[out=45,in=135] (137); - \draw[-latex](137) to[out=-135,in=-45] (7); - \draw[-latex](137) to[out=45,in=180] (NULL2); - \end{tikzpicture} - \end{quote} - - Der Rückwärts-Zeiger (\lstinline{prev}) des ersten Elements zeigt, - genau wie der Vorwärts-Zeiger (\lstinline{next}) des letzten Elements, - auf \emph{nichts}, hat also den Wert \lstinline{NULL}. - - \begin{enumerate}[\quad(a)]\setcounter{enumi}{2} - \item - Schreiben Sie das Programm um für doppelt verkettete Listen. - \points{5} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Ergänzen Sie eine Funktion \lstinline{delete_from_list()} - zum Löschen eines Elements aus der Liste - mit Freigabe des Speicherplatzes.} - - Siehe: \gitfile{hp}{2020ws/20210211}{loesung-2a.c} - - Um ein Element aus einer verketteten Liste zu löschen, - müssen zuerst die Zeiger umgestellt werden, - um das Element von der Liste auszuschließen. - Erst danach darf der Speicherplatz für das Element freigegeben werden. - -% Da das Beispielprogramm (\gitfile{hp}{2020ws/20210211}{lists-5.c}) -% nicht mit dynamischem Speicher arbeitet, -% stellen wir dieses zunächst auf dynamischen Speicher um, z.\,B.: -% \begin{lstlisting}[gobble=8] -% node *element5 = malloc (sizeof (node)); -% \end{lstlisting} -% Danach bezeichnet \lstinline{element5} -% die Adresse der \lstinline{struct}-Variablen; -% es wird also \lstinline{element5} an die Funktionen übergeben -% und nicht \lstinline{&element5} (die Adresse des Zeigers). - -% Um nun ein Element aus der Liste zu entfernen, -% benötigt man - Man benötigt also - \emph{das vorherige Element}, - dessen \lstinline{next}-Zeiger man dann auf - das übernächste Element \lstinline{next->next} weitersetzt. - - Bei jedem Zeiger muß man vor dem Zugriff prüfen, - daß dieser nicht auf \lstinline{NULL} zeigt. - (Die Musterlösung ist in dieser Hinsicht nicht konsequent. - Für den Produktiveinsatz müßte z.\,B.\ \lstinline{delete_from_list()} - auch den übergebenen Zeiger \lstinline{what} auf \lstinline{NULL} prüfen.) - - Ein Spezialfall tritt ein, wenn das erste Element einer Liste - entfernt werden soll. In diesem Fall tritt \lstinline{first} - an die Stelle des \lstinline{next}-Zeigers - des (nicht vorhandenen) vorherigen Elements. - Da \lstinline{delete_from_list()} \emph{schreibend\/} auf \lstinline{first} - zugreift, muß \lstinline{first} \emph{als Zeiger\/} übergeben werden - (\lstinline{node **first}). - - Um alle Spezialfälle zu testen (am Anfang, am Ende und in der Mitte der Liste), - wurden die Testfälle im Hauptprogramm erweitert. - - \item - \textbf{Schreiben Sie das Programm um für doppelt verkettete Listen.} - - Siehe: \gitfile{hp}{2020ws/20210211}{loesung-2b.c} - - Bei allen Einfüge- und Löschaktionen müssen \emph{jeweils zwei\/} - \lstinline{next}- und \lstinline{prev}-Zeiger neu gesetzt werden. - - Zum Debuggen empfiehlt es sich sehr, - eine Funktion zu schreiben, die die Liste auf Konsistenz prüft - (hier: \lstinline{check_list()}). - - Das Testprogramm macht von der Eigenschaft der doppelt verketteten Liste, - daß man sie auch rückwärts effizient durchgehen kann, keinen Gebrauch. - Um diese Eigenschaft als Vorteil nutzen zu können, empfiehlt es sich, - zusätzlich zu \lstinline{first} - auch einen Zeiger auf das letzte Element (z.\,B.\ \lstinline{last}) - einzuführen. Dieser muß dann natürlich bei allen Operationen - (Einfügen, Löschen, \dots) auf dem aktuellen Stand gehalten werden. - - \end{enumerate} - - \exercise{Ternärer Baum} - - Der in der Vorlesung vorgestellte \newterm{binäre Baum\/} - ist nur ein Spezialfall; - im allgemeinen können Bäume auch mehr als zwei Verzweigungen - pro Knotenpunkt haben. - Dies ist nützlich bei der Konstruktion \emph{balancierter Bäume}, - also solcher, die auch im \emph{Worst Case\/} - nicht zu einer linearen Liste entarten, - sondern stets eine -- möglichst flache -- Baumstruktur behalten. - - Wir betrachten einen Baum mit bis zu drei Verzweigungen pro Knotenpunkt, - einen sog.\ \newterm{ternären Baum}. - Jeder Knoten enthält dann nicht nur einen, - sondern \emph{zwei\/} Werte als Inhalt: - - \begin{lstlisting} - typedef struct node - { - int content_left, content_right; - struct node *left, *middle, *right; - } node; - \end{lstlisting} - - Wir konstruieren nun einen Baum nach folgenden Regeln: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Innerhalb eines Knotens sind die Werte sortiert: - \lstinline{content_left} muß stets kleiner sein als \lstinline{content_right}. - \item - Der Zeiger \lstinline{left} zeigt auf Knoten, - deren enthaltene Werte durchweg kleiner sind als \lstinline{content_left}. - \item - Der Zeiger \lstinline{right} zeigt auf Knoten, - deren enthaltene Werte durchweg größer sind als \lstinline{content_right}. - \item - Der Zeiger \lstinline{middle} zeigt auf Knoten, - deren enthaltene Werte durchweg größer sind als \lstinline{content_left}, - aber kleiner als \lstinline{content_right}. - \item - Ein Knoten muß nicht immer mit zwei Werten voll besetzt sein; - er darf auch \emph{nur einen\/} gültigen Wert enthalten. - - Der Einfachheit halber lassen wir in diesem Beispiel - nur positive Zahlen als Werte zu. - Wenn ein Knoten nur einen Wert enthält, - setzen wir \lstinline{content_right = -1}, - und der Zeiger \lstinline{middle} wird nicht verwendet. - \item - Wenn wir neue Werte in den Baum einfügen, - werden \emph{zuerst\/} die nicht voll besetzten Knoten aufgefüllt - und \emph{danach erst\/} neue Knoten angelegt und Zeiger gesetzt. - \item - Beim Auffüllen eines Knotens darf nötigenfalls \lstinline{content_left} - nach \lstinline{content_right} verschoben werden. - Ansonsten werden einmal angelegte Knoten nicht mehr verändert. - \end{itemize} - \vspace*{-\medskipamount} - (In der Praxis dürfen Knoten gemäß speziellen Regeln - nachträglich verändert werden, - um Entartungen gar nicht erst entstehen zu lassen -- - siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}.) - - \begin{enumerate}[\quad(a)] - \item - Zeichnen Sie ein Schaubild, das veranschaulicht, - wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12 - nacheinander und in dieser Reihenfolge - in den oben beschriebenen Baum eingefügt werden - -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20210211.pdf}), - Seite 42. - \points{3} - % - % Lösung: - % - % 7 137 - % / | - % 3 5 12 42 - % / \ - % 1 2 6 - % - % (NULL-Zeiger sind hier nicht dargestellt, - % gehören aber dazu.) - % - \goodbreak - \item - Dasselbe, aber in der Reihenfolge - 2, 7, 42, 12, 1, 137, 5, 6, 3. - \points{3} - % - % Lösung: - % - % 2 7 - % / | \ - % 1 5 6 12 42 - % / \ - % 3 137 - % - % (NULL-Zeiger sind hier wieder nicht dargestellt, - % gehören aber dazu.) - % - \item - Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment, - wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum - sortiert auszugeben. - \points{4} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Zeichnen Sie ein Schaubild, das veranschaulicht, - wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12 - nacheinander und in dieser Reihenfolge - in den oben beschriebenen Baum eingefügt werden - -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20190121.pdf}), - Seite 21.} - % - % Lösung: - % - % 7 137 - % / | - % 3 5 12 42 - % / \ - % 1 2 6 - % - % (NULL-Zeiger sind hier nicht dargestellt, - % gehören aber dazu.) - % - \begin{center} - \newcommand{\x}{~\makebox(0,0){\raisebox{0.7em}{\rule{1pt}{1.4em}}}~} - \begin{tikzpicture} - \color{blendedblue} - \node(root) at (0,0) {\lstinline{node *root;}}; - \node[shape=rectangle,draw,line width=1pt](7-137) at (0,-1.5) {7\x 137}; - \draw[-latex](root)--(7-137); - \node[shape=rectangle,draw,line width=1pt](3-5) at (-2,-3) {3\x 5}; - \draw[-latex](7-137)--(3-5); - \node[shape=rectangle,draw,line width=1pt](12-42) at (0,-3) {12\x 42}; - \draw[-latex](7-137)--(12-42); - \node[shape=rectangle,draw,line width=1pt](1-2) at (-4,-4.5) {1\x 2}; - \draw[-latex](3-5)--(1-2); - \node[shape=rectangle,draw,line width=1pt](6) at (0,-4.5) {6}; - \draw[-latex](3-5)--(6); - \end{tikzpicture} - \end{center} - Bemerkungen: - \begin{itemize} - \item - Zeiger mit dem Wert \lstinline{NULL} sind nicht dargestellt: - \lstinline{right}-Zeiger von 7/137, - \lstinline{middle}-Zeiger von 3/5, - sämtliche Zeiger von 1/2, 12/42 und 6. - \item - Beim Einfügen der 12 wird die sich bereits vorher in diesem - \lstinline{node} befindliche 42 zu \lstinline{content_right}, - und die 12 wird das neue \lstinline{content_left}. - \item - Dieser Baum hat sehr einfache Regeln und ist daher \emph{nicht\/} - balanciert. Insbesondere unsere Regel, daß einmal angelegte Knoten - nicht mehr verändert werden dürfen, steht dem im Wege. - Ein einfaches Beispiel für einen \emph{balancierten\/} ternären - Baum ist der 2-3-Baum -- siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}. - \end{itemize} - \goodbreak - \item - \textbf{Dasselbe, aber in der Reihenfolge - 2, 7, 42, 12, 1, 137, 5, 6, 3.} - % - % Lösung: - % - % 2 7 - % / | \ - % 1 5 6 12 42 - % / \ - % 3 137 - % - % (NULL-Zeiger sind hier wieder nicht dargestellt, - % gehören aber dazu.) - % - \begin{center} - \newcommand{\x}{~\makebox(0,0){\raisebox{0.7em}{\rule{1pt}{1.4em}}}~} - \begin{tikzpicture} - \color{blendedblue} - \node(root) at (0,0) {\lstinline{node *root;}}; - \node[shape=rectangle,draw,line width=1pt](2-7) at (0,-1.5) {2\x 7}; - \draw[-latex](root)--(7-137); - \node[shape=rectangle,draw,line width=1pt](1) at (-2,-3) {1}; - \draw[-latex](2-7)--(1); - \node[shape=rectangle,draw,line width=1pt](5-6) at (0,-3) {5\x 6}; - \draw[-latex](2-7)--(5-6); - \node[shape=rectangle,draw,line width=1pt](3) at (-2,-4.5) {3}; - \draw[-latex](5-6)--(3); - \node[shape=rectangle,draw,line width=1pt](12-42) at (2,-3) {12\x 42}; - \draw[-latex](2-7)--(12-42); - \node[shape=rectangle,draw,line width=1pt](137) at (4,-4.5) {137}; - \draw[-latex](12-42)--(137); - \end{tikzpicture} - \end{center} - Bemerkungen: - \begin{itemize} - \item - Wieder sind Zeiger mit dem Wert \lstinline{NULL} nicht dargestellt: - \lstinline{middle}- und \lstinline{right}-Zeiger von 5/6, - \lstinline{left}- und \lstinline{middle}-Zeiger von 12/42, - sämtliche Zeiger von 1, 3 und 137. - \item - Beim Einfügen der 12 wird wieder die sich bereits vorher in diesem - \lstinline{node} befindliche 42 zu \lstinline{content_right}, - und die 12 wird das neue \lstinline{content_left}. - \end{itemize} - \item - \textbf{Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment, - wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum - sortiert auszugeben.} - - Die entscheidende Idee ist \textbf{Rekursion}. - - Eine Funktion, die den gesamten Baum ausgibt, - müßte einmalig für den Zeiger \lstinline{root} aufgerufen werden - und folgendes tun: - \begin{enumerate}[\quad 1.] - \item - falls der übergebene Zeiger den Wert \lstinline{NULL} hat, - nichts ausgeben, sondern die Funktion direkt beenden, - \item - sich selbst für den \lstinline{left}-Zeiger aufrufen, - \item - den Wert von \lstinline{content_left} ausgeben, - \item - sich selbst für den \lstinline{middle}-Zeiger aufrufen, - \item - sofern vorhanden (also ungleich \lstinline{-1}), - den Wert von \lstinline{content_right} ausgeben, - \item - sich selbst für den \lstinline{right}-Zeiger aufrufen. - \end{enumerate} - Als C-Fragment: - \begin{lstlisting}[gobble=8] - void output_tree (node *root) - { - if (root) - { - output_tree (root->left); - printf ("%d\n", root->content_left); - output_tree (root->middle); - if (root->content_right >= 0) - printf ("%d\n", root->content_right); - output_tree (root->right); - } - } - \end{lstlisting} - Die Datei \gitfile{hp}{2020ws/20210211}{loesung-3c.c} erweitert dieses Fragment - zu einem vollständigen C-Programm zum Erstellen und sortierten Ausgeben - eines ternären Baums mit den Zahlenwerten von Aufgabenteil (a). - \end{enumerate} - -\end{document} diff --git a/20210211/hp-uebung-20210211.pdf b/20210211/hp-uebung-20210211.pdf deleted file mode 100644 index 12f115890aa74b65cc4417e5b75e9a48d6dd9f50..0000000000000000000000000000000000000000 Binary files a/20210211/hp-uebung-20210211.pdf and /dev/null differ diff --git a/20210211/hp-uebung-20210211.tex b/20210211/hp-uebung-20210211.tex deleted file mode 100644 index 14f6615c4971fa69cfe83b56bab318926d285de2..0000000000000000000000000000000000000000 --- a/20210211/hp-uebung-20210211.tex +++ /dev/null @@ -1,313 +0,0 @@ -% hp-uebung-20210204.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Stack-Operationen, einfach und doppelt verkettete Listen, ternärer Baum - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{tikz} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 11.\ Februar 2021} - -% Diese Übung enthält Punkteangaben wie in einer Klausur. -% Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten -% unter Verwendung ausschließlich zugelassener Hilfsmittel -% 17 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Stack-Operationen} - - Das folgende Programm (\gitfile{hp}{2020ws/20210211}{aufgabe-1.c}) - implementiert einen Stapelspeicher (Stack). - Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer) - tatsächlich genutzt wird. - An dieser Obergrenze kann man Elemente hinzufügen (push). - - In dieser Aufgabe sollen zusätzlich Elemente - in der Mitte eingefügt werden (insert). - Die dafür bereits existierenden Funktionen \lstinline{insert()} - und \lstinline{insert_sorted()} sind jedoch fehlerhaft. - - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - #define STACK_SIZE 10 - - int stack[STACK_SIZE]; - int stack_pointer = 0; - - void push (int x) - { - stack[stack_pointer++] = x; - } - - void show (void) - { - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - void insert (int x, int pos) - { - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; - } - - void insert_sorted (int x) - { - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); - } - - int main (void) - { - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; - } - \end{lstlisting} - \end{minipage} - - \begin{enumerate}[\quad(a)] - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört. -% \points{3} - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.) -% \points{2} - \item - Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt -- oder die Zahl - \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen. -% \points{3} - \item - Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen. -% \points{4} - \end{enumerate} - - \goodbreak - - \exercise{Einfach und doppelt verkettete Listen} - - Das Beispiel-Programm \gitfile{hp}{2020ws/20210211}{aufgabe-2.c} - demonstriert zwei Funktionen zur Verwaltung einfach verketteter Listen: - \lstinline{output_list()} zum Ausgeben der Liste auf den Bildschirm und - \lstinline{insert_into_list()} zum Einfügen in die Liste. - - \begin{enumerate}[\quad(a)] - \item - Ergänzen Sie eine Funktion \lstinline{delete_from_list()} - zum Löschen eines Elements aus der Liste - mit Freigabe des Speicherplatzes. -% \points{5} - \item - Ergänzen Sie eine Funktion \lstinline{reverse_list()} - die die Reihenfolge der Elemente in der Liste umdreht.\\ -% \points{3} - \end{enumerate} - - Eine doppelt verkettete Liste hat in jedem Knotenpunkt (\lstinline{node}) - \emph{zwei\/} Zeiger -- einen auf das nächste Element (\lstinline{next}) - und einen auf das vorherige Element (z.\,B.\ \lstinline{prev} für "`previous"'). - Dadurch ist es leichter als bei einer einfach verketteten Liste, - die Liste in umgekehrter Reihenfolge durchzugehen. - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,3.5) {first}; - \node(NULL1) at (-1,1.25) {NULL}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL2) at (7,2.75) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3) to[out=45,in=135] (7); - \draw[-latex](3) to[out=-135,in=0] (NULL1); - \draw[-latex](7) to[out=-135,in=-45] (3); - \draw[-latex](7) to[out=45,in=135] (137); - \draw[-latex](137) to[out=-135,in=-45] (7); - \draw[-latex](137) to[out=45,in=180] (NULL2); - \end{tikzpicture} - \end{quote} - - Der Rückwärts-Zeiger (\lstinline{prev}) des ersten Elements zeigt, - genau wie der Vorwärts-Zeiger (\lstinline{next}) des letzten Elements, - auf \emph{nichts}, hat also den Wert \lstinline{NULL}. - - \begin{enumerate}[\quad(a)]\setcounter{enumi}{2} - \item - Schreiben Sie das Programm um für doppelt verkettete Listen. -% \points{5} - \end{enumerate} - - \exercise{Ternärer Baum} - - Der in der Vorlesung vorgestellte \newterm{binäre Baum\/} - ist nur ein Spezialfall; - im allgemeinen können Bäume auch mehr als zwei Verzweigungen - pro Knotenpunkt haben. - Dies ist nützlich bei der Konstruktion \emph{balancierter Bäume}, - also solcher, die auch im \emph{Worst Case\/} - nicht zu einer linearen Liste entarten, - sondern stets eine -- möglichst flache -- Baumstruktur behalten. - - Wir betrachten einen Baum mit bis zu drei Verzweigungen pro Knotenpunkt, - einen sog.\ \newterm{ternären Baum}. - Jeder Knoten enthält dann nicht nur einen, - sondern \emph{zwei\/} Werte als Inhalt: - - \begin{lstlisting} - typedef struct node - { - int content_left, content_right; - struct node *left, *middle, *right; - } node; - \end{lstlisting} - - Wir konstruieren nun einen Baum nach folgenden Regeln: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Innerhalb eines Knotens sind die Werte sortiert: - \lstinline{content_left} muß stets kleiner sein als \lstinline{content_right}. - \item - Der Zeiger \lstinline{left} zeigt auf Knoten, - deren enthaltene Werte durchweg kleiner sind als \lstinline{content_left}. - \item - Der Zeiger \lstinline{right} zeigt auf Knoten, - deren enthaltene Werte durchweg größer sind als \lstinline{content_right}. - \item - Der Zeiger \lstinline{middle} zeigt auf Knoten, - deren enthaltene Werte durchweg größer sind als \lstinline{content_left}, - aber kleiner als \lstinline{content_right}. - \item - Ein Knoten muß nicht immer mit zwei Werten voll besetzt sein; - er darf auch \emph{nur einen\/} gültigen Wert enthalten. - - Der Einfachheit halber lassen wir in diesem Beispiel - nur positive Zahlen als Werte zu. - Wenn ein Knoten nur einen Wert enthält, - setzen wir \lstinline{content_right = -1}, - und der Zeiger \lstinline{middle} wird nicht verwendet. - \item - Wenn wir neue Werte in den Baum einfügen, - werden \emph{zuerst\/} die nicht voll besetzten Knoten aufgefüllt - und \emph{danach erst\/} neue Knoten angelegt und Zeiger gesetzt. - \item - Beim Auffüllen eines Knotens darf nötigenfalls \lstinline{content_left} - nach \lstinline{content_right} verschoben werden. - Ansonsten werden einmal angelegte Knoten nicht mehr verändert. - \end{itemize} - \vspace*{-\medskipamount} - (In der Praxis dürfen Knoten gemäß speziellen Regeln - nachträglich verändert werden, - um Entartungen gar nicht erst entstehen zu lassen -- - siehe z.\,B.\ \url{https://en.wikipedia.org/wiki/2-3_tree}.) - - \begin{enumerate}[\quad(a)] - \item - Zeichnen Sie ein Schaubild, das veranschaulicht, - wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12 - nacheinander und in dieser Reihenfolge - in den oben beschriebenen Baum eingefügt werden - -- analog zu den Vortragsfolien (\gitfile{hp}{2020ws/20210211}{hp-20210211.pdf}), - Seite 42. -% \points{3} - % - % Lösung: - % - % 7 137 - % / | - % 3 5 12 42 - % / \ - % 1 2 6 - % - % (NULL-Zeiger sind hier nicht dargestellt, - % gehören aber dazu.) - % - \item - Dasselbe, aber in der Reihenfolge - 2, 7, 42, 12, 1, 137, 5, 6, 3. -% \points{3} - % - % Lösung: - % - % 2 7 - % / | \ - % 1 5 6 12 42 - % / \ - % 3 137 - % - % (NULL-Zeiger sind hier wieder nicht dargestellt, - % gehören aber dazu.) - % - \item - Beschreiben Sie in Worten und/oder als C-Quelltext-Fragment, - wie eine Funktion aussehen müßte, um den auf diese Weise entstandenen Baum - sortiert auszugeben. -% \points{4} - \end{enumerate} - - \begin{flushright} - \textit{Viel Erfolg -- auch in den Prüfungen!} - \end{flushright} - -% \makeatletter -% \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} -% \makeatother - -\end{document} diff --git a/20210211/lists-1.c b/20210211/lists-1.c deleted file mode 100644 index a04067e1403601ef56dd706d6148c1d386884e82..0000000000000000000000000000000000000000 --- a/20210211/lists-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int content; - node *next; -} node; - -int main (void) -{ - return 0; -} diff --git a/20210211/lists-2.c b/20210211/lists-2.c deleted file mode 100644 index f27d1d5af7c0c237f0d0286155380ef9452a497a..0000000000000000000000000000000000000000 --- a/20210211/lists-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - return 0; -} diff --git a/20210211/lists-3.c b/20210211/lists-3.c deleted file mode 100644 index 9c9029724efff25263813c5491add92504779d17..0000000000000000000000000000000000000000 --- a/20210211/lists-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20210211/lists-4.c b/20210211/lists-4.c deleted file mode 100644 index e048736b85cc228c35f31644d003e00cdefc5496..0000000000000000000000000000000000000000 --- a/20210211/lists-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node3.next = &node7; - node7.next = &node137; - node137.next = NULL; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20210211/lists-5.c b/20210211/lists-5.c deleted file mode 100644 index a0cc620a884c133dd89582de726139091bc9c5d0..0000000000000000000000000000000000000000 --- a/20210211/lists-5.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node3.next = &node7; - node7.next = &node137; - node137.next = NULL; - - node node5 = { 5, NULL }; - node5.next = node3.next; - node3.next = &node5; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20210211/loesung-1.c b/20210211/loesung-1.c deleted file mode 100644 index 9b87d6c2f977af2843bcc2b75896fb5f00d8fc35..0000000000000000000000000000000000000000 --- a/20210211/loesung-1.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20210211/loesung-1b-1.c b/20210211/loesung-1b-1.c deleted file mode 100644 index cbbe37055109d203105a7ad4acb63d5bef61f4c0..0000000000000000000000000000000000000000 --- a/20210211/loesung-1b-1.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = 0; - while (i < stack_pointer && x > stack[i]) - i++; - insert (x, i); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20210211/loesung-1b-2.c b/20210211/loesung-1b-2.c deleted file mode 100644 index b1e1ae846f15a29e9cd53a8d1d689e3ccbefacce..0000000000000000000000000000000000000000 --- a/20210211/loesung-1b-2.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - i--; - insert (x, i + 1); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20210211/loesung-1c.c b/20210211/loesung-1c.c deleted file mode 100644 index 79d061e3d7b78a2bec05b632e74b083a16d5a326..0000000000000000000000000000000000000000 --- a/20210211/loesung-1c.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int search (int x) -{ - for (int i = 0; i < stack_pointer; i++) - if (stack[i] == x) - return i; - return -1; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - printf ("%d\n", search (42)); - printf ("%d\n", search (1117)); - return 0; -} diff --git a/20210211/loesung-1d.c b/20210211/loesung-1d.c deleted file mode 100644 index 9079d8d3be7a500498aede2cf8e89a7d7db48a35..0000000000000000000000000000000000000000 --- a/20210211/loesung-1d.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int search (int x) -{ - int left = 0; - int right = stack_pointer; - while (left < right - 1) - { - int middle = (left + right) / 2; - if (x < stack[middle]) - right = middle; - else - left = middle; - } - if (x == stack[left]) - return left; - else - return -1; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - printf ("%d\n", search (2)); - printf ("%d\n", search (4)); - printf ("%d\n", search (42)); - printf ("%d\n", search (67)); - printf ("%d\n", search (137)); - printf ("%d\n", search (1117)); - return 0; -} diff --git a/20210211/loesung-2a.c b/20210211/loesung-2a.c deleted file mode 100644 index 93f5e5629a98d13d6292c56d1a3f855b4f5bd8fd..0000000000000000000000000000000000000000 --- a/20210211/loesung-2a.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -void output_list (node *first) -{ - for (node *p = first; p; p = p->next) - printf ("%d ", p->content); - printf ("\n"); -} - -void insert_into_list (node *what, node *where) -{ - what->next = where->next; - where->next = what; -} - -void delete_from_list (node *what, node **first) -{ - if (what == *first) - *first = what->next; - else - { - node *p = *first; - while (p && p->next != what) - p = p->next; - if (p) - p->next = what->next; - } - free (what); -} - -int main (void) -{ - node *element3 = malloc (sizeof (node)); - node *element7 = malloc (sizeof (node)); - node *element137 = malloc (sizeof (node)); - - element3->content = 3; - element7->content = 7; - element137->content = 137; - - node *first = element3; - element3->next = element7; - element7->next = element137; - element137->next = NULL; - - output_list (first); - - node *element5 = malloc (sizeof (node)); - element5->content = 5; - insert_into_list (element5, element3); - - output_list (first); - - delete_from_list (element5, &first); - output_list (first); - delete_from_list (element3, &first); - output_list (first); - delete_from_list (element137, &first); - output_list (first); - - return 0; -} diff --git a/20210211/loesung-2b.c b/20210211/loesung-2b.c deleted file mode 100644 index 811b99b1fc9697ca0302eea8950c9bc6e7ab6042..0000000000000000000000000000000000000000 --- a/20210211/loesung-2b.c +++ /dev/null @@ -1,97 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *next, *prev; -} node; - -void check_list (node *first) -{ - for (node *p = first; p; p = p->next) - { - if (p->next && p->next->prev != p) - fprintf (stderr, "List inconsistency!\n"); - if (p->prev && p->prev->next != p) - fprintf (stderr, "List inconsistency!\n"); - } -} - -void output_list (node *first) -{ - for (node *p = first; p; p = p->next) - printf ("%d ", p->content); - printf ("\n"); -} - -void insert_into_list (node *what, node *where) -{ - what->next = where->next; - if (where->next) - where->next->prev = what; - what->prev = where; - where->next = what; -} - -void delete_from_list (node *what, node **first) -{ - if (what == *first) - { - *first = what->next; - if (*first) - (*first)->prev = NULL; - } - else - { - node *p = *first; - while (p && p->next != what) - p = p->next; - if (p) - p->next = what->next; - if (what->next) - what->next->prev = p; - } - free (what); -} - -int main (void) -{ - node *element3 = malloc (sizeof (node)); - node *element7 = malloc (sizeof (node)); - node *element137 = malloc (sizeof (node)); - - element3->content = 3; - element7->content = 7; - element137->content = 137; - - node *first = element3; - element3->prev = NULL; - element3->next = element7; - element7->prev = element3; - element7->next = element137; - element137->prev = element7; - element137->next = NULL; - - output_list (first); - check_list (first); - - node *element5 = malloc (sizeof (node)); - element5->content = 5; - insert_into_list (element5, element3); - - output_list (first); - check_list (first); - - delete_from_list (element5, &first); - output_list (first); - check_list (first); - delete_from_list (element3, &first); - output_list (first); - check_list (first); - delete_from_list (element137, &first); - output_list (first); - check_list (first); - - return 0; -} diff --git a/20210211/loesung-3c.c b/20210211/loesung-3c.c deleted file mode 100644 index a6dea990b25895475e343f07895c6a946426d2d8..0000000000000000000000000000000000000000 --- a/20210211/loesung-3c.c +++ /dev/null @@ -1,68 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content_left, content_right; - struct node *left, *middle, *right; -} node; - -void insert_into_tree (node **root, int value) -{ - if (*root) - { - if ((*root)->content_right >= 0) - if (value < (*root)->content_left) - insert_into_tree (&(*root)->left, value); - else if (value < (*root)->content_right) - insert_into_tree (&(*root)->middle, value); - else - insert_into_tree (&(*root)->right, value); - else - if (value < (*root)->content_left) - { - (*root)->content_right = (*root)->content_left; - (*root)->content_left = value; - } - else - (*root)->content_right = value; - } - else - { - *root = malloc (sizeof (node)); - (*root)->left = NULL; - (*root)->content_left = value; - (*root)->middle = NULL; - (*root)->content_right = -1; - (*root)->right = NULL; - } -} - -void output_tree (node *root) -{ - if (root) - { - output_tree (root->left); - printf ("%d\n", root->content_left); - output_tree (root->middle); - if (root->content_right >= 0) - printf ("%d\n", root->content_right); - output_tree (root->right); - } -} - -int main (void) -{ - node *root = NULL; - insert_into_tree (&root, 7); - insert_into_tree (&root, 137); - insert_into_tree (&root, 3); - insert_into_tree (&root, 5); - insert_into_tree (&root, 6); - insert_into_tree (&root, 42); - insert_into_tree (&root, 1); - insert_into_tree (&root, 2); - insert_into_tree (&root, 12); - output_tree (root); - return 0; -} diff --git a/20210211/logo-hochschule-bochum-cvh-text-v2.pdf b/20210211/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20210211/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20210211/logo-hochschule-bochum.pdf b/20210211/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20210211/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20210211/pgscript.sty b/20210211/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20210211/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20210211/pgslides.sty b/20210211/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20210211/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20210211/stack-0.c b/20210211/stack-0.c deleted file mode 100644 index 289aab7602e1e1f9f1e6433b858f295792499b1b..0000000000000000000000000000000000000000 --- a/20210211/stack-0.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -void push (int x) -{ -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-1.c b/20210211/stack-1.c deleted file mode 100644 index d1de6e09d718b69a9d255b6c83f6f7815584b430..0000000000000000000000000000000000000000 --- a/20210211/stack-1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer] = x; - stack_pointer++; -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-2.c b/20210211/stack-2.c deleted file mode 100644 index 20bed3660cffea7e0a9803451f69ef56a4a04b93..0000000000000000000000000000000000000000 --- a/20210211/stack-2.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-3.c b/20210211/stack-3.c deleted file mode 100644 index b20a444d628a88101416097c79b34e0669b24d21..0000000000000000000000000000000000000000 --- a/20210211/stack-3.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - stack_pointer--; - return stack[stack_pointer]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-4.c b/20210211/stack-4.c deleted file mode 100644 index 0d738f95ff81ce1701b4aa8a12df30094b723851..0000000000000000000000000000000000000000 --- a/20210211/stack-4.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-5.c b/20210211/stack-5.c deleted file mode 100644 index 38a187208208488bdb8e988d93442d57730e421e..0000000000000000000000000000000000000000 --- a/20210211/stack-5.c +++ /dev/null @@ -1,40 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-6.c b/20210211/stack-6.c deleted file mode 100644 index be00e160384be5e4af05831547ed74b636c3bdf0..0000000000000000000000000000000000000000 --- a/20210211/stack-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - for (int i = 0; i < 42; i++) - push (i); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20210211/stack-7.c b/20210211/stack-7.c deleted file mode 100644 index b583bc281f9ae3acd673ec9ea4de75720084fb50..0000000000000000000000000000000000000000 --- a/20210211/stack-7.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - for (int i = 0; i < 42; i++) - printf ("%d\n", pop ()); - return 0; -} diff --git a/20201105/gitlab.png b/20211004/gitlab.png similarity index 100% rename from 20201105/gitlab.png rename to 20211004/gitlab.png diff --git a/20201105/hp-20201105-fig1.pdf b/20211004/hp-20211004-fig1.pdf similarity index 100% rename from 20201105/hp-20201105-fig1.pdf rename to 20211004/hp-20211004-fig1.pdf diff --git a/20201105/hp-20201105-fig1.tex b/20211004/hp-20211004-fig1.tex similarity index 100% rename from 20201105/hp-20201105-fig1.tex rename to 20211004/hp-20211004-fig1.tex diff --git a/20201105/hp-20201105.pdf b/20211004/hp-20211004.pdf similarity index 55% rename from 20201105/hp-20201105.pdf rename to 20211004/hp-20211004.pdf index 2c02ccc81ae5c7f44daf48b6bd2b5af95cc58715..f7304d7daca827ffe6f17406e104426c2338fb58 100644 Binary files a/20201105/hp-20201105.pdf and b/20211004/hp-20211004.pdf differ diff --git a/20201105/hp-20201105.tex b/20211004/hp-20211004.tex similarity index 95% rename from 20201105/hp-20201105.tex rename to 20211004/hp-20211004.tex index 3860857857e2d771ab1b4c2bb2f0936e9fa5fe07..d968501660e458c428082d5fdedef75aa4d80aa5 100644 --- a/20201105/hp-20201105.tex +++ b/20211004/hp-20211004.tex @@ -1,5 +1,5 @@ -% hp-20201105.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski +% hp-20211004.pdf - Lecture Slides on Low-Level Programming +% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -37,9 +37,11 @@ \usepackage{pstricks,pst-grad} \end{psinputs} +\newcommand{\redurl}[1]{\href{#1}{\color{red}\nolinkurl{#1}}} + \title{Hardwarenahe Programmierung} \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{5.\ November 2020} +\date{4.\ Oktober 2021} \begin{document} @@ -47,10 +49,11 @@ \date{\begin{picture}(0,0) \color{red} - \put(0.63,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{% + \put(0.55,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{% \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}} + \put(1.5,-3){\makebox(0,0)[bl]{\redurl{https://www.peter.gerwinski.de/physik/}}} \end{picture}% - 5.\ November 2020} + 4.\ Oktober 2021} \maketitleframe @@ -62,15 +65,19 @@ \showsectionnonumber \begin{itemize} + \item + Diese Veranstaltung findet \textbf{in Präsenz} statt.\\ + Wir versuchen aber, auch eine Online-Teilnahme zu ermöglichen. + \medskip \item \textbf{Mumble}: Seminarraum 2\\ - Fragen: Mikrophon einschalten oder über den Chat\\ - Umfragen: über den Chat + Fragen: Mikrofon einschalten oder über den Chat\\ + Umfragen: über den Chat -- \textbf{auch während der Präsenz-Veranstaltung} \smallskip \item \textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\ - Eigenen Bildschirm freigeben: über VNC oder über Jitsi Meet\\ - Kamerabild übertragen: über Jitsi Meet + Eigenen Bildschirm freigeben: VNC-Software oder Web-Interface \emph{yesVNC}\\ + Eigenes Kamerabild übertragen: Web-Interface \emph{CVH-Camera} \smallskip \item Allgemeine Informationen: @@ -82,8 +89,7 @@ \smallskip \item Bei Problemen: bitte notieren:\\ - Art des Problems, genaue Uhrzeit, eigener Internet-Provider\\ - speziell: Netzanschluß des Studierendenwohnheims + Art des Problems, genaue Uhrzeit, eigener Internet-Zugang \bigskip \item GitLab: \url{https://gitlab.cvh-server.de/pgerwinski/hp} @@ -326,11 +332,12 @@ \end{itemize} \item \textbf{Übungen}\\ - finden bereits diese Woche statt. + sind mit der Vorlesung integriert. \item Das \textbf{Praktikum}\\ - findet weitgehend in Heimarbeit statt.\\ - Bereits heute: vorbereitende Maßnahmen + findet jede Woche statt.\\ + Diese Woche: vorbereitende Maßnahmen,\\ + Kennenlernen der verwendeten Werkzeuge \end{itemize} \end{frame} diff --git a/20201105/hp-uebung-20201105.pdf b/20211004/hp-uebung-20211004.pdf similarity index 100% rename from 20201105/hp-uebung-20201105.pdf rename to 20211004/hp-uebung-20211004.pdf diff --git a/20201105/hp-uebung-20201105.tex b/20211004/hp-uebung-20211004.tex similarity index 100% rename from 20201105/hp-uebung-20201105.tex rename to 20211004/hp-uebung-20211004.tex diff --git a/20201105/logo-hochschule-bochum-cvh-text-v2.pdf b/20211004/logo-hochschule-bochum-cvh-text-v2.pdf similarity index 100% rename from 20201105/logo-hochschule-bochum-cvh-text-v2.pdf rename to 20211004/logo-hochschule-bochum-cvh-text-v2.pdf diff --git a/20201105/logo-hochschule-bochum.pdf b/20211004/logo-hochschule-bochum.pdf similarity index 100% rename from 20201105/logo-hochschule-bochum.pdf rename to 20211004/logo-hochschule-bochum.pdf diff --git a/20201105/pgscript.sty b/20211004/pgscript.sty similarity index 100% rename from 20201105/pgscript.sty rename to 20211004/pgscript.sty diff --git a/20201105/pgslides.sty b/20211004/pgslides.sty similarity index 100% rename from 20201105/pgslides.sty rename to 20211004/pgslides.sty diff --git a/hp-slides-2020ws.pdf b/hp-slides-2020ws.pdf deleted file mode 100644 index a74ee6002f891133eb1b11e2d785db5644b347df..0000000000000000000000000000000000000000 Binary files a/hp-slides-2020ws.pdf and /dev/null differ diff --git a/hp-slides-2020ws.tex b/hp-slides-2020ws.tex deleted file mode 100644 index a621d08bd4c5a7088814622ca5a4120663f7ff9c..0000000000000000000000000000000000000000 --- a/hp-slides-2020ws.tex +++ /dev/null @@ -1,39 +0,0 @@ -\documentclass{article} - -\usepackage[final]{pdfpages} -\usepackage[paperwidth=363pt,paperheight=272pt]{geometry} -\usepackage{hyperref} - -\pagestyle{empty} - -\begin{document} - \includepdf[pages=1]{script/hp-slides-title-2020ws.pdf} - \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis} - \includepdf[pages=2-]{script/hp-slides-title-2020ws.pdf} - \pdfbookmark[1]{05.11.2020: Einführung, Einführung in C (bis Schleifen)}{20201105} - \includepdf[pages=-]{20201105/hp-20201105.pdf} - \pdfbookmark[1]{12.11.2020: Einführung in C: Seiteneffekte, Funktionen}{20201112} - \includepdf[pages=-]{20201112/hp-20201112.pdf} - \pdfbookmark[1]{19.11.2020: Einführung in C: Zeiger, Arrays und Strings}{20201119} - \includepdf[pages=-]{20201119/hp-20201119.pdf} - \pdfbookmark[1]{26.11.2020: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung}{20201126} - \includepdf[pages=-]{20201126/hp-20201126.pdf} - \pdfbookmark[1]{03.12.2020: Parameter des Hauptprogramms, String-Operationen}{20201203} - \includepdf[pages=-]{20201203/hp-20201203.pdf} - \pdfbookmark[1]{10.12.2020: Präprozessor, Bibliotheken einbinden und verwenden}{20201210} - \includepdf[pages=-]{20201210/hp-20201210.pdf} - \pdfbookmark[1]{17.12.2020: make, Differentialgleichungen}{20201217} - \includepdf[pages=-]{20201217/hp-20201217.pdf} - \pdfbookmark[1]{07.01.2021: Rekursion, Aufwandsabschätzungen}{20210107} - \includepdf[pages=-]{20210107/hp-20210107.pdf} - \pdfbookmark[1]{14.01.2021: Hardwarenahe Programmierung: Bit-Operationen, I/O-Ports}{20210114} - \includepdf[pages=-]{20210114/hp-20210114.pdf} - \pdfbookmark[1]{21.01.2021: Hardwarenahe Programmierung: Interrupts, volatile-Variable, Byte-Reihenfolge – Endianness, Binärdarstellung negativer Zahlen, Speicherausrichtung – Alignment}{20210121} - \includepdf[pages=-]{20210121/hp-20210121.pdf} - \pdfbookmark[1]{28.01.2021: Objektorientierte Programmierung}{20210128} - \includepdf[pages=-]{20210128/hp-20210128.pdf} - \pdfbookmark[1]{04.02.2021: Objektorientierte Programmierung: virtuelle Methoden}{20210204} - \includepdf[pages=-]{20210204/hp-20210204.pdf} - \pdfbookmark[1]{11.02.2021: Objektorientierte Programmierung: virtuelle Methoden}{20210211} - \includepdf[pages=-]{20210211/hp-20210211.pdf} -\end{document} diff --git a/script/Tower_of_Hanoi.jpeg b/script/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/script/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf deleted file mode 100644 index 8f90a0d169c4b94a85845ccc3dad9b2877799c9b..0000000000000000000000000000000000000000 Binary files a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf and /dev/null differ diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg deleted file mode 100644 index d399442a10e479bbb92058b13e1aafa2fbcd3503..0000000000000000000000000000000000000000 --- a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 847.15857 743.62268" - height="743.62268" - width="847.15857" - xml:space="preserve" - version="1.1" - id="svg5488"><metadata - id="metadata5494"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs5492" /><g - transform="matrix(1.25,0,0,-1.25,0,743.62267)" - id="g5496"><g - id="g5498"><path - id="path5500" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,594.5 c -7.512,0 -15.027,-2.867 -20.758,-8.598 -1.879,-1.879 -3.445,-3.953 -4.707,-6.152 l -15.246,-26.157 -0.07,0 L 4.984,45.554 C 4.93,45.457 4.887,45.359 4.832,45.261 3.344,42.867 2.176,40.218 1.406,37.351 -2.789,21.695 6.504,5.597 22.164,1.402 c 2.586,-0.695 5.184,-1.012 7.738,-1 l 618.067,0 c 16.215,0 29.355,13.141 29.355,29.356 0,5.304 -1.414,10.281 -3.879,14.578 -0.019,0.031 -0.035,0.062 -0.05,0.097 l -304.368,528.41 c -3.863,6.665 -5.652,9.305 -9.406,13.059 -5.73,5.731 -13.242,8.598 -20.754,8.598 z" /><path - id="path5502" - style="fill:#c1121c;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,587.144 c -7.125,0.051 -14.949,-3.59 -18.781,-10.406 L 10.793,40.847 C 9.008,37.199 8.258,34.027 8.234,30.398 c 0,-6.496 2.875,-12.66 7.848,-16.84 4.383,-3.394 8.535,-5.16 14.121,-5.16 l 617.906,0 c 3.77,-0.035 7.547,0.871 10.977,3.133 6.453,3.898 10.402,10.883 10.41,18.426 -0.184,3.894 -1.144,8 -2.879,10.89 L 357.504,576.828 c -0.027,0.047 -0.059,0.094 -0.09,0.14 -0.031,0.047 -0.062,0.094 -0.094,0.145 -1.097,1.754 -2.472,3.305 -4.039,4.633 -3.59,3.109 -8.086,4.976 -12.824,5.316 -0.531,0.047 -1.062,0.078 -1.59,0.082 z M 30.203,8.398 l -1.523,0 1.554,0 -0.031,0 z M 338.547,480.933 574.25,72.398 l -471.738,0 236.035,408.535 z" /><path - id="path5504" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,594.898 c -7.617,0 -15.23,-2.906 -21.039,-8.715 -1.906,-1.902 -3.492,-4.008 -4.773,-6.234 l -15.129,-25.957 -0.071,0 L 4.641,45.754 C 4.574,45.636 4.527,45.535 4.48,45.453 2.977,43.031 1.797,40.351 1.02,37.457 -3.23,21.586 6.191,5.269 22.059,1.015 24.68,0.312 27.316,-0.008 29.902,0 l 618.067,0 c 16.429,0 29.758,13.328 29.758,29.758 0,5.375 -1.438,10.417 -3.934,14.773 -0.012,0.019 -0.027,0.051 -0.051,0.098 L 369.379,573.043 c -3.871,6.668 -5.695,9.363 -9.469,13.14 -5.808,5.809 -13.426,8.715 -21.039,8.715 l -0.004,0 z m 0,-0.398 c 7.512,0 15.024,-2.867 20.754,-8.598 3.754,-3.754 5.543,-6.394 9.406,-13.059 L 673.391,44.433 c 0.019,-0.035 0.035,-0.066 0.054,-0.097 2.465,-4.297 3.879,-9.274 3.879,-14.578 0,-16.215 -13.14,-29.356 -29.355,-29.356 l -618.067,0 C 27.348,0.39 24.75,0.707 22.164,1.402 6.504,5.597 -2.789,21.695 1.406,37.351 c 0.766,2.867 1.938,5.516 3.426,7.91 0.055,0.098 0.098,0.196 0.152,0.293 l 293.102,508.039 0.07,0 15.246,26.157 c 1.262,2.199 2.828,4.273 4.707,6.152 5.731,5.731 13.243,8.598 20.758,8.598 z" /><path - id="path5506" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,408.414 c -17.676,0 -32.004,-14.328 -32.004,-32 l 16,-188.016 c 0,-8.836 6.371,-16.015 16.004,-16 9.629,0.016 15.996,7.82 15.996,16.012 l 16,188.004 c 0,17.672 -14.324,32 -31.996,32 z" /><path - id="path5508" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 370.863,124.398 c 0,-17.683 -14.316,-31.996 -31.996,-31.996 -17.676,0 -32.004,14.309 -32.004,31.996 0,17.672 14.328,32.004 32.004,32.004 17.68,0 31.996,-14.332 31.996,-32.004" /></g></g></svg> \ No newline at end of file diff --git a/script/Zeichen_123.pdf b/script/Zeichen_123.pdf deleted file mode 120000 index fdbc897227df059cfda790a16555e6e417682116..0000000000000000000000000000000000000000 --- a/script/Zeichen_123.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/Zeichen_123.pdf \ No newline at end of file diff --git a/script/answer.c b/script/answer.c deleted file mode 100644 index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000 --- a/script/answer.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 23; -} diff --git a/script/answer.h b/script/answer.h deleted file mode 100644 index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000 --- a/script/answer.h +++ /dev/null @@ -1 +0,0 @@ -extern int answer (void); diff --git a/script/arrays-1.c b/script/arrays-1.c deleted file mode 100644 index 2582e4953f11963bc5a71bb055829c9b95fc2f68..0000000000000000000000000000000000000000 --- a/script/arrays-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; -} diff --git a/script/arrays-2.c b/script/arrays-2.c deleted file mode 100644 index 8affefa7b74afcbe0effbbe0ff32a577c696f21e..0000000000000000000000000000000000000000 --- a/script/arrays-2.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; -} diff --git a/script/bsort-1.c b/script/bsort-1.c deleted file mode 100644 index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000 --- a/script/bsort-1.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-1a.c b/script/bsort-1a.c deleted file mode 100644 index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000 --- a/script/bsort-1a.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-2.c b/script/bsort-2.c deleted file mode 100644 index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000 --- a/script/bsort-2.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-3.c b/script/bsort-3.c deleted file mode 100644 index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000 --- a/script/bsort-3.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int done = 0; - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0 && !done) - { - done = 1; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - done = 0; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-4.c b/script/bsort-4.c deleted file mode 100644 index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000 --- a/script/bsort-4.c +++ /dev/null @@ -1,57 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - int new_sorted = 0; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - new_sorted = i; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted = new_sorted; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/cube-1.c b/script/cube-1.c deleted file mode 100644 index 2f9328f07a9e6f35bb50535911fd0a327a5b6669..0000000000000000000000000000000000000000 --- a/script/cube-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; -} diff --git a/script/cube-2.c b/script/cube-2.c deleted file mode 100644 index 0df28c7e4901f3653611c3803bc7df4d68a84121..0000000000000000000000000000000000000000 --- a/script/cube-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glRotatef (-30.0, 0.5, 1.0, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; -} diff --git a/script/cube-3.c b/script/cube-3.c deleted file mode 100644 index ef326a1f58b7e5396fc2102907a3ba6a671b1bbf..0000000000000000000000000000000000000000 --- a/script/cube-3.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glRotatef (t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-4.c b/script/cube-4.c deleted file mode 100644 index 9dfb48d59fbbc5221a6f5599089aa2f1a694209a..0000000000000000000000000000000000000000 --- a/script/cube-4.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-5.c b/script/cube-5.c deleted file mode 100644 index 5cbb7d0065fa2c51fc5a268e964b418306034234..0000000000000000000000000000000000000000 --- a/script/cube-5.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-6.c b/script/cube-6.c deleted file mode 100644 index b82eb81195fd03c68073807e800759e9a6e55e4a..0000000000000000000000000000000000000000 --- a/script/cube-6.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glTranslatef (0.9, 0.0, 0.0); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-7.c b/script/cube-7.c deleted file mode 100644 index b177ba0d9351d4c299503266b0f6df733ac8721d..0000000000000000000000000000000000000000 --- a/script/cube-7.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glTranslatef (0.9, 0.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/earth-texture.png b/script/earth-texture.png deleted file mode 120000 index c55876c24a42b6e0bb353e9e4789127e5b33e470..0000000000000000000000000000000000000000 --- a/script/earth-texture.png +++ /dev/null @@ -1 +0,0 @@ -../common/earth-texture.png \ No newline at end of file diff --git a/script/egal.txt b/script/egal.txt deleted file mode 100644 index 70fbe4a435e96acc7b3db8eefb8018eda4ab0e4d..0000000000000000000000000000000000000000 --- a/script/egal.txt +++ /dev/null @@ -1,37 +0,0 @@ -GNU/Linux -~~~~~~~~~ -Compilieren: gcc -Wall -O cube-5.c opengl-magic.c \ - -lGL -lGLU -lglut -o cube-5 -Aufrufen: ./cube-5 - -MacOS -~~~~~ -Compilieren: gcc -Wall -O cube-5.c opengl-magic.c \ - -framework OpenGL -framework GLUT -o cube-5 -Aufrufen: ./cube-5 - -Cygwin mit X11 -~~~~~~~~~~~~~~ -Compilieren: gcc -Wall -O cube-5.c opengl-magic.c \ - -lGL -lGLU -lglut -o cube-5 -Aufrufen: DISPLAY=:0.0 ./cube-5 -oder: - einmalig: export DISPLAY=:0.0 - danach: ./cube-5 - -Vorher einmalig: X-Server starten - XWin -multiwindow & - -Cygwin ohne X11 -~~~~~~~~~~~~~~~ -Compilieren: i686-pc-mingw32-gcc -I freeglut/include -L freeglut/lib \ - -Wall -O cube-5.c opengl-magic.c \ - -lOpenGL32 -lGLU32 -lfreeglut -o cube-5 -Aufrufen: ./cube-5 - -MinGW ohne X11 -~~~~~~~~~~~~~~ -Compilieren: gcc -I freeglut/include -L freeglut/lib \ - -Wall -O cube-5.c opengl-magic.c \ - -lOpenGL32 -lGLU32 -lfreeglut -o cube-5 -Aufrufen: ./cube-5 diff --git a/script/fhello-1.c b/script/fhello-1.c deleted file mode 100644 index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000 --- a/script/fhello-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/fhello-2.c b/script/fhello-2.c deleted file mode 100644 index 6bd3fc97506fab7643dfe4d59a957cfa1a600750..0000000000000000000000000000000000000000 --- a/script/fhello-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; -} diff --git a/script/fhello-3.c b/script/fhello-3.c deleted file mode 100644 index 529ddffd80d4a17c9fc89bf07f9da2368f412ea3..0000000000000000000000000000000000000000 --- a/script/fhello-3.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <errno.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; -} diff --git a/script/fhello-4.c b/script/fhello-4.c deleted file mode 100644 index 2719776d312c79509d2863c5eabce09236db255c..0000000000000000000000000000000000000000 --- a/script/fhello-4.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <string.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; -} diff --git a/script/fhello-5.c b/script/fhello-5.c deleted file mode 100644 index 038e0a3693708ca63281fce8e6d8f977d75ca8f4..0000000000000000000000000000000000000000 --- a/script/fhello-5.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/fhello-6.c b/script/fhello-6.c deleted file mode 100644 index 8572d98de1fa9eef81ec260592bc5c2fa3399a02..0000000000000000000000000000000000000000 --- a/script/fhello-6.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (errno, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/fifo-8.c b/script/fifo-8.c deleted file mode 100644 index 5ee60f2325c170808389365a522d6e6cab0f1f45..0000000000000000000000000000000000000000 --- a/script/fifo-8.c +++ /dev/null @@ -1,49 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_read = 0; -int fifo_write = 0; - -void push (int x) -{ - if ((fifo_write + 1) % FIFO_SIZE == fifo_read) - fprintf (stderr, "push(): FIFO is full\n"); - else - { - fifo[fifo_write++] = x; - if (fifo_write >= FIFO_SIZE) - fifo_write = 0; - } -} - -int pop (void) -{ - if (fifo_read == fifo_write) - { - fprintf (stderr, "pop(): FIFO is empty\n"); - return -1; - } - else - { - int result = fifo[fifo_read++]; - if (fifo_read >= FIFO_SIZE) - fifo_read = 0; - return result; - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - for (int i = 0; i < 15; i++) - push (i); - return 0; -} diff --git a/script/functions-1.c b/script/functions-1.c deleted file mode 100644 index 10f26249461a77f1db7691b0bedd754d8ade5e0a..0000000000000000000000000000000000000000 --- a/script/functions-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void foo (int a, int b) -{ - printf ("foo(): a = %d, b = %d\n", a, b); -} - -int main (void) -{ - foo (3, 7); - return 0; -} diff --git a/script/functions-2.c b/script/functions-2.c deleted file mode 100644 index 23ea1d20a629fcb69f88d44dc010da45572791ba..0000000000000000000000000000000000000000 --- a/script/functions-2.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; - b++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - return 0; -} diff --git a/script/gtk-1.c b/script/gtk-1.c deleted file mode 100644 index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000 --- a/script/gtk-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-2.c b/script/gtk-2.c deleted file mode 100644 index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000 --- a/script/gtk-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-3.c b/script/gtk-3.c deleted file mode 100644 index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000 --- a/script/gtk-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-4.c b/script/gtk-4.c deleted file mode 100644 index 3e15b640a0f1503294f93bb69fa0b457d60288e4..0000000000000000000000000000000000000000 --- a/script/gtk-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-5.c b/script/gtk-5.c deleted file mode 100644 index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000 --- a/script/gtk-5.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-6.c b/script/gtk-6.c deleted file mode 100644 index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000 --- a/script/gtk-6.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/gtk-7.c b/script/gtk-7.c deleted file mode 100644 index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000 --- a/script/gtk-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data) -{ - printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y); - return FALSE; -} - -gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data) -{ - printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); - g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL); - - gtk_widget_add_events (window, GDK_KEY_PRESS_MASK); - g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/script/hello-1.c b/script/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/script/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/script/hello-2.c b/script/hello-2.c deleted file mode 100644 index 15d0bc8e9b71c25fcd70d60b5f188d930ffa04b4..0000000000000000000000000000000000000000 --- a/script/hello-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - "\n"; - return 0; -} diff --git a/script/hexe.h b/script/hexe.h deleted file mode 100644 index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000 --- a/script/hexe.h +++ /dev/null @@ -1 +0,0 @@ -eine kleine Hexe. diff --git a/script/higher-math-1.c b/script/higher-math-1.c deleted file mode 100644 index 0d1a61a7f3f115e878707bf9ab97d8536e46e9bb..0000000000000000000000000000000000000000 --- a/script/higher-math-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 4 - -int main (void) -{ - printf ("2 + 2 = %d\n", VIER); - return 0; -} diff --git a/script/higher-math-2.c b/script/higher-math-2.c deleted file mode 100644 index 4f8bfec89f2f1d3a82ee0911dadee9d3955bed50..0000000000000000000000000000000000000000 --- a/script/higher-math-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -#define wuppdich printf -#define holla main -#define pruzzel return -#define VIER 4 - -int holla (void) -{ - wuppdich ("2 + 2 = %d\n", VIER); - pruzzel 0; -} diff --git a/script/higher-math-3.c b/script/higher-math-3.c deleted file mode 100644 index 0774461371a771e36ef4682648194a3161f4e1b6..0000000000000000000000000000000000000000 --- a/script/higher-math-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 2 + 2 - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; -} diff --git a/script/higher-math-4.c b/script/higher-math-4.c deleted file mode 100644 index 66907e2c7865f7e345f31376748ebfd62134fa43..0000000000000000000000000000000000000000 --- a/script/higher-math-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2) - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; -} diff --git a/script/higher-math-5.c b/script/higher-math-5.c deleted file mode 100644 index 77a4e4ccc520044f3be85c473f440f313ac9f0fa..0000000000000000000000000000000000000000 --- a/script/higher-math-5.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2)); - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER - return 0; -} diff --git a/script/hp-2020ws.pdf b/script/hp-2020ws.pdf deleted file mode 100644 index 9ffec9021c72492cdbc0119d27f88f428ac500e2..0000000000000000000000000000000000000000 Binary files a/script/hp-2020ws.pdf and /dev/null differ diff --git a/script/hp-2020ws.tex b/script/hp-2020ws.tex deleted file mode 100644 index 5adc27dadc1e263360ba7f3071e7186e01fc5807..0000000000000000000000000000000000000000 --- a/script/hp-2020ws.tex +++ /dev/null @@ -1,5876 +0,0 @@ -% hp-2018ws.pdf - Lecture Notes on Applied Computer Sciences -% Copyright (C) 2012, 2013, 2015, 2016, 2018 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{pdftricks} -\usepackage{rotating} -\usepackage{amsfonts} -\usepackage[helvet]{sfmath} -\usepackage{tikz} - -\newcommand{\name}[1]{\textsc{#1}} -\newcommand{\ccbysanp}{CC-by-sa (Version 3.0, nicht portiert)} -\newcommand{\fdl}{GNU FDL (Version 1.2 oder höher)} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} -\newcommand{\pd}{gemeinfrei -- \emph{public domain}} - -\newcommand{\underconstruction}{% - \begin{minipage}{6cm} - \begin{center} - \includegraphics[width=2cm]{Zeichen_123.pdf} - - Dieser Abschnitt ist\\ - noch nicht fertig. - \end{center} - \end{minipage}} - -\makeatletter - \newcommand{\figurecaptionraw}[2]{% - \def\n{\hfill\break} - \refstepcounter{figure}% - \addcontentsline{lof}{figure}% - {\protect\numberline{\hspace{-1.5em}Abb.~\thefigure}{\ignorespaces #1}}% - \begingroup - \def\n{\break} - \@makecaption{\csname fnum@figure\endcsname}{\ignorespaces #1}\par - \endgroup - \addtocontents{lof}{\begingroup\leftskip3.8em #2\par\endgroup} - } -\makeatother -\newcommand{\figurecaptionurl}[5]{% - \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: #4\protect\\Lizenz: #5}} -\newcommand{\figurecaptionurlurl}[5]{% - \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: \protect\url{#4}\protect\\Lizenz: #5}} -\newcommand{\figurecaptionself}[1]{\figurecaptionraw{#1}{Quelle/Autor: selbst erstellt\protect\\Lizenz: \mylicense}} - -\begin{psinputs} - \usepackage{pgscript} - \usepackage{pstricks,pst-grad,pst-node,pst-plot} - \psset{unit=1cm} -\end{psinputs} - -\begin{document} - \thispagestyle{empty} - \makebox(0,0.0105)[tl]{\includegraphics[scale=1.008]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.7]{logo-hochschule-bochum.pdf}}% - \vfill - \begin{center} - {\Huge\textbf{Hardwarenahe Programmierung}\par} - \vspace{2cm} - {\large Wintersemester 2019/20\\[\medskipamount] - Prof.~Dr.~rer.~nat.~Peter Gerwinski} - \end{center} - \vfill - - \clearpage - - \begingroup - - \setlength{\leftskip}{3cm} - - \strut\vfill - - Stand: 11.\ Januar 2020 - - Soweit nicht anders angegeben:\\ - Text und Bilder: Copyright \copyright\ 2012, 2013, 2015, 2016, 2018, 2020\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können dieses Skript - einschließlich Vortragsfolien, Beispielprogramme und sonstiger Lehrmaterialien - unter \url{https://gitlab.cvh-server.de/pgerwinski/hp} herunterladen. - - \endgroup - - \clearpage - - \tableofcontents - - \clearpage - - \section{Einführung} - - \subsection{Was ist hardwarenahe Programmierung?} - -% Die angewandte Informatik befaßt sich mit der Praxis der Programmierung von Computern. -% Sie vermittelt zwischen den Fachgebieten der Rechnertechnik -% ("`Wie funktioniert ein Computer?"') und der Softwaretechnik (Theorie des Programmierens). - - In der Programmierung steht "`hardwarenah"' - für maximale Kontrolle des Programmierers über das genaue Verhalten der Hardware. - Im Gegensatz zur abstrakten Programmierung, - in der man als Programmierer in einer für Menschen möglichst komfortablen Weise - das gewünschte Verhalten des Computers beschreibt - und des den Programmierwerkzeugen überläßt, - auf welche Weise genau der Computer dies umsetzt, - geht es in der hardwarenahen Programmierung darum, - das Verhalten des Prozessors und jeder einzelnen Speicherzelle genau zu kennen. - - \begin{center} - \begin{pdfpic} - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - \end{pdfpic} - \vspace{-\bigskipamount} - \figurecaptionself{Wissenschaftliche Disziplinen mit Bezug zur Informatik,\n - angeordnet nach Abstraktionsgrad ihres jeweiligen Gegenstandes - \label{Disziplinen}} - \end{center} - - Im Gegensatz zu z.\,B.\ Lebewesen - werden Computer von Menschen entwickelt und gebaut. - Daher ist es grundsätzlich möglich, sie durch hardwarenahe Programmierung - vollständig zu verstehen und zu beherrschen. - - \subsection{Programmierung in C} - - Ein großer Teil dieser Vorlesung wird der Programmierung in der Programmiersprache C gewidmet sein. - - Warum C? - - C hat sich als Kompromiß zwischen einer Hochsprache und maximaler Nähe zur Hardware - sehr weit etabliert. - Es läuft auf nahezu jeder Plattform (= Kombination aus Hardware und Betriebssystem) - und stellt somit einen "`kleinsten gemeinsamen Nenner der Programmierung"' dar. - C orientiert sich sehr eng an der Funktionsweise der Computer-Hardware - und wird daher auch als "`High-Level-Assembler"' bezeichnet. - - Wie die Assembler-Sprache, die Sie in \emph{Grundlagen Rechnertechnik\/} kennenlernen werden, - ist C ein Profi-Werkzeug und als solches "`leistungsfähig, aber gefährlich"'. - Programme können in C sehr kompakt geschrieben werden. - C kommt mit verhältnismäßig wenigen Sprach"-elementen aus, - die je nach Kombination etwas anderes bewirken. - Dies hat zur Folge, daß einfache Schreibfehler, - die in anderen Programmiersprachen als Fehler bemängelt würden, - in C häufig ein ebenfalls gültiges Programm ergeben, - das sich aber völlig anders als beabsichtigt verhält. - - \breath - - C wurde gemeinsam mit dem Betriebssystem Unix entwickelt - und hat mit diesem wichtige Eigenschaften gemeinsam: - \begin{itemize} - \item - \textbf{Kompakte Schreibweise:} - Häufig verwendete Konstrukte werden möglichst platzsparend notiert. - Wie in C, kann auch unter Unix ein falsch geschriebenes Kommando - ein ebenfalls gültiges Kommando mit anderer Wirkung bedeuten. - \item - \textbf{Baukastenprinzip:} - In C wie in Unix bemüht man sich darum, den unveränderlichen Kern möglichst klein zu halten. - Das meiste, was man in C tatsächlich benutzt, ist in Form von Bibliotheken modularisiert; - das meiste, was man unter Unix tatsächlich benutzt, ist in Form von Programmen modularisiert. - \item - \textbf{Konsequente Regeln:} - In C wie in Unix bemüht man sich darum, - feste Regeln -- mathematisch betrachtet -- möglichst einfach zu halten - und Ausnahmen zu vermeiden. - (Beispiel: Unter MS-DOS und seinen Nachfolgern wird eine ausführbare Datei gefunden, - wenn sie sich \emph{entweder} im aktuellen Verzeichnis \emph{oder} im Suchpfad befindet. - Unter Unix wird sie gefunden, wenn sie sich im Suchpfad befindet. - Es ist unter Unix möglich, das aktuelle Verzeichnis in den Suchpfad aufzunehmen; - aus Sicherheitserwägungen heraus geschieht dies jedoch üblicherweise nicht.) - \item - \textbf{Kein "`Fallschirm"':} - C und Unix führen Befehle ohne Nachfrage aus. - (Beispiel: Ein eingegebener Unix-Befehl zum Formatieren einer Festplatte - wird ohne Rückfrage ausgeführt.) - \end{itemize} - - Trotz dieser Warnungen besteht bei Programmierübungen in C - normalerweise \emph{keine\/} Gefahr für den Rechner. - Moderne PC-Betriebssysteme überwachen die aufgerufenen Programme - und beenden sie notfalls mit einer Fehlermeldung ("`Schutzverletzung"'). - Experimente mit Mikrocontrollern, die im Rahmen dieser Lehrveranstaltung stattfinden werden, - erfolgen ebenfalls in einer Testumgebung, in der kein Schaden entstehen kann. - - Bitte nutzen Sie die Gelegenheit, in diesem Rahmen Ihre Programmierkenntnisse zu trainieren, - damit Sie später in Ihrer beruflichen Praxis, - wenn durch ein fehlerhaftes Programm ernsthafter Schaden entstehen kann, - wissen, was Sie tun. - - \section{Einführung in C} - - \subsection{Hello, world!} - - Das folgende Beispiel-Programm (Datei: \gitfile{hp}{2020ws/script}{hello-1.c}) - gibt den Text "`Hello, world!"' auf dem Bildschirm aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} - Dieses traditionell erste -- "`einfachste"' -- Beispiel enthält in C bereits viele Elemente, - die erst zu einem späteren Zeitpunkt zufriedenstellend erklärt werden können: - \begin{itemize} - \item - \lstinline{#include <stdio.h>} - - Wir deuten diese Zeile im Moment so, daß uns damit gewisse Standardfunktionen - (darunter \lstinline{printf()} -- siehe unten) zur Verfügung gestellt werden. - - Diese Betrachtungsweise ist nicht wirklich korrekt - und wird in Abschnitt \ref{Praeprozessor} genauer erklärt. - - \item - \lstinline|int main (void) { ... }| - - Dies ist das C-Hauptprogramm. - Das, was zwischen den geschweiften Klammern steht, wird ausgeführt. - - Auch hier wird zu einem späteren Zeitpunkt (Abschnitt \ref{Funktionen}) - genauer erklärt werden, was die einzelnen Elemente bedeuten und welchen Sinn sie haben. - \end{itemize} - \goodbreak - Im folgenden soll nun der eigentliche Inhalt des Programms erklärt werden: - \begin{lstlisting} - printf ("Hello, world!\n"); - return 0; - \end{lstlisting} - \vspace{-\bigskipamount} - \begin{itemize} - \item - Bei beiden Zeilen handelt es sich um sogenannte \newterm{Anweisungen}. - \item - Jede Anweisung wird mit einem Semikolon abgeschlossen. - \item - Bei \lstinline{printf()} handelt es sich um einen \newterm{Funktionsaufruf}, - dessen Wirkung darin besteht, daß der zwischen den Klammern angegebene \newterm{Parameter\/} - (oder: das \newterm{Argument\/}) der Funktion - auf dem Standardausgabegerät ausgegeben wird. - (In unserem Fall handelt es sich dabei um einen Bildschirm.) - Der Name "`\lstinline{printf}"' der Funktion steht für "`print formatted"' -- formatierte Ausgabe. - \item - \lstinline{"Hello, world!\n"} ist eine \newterm{Konstante\/} - vom Typ \newterm{String\/} (= Zeichenkette). - \item - \lstinline{\n} ist eine \newterm{Escape-Sequenz}. - Sie steht für ein einzelnes, normalerweise unsichtbares Zeichen - mit der Bedeutung "`neue Zeile"'. - \item - Die Anweisung \lstinline{return 0} bedeutet: - Beende die laufende Funktion (hier: \lstinline{main()}, also das Hauptprogramm) - mit dem Rückgabewert 0. - (Bedeutung: "`Programm erfolgreich ausgeführt."' -- siehe Abschnitt \ref{Funktionen}.) - \end{itemize} - - \subsection{Programme compilieren und ausführen} - - Der Programmtext wird mit Hilfe eines Eingabeprogramms, des \newterm{Texteditors}, - in den Computer eingegeben und als Datei gespeichert. - Als Dateiname sei hier \gitfile{hp}{2020ws/script}{hello-1.c} angenommen. - Die Dateiendung \file{.c} soll anzeigen, - daß es sich um einen Programmquelltext in der Programmiersprache C handelt. - - Die \file{.c}-Datei ist für den Computer nicht direkt ausführbar. - Um eine ausführbare Datei zu erhalten, - muß das Programm zuerst in die Maschinensprache des verwendeten Computers übersetzt werden. - Diesen Vorgang nennt man \newterm{Compilieren}. - - In einer Unix-Shell mit installierter GNU-Compiler-Collection - (GCC; frühere Bedeutung der Abkürzung: GNU-C-Compiler) - geschieht das Compilieren durch Eingabe der folgenden Zeile, der \newterm{Kommandozeile\/}: - - \begin{lstlisting}[style=terminal] - $ ¡gcc hello-1.c -o hello-1¿ - \end{lstlisting} - - Das Zeichen \lstinline[style=terminal]{$} steht für die \newterm{Eingabeaufforderung\/} - (oder das \newterm{Prompt\/}) der Unix-Shell. Es kann auch anders aussehen, z.\,B.\ - \lstinline[style=terminal]{pc42:~$} oder auch - \lstinline[style=terminal]{cassini/home/peter/bo/2018ws/hp/script>}. - Die Eingabe"-aufforderung wird vom Computer ausgegeben; - die Kommandozeile rechts daneben müssen wir eingeben und mit der Eingabetaste (Enter) bestätigen. - - \lstinline[style=cmd]{gcc} ist ein Befehl an den Computer, - nämlich der Name eines Programms, das wir aufrufen wollen (hier: der Compiler). - Die darauf folgenden Teile der Kommandozeile heißen die \newterm{Parameter\/} - oder \newterm{Argumente\/} des Befehls. - - Der Parameter \lstinline[style=cmd]{hello-1.c} ist der Name der Datei, die compiliert werden soll. - - \lstinline[style=cmd]{-o} ist eine \newterm{Option\/} an den Compiler, - mit der man ihm mitteilt, daß der nächste Parameter \lstinline[style=cmd]{hello-1} - der Name der ausführbaren Datei ist, die erzeugt werden soll. - - Unter Unix ist es üblich, ausführbaren Dateien \emph{keine\/} Endung zu geben. - Unter Microsoft Windows wäre es stattdessen üblich, - die ausführbare Datei \lstinline[style=cmd]{hello-1.exe} zu nennen. - - \breath - - Um von einer Unix-Shell aus ein Programm aufzurufen, - gibt man dessen vollständigen Namen - -- einschließlich Verzeichnispfad und eventueller Endung -- als Kommando ein: - \begin{lstlisting}[style=terminal] - $ ¡./hello-1¿ - \end{lstlisting} - Der Punkt steht für das aktuelle Verzeichnis; - der Schrägstrich trennt das Verzeichnis vom eigentlichen Dateinamen. - - Wenn sich ein Programm im Suchpfad befindet (z.\,B.: \lstinline[style=cmd]{gcc}), - darf die Angabe des Verzeichnisses entfallen. - (Den Suchpfad kann man sich mit dem Kommando - \lstinline[style=cmd]{echo $PATH} anzeigen lassen.) - Aus Sicherheitsgründen steht das aktuelle Verzeichnis - unter Unix üblicherweise \emph{nicht\/} im Suchpfad. - - \breath - - \begin{experts} - Dateiendungen dienen unter Unix nur der Übersicht, - haben aber keine technischen Konsequenzen: - \begin{itemize} - \item - Ob eine Datei als ausführbar betrachtet wird oder nicht, - wird nicht anhand einer Endung, sondern über ein \newterm{Dateiattribut\/} entschieden. - Die Dateiattribute werden beim Listen des Verzeichnisinhalts angezeigt: - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡ls -l¿ - -rwxr-x--- 1 peter ainf 6294 4. Okt 14:34 hello-1 - -rw-r--r-- 1 peter ainf 82 4. Okt 15:11 hello-1.c - \end{lstlisting} - Jedes \lstinline[style=terminal]{r} steht für "`read"' (Datei lesbar), - jedes \lstinline[style=terminal]{w} für "`write"' (Datei schreibbar) - und jedes \lstinline[style=terminal]{x} für "`execute"' (Datei ausführbar). - Von links nach rechts stehen die \lstinline[style=terminal]{rwx}-Gruppen für - den Besitzer der Datei (hier: \lstinline[style=terminal]{peter}) - eine Benutzergruppe (hier: \lstinline[style=terminal]{ainf}) - und für alle anderen Benutzer des Computers. - - Im o.\,a.\ Beispiel ist die Datei \gitfile{hp}{2020ws/script}{hello-1.c} - für den Benutzer \lstinline[style=terminal]{peter} les- und schreibbar, - für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} nur lesbar - und für alle anderen Benutzer des Computers ebenfalls nur lesbar. - Die Datei \file{hello-1} (ohne Endung) ist hingegen - für den Benutzer \lstinline[style=terminal]{peter} les-, schreib- und ausführbar, - für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} les- und ausführbar, - aber nicht schreibbar. Alle anderen Benutzer des Computer haben für die Datei - \file{hello-1} überhaupt keine Zugriffsrechte. - \item - Welcher Art der Inhalt der Datei ist, - entnimmt Unix dem Inhalt selbst. - Man kann sich dies mit Hilfe des Befehls \lstinline[style=cmd]{file} anzeigen lassen: - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡file hello-1¿ - hello-1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), - dynamically linked (uses shared libs), for GNU/Linux 2.6.18, - not stripped - $ ¡file hello-1.c¿ - hello-1.c: ASCII C program text - \end{lstlisting} - \item - Eine ausführbare Datei, die Text enthält, ist ein sogenanntes \newterm{Shell-Skript}. - Der Aufruf eines Shell-Skripts bewirkt i.\,w.\ dasselbe, - als wenn man den darin enthaltenen Text als Kommandos eingeben würde. - \item - Ein C-Quelltext enthält i.\,d.\,R.\ \emph{keine\/} gültigen Unix-Kommandos - und kann daher \emph{nicht\/} "`einfach so"' ausgeführt werden. - \item - Es ist zulässig, aber normalerweise nicht sinnvoll, - einer ausführbaren Datei die Endung \file{.c} zu geben. - \end{itemize} - \end{experts} - - \subsection{Elementare Aus- und Eingabe} - - Da es möglich ist, mittels der Funktion \lstinline{printf()} - eine String-Konstante wie z.\,B.\ \lstinline{"Hello, world!\n"} "`einfach so"' auszugeben, - liegt die Vermutung nahe, Integer-Konstanten auf gleiche Weise ausgeben zu können. - - Datei \gitfile{hp}{2020ws/script}{output-1.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf (42); - return 0; - } - \end{lstlisting} - Beim Compilieren dieses Programms erhalten wir eine Warnung: - \begin{lstlisting}[style=terminal] - $ ¡gcc output-1.c -o output-1¿ - output-12.c: In function 'main': - output-12.c:5: warning: passing argument 1 of 'printf' - makes pointer from integer without a cast - /usr/include/stdio.h:339: note: expected - 'const char * __restrict__' but argument is of type 'int' - \end{lstlisting} - \goodbreak - Es entsteht trotzdem eine ausführbare Datei \file{output-1}. - Wenn wir diese jedoch ausführen, erhalten wir eine Fehlermeldung: - \begin{lstlisting}[style=terminal] - $ ¡./output-12¿ - Segmentation fault - \end{lstlisting} - Tatsächlich ist die direkte Übergabe einer Integer-Konstanten an \lstinline{printf()} - ein grober Fehler: \lstinline{printf()} akzeptiert als ersten Parameter nur Ausdrücke vom Typ String. - Der C-Compiler nimmt eine implizite Umwandlung der Integer-Konstanten in einen String vor: - Die Zahl wird als eine Speicheradresse interpretiert, an der sich der Text befindet. - Dies ist nicht besonders sinnvoll (daher die Warnung), aber in C zulässig. - - Wenn nun das Programm ausgeführt wird, versucht es, auf die Speicheradresse Nr.\ 42 zuzugreifen. - Diese befindet sich normalerweise außerhalb des Programms. - Das Betriebssystem bemerkt den illegalen Zugriffsversuch - und bricht das Programm mit einer Fehlermeldung - ("`Speicherzugriffsfehler"', "`Schutzverletzung"' o.\,ä.) ab. - - Auf einer Plattform ohne derartige Schutzmechanismen (z.\,B.\ einem Mikrocontroller) - wird das fehlerhafte Programm hingegen klaglos ausgeführt. - Es werden dann sinnlose Texte, die sich zufällig an Speicheradresse Nr.\ 42 befinden, - auf dem Standardausgabegerät ausgegeben. - - \breath - - Dieses fehlerhafte Programm illustriert, wie leicht es in der Programmiersprache C ist, - einen Absturz zu programmieren. - Die meisten anderen Programmiersprachen würden das fehlerhafte Programm nicht akzeptieren; - anstelle der o.\,a.\ Warnung bekäme man eine ähnlichlautende Fehlermeldung. - - \begin{hint} - Nehmen Sie nicht nur die Fehlermeldungen,\\ - sondern auch die Warnungen des Compilers ernst! - \end{hint} - - Gerade in graphischen Entwicklungsentwicklungen - werden Warnungen oft in einem winzigen Fenster angezeigt - und gehen zwischen anderen Meldungen unter. - Auch sind die Compiler-Optionen, - mit denen Sie Warnungen ein- oder ausschalten können, - oft in tiefen Menü-Strukturen versteckt, - so daß man als Programmierer den Aufwand scheut, - diese sinnvoll zu setzen. - - Fehlermeldungen \emph{müssen\/} Sie ernstnehmen, - da Sie sonst kein ausführbares Programm erhalten. - Warnungen \emph{sollten\/} Sie ebenfalls ernstnehmen, - \emph{obwohl\/} Sie ein ausführbares Programm erhalten, - da dieses mit hoher Wahrscheinlichkeit - in einer nicht-offensichtlichen Weise \emph{fehlerhaft\/} ist. - Ein derartiges Programm produktiv einzusetzen, - kann je nach Einsatzgebiet Vermögens-, Sach- oder sogar Personenschäden - zur Folge haben. - - \breath - - Wie man nun tatsächlich in C Zahlenwerte ausgibt, - illustriert das Beispielprogramm \gitfile{hp}{2020ws/script}{output-2.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: %d\n", 42); - return 0; - } - \end{lstlisting} - Der erste Parameter von \lstinline{printf()}, der sog.\ \newterm{Format-String}, - enthält das Symbol \lstinline{%d}. - Diese sog.\ \newterm{Formatspezifikation\/} wird in der Ausgabe - durch den Zahlenwert des zweiten Parameters von \lstinline{printf()} ersetzt. - Das \lstinline{d} steht hierbei für "`dezimal"'. - - \breath - - \begin{experts} -% Wenn man anstelle von \lstinline{%d} die Formatspezifikation \lstinline{%x} verwendet, -% wird die Zahl in hexadezimaler anstatt in dezimaler Schreibweise ausgegeben. - Wenn man zwischen das Prozentzeichen un das \lstinline{d} eine Zahl schreibt (z.\,B.\ \lstinline{%3d}), - gibt man damit die Breite eines Feldes an, in die die auszugebende Zahl rechtsbündig geschrieben wird. - Wenn man die Feldbreite mit einer Null beginnen läßt (z.\,B.\ \lstinline{%03d}) - wird die auszugebende Zahl von links mit Nullen bis zur Feldbreite aufgefüllt. - - Eine vollständige Liste der in \lstinline{printf()} zulässigen Formatspezifikationen - finden Sie in der Dokumentation des Compiler-Herstellers zu \lstinline{printf()}. - Von der Unix-Shell aus können Sie diese - mit dem Befehl \lstinline[style=cmd]{man 3 printf} abrufen. -% -% Umgekehrt können Sie in C Integer-Konstanten -% durch Voranstellen von \lstinline{0x} in hexadezimaler anstatt dezimaler Schreibweise eingeben. -% Die Hexadezimalzahl \lstinline{0x2a} steht in C für genau dieselbe Konstante -% wie die Dezimalzahl \lstinline{42}. - \end{experts} - - \breath - - Bemerkungen: - \begin{itemize} - \item - Ein Text darf auch Ziffern enthalten. - Anhand der Ausgabe sind \lstinline{printf ("42\n");} - und \lstinline{printf ("%d\n", 42);} nicht voneinander unterscheidbar. - \item - Die Position des \lstinline{\n} ist relevant, - z.\,B.\ geht \lstinline{printf ("\n42");} zuerst in eine neue Zeile - und gibt danach den Text aus. - Auch mehrere \lstinline{\n} in derselben String-Konstanten sind zulässig. - \item - C akzeptiert auch sehr seltsame Konstrukte. - Das folgende Beispiel (Datei: \gitfile{hp}{2020ws/script}{hello-2.c}) - \begin{lstlisting}[gobble=8] - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "\n"; - return 0; - } - \end{lstlisting} - wird vom Compiler akzeptiert. - (Warum das so ist, wird in Abschnitt \ref{Seiteneffekte} behandelt.) - - Bei Verwendung der zusätzlichen Option \lstinline[style=cmd]{-Wall} - erhalten wir zumindest eine Warnung über eine "`Anweisung ohne Effekt"': - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall hello-2.c -o hello-2¿ - hello-2.c: In function 'main': - hello-2.c:6: warning: statement with no effect - \end{lstlisting} - Es empfiehlt sich, die Option \lstinline[style=cmd]{-Wall} grundsätzlich zu verwenden - und die Warnungen ernstzunehmen. - \end{itemize} - - \breath - - Wenn mehrere Werte ausgegeben werden sollen, - verwendet man in \lstinline{printf()} mehrere Formatspezifikationen - und gibt mehrere Werte als Parameter an (Datei: \gitfile{hp}{2020ws/script}{output-3.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2); - return 0; - } - \end{lstlisting} - \begin{lstlisting}[style=terminal] - $ ¡gcc output-3.c -o output-3¿ - $ ¡./output-3¿ - Richtige Antworten wären 1 oder 2 oder sonstige. - $ - \end{lstlisting} - Achtung: Zu viele oder zu wenige Werte in der Parameterliste - ergeben trotzdem ein gültiges, wenn auch fehlerhaftes C-Programm - (Datei: \gitfile{hp}{2020ws/script}{output-4.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n"); - return 0; - } - \end{lstlisting} - Wenn man dieses Programm laufen läßt, - wird nicht etwa das zweite \lstinline{%d} durch den Zahlenwert 2 ersetzt. - Vielmehr endet das, was ausgegeben wird, mit dem ersten \lstinline{%d}, - für das der Zahlenwert 1 eingesetzt wird, - und alles, was nach der 1 kommt, wird schlichtweg ignoriert. - \begin{lstlisting}[style=terminal] - $ ¡gcc output-4.c -o output-4¿ - $ ¡./output-4¿ - Richtige Antworten wären 1 - $ - \end{lstlisting} - Bei Verwendung der Option \lstinline[style=cmd]{-Wall} - erhalten wir auch hier eine Warnung: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall output-4.c -o output-4¿ - output-4.c: In function 'main': - output-4.c:5: warning: too many arguments for format - \end{lstlisting} - - Das Einlesen von Werten erfolgt in C mit der Funktion \lstinline{scanf()}. - - Das folgende Beispielprogramm (Datei: \gitfile{hp}{2020ws/script}{input-1.c}) - liest einen Wert vom Standardeingabegerät (hier: Tastatur) ein - und gibt ihn wieder aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; - } - \end{lstlisting} - - Damit \lstinline{scanf()} in die Variable \lstinline{a} einen Wert schreiben kann, - ist es erforderlich, nicht den aktuellen Wert von \lstinline{a}, - sondern die Variable selbst an \lstinline{scanf()} zu übergeben. - Dies geschieht durch Voranstellen eines Und-Symbols \lstinline{&}. - (Genaugenommen handelt es sich um die Übergabe einer Speicheradresse. - Dies wird in Abschnitt \ref{Zeiger} genauer behandelt.) - - Wenn wir das \lstinline{&} vergessen (Beispielprogramm: \gitfile{hp}{2020ws/script}{input-2.c}), - kann das C-Programm weiterhin compiliert werden. - Bei Verwendung der Option \lstinline[style=cmd]{-Wall} erhalten wir eine Warnung. - Wenn wir das Programm ausführen und versuchen, einen Wert einzugeben, stürzt das Programm ab. - (Hintergrund: Es betrachtet den aktuellen -- zufälligen -- Wert der Variablen \lstinline{a} - als Adresse einer Speicherzelle, an der der eingelesene Wert gespeichert werden soll. - Das Programm greift also schreibend auf eine Speicherzelle außerhalb des ihm zugeteilten Bereichs zu.) - - \breath - - \begin{experts} - Die Funktion \lstinline{scanf()} kann, analog zu \lstinline{printf()}, - gleichzeitig mehrere Werte abfragen. - Hierzu müssen wir im Format-String mehrere Formatspezifikationen angeben - und die Adressen mehrerer Variabler als Parameter übergeben. - - Genau wie bei \lstinline{printf()} werden überzählige Parameter ignoriert, - und fehlende Parameter führen zu einem Absturz des Programms. - - Zeichen zwischen den Formatspezifikationen fungieren als Trennzeichen. - Damit die Zahlen angenommen werden, muß die Eingabe die Trennzeichen enthalten. - - Für doppelt genaue Fließkommazahlen (\lstinline{double}) - lautet die Formatspezifikation \lstinline{%lf}; - für einfach genaue Fließkommazahlen (\lstinline{float}) - lautet sie \lstinline{%f}. - - Weitere Informationen zu den Formatspezifikationen von \lstinline{scanf()} - finden Sie in der Dokumentation zu \lstinline{scanf()}. - (In der Unix-Shell können Sie diese mit dem Befehl \lstinline[style=cmd]{man 3 scanf} abrufen.) - - Für das Einlesen von Strings ist \lstinline{scanf()} eher ungeeignet. - Hier empfiehlt es sich, stattdessen \lstinline{fgets()} zu benutzen - (siehe \lstinline[style=cmd]{man 3 fgets}). - \end{experts} - - \subsection{Elementares Rechnen} - - Der \newterm{binäre Operator} \lstinline{+} kann in C (und den meisten Programmiersprachen) - dazu verwendet werden, zwei Integer-Ausdrücke, die sogenannten \newterm{Operanden}, - durch Addition zu einem neuen Integer-Ausdruck zu verknüpfen. - - Beispiel: \gitfile{hp}{2020ws/script}{mathe-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("%d\n", 23 + 19); - return 0; - } - \end{lstlisting} - \begin{experts} - (Tatsächlich führt bereits die erste Stufe des Compilers eine Optimierung durch, - die bewirkt, daß die ausführbare Datei keine Additionsbefehle, - sondern direkt das Ergebnis der Addition enthält.) - \end{experts} - - Die Operatoren für die Grundrechenarten lauten in C: - \begin{center} - \begin{tabular}{cl} - \lstinline|+| & Addition \\ - \lstinline|-| & Subtraktion \\ - \lstinline|*| & Multiplikation \\ - \lstinline|/| & Division: Bei ganzen Zahlen wird grundsätzlich abgerundet. \\ - \lstinline|%| & Modulo-Operation: Rest bei Division (\lstinline|39 % 4| ergibt \lstinline|3|.) - \end{tabular} - \end{center} - - Die Verwendung von \newterm{Variablen} erfordert in C eine vorherige Deklaration. - \begin{lstlisting}[belowskip=0pt] - int a; - \end{lstlisting} - deklariert eine Variable vom Typ Integer, - \begin{lstlisting}[belowskip=0pt] - int a, b; - \end{lstlisting} - deklariert zwei Variable vom Typ Integer, und - \begin{lstlisting}[belowskip=0pt] - int a, b = 3; - \end{lstlisting} - deklariert zwei Variable vom Typ Integer und initialisiert \emph{die zweite\/} mit dem Wert 3. - (Im letzten Beispiel wird insbesondere die erste Variable \lstinline{a} \emph{nicht\/} initialisiert.) - - Nicht initialisierte Variable erhalten einen \emph{zufälligen\/} Wert. - Wenn beim Compilieren mit \lstinline[style=cmd]{gcc} - zusätzlich zu den Warnungen (Option \lstinline[style=cmd]{-Wall}) - auch die Optimierung (Option \lstinline[style=cmd]{-O}, \lstinline[style=cmd]{-O2} oder \lstinline[style=cmd]{O3}) - aktiviert ist, erkennt \lstinline[style=cmd]{gcc} - die Verwendung derartiger zufälliger Werte und gibt eine Warnung aus. - - \begin{experts} - Nicht explizit initialisierte \newterm{globale Variable}, - also solche, die außerhalb einer Funktion deklariert werden, - werden implizit auf Null initialisiert - (\lstinline{0} für Zahlen, \lstinline{NULL} für Zeiger usw.). - Es ist trotzdem in Hinblick auf selbstdokumentierenden Quelltext sinnvoll, - diese ggf.\ explizit auf \lstinline{0} zu initialisieren. - \end{experts} - - \breath - - Für Fließkommazahlen verwendet man meistens den Datentyp \lstinline{double}: - \begin{lstlisting}[belowskip=0pt] - double x = 3.141592653589793; - \end{lstlisting} - - \bigskip - - \begin{experts} - Die Bezeichnung \lstinline{double} steht für "`doppelt genau"'. - Daneben gibt es noch einen Datentyp \lstinline{float} für "`einfach genaue"' Fließkommazahlen - sowie einen Datentyp \lstinline{long double} für noch höhere Genauigkeit. - Typischerweise folgen Fließkommazahlen in C dem Standard IEEE 754. - In diesem Fall hat \lstinline{float} eine Genauigkeit von ca.\ 6 - und \lstinline{double} eine Genauigkeit von ca.\ 15 Nachkommastellen. - \end{experts} - - \breath - - Zuweisungen an Variable erfolgen in C mit Hilfe des binären Operators \lstinline{=}. - Es ist ausdrücklich erlaubt, den "`alten"' Wert einer Variablen in Berechnungen zu verwenden, - deren Ergebnis man dann derselben Variablen zuweist. - - Eine Anweisung wie z.\,B.\ \lstinline{a = 2 * a} - ist insbesondere keine mathematische Gleichung - (mit der Lösung 0 für die Unbekannte \lstinline{a}), - sondern die Berechnung des Doppelten des aktuellen Wertes der Variablen \lstinline{a}, - welches dann wiederum in der Variablen \lstinline{a} gespeichert wird. - - \subsection{Verzweigungen} - - Das Beispielprogramm \gitfile{hp}{2020ws/script}{if-0.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; - } - \end{lstlisting} - hat den Nachteil, daß bei Eingabe von 0 für die zweite Zahl das Programm abstürzt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall if-0.c -o if-0¿ - $ ¡./if-0¿ - Bitte a eingeben: ¡13¿ - Bitte b eingeben: ¡0¿ - Floating point exception - \end{lstlisting} - Die Fehlermeldung stammt nicht vom Programm selbst, sondern vom Betriebssystem, - das auf einen vom Prozessor signalisierten Fehlerzustand reagiert. - ("`Floating point exception"' ist die Bezeichnung dieses Fehlerzustands. - In diesem Fall ist die Bezeichnung leicht irreführend, - da konkret dieser Fehler durch eine Division ganzer Zahlen, - also insbesondere nicht durch eine Fließkommaoperation, ausgelöst wird.) - - Für Programme wie dieses ist es notwendig, - in Abhängigkeit von den Benutzereingaben unterschiedliche Anweisungen auszuführen. - Diese sog.\ \newterm{Verzweigung\/} geschieht mittels einer \lstinline{if}-Anweisung. - - \goodbreak - Beispielprogramm: \gitfile{hp}{2020ws/script}{if-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; - } - \end{lstlisting} - - In den Klammern hinter dem \lstinline{if} steht ein Ausdruck, die sog.\ \newterm{Bedingung}. - Die auf das \lstinline{if} folgende Anweisung wird nur dann ausgeführt, - wenn die Bedingung \emph{ungleich Null\/} ist. - (C kennt keinen eigenen "`Booleschen"' Datentyp. - Stattdessen steht \lstinline{0} für den Wahrheitswert "`falsch"' - und alles andere für den Wahrheitswert "`wahr"'.) - - Der binäre Operator \lstinline{!=} prüft zwei Ausdrücke auf Ungleichheit. - Er liefert \lstinline{0} zurück, wenn beide Operanden gleich sind, - und \lstinline{1}, wenn sie ungleich sind. - - \breath - - Die \lstinline{if}-Anweisung kennt einen optionalen \lstinline{else}-Zweig. - Dieser wird dann ausgeführt, wenn die Bedingung \emph{nicht\/} erfüllt ist. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{if-2.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - return 0; - } - \end{lstlisting} - - \breath - - Sowohl auf das \lstinline{if} als auch auf das \lstinline{else} - folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt. - - In dem folgenden Beispielprogramm (Datei: \gitfile{hp}{2020ws/script}{if-3.c}) - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - return 0; - } - \end{lstlisting} - wird die Zeile \lstinline{printf ("Das tut man nicht.\n");} auch dann ausgeführt, - wenn die Variable \lstinline{b} ungleich 0 ist. - - \breath - - In C ist die Einrückung der Zeilen im Programmquelltext "`nur"' eine optische Hilfe für Programmierer. - Welche Anweisung von welcher Bedingung abhängt, - entscheidet der Compiler allein anhand der Regeln der Programmiersprache, - und diese besagen eindeutig: - "`Sowohl auf das \lstinline{if} als auch auf das \lstinline{else} - folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt."' - - Wenn wir möchten, daß mehrere Anweisungen von der Bedingung abhängen, - müssen wir diese mittels geschweifter Klammern - zu einem sog.\ \newterm{Anweisungsblock\/} zusammenfassen. - - \goodbreak - Beispielprogramm: \gitfile{hp}{2020ws/script}{if-4.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - { - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - } - return 0; - } - \end{lstlisting} - - Aus Sicht des Computers ist die Einrückung - -- und überhaupt die Anordnung von Leerzeichen und Zeilenschaltungen -- belanglos. - Die folgende Schreibweise (Datei: \gitfile{hp}{2020ws/script}{if-5.c}) ist für ihn - vollkommen gleichwertig zu \gitfile{hp}{2020ws/script}{if-4.c}: - \begin{lstlisting} - #include<stdio.h> - int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a); - printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf( - "a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n"); - printf("Das tut man nicht.\n");}return 0;} - \end{lstlisting} - Aus Sicht eines Menschen hingegen kann eine \emph{korrekte\/} Einrückung des Quelltextes - \emph{sehr\/} hilfreich dabei sein, in einem Programm die Übersicht zu behalten. - - \goodbreak - Daher hier der dringende Rat: - \begin{hint} - Achten Sie in Ihren Programmen auf korrekte und übersichtliche Einrückung! - \end{hint} - - \breath - - Um zwei Ausdrücke auf Gleichheit zu prüfen, - verwendet man in C den binären Operator \lstinline{==}. - - Die Anweisungen - \begin{lstlisting}[belowskip=0pt] - if (b != 0) - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - else - printf ("Bitte nicht durch 0 teilen!\n"); - \end{lstlisting} - sind also äquivalent zu: - \begin{lstlisting} - if (b == 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - \end{lstlisting} - - Achtung: Die Anweisungen - \begin{lstlisting}[belowskip=0pt] - if (b = 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - \end{lstlisting} - (mit \lstinline{=} anstelle von \lstinline{==}) sind ebenfalls gültiges C, - haben jedoch eine andere Bedeutung! - \goodbreak - - Der Hintergrund ist der folgende: - Alle binären Operatoren, sei es \lstinline{+} oder \lstinline{=} oder \lstinline{==}, - sind in C vom Prinzip her gleichwertig. - Alle nehmen zwei numerische Operanden entgegen und liefern einen numerischen Wert zurück. - Wenn wir nun beispielsweise annehmen, daß die Variable \lstinline{a} den Wert 3 hat, dann gilt: - \begin{center} - \begin{tabular}{cl} - \lstinline|a + 7| & ergibt \lstinline|10|. \\ - \lstinline|a = 7| & ergibt \lstinline|7| (und weist \lstinline|a| den Wert 7 zu). \\ - \lstinline|a == 7| & ergibt \lstinline|0|. - \end{tabular} - \end{center} - Das o.\,a.\ Programmfragment bedeutet demnach: - Weise der Variablen \lstinline{b} den Wert \lstinline{0} zu, - und führe anschließend \emph{immer\/} eine Division durch \lstinline{b} aus. - (Die \lstinline{if}-Bedingung bekommt den Wert \lstinline{0}, ist also niemals erfüllt.) - - \breath - - Daß es sich bei Wahrheitswerten in C tatsächlich um Integer-Werte handelt, wird auch deutlich, - wenn man sich diese mittels \lstinline{printf()} ausgeben läßt. - - Wenn man beispielsweise in dem folgenden Programm \gitfile{hp}{2020ws/script}{if-6.c} - den Wert \lstinline{7} für die Variable \lstinline{b} eingibt, - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int b; - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0); - printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0); - printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23); - return 0; - } - \end{lstlisting} - \goodbreak - lautet die Ausgabe: - \goodbreak - \begin{lstlisting}[style=terminal] - $ ¡./if-6¿ - Bitte b eingeben: ¡7¿ - Der Ausdruck b != 0 hat den Wert 1 - Der Ausdruck b == 0 hat den Wert 0 - Der Ausdruck b = 23 hat den Wert 23 - \end{lstlisting} - In der ersten und zweiten Zeile wird geprüft, ob \lstinline{b} den Wert 0 hat, - und \lstinline{1} für "`ja"' bzw.\ \lstinline{0} für "`nein"' ausgegeben. - In der dritten Zeile wird \lstinline{b} der Wert \lstinline{23} zugewiesen - und anschließend der neue Wert von \lstinline{b} ausgegeben. - - \subsection{Schleifen} - - Mit Hilfe der \lstinline{while}-Anweisung ist es möglich, - Anweisungen in Abhängigkeit von einer Bedingung mehrfach auszuführen. - - Das folgende Beispielprogramm \gitfile{hp}{2020ws/script}{loop-1.c} - schreibt die Zahlen von 1 bis einschließlich 10 auf den Bildschirm: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - return 0; - } - \end{lstlisting} - Die Auswertung der Bedingung erfolgt analog zur \lstinline{if}-Anweisung. - Ebenso folgt auf \lstinline{while} nur eine eine einzige Anweisung, die wiederholt ausgeführt wird; - mehrere Anweisungen müssen mit geschweiften Klammern zu einem Anweisungsblock zusammengefaßt werden. - - Der binäre Operator \lstinline{<=} liefert 1 zurück, - wenn der linke Operand kleiner oder gleich dem rechten ist, ansonsten 0. - Entsprechend sind die Operatoren \lstinline{>=}, \lstinline{<} und \lstinline{>} definiert. - -\if 0 - - \breath - - Wenn man eine Bedingung angibt, die niemals 0 wird, - erzeugt man eine Endlosschleife (\gitfile{hp}{2020ws/script}{while-2.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int i; - i = 1; - while (1) - { - i = i + i; - printf ("%d\n", i); - } - return 0; - } - \end{lstlisting} - Das endlos laufende Programm kann nur noch über das Betriebssystem beendet werden. - Von der Unix-Shell aus geschieht dies durch Eingabe von \lstinline[style=cmd]{Strg+C}. - - In der Ausgabe des oben dargestellten Beispielprogramms fällt auf, - daß die Zweierpotenzen zunächst wie erwartet anwachsen, - später aber nur noch der Zahlenwert 0 ausgegeben wird: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall while-2.c -o while-2¿ - $ ¡./while-2¿ - 2 - 4 - 8 - 16 - 32 - 64 - 128 - 256 - 512 - 1024 - 2048 - 4096 - 8192 - 16384 - 32768 - 65536 - 131072 - 262144 - 524288 - 1048576 - 2097152 - 4194304 - 8388608 - 16777216 - 33554432 - 67108864 - 134217728 - 268435456 - 536870912 - 1073741824 - -2147483648 - 0 - 0 - 0 - ... - \end{lstlisting} - \goodbreak - Dies hängt mit der Art und Weise zusammen, - wie Zahlen in einem Computer gespeichert werden. - Im Detail ist dies Gegenstand der Vorlesung "`Rechnertechnik"'; - ein paar für uns wichtige Eckdaten seien an dieser Stelle erwähnt: - \begin{itemize} - \item - Computer speichern Zahlen im Binärformat, das nur die Ziffern 0 und 1 kennt.\\ - Beispielsweise lautet die Dezimalzahl 9 in Binärdarstellung 1001. - \item - Zweierpotenzen entsprechen jeweils einer 1 mit folgenden Nullen.\\ - Die Dezimalzahlen 2, 4, 8 und 16 haben die Binärdarstellungen 10, 100, 1000 und 10000. - \item - Auf einem 32-Bit-Prozessor zeigt die zweiundreißigste Ziffer von rechts das Vorzeichen an. - Steht hier eine 1, ist die Zahl negativ. - Dies erklärt, weshalb die Verdopplung von 1073741824 (binär: eine 1 mit 30 Nullen) - $-$2147483648 ergibt (binär: eine 1 mit 31 Nullen). - \item - Bei einer weiteren Verdopplung würde binär eine 1 mit 32 Nullen entstehen, - die aber von einem 32-Bit-Prozessor nicht mehr dargestellt werden kann. - Ohne weitere Maßnahmen ist daher das Doppelte von $-$2147483648 auf einem 32-Bit-Prozessor - die Zahl 0. - \end{itemize} - -\fi - - \breath - - Ein wichtiger Spezialfall einer \lstinline{while}-Schleife ist die folgende Situation: - \begin{itemize} - \item - Vor dem Betreten der Schleife findet eine Initialisierung statt, z.\,B.\ \lstinline{i = 1}. - \item - Am Ende jedes Schleifendurchlaufs wird eine "`Schritt-Anweisung"' durchgeführt, - z.\,B.\ \lstinline{i = i + 1}. - \end{itemize} - Für dieses spezielle \lstinline{while} kennt C die Abkürzung \lstinline{for}: - \begin{center} - \begin{minipage}{4cm} - \begin{lstlisting}[gobble=8] - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - \end{lstlisting} - \end{minipage}% - \quad - ist genau dasselbe wie - \quad - \begin{minipage}{4.9cm} - \begin{lstlisting}[gobble=8] - int i; - for (i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - \end{lstlisting} - \quad oder - \begin{lstlisting}[gobble=8] - for (int i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - \end{lstlisting} - \bigskip - \quad(Datei: \gitfile{hp}{2020ws/script}{loop-2.c}) - \end{minipage} - \end{center} - - Achtung: Zwischen den Klammern nach \lstinline{for} stehen zwei Semikolons, keine Kommata. - - \begin{hint} - Die Schreibweise mit der Deklaration \lstinline{int i = 1} - \emph{innerhalb\/} der \lstinline{for}-Schleife - ist erst ab dem C-Standard C99 zulässig. - Beim Compilieren mit älteren Versionen des \lstinline[style=cmd]{gcc} - muß daher zusätzlich die Option \lstinline[style=cmd]{-std=c99} angegeben werden. - \end{hint} - - \breath - - Als eine weitere Schleife kennt C die \lstinline{do}-\lstinline{while}-Schleife: - \begin{lstlisting} - i = 1; - do - { - printf ("%d\n", i); - i = i + 1; - } - while (i <= 10) - \end{lstlisting} - Der Unterschied zur "`normalen"' \lstinline{while}-Schleife besteht darin, - daß eine \lstinline{do}-\lstinline{while}-Schleife mindestens einmal ausgeführt wird, - weil die Bedingung nicht bereits am Anfang, sondern erst am Ende des Schleifendurchlaufs geprüft wird. - - \bigbreak - - Zwischen einer "`normalen"' \lstinline{while}-Schleife - und einer \lstinline{for}-Schleife besteht hingegen \emph{kein\/} Unterschied. - Insbesondere ist eine Schreibweise wie - \begin{lstlisting} - for (i = 1; 10; i + 1) - printf ("%d\n", i); - \end{lstlisting} - \vspace{-\smallskipamount} - zwar zulässiges C, aber nicht sinnvoll (Datei: \gitfile{hp}{2020ws/script}{loop-3.c}). - Dies kann man sofort erkennen, indem man die \lstinline{for}-Schleife - in eine \lstinline{while}-Schleife übersetzt: - \begin{lstlisting} - i = 1; - while (10) - { - printf ("%d\n", i); - i + 1; - } - \end{lstlisting} - Dieses Programmfragment setzt einmalig \lstinline{i} auf den Wert 1 - und springt danach in eine Endlosschleife zur Ausgabe von \lstinline{i}. - (Die \lstinline{while}-Bedingung \lstinline{10} ist ungleich Null, hat also stets den Wahrheitswert "`wahr"'.) - Am Ende jedes Schleifendurchlaufs wird \lstinline{i + 1} berechnet; - der berechnete Wert wird jedoch nirgendwo verwendet, sondern schlichtweg verworfen. - Insbesondere ändert \lstinline{i} seinen Wert nicht. - - \subsection{Seiteneffekte\label{Seiteneffekte}} - - Das Verwerfen berechneter Werte verdient eine nähere Betrachtung - -- insbesondere in der Programmiersprache C. - Wie das Beispielprogramm \gitfile{hp}{2020ws/script}{statements-1.c} illustriert, - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - 2 + 2; - return 0; - } - \end{lstlisting} - ist es anscheinend zulässig, Werte als Anweisung zu verwenden. - - Grundsätzlich gilt in C: - Man kann jeden gültigen Ausdruck als Anweisung verwenden. - Der Wert des Ausdrucks wird dabei ignoriert. - - Die Bedeutung der (gültigen!) C-Anweisung \lstinline{2 + 2;} lautet somit: - "`Berechne den Wert \lstinline{2 + 2} und vergiß ihn wieder."' - - Tatsächlich gilt dasselbe auch für \lstinline{printf()}: - Die Funktion \lstinline{printf()} liefert eine ganze Zahl zurück. - Der \lstinline{printf()}-Aufruf ist somit ein Ausdruck, - dessen Wert ignoriert wird. - - "`Nebenbei"' hat \lstinline{printf()} aber noch eine weitere Bedeutung, - nämlich die Ausgabe des Textes auf dem Standardausgabegerät (Bildschirm). - Diese weitere Bedeutung heißt \newterm{Seiteneffekt\/} des Ausdrucks. - - Das Beispielprogramm \gitfile{hp}{2020ws/script}{statements-2.c} - gibt den vom ersten \lstinline{printf()} zurückgegebenen Wert - mit Hilfe eines zweiten \lstinline{printf()} aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int x; - x = printf ("%d\n", 2 + 2); - printf ("%d\n", x); - return 0; - } - \end{lstlisting} - Die Ausgabe lautet: - \begin{lstlisting}[style=terminal] - 4 - 2 - \end{lstlisting} - Bei dem von \lstinline{printf()} zurückgegebenen Wert handelt es sich um die Anzahl der geschriebenen Zeichen. - In diesem Fall ist sind es zwei Zeichen, nämlich die Ziffer \lstinline{4} - sowie das Zeilenendesymbol, im Programm als \lstinline{\n} notiert. - - \breath - - Auch Operatoren können in C Seiteneffekte haben. - - \begin{itemize} - \item - Der binäre Operator \lstinline{=} (Zuweisung) - hat als Seiteneffekt die Zuweisung des zweiten Operanden an den ersten Operanden - und als Rückgabewert den zugewiesenen Wert. - \item - Ähnlich funktionieren die binären Operatoren \lstinline{+= -= *= /* %=}. - Sie wenden die vor dem \lstinline{=} stehende Rechenoperation auf die beiden Operatoren an, - weisen als Seiteneffekt das Ergebnis dem ersten Operanden zu - und geben das Rechenergebnis als Wert zurück. - \item - Die binären Rechnoperatoren \lstinline{+ - * / %} - und Vergleichsoperatoren \lstinline{== != < > <= >=} - haben \emph{keinen\/} Seiteneffekt. - \item - Der unäre Rechenoperator \lstinline{-} (arithmetische Negation, Vorzeichen) - hat ebenfalls \emph{keinen\/} Seiteneffekt. - \item - Ein weiterer unärer Operator \emph{ohne\/} Seiteneffekt ist die logische Negation,\\ - in C ausgedrückt durch ein Ausrufezeichen: \lstinline{!}\\ - \lstinline{!a} ist 1, wenn \lstinline{a} den Wert 0 hat; ansonsten ist es 0.\\ - \lstinline{!(a < b)} ist demzufolge dasselbe wie \lstinline{a >= b}. - \item - Der Funktionsaufruf \lstinline{()} (Klammerpaar) ist in C ebenfalls ein unärer Operator. - Er liefert einen Wert zurück (Rückgabewert der Funktion) - und hat einen Seiteneffekt (Aufruf der Funktion). - \item - Die unären Operatoren \lstinline{++} und \lstinline{--} haben den Seiteneffekt, - daß sie die Variable, vor oder hinter der sie stehen, um 1 erhöhen (\lstinline{++}) - bzw.\ vermindern (\lstinline{--}). - Wenn der Operator \emph{vor\/} der Variablen steht (\lstinline{++a}), - ist der Rückgabewert der um 1 erhöhte/verminderte Wert der Variablen. - Wenn er hingegen \emph{hinter\/} der Variablen steht (\lstinline{a++}), - ist der Rückgabewert der ursprüngliche Wert der Variablen; - das Erhöhen/Vermindern findet in diesem Fall erst danach statt. - - \begin{experts} - Da die Reihenfolge, in der ein Ausdruck ausgewertet wird, nicht immer festliegt, - sollte man darauf achten, daß die Seiteneffekte eines Ausdruck dessen Wert nicht beeinflussen. - (\lstinline[style=cmd]{gcc} warnt in derartigen Fällen.) - \end{experts} - - \begin{experts} - \item - Ein weiterer binärer Operator \emph{ohne\/} Seiteneffekt ist das Komma. - Der Ausdruck \lstinline{a, b} bedeutet: - "`Berechne \lstinline{a}, vergiß es wieder, und gib stattdessen \lstinline{b} zurück."' - Dies ist nur dann sinnvoll, wenn der Ausdruck \lstinline{a} einen Seiteneffekt hat. - \end{experts} - \end{itemize} - - Die folgenden vier Programmfragmente sind verschiedene Schreibweisen für genau denselben Code. - \begin{lstlisting} - int i; - - i = 0; - while (i < 10) - { - printf ("%d\n", i); - i += 1; - } - - for (i = 0; i < 10; i++) - printf ("%d\n", i); - - i = 0; - while (i < 10) - printf ("%d\n", i++); - - for (i = 0; i < 10; printf ("%d\n", i++)); - \end{lstlisting} - Sie bewirken nicht nur dasselbe (Ausgabe der Zahlen von 0 bis 9), - sondern stehen tatsächlich für \emph{genau dasselbe Programm}. - Sie laufen genau gleich schnell und unterscheiden sich nur hinsichtlich ihrer Lesbarkeit, - wobei es vom persönlichen Geschmack abhängt, welche Variante man jeweils als lesbarer empfindet. - \begin{hint} - Schreiben Sie Ihre Programme stets so lesbar wie möglich.\\ - Platzsparende Schreibweise macht ein Programm nicht schneller. - \end{hint} - - \subsection{Strukturierte Programmierung} - - Bei den bisher vorgestellten Verzweigungen und Schleifen - ist die Reihenfolge, in der die Befehle abgearbeitet werden, klar erkennbar. - Darüberhinaus kennt C auch Anweisungen, - die einen Sprung des Programms bewirken, der diese Struktur durchbricht: - \begin{itemize} - \item - Mit der \lstinline{break}-Anweisung kann das Programm - die nächst"-äußere \lstinline{while}- oder \lstinline{for}-Schleife - unmittelbar verlassen. - - Das folgende Beispielprogramm zählt von 0 bis 9, - indem es eine Endlosschleife beim Erreichen von 10 - mittels \lstinline{break} unterbricht. - Der Schleifenzäher \lstinline{i} wird innerhalb des \lstinline{printf()} - "`nebenbei"' inkrementiert. - \begin{lstlisting}[gobble=8] - int i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - } - \end{lstlisting} - Eine übersichtlichere Schreibweise derselben Schleife lautet: - \begin{lstlisting}[gobble=8] - for (int i = 0; i < 10; i++) - printf ("%d\n", i++); - \end{lstlisting} - (Der erzeugte Code ist in beiden Fällen genau derselbe.) - \item - Mit der \lstinline{continue}-Anweisung springt ein Programm - unmittelbar in den nächsten Durchlauf der nächst"-äußeren Schleife. - \item - Mit der \lstinline{return}-Anweisung kann man eine Funktion - (siehe Abschnitt~\ref{Funktionen}) ohne Umweg direkt verlassen. - \item - Mit der \lstinline{goto}-Anweisung springt ein Programm - direkt an einen \newterm{Label}. - Dieser besteht aus einem Namen, gefolgt von einem Doppelpunkt. - \begin{lstlisting}[gobble=8] - int i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop: - \end{lstlisting} - \end{itemize} - - Ein Programmquelltext sollte immer so gestaltet werden, - daß er den Ablauf des Programms unmittelbar ersichtlich macht. - Ein vorzeitiges \lstinline{return} stellt einen "`Hinterausgang"' - einer Funktion dar und sollte mit Bedacht eingesetzt werden. - - Ähnliches gilt in noch stärkerem Maße für \lstinline{break} und \lstinline{continue} - als "`Hinterausgänge"' von Schleifen. - Diese sind sicherlich bequeme Möglichkeiten, zusätzliche \lstinline{if}s - und zusätzliche Wahrheitswert-Variable zu vermeiden, - verschleiern aber langfristig den Ablauf der Befehle. - Statt eine Schleife mit \lstinline{break} zu verlassen - oder Teile des Schleifeninneren mit \lstinline{continue} zu überspringen, - ist es besser, die Schleifenbedingung - und \lstinline{if}-Anweisungen innerhalb der Schleife so zu formulieren, - daß Sie kein \lstinline{break} oder \lstinline{continue} mehr benötigen. - Dadurch versteht man auch selbst besser, was das Programm eigentlich tut. - Das Programm wird übersichtlicher und oft sogar kürzer. - - In besonderem Maße gilt dies für die \lstinline{goto}-Anweisung. - Hier ist nicht erkennbar, ob der Sprung nach oben geht (Schleife) oder nach unten (Verzweigung). - Verschachtelungen von Blöcken und \lstinline{goto}-Sprüngen - bereiten dem Compiler zusätzliche Arbeit und stehen somit der Optimierung entgegen. - (Es stimmt insbesondere nicht, daß Konstruktionen mit \lstinline{goto} - schneller abgearbeitet würden als Konstruktionen mit \lstinline{if} und \lstinline{while}.) - Es ist daher besser, \lstinline{goto} nicht zu verwenden - und stattdessen den Programmablauf mit Hilfe von Verzweigungen und Schleifen - zu strukturieren. - (Siehe auch: \url{http://xkcd.com/292/}) - - Zusammengefaßt: - \begin{hint} - Verwenden Sie vorzeitiges \lstinline{return} mit Bedacht. - - Vermeiden Sie die Verwendung von \lstinline{break} und \lstinline{continue}. - - Verwenden Sie kein \lstinline{goto}. - \end{hint} - - \subsection{Funktionen\label{Funktionen}} - - Eine Funktionsdeklaration hat in C die Gestalt: - \begin{quote} - Typ Name ( Parameterliste )\\ - \{\\ - \strut\quad Anweisungen\\ - \} - \end{quote} - - Beispielprogramm: \gitfile{hp}{2020ws/script}{functions-1.c} - \begin{lstlisting} - #include <stdio.h> - - void foo (int a, int b) - { - printf ("foo(): a = %d, b = %d\n", a, b); - } - - int main (void) - { - foo (3, 7); - return 0; - } - \end{lstlisting} - (Das Wort "`foo"' ist eine sog.\ \newterm{metasyntaktische Variable} -- - ein Wort, das absichtlich nichts bedeutet und für einen beliebig austauschbaren Namen steht.) - - Mit dem Funktionsaufruf \lstinline{foo (3, 7)} stellt das Hauptprogramm der Funktion \lstinline{foo()} - die Parameterwerte 3 für \lstinline{a} und 7 für \lstinline{b} zur Verfügung. - - Der Rückgabewert der Funktion \lstinline{foo()} ist vom Typ \lstinline{void}. - Im Gegensatz zu Datentypen wie z.\,B.\ \lstinline{int}, das für ganze Zahlen steht, - steht \lstinline{void} für "`nichts"'. - - Von Ausdrücken zurückgegebene \lstinline{void}-Werte \emph{müssen\/} ignoriert werden. - (Von Ausdrücken zurückgegebene Werte anderer Typen \emph{dürfen\/} ignoriert werden.) - - \breath - - Das Hauptprogramm ist in C eine ganz normale Funktion. - Dadurch, daß sie den Namen \lstinline{main} hat, - weiß das Betriebssystem, daß es sie bei Programmbeginn aufrufen soll. - \lstinline{main()} kann dann seinerseits weitere Funktionen aufrufen. - - Über seinen Rückgabewert (vom Typ \lstinline{int}) teilt \lstinline{main()} dem Betriebssystem mit, - ob das Programm erfolgreich beendet werden konnte. - Der Rückgabewert 0 steht für "`Erfolg"'; andere Werte stehen für verschiedenartige Fehler. - - \breath - - Je nachdem, wo und wie Variable deklariert werden, - sind sie von verschiedenen Stellen im Programm aus zugänglich - und/oder verhalten sich unterschiedlich. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{functions-2.c} - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; - b++; - } - - int main (void) - { - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - return 0; - } - \end{lstlisting} - Die Ausgabe dieses Programms lautet: - \begin{lstlisting}[style=terminal] - main(): a = 0, b = 3 - foo(): a = 5, b = 7 - main(): a = 0, b = 4 - main(): a = 12, b = 12 - foo(): a = 6, b = 7 - main(): a = 12, b = 13 - \end{lstlisting} - Erklärung: - \begin{itemize} - \item - Der erste Aufruf der Funktion \lstinline{printf()} in Zeile 17 des Programms - gibt die Werte der in Zeile 3 deklarierten Variablen aus. - Diese lauten 0 für \lstinline{a} und 3 für \lstinline{b}. - - Weil es sich um sog.\ \newterm{globale Variable\/} handelt - (Die Deklaration steht außerhalb jeder Funktion.), - werden diese Variablen \emph{bei Programmbeginn\/} initialisiert. - Für \lstinline{b} steht der Wert 3 für die Initialisierung innerhalb der Deklaration; - für \lstinline{a} gilt der implizite Wert 0. - \item - Der zweite Aufruf von \lstinline{printf()} erfolgt indirekt über die Funktion \lstinline{foo()}, - die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 18). - - Oberhalb des \lstinline{printf()} (Zeile 10) befinden sich neue Deklarationen für Variable, - die ebenfalls \lstinline{a} (Zeile 8) und \lstinline{b} heißen (Zeile 9). - Diese sog.\ \newterm{lokalen Variablen\/} werden auf neue Werte initialisiert, - die korrekt ausgegeben werden. - - Ab den Zeilen 8 und 9 bis zum Ende der Funktion \lstinline{foo()} - sind die in Zeile 3 deklarierten globalen Variablen \lstinline{a} und \lstinline{b} - nicht mehr zugreifbar. - \item - Der dritte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 19). - - \lstinline{a} hat immer noch den Wert 0, - weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde, - die ebenfalls \lstinline{a} heißt, nämlich die lokale Variable, die in Zeile 8 deklariert wurde. - - Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12. - In Zeile 7 jedoch greift die Funktion \lstinline{foo()} - auf die in Zeile 3 deklarierte globale Variable \lstinline{b} zu, - die dadurch den Wert 4 (statt vorher: 3) erhält. - \item - In Zeile 20 weist das Hauptprogramm beiden in Zeile 3 deklarierten Variablen den Wert 12 zu. - - Genauer: Es weist der Variablen \lstinline{a} den Wert \lstinline{b = 12} zu. - Bei \lstinline{b = 12} handelt es sich um einen Ausdruck mit Seiteneffekt, - nämlich die Zuweisung des Wertes 12 an die Variable \lstinline{b}. - Der Wert des Zuweisungsausdrucks ist ebenfalls 12. - \item - Der vierte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 21) - und gibt erwartungsgemäß zweimal den Wert 12 aus. - \item - Der fünfte Aufruf von \lstinline{printf()} erfolgt wieder indirekt über die Funktion \lstinline{foo()}, - die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 22). - - Die Funktion \lstinline{foo()} gibt wiederum die Werte - der in den Zeilen 8 und 9 deklarierten Variablen aus. - - Bei \lstinline{b} (Zeile 9) handelt es sich um eine \newterm{automatische Variable}. - Diese ist nur innerhalb des umgebenden Blockes -- hier der Funktion \lstinline{foo()} -- bekannt. - Sie wird beim Aufruf der Funktion initialisiert und hat daher in Zeile 10 stets den Wert 7, - den sie in Zeile 9 bekommen hat. - - Die Variable \lstinline{a} (Zeile 8) ist hingegen als \newterm{statisch\/} - (engl.\ \lstinline{static}) deklariert. - Sie behält ihren Wert zwischen zwei Aufrufen von \lstinline{foo()}, - wird nur zu Programmbeginn initialisiert - und ist von außerhalb der Funktion nicht veränderbar. - - \begin{experts} - Ausnahme: Wenn einer anderen Funktion die Adresse der \lstinline{static}-Variablen bekannt ist, - kann diese die Variable über einen Zeiger verändern -- Siehe Abschnitt~\ref{Zeiger}. - \end{experts} - - Da der Anfangswert 5 der Variablen \lstinline{a} bereits einmal erhöht wurde (Zeile 11), - wird der Wert 6 ausgegeben. - (Die Zuweisung des Wertes 12 im Hauptprogramm bezog sich auf ein anderes \lstinline{a}, - nämlich das in Zeile 3 deklarierte.) - \item - Der letzte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 23). - - \lstinline{a} hat immer noch den Wert 12, - weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde, - die ebenfalls \lstinline{a} heißt, nämlich die, die in Zeile 8 deklariert wurde. - - Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12. - In Zeile 7 jedoch greift die Funktion \lstinline{foo()} - auf die in Zeile 3 deklarierte Variable \lstinline{b} zu, - die dadurch den Wert 13 (statt vorher: 12) erhält. - \end{itemize} - - \subsection{Zeiger\label{Zeiger}} - - In C können an Funktionen grundsätzlich nur Werte übergeben werden. - Vom Funktionsrückgabewert abgesehen, hat eine C-Funktion keine Möglichkeit, - dem Aufrufer Werte zurückzugeben. - - Es ist dennoch möglich, eine C-Funktion aufzurufen, - um eine Variable (oder mehrere) auf einen Wert zu setzen. - Hierfür übergibt man der Funktion die \newterm{Speicheradresse\/} der Variablen als Wert. - Der Wert ist ein \newterm{Zeiger\/} auf die Variable. - - Wenn einem Zeiger der unäre Operator \lstinline{*} vorangestellt wird, - ist der resultierende Ausdruck diejenige Variable, auf die der Zeiger zeigt. - In Deklarationen wird dasselbe Symbol dem Namen vorangestellt, - um anstelle einer Variablen des genannten Typs - eine Variable vom Typ "`Zeiger auf Variable des genannten Typs"' zu deklarieren. - (Das \lstinline{*}-Symbol wirkt jeweils nur auf den unmittelbar folgenden Bezeichner.) - - Umgekehrt wird der unäre Operator \lstinline{&} einer Variablen vorangestellt, - um einen Ausdruck vom Typ "`Zeiger auf Variable dieses Typs"' - mit dem Wert "`Speicheradresse dieser Variablen"' zu erhalten. - - \goodbreak - Beispielprogramm: \gitfile{hp}{2020ws/script}{pointers-1.c} - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - Die Funktion \lstinline{calc_answer()} läßt sich vom Hauptprogramm einen Zeiger \lstinline{a} - auf die lokale Variable \lstinline{answer} des Hauptprogramms übergeben. - (Aus Sicht des Hauptprogramms ist dieser Zeiger die Adresse \lstinline{&answer} - der lokalen Variablen \lstinline{answer}.) - Sie schreibt einen Wert in die Variable \lstinline{*a}, auf die der Zeiger \lstinline{a} zeigt. - Das Hauptprogramm kann diesen Wert anschließend seiner Variablen \lstinline{answer} entnehmen - und mit \lstinline{printf()} ausgeben. - - Vergißt man beim Aufruf den Adreßoperator \lstinline{&}, - übergibt man den aktuellen Wert der Variablen (hier: eine Zahl) - anstelle eines Zeigers (und erhält eine Warnung durch den Compiler). - Dieser Wert wird als eine Speicheradresse interpretiert. - Diese befindet sich in der Regel außerhalb des Bereichs, - den das Betriebssystem dem Programm zugewiesen hat. - Ein Versuch der Funktion, auf diese Speicheradresse zuzugreifen, - führt dann zum Absturz des Programms (Speicherschutzverletzung). - - \subsection{Arrays und Strings\label{Strings}} - - \subsubsection{Arrays} - - In C ist es möglich, mit einem Zeiger Arithmetik zu betreiben, - so daß er nicht mehr auf die ursprüngliche Variable zeigt, - sondern auf ihren Nachbarn im Speicher. - - Solche Nachbarn gibt es dann, - wenn mehrere Variable gleichen Typs gemeinsam angelegt werden. - Eine derartige Ansammlung von Variablen gleichen Typs heißt \newterm{Array\/} (Feldvariable, Vektor). - - Beispielprogramm: \gitfile{hp}{2020ws/script}{arrays-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - - Die initialisierte Variable \lstinline{prime} ist ein Array von fünf ganzen Zahlen. - Der Bezeichner \lstinline{prime} des Arrays wird als Zeiger auf eine \lstinline{int}-Variable verwendet. - In diesem Sinne sind Arrays und Zeiger in C dasselbe. - - \lstinline{p + i} ist ein Zeiger auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - Durch Dereferenzieren \lstinline{*(p + i)} erhalten wir - den \lstinline{i}-ten Nachbarn von \lstinline{*p} selbst. - - Da diese Kombination -- Zeigerarithmetik mit anschließendem Dereferenzieren -- - sehr häufig auftritt, stellt C für die Konstruktion \lstinline{*(p + i)} - die Abkürzung \lstinline{p[i]} zur Verfügung. - - Die von anderen Sprachen her bekannte Schreibweise \lstinline{p[i]} - für das \lstinline{i}-te Element eines Arrays \lstinline{p} - ist also in C lediglich eine Abkürzung für \lstinline{*(p + i)}, - wobei man \lstinline{p} gleichermaßen als Array wie als Zeiger auffassen kann. - - Wenn wir uns dieser Schreibweise bedienen - und anstelle des Zeigers \lstinline{p}, der durchgehend den Wert \lstinline{prime} hat, - direkt \lstinline{prime} verwenden, - erhalten wir das Beispielprogramm \gitfile{hp}{2020ws/script}{arrays-2.c}: - \goodbreak - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - - Achtung: C prüft \emph{nicht}, ob der Array-Index - innerhalb des zulässigen Bereichs liegt, - ob also der durch Addition des Index auf die Array-Adresse erhaltene Zeiger - noch auf eine Adresse innerhalb des Arrays zeigt. - - Übergelaufene Indizes führen nicht immer sofort zum Absturz des Programms, - sondern können z.\,B.\ andere Variablen des Programms überschreiben. - Da derartige Fehler äußerst schwer zu entdecken sind, - lohnt es sich, Array-Indices vor ihrer Verwendung - mit Hilfe von \lstinline{if}-Anweisungen "`von Hand"' zu prüfen. - - \subsubsection{Strings} - - Ein wichtiger Spezialfall ist ein Array, dessen Komponenten den Datentyp \lstinline{char} haben. - In C ist \lstinline{char} wie \lstinline{int} eine ganze Zahl; - der einzige Unterschied besteht darin, daß der Wertebereich von \lstinline{char} daran angepaßt ist, - ein Zeichen (Buchstabe, Ziffer, Satz- oder Sonderzeichen, engl.\ character) aufzunehmen. - Ein typischer Wertebereich für den Datentyp \lstinline{char} ist von $-$128 bis 127. - - Ein Initialisierer für ein Array von \lstinline{char}-Variablen kann direkt als Folge von Zeichen - (Zeichenkette, engl.\ \newterm{String\/}) mit doppelten Anführungszeichen geschrieben werden. - Jedes Zeichen initialisiert eine ganzzahlige Variable mit seinem ASCII-Wert. - An das Ende eines in dieser Weise notierten Array-Initialisierers - fügt der Compiler implizit einen Ganzzahl-Initialisierer für den Zahlenwert 0 an. - Der Array-Initialisierer \lstinline{"Hello"} ist also gleichbedeutend mit - \lstinline|{ 72, 101, 108, 108, 111, 0 }|. - (Die 72 steht für ein großes H, die 111 für ein kleines o. Man beachte die abschließende 0 am Ende!) - - Ein String in C ist also ein Array von \lstinline{char}s, - also ein Zeiger auf \lstinline{char}s, - also ein Zeiger auf ganze Zahlen, deren Wertebereich daran angepaßt ist, Zeichen aufzunehmen. - - Wenn bei der Deklaration eines Arrays die Länge aus dem Initialisierer hervorgeht, - braucht diese nicht ausdrücklich angegeben zu werden. - In diesem Fall folgt auf den Bezeichner nur das Paar eckiger Klammern und der Initialisierer. - - Das Beispielprogramm \gitfile{hp}{2020ws/script}{strings-1.c} zeigt, - wie das Array durchlaufen werden kann, bis die Zahl 0 gefunden wird: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%d", hello_world[i++]); - return 0; - } - \end{lstlisting} - - Durch die Formatangabe \lstinline{%d} wird jedes Zeichen -- korrektermaßen -- als Dezimalzahl ausgegeben. - Wenn wir stattdessen die Formatangabe \lstinline{%c} verwenden (für \emph{character\/}), - wird für jedes Zeichen -- ebenso korrektermaßen -- sein Zeichenwert (Buchstabe, Ziffer, \dots) ausgegeben - (Datei: \gitfile{hp}{2020ws/script}{strings-2.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%c", hello_world[i++]); - return 0; - } - \end{lstlisting} - - Durch Verwendung von Pointer-Arithmetik - und Weglassen der überflüssigen Abfrage \lstinline{!= 0} - erhalten wir das äquivalente Beispielprogramm \gitfile{hp}{2020ws/script}{strings-3.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - char *p = hello_world; - while (*p) - printf ("%c", *p++); - return 0; - } - \end{lstlisting} - Dieses ist die in C übliche Art, eine Schleife zu schreiben, - die nacheinander alle Zeichen in einem String bearbeitet. - - \breath - - Eine weitere Formatangabe \lstinline{%s} dient in \lstinline{printf()} dazu, - direkt einen kompletten String bis ausschließlich der abschließenden 0 auszugeben. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-4.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char *p = "Hello, world!"; - printf ("%s\n", p); - return 0; - } - \end{lstlisting} - - Anstatt als Array, das dann einem Zeiger zugewiesen wird, - deklarieren wir die Variable \lstinline{hello_world} direkt als Zeiger. - Dies ist die in C übliche Art, mit String-Konstanten umzugehen. - - Allein die Formatspezifikation entscheidet darüber, - wie die Parameter von \lstinline{printf()} bei der Ausgabe dargestellt werden: - \begin{quote} - \begin{tabular}{cl} - \lstinline|%d| & Der Parameter wird als Zahlenwert interpretiert und dezimal ausgegeben. \\ - \lstinline|%x| & Der Parameter wird als Zahlenwert interpretiert und hexadezimal ausgegegeben.\\ - \lstinline|%c| & Der Parameter wird als Zahlenwert interpretiert und als Zeichen ausgegeben.\\ - \lstinline|%s| & Der Parameter wird als Zeiger interpretiert und als Zeichenfolge ausgegeben. - \end{tabular} - \end{quote} - - \subsection{String-Operationen} - - Mit \lstinline{#include <string.h>} steht uns eine Sammlung von Funktionen - zur Bearbeitung von Strings (= Array von \lstinline{char}-Variablen - $\approx$ Zeiger auf \lstinline{char}-Variable) zur Verfügung: - - \begin{itemize} - \item[\textbf{;\,)}] - \lstinline{+}-Operationen - - Durch Addieren einer ganzen Zahl auf die Startadresse des Strings - entsteht ein Zeiger auf einen neuen String, - der erst ein paar Zeichen später beginnt. - Auf diese Weise kann man in C ganz ohne Benutzung einer Bibliothek - den Anfang eines Strings abschneiden. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - printf ("%s\n", hello + 7); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der Zeiger nach der Addition - noch auf einen Bereich innerhalb des Strings zeigt. - Wenn man auf diese Weise über den String hinausliest, - führt dies zu unsinnigen Ergebnissen - bis hin zu einem Absturz (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-14.c} - - \item[\textbf{;\,)}] - Null-Zeichen in den String schreiben - - Durch das Schreiben eines Null-Symbols (Zahlenwert 0) in den String - kann man diesen ganz ohne Benutzung einer Bibliothek - an dieser Stelle abschneiden. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - hello[5] = 0; - printf ("%s\n", hello); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der Schreibvorgang noch innerhalb des Strings stattfindet. - Wenn man auf diese Weise über den String hinauschreibt, - werden andere Variable überschrieben, - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-14.c} - - \item - \lstinline{strlen()} -- Ermitteln der Länge eines Strings - - Das abschließende Null-Symbol wird für die Länge \emph{nicht\/} mitgezählt, - es verbraucht aber natürlich dennoch Speicherplatz. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - printf ("%s\n", strlen (hello)); - \end{lstlisting} - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-14.c} - - \item - \lstinline{strcmp()} -- Strings vergleichen - - Wenn der erste String-Parameter alphabetisch vor dem zweiten liegt, - gibt \lstinline{strcmp()} den Wert \lstinline{-1} zurück, - wenn es umgekehrt ist, den Wert \lstinline{1}, - wenn die Strings gleich sind, den Wert \lstinline{0}. - - \begin{lstlisting}[gobble=8] - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - \end{lstlisting} - - Der Vergleich erfolgt im Sinne des verwendeten Zeichensatzes, - normalerweise ASCII. Dabei kommen z.\,B.\ Großbuchstaben grundsätzlich - \emph{vor\/} den Kleinbuchstaben. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-15.c} - - \item - \lstinline{strcat()} -- String an anderen String anhängen - - Die Funktion \lstinline{strcat()} hängt den zweiten String - an den ersten an. - - \begin{lstlisting}[gobble=8] - char *anton = "Anton"; - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der resultierende String noch in den für den ersten Strng reservierten - Speicherbereich (Puffer) hineinpaßt. - Wenn man auf diese Weise über den String hinauschreibt, - werden andere Variable überschrieben, - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-15.c} - - \item - \lstinline{sprintf()} -- in String schreiben - - \lstinline{sprintf()} funktioniert ähnlich wie \lstinline{printf()}, - schreibt aber nicht zur Standardausgabe (Bildschirm), - sondern in einen String hinein, den man als ersten Parameter übergibt. - - \begin{lstlisting}[gobble=8] - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, ob der Ziel-String - (Puffer -- \newterm{Buffer\/}) groß genug ist, um die Ausgabe aufzunehmen. - Wenn dies nicht der Fall ist un man über das Ende des Strings hinausschreibt, - werden andere Variable des Programms überschrieben (\newterm{Buffer Overflow}), - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - Derartige Fehler sind schwer zu finden und befinden sich zum Teil bis heute - in Programmen, die im Internet zum Einsatz kommen - und Angreifern ermöglichen, Rechner von außen zu übernehmen. - - Um dieses Problem zu vermeiden, empfiehlt es sich, - anstelle von \lstinline{sprintf()} die Funktion \lstinline{snprintf()} - zu verwenden. Diese erwartet als zweiten Parameter die Länge des Ziel-Strings - und sorgt dafür, daß nicht über dessen Ende hinausgeschrieben wird. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-16.c} - - \item - \lstinline{strstr()} -- in String suchen - - Die Funktion \lstinline{strstr()} - such im ersten String-Parameter nach dem zweiten - und gibt als Ergebnis einen Zeiger auf diejenige Stelle zurück, - an der der zweite String gefunden wurde. - - \begin{lstlisting}[gobble=8] - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - \end{lstlisting} - - Wenn man dies in einen Array-Index umrechnen will, - geschieht dies durch Subtrahieren des Zeigers auf den ersten String. - Das Ergebnis ist eine Integer vom Typ \lstinline{ssize_t} - (\emph{signed size type\/}). Um diese mit \lstinline{printf()} auszugeben, - verwendet man \lstinline{%zd} anstelle von \lstinline{%d}. - - Beispielprogramm: \gitfile{hp}{2020ws/script}{strings-16.c} - - \end{itemize} - - \subsection{Parameter des Hauptprogramms} - - Bisher haben wir das Hauptprogramm \lstinline{main()} immer in der Form - \begin{lstlisting} - int main (void) - { - ... - return 0; - } - \end{lstlisting} - geschrieben. - - Tatsächlich kann das Hauptprogramm vom Betriebssystem Parameter entgegennehmen - (Datei: \gitfile{hp}{2020ws/script}{params-1.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - Bei der ganzen Zahl \lstinline{int argc} handelt es sich um die Anzahl der übergebenen Parameter. - - \lstinline{char **argv} ist ein Zeiger auf einen Zeiger auf \lstinline{char}s, - also ein Array von Arrays von \lstinline{char}s, - also ein Array von Strings. - Wenn wir es mit einem Index \lstinline{i} versehen, - greifen wir auf auf den \lstinline{i}-ten Parameter zu. - Der Index \lstinline{i} läuft, wie in C üblich, von \lstinline{0} bis \lstinline{argc - 1}. - Das o.\,a.\ Beispielprogramm gibt alle übergebenen Parameter auf dem Standardausgabegerät aus: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O params-1.c -o params-1¿ - $ ¡./params-1 foo bar baz¿ - argc = 4 - argv[0] = "./params-1" - argv[1] = "foo" - argv[2] = "bar" - argv[3] = "baz" - \end{lstlisting} - Genaugenommen übergibt das Betriebssystem dem Programm die gesamte Kommandozeile: - Der nullte Parameter ist der Aufruf der ausführbaren Datei selbst - -- in genau der Weise, in der er eingegeben wurde. - - Neben \lstinline{argc} gibt es noch einen weiteren Mechanismus, - mit dem das Betriebssystem dem Programm die Anzahl der übergebenen Parameter mitteilt: - Als Markierung für das Ende der Liste wird ein zusätzlicher Zeiger übergeben, der auf "`nichts"' zeigt, - dargestellt durch die Speicheradresse mit dem Zahlenwert 0, - in C mit \lstinline{NULL} bezeichnet. - - Um die Parameter des Programms in einer Schleife durchzugehen, - können wir also entweder von \lstinline{0} bis \lstinline{argc - 1} zählen - (Schleifenbedingung \lstinline{i < argc}, Datei: \gitfile{hp}{2020ws/script}{params-1.c} -- siehe oben) - oder die Schleife mit dem Erreichen der Endmarkierung abbrechen - (Schleifenbedingung \lstinline{argv[i] != NULL}, Datei: \gitfile{hp}{2020ws/script}{params-2.c}). - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; argv[i] != NULL; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - Auch für Zeiger gilt: \lstinline{NULL} entspricht dem Wahrheitswert "`falsch"'; - alles andere dem Wahrheitswert "`wahr"'. - Wir dürfen die Schleifenbedingung also wie folgt abkürzen (Datei: \gitfile{hp}{2020ws/script}{params-3.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (char **p = argv; *p; p++) - printf ("argv[p] = \"%s\"\n", *p); - return 0; - } - \end{lstlisting} - - \subsection{Strukturen\label{Strukturen}} - - In vielen Situationen ist es sinnvoll, - mehrere Variable zu einer Einheit zusammenzufassen. - - Das folgende Beispielprogramm \gitfile{hp}{2020ws/script}{structs-1.c} - faßt drei Variable \lstinline{day}, \lstinline{month} und \lstinline{year} - zu einem einzigen -- neuen -- Datentyp \lstinline{date} zusammen: - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 1, 11, 2016 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(4,4.95){\makebox(0,0)[l]{$\left.\rule{0pt}{1.4cm}\right\}$ neuer Datentyp: date}} - \put(4.9,3){\vector(-1,-1){0.5}} - \put(5,3){\makebox(0,0)[l]{Variable deklarieren und initialisieren}} - \put(5.55,1.1){\vector(-1,1){0.5}} - \put(5.65,1.1){\makebox(0,0)[l]{Zugriff auf die Komponente day - der strukturierten Variablen today}} - \end{picture}% - (Zur Erinnerung: Der Datentyp \lstinline{char} steht für Zahlen, - die mindestens die Werte von $-$128 bis 127 annehmen können. - C unterscheidet nicht zwischen Zahlen und darstellbaren Zeichen.) - - Eine wichtige Anwendung derartiger \newterm{strukturierter Datentypen\/} besteht darin, - zusammengehörige Daten als Einheit an Funktionen übergeben zu können - (Beispielprogramm: \gitfile{hp}{2020ws/script}{structs-2.c}): - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 1; - (*d).month = 11; - (*d).year = 2016; - } - - int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - } - \end{lstlisting} - Die Funktion \lstinline{set_date()} hat die Aufgabe, - eine \lstinline{date}-Variable mit Werten zu füllen (sog.\ \newterm{Setter\/}-Funktion). - Damit dies funktionieren kann, übergibt das Hauptprogramm an die Funktion - einen Zeiger auf die strukturierte Variable. - Über diesen Zeiger kann die Funktion dann auf alle Komponenten der Struktur zugreifen. - (Die Alternative wäre gewesen, für jede Komponente einen separaten Zeiger zu übergeben.) - - Da die Zeigerdereferenzierung \lstinline{*foo} - mit anschließendem Komponentenzugriff \lstinline{(*foo).bar} - eine sehr häufige Kombination ist, kennt C hierfür eine Abkürzung: - \lstinline{foo->bar} - - \goodbreak - Beispielprogramm: \gitfile{hp}{2020ws/script}{structs-3.c} - \goodbreak - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 1; - d->month = 11; - d->year = 2016; - } - - int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - } - \end{lstlisting} - - \goodbreak - \subsubsection*{Aufgabe} - - Schreiben Sie eine Funktion \lstinline{inc_date (date *d)} - die ein gegebenes Datum \lstinline{d} - unter Beachtung von Schaltjahren auf den nächsten Tag setzt. - - \goodbreak - \subsubsection*{Lösung} - - Wir lösen die Aufgabe über den sog.\ \newterm{Top-Down-Ansatz} ("`vom Allgemeinen zum Konkreten"'). - Als besonderen Trick approximieren wir unfertige Programmteile zunächst durch einfachere, fehlerbehaftete. - Diese fehlerhaften Programmteile sind in den untenstehenden Beispielen rot markiert. - (In der Praxis würde man diese Zeilen unmittelbar durch die richtigen ersetzen; - die fehlerhaften "`Platzhalter"' sollten also jeweils nur für Sekundenbruchteile im Programm stehen. - Falls man einmal tatsächlich einen Platzhalter für mehrere Sekunden oder länger stehen lassen sollte - -- z.\,B., weil an mehreren Stellen Änderungen notwendig sind --, - sollte man ihn durch etwas Uncompilierbares (z.\,B.\ \lstinline{@@@}) markieren, - damit man auf jeden Fall vermeidet, ein fehlerhaftes Programm auszuliefern.) - - Zunächst kopieren wir das Beispielprogramm \gitfile{hp}{2020ws/script}{structs-3.c} - und ergänzen den Aufruf der -- noch nicht existierenden -- Funktion \lstinline{inc_date()} - (Datei: \gitfile{{hp}script}{incdate-0.c}): - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - \end{lstlisting} - \begin{lstlisting} - void set_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - } - \end{lstlisting} - \begin{lstlisting} - int main (void) - { - date today; - set_date (&today); - ¡inc_date (&today);¿ - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - - Als nächstes kopieren wir innerhalb des Programms die Funktion \lstinline{get_date()} - als "`Schablone"' für \lstinline{inc_date()}: - \begin{lstlisting} - void get_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - } - - ¡void inc_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - }¿ - \end{lstlisting} - Da die Funktion jetzt existiert, ist der Aufruf nicht mehr fehlerhaft. - Stattdessen haben wir jetzt eine fehlerhafte Funktion \lstinline{inc_date()}. - - Im nächsten Schritt ersetzen wir die fehlerhafte Funktion - durch ein simples Hochzählen der \lstinline{day}-Kom\-po\-nen\-te (Datei: \gitfile{hp}{2020ws/script}{incdate-1.c}) - \begin{lstlisting} - void inc_date (date *d) - { - ¡d->day += 1; /* FIXME */¿ - } - \end{lstlisting} - Diese naive Vorgehensweise versagt, sobald wir den Tag über das Ende des Monats hinauszählen. - Dies reparieren wir im nächsten Schritt, - wobei wir für den Moment inkorrekterweise annehmen, daß alle Monate 30 Tage hätten - und das Jahr beliebig viele Monate. - (Datei: \gitfile{hp}{2020ws/script}{incdate-2.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - ¡if (d->day > 31) /* FIXME */ - { - d->month++; /* FIXME */ - d->day = 1; - }¿ - } - \end{lstlisting} - Zunächst reparieren wir den Fehler, der am Ende des Jahres entsteht - (Datei: \gitfile{hp}{2020ws/script}{incdate-3.c}). - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; - d->day = 1; - ¡if (d->month > 12) - { - d->year++; - d->month = 1; - }¿ - } - } - \end{lstlisting} - Das Problem der unterschiedlich langen Monate gehen wir wieder stufenweise an. - Zunächst ersetzen wir die Konstante \lstinline{31} - durch eine Variable \lstinline{days_in_month}. - (Datei: \gitfile{hp}{2020ws/script}{incdate-4.c}) - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - ¡int days_in_month = 31; /* FIXME */ - if (d->day > days_in_month)¿ - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Anschließend reparieren wir den fehlerhaften (konstanten) Wert der Variablen, - wobei wir zunächst das Problem der Schaltjahre aussparen (Datei: \gitfile{hp}{2020ws/script}{incdate-5.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - ¡if (d->month == 2) - days_in_month = 28; /* FIXME */ - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30;¿ - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Auf dieselbe Weise lagern wir das Problem "`Schaltjahr oder nicht?"' - in eine Variable aus. Diese ist wieder zunächst konstant - (Datei: \gitfile{hp}{2020ws/script}{incdate-6.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - ¡int is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28;¿ - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Als nächstes ergänzen wir die Vier-Jahres-Regel für Schaltjahre - (Datei \gitfile{hp}{2020ws/script}{incdate-7.c}): - \begin{lstlisting} - ¡int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */¿ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - \end{lstlisting} - Das nun vorliegende Programm arbeitet bereits für den julianischen Kalender - sowie für alle Jahre von 1901 bis 2099 korrekt, - nicht jedoch für z.\,B.\ das Jahr 2100 (Datei: \gitfile{hp}{2020ws/script}{incdate-8.c}). - Damit das Programm für den aktuell verwendeten gregorianischen Kalender korrekt arbeitet, - ergänzen wir noch die Ausnahme, daß durch 100 teilbare Jahre keine Schaltjahre sind, - sowie die Ausnahme von der Ausnahme, daß durch 400 teilbare Jahre - (z.\,B.\ das Jahr 2000) eben doch Schaltjahre sind (Datei: \gitfile{hp}{2020ws/script}{incdate-9.c}): - \begin{lstlisting} - int is_leap_year = 0; - if (d->year % 4 == 0) - ¡{ - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - }¿ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - \end{lstlisting} - Damit ist die Aufgabe gelöst. - Der vollständige Quelltext der Lösung (Datei: \gitfile{hp}{2020ws/script}{incdate-9.c}) lautet: - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - \end{lstlisting} - \begin{lstlisting} - void set_date (date *d) - { - d->day = 28; - d->month = 2; - d->year = 2000; - } - \end{lstlisting} - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - { - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - } - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - \begin{lstlisting} - int main (void) - { - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - Bemerkungen: - \begin{itemize} - \item - Anstatt die Anzahl der Tage in einem Monat - innerhalb der Funktion \lstinline{set_date()} zu berechnen, - ist es sinnvoll, hierfür eine eigene Funktion zu schreiben. - Dasselbe gilt für die Berechnung, - ob es sich bei einem gegebenem Jahr um ein Schaltjahr handelt. - \item - Der Top-Down-Ansatz ist eine bewährte Methode, - um eine zunächst komplexe Aufgabe in handhabbare Teilaufgaben zu zerlegen. - Dies hilft ungemein, in längeren Programmen (mehrere Zehntausend bis Millionen Zeilen) - die Übersicht zu behalten. - \item - Der Trick mit dem zunächst fehlerhaften Code hat den Vorteil, - daß man jeden Zwischenstand des Programms compilieren und somit austesten kann. - Er birgt andererseits die Gefahr in sich, - die Übersicht über den fehlerhaften Code zu verlieren, - so daß es dieser bis in die Endfassung schafft. - Neben dem bereits erwähnten Trick uncompilierbarer Symbole - haben sich hier Kommentare wie \lstinline{/* FIXME */} bewährt, - auf die man seinen Code vor der Auslieferung der Endfassung - noch einmal automatisch durchsuchen läßt. -% \item -% Allen an der Berechnung beteiligten Funktionen -% wurde hier ein Zeiger \lstinline{d} auf die vollständige \lstinline{date}-Struktur übergeben. -% Dies ist ein \newterm{objektorientierter Ansatz}, -% bei dem man die Funktionen als \newterm{Methoden\/} der \newterm{Klasse\/} \lstinline{date} auffaßt. -% (Von sich aus unterstützt die Sprache C -- im Gegensatz zu z.\,B.\ C++ -- keine Klassen und Methoden, -% sondern man muß diese bei Bedarf in der oben beschrieben Weise selbst basteln. -% Für eine fertige Lösung siehe z.\,B.\ die \file{GObject}-Bibliothek -- \url{http://gtk.org}.) -% -% Alternativ könnte man sich mit den zu übergebenden Parametern auf diejenigen beschränken, -% die in der Funktion tatsächlich benötigt werden, -% also z.\,B.\ \lstinline{int days_in_month (int month, int year)} -% und \lstinline{int is_leap_year (int year)}. -% Damit wären die Funktionen allgemeiner verwendbar. -% -% Welcher dieser beiden Ansätze der bessere ist, hängt von der Situation -% und von persönlichen Vorlieben ab. - \end{itemize} - - \subsection{Dateien und Fehlerbehandlung} - - Die einfachste Weise, in C mit Dateien umzugehen, - ist über sog.\ \newterm{Streams}. - - Die Funktion \lstinline{fopen()} - erwartet als Parameter einen Dateinamen und einen Modus - und gibt als Rückgabewert einen Zeiger auf einen Stream - -- eine Struktur vom Typ \lstinline{FILE} -- zurück: - \begin{lstlisting} - FILE *f = fopen ("fhello.txt", "w"); - \end{lstlisting} - Als Modus übergibt man eine String-Konstante. - Diese kann die Buchstaben \lstinline{r} für Lesezugriff (\emph{read\/}), - \lstinline{w} für Schreibzugriff mit Überschreiben (\emph{write\/}) - sowie \lstinline{a} für Schreibzugriff mit Anhängen (\emph{append\/}) enthalten - und zusätzlich den Buchstaben \lstinline{b} für Binärdaten (im Gegensatz zu Text). - - Die in C üblichen Ein-/Ausgabefunktionen wie z.\,B.\ \lstinline{printf()} - haben Varianten mit vorangestelltem "`f-"', z.\,B.\ \lstinline{fprintf()}. - Wenn man diesen Funktionen als ersten Parameter einen Zeiger auf ein - \lstinline{FILE} übergibt, verhalten sie sich in der üblichen Weise, - nur daß sie nicht zur Standardausgabe schreiben (Bildschirm), - sondern in die Datei, deren Name beim Öffnen des \lstinline{FILE} - angegeben wurde (Datei \gitfile{hp}{2020ws/script}{fhello-1.c}): - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - - Der von \lstinline{fopen()} zurückgegebene Wert ist ein Zeiger. - Ein Aufruf von \lstinline{fprintf()} oder \lstinline{fclose()} - stellt eine Verwendung dieses Zeigers dar. - Wenn die Datei -- aus welchen Gründen auch immer -- nicht geöffnet werden konnte, - ist dieser Zeiger \lstinline{NULL}, und seine Verwendung führt - zum Absturz des Programms. - Es ist daher dringend empfohlen, diesen Fall zu prüfen - (Datei: \gitfile{hp}{2020ws/script}{fhello-2.c}): - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - } - \end{lstlisting} - - Anstatt einfach nur "`nichts"' zu machen, - ist es besser, eine sinnvolle Fehlermeldung auszugeben. - Dabei sind wir nicht allein auf "`Fehler beim Öffnen der Datei"' angewiesen: - Das Betriebssystem teilt uns über die globale Variable \lstinline{errno} mit, - was genau beim Öffnen der Datei fehlgeschlagen ist. - Mit \lstinline{#include <errno.h>} erhält unser Programm - Zugriff auf diese Variable - und kann den Fehler-Code in seiner Fehlermeldung mit ausgeben - (Datei: \gitfile{hp}{2020ws/script}{fhello-3.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - } - \end{lstlisting} - - Die Ausgabe von Fehler erfolgt üblicherweise nicht mit einem "`normalen"' - \lstinline{printf()}, sondern mit einem \lstinline{fprintf()} in die - bereits standardmäßig geöffnete Datei \lstinline{stderr}, die - \newterm{Fehlerausgabe}-Datei. - Diese landet -- genau wie die Standardausgabe -- zunächst auf dem Bildschirm, - kann aber separat von der Standardausgabe umgeleitet werden, - z.\,B.\ in eine separate Datei. - - Die Bedeutung der Fehler-Codes ist - nicht nur in der Dokumentation des Betriebssystems, - sondern auch in einer C-Bibliothek hinterlegt. - Mit \lstinline{#include <string.h>} erhalten wir - eine Funktion \lstinline{strerror()}, - die den Fehler-Code in eine für Menschen lesbare Fehlermeldung umwandelt - (Datei: \gitfile{hp}{2020ws/script}{fhello-4.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - } - \end{lstlisting} - - Ein häufiger Fall ist, daß das Programm nach Ausgabe der Fehlermeldung - direkt beendet werden soll. - Hierbei wird nicht das sonst übliche \lstinline{return 0} - des Hauptprogramms aufgerufen, sondern \lstinline{return} - mit einer anderen Zahl als 0, z.\,B.\ \lstinline{return 1} - für "`allgemeiner Fehler"'. - Üblich ist es, den Fehler-Code zurückgegeben - -- \lstinline{return errno} --, um diesen auch an denjenigen, - der das Programm aufgerufen hat, weiterzureichen. - - Für diese standardisierte Reaktion auf Fehler - steht mit \lstinline{#include <error.h>} - eine Funktion \lstinline{error()} zur Verfügung, - die eine zum übergebenen Fehler-Code gehörende Fehlermeldung ausgibt - und anschließend das Programm mit einem übergebenen Fehler-Code beendet - (Datei: \gitfile{hp}{2020ws/script}{fhello-5.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - #include <error.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - - In diesem Fall ist \lstinline{1} der Code, - den das Programm im Fehlerfall zurückgeben soll, - und \lstinline{errno} ist die Nummer des Fehlers, - dessen Fehlermeldung auf dem Bildschirm (\lstinline{stderr}) - ausgegeben werden soll. - (Üblich wäre wie gesagt auch, hier zweimal \lstinline{errno} zu übergeben.) - - \textbf{Bitte niemals Fehler einfach ignorieren!} - Ein Programm, das bereits auf eine nicht gefundene Datei - mit einem Absturz reagiert, ist der Alptraum jedes Benutzers - und eines jeden, der versucht, in dem Programm Fehler zu beheben. - Ein korrekt geschriebenes Programm stürzt \emph{niemals\/} ab, - sondern beendet sich schlimmstensfalls mit einer aussagekräftigen Fehlermeldung, - die uns in die Lage versetzt, die Fehlerursache zu beheben. - - \section{Bibliotheken} - - \subsection{Der Präprozessor\label{Praeprozessor}} - - Der erste Schritt beim Compilieren eines C-Programms ist das - Auflösen der sogenannten Präprozessor-Direktiven und -Macros. - \begin{lstlisting} - #include <stdio.h> - \end{lstlisting} - \vspace{-\medskipamount} - bewirkt, daß aus Sicht des Compilers anstelle der Zeile - der Inhalt der Datei \file{stdio.h} im C-Quelltext erscheint. - Dies ist zunächst unabhängig von Bibliotheken und auch nicht auf die Programmiersprache C beschränkt. - - Beispiel: - Die Datei \gitfile{hp}{2020ws/script}{maerchen.c} enthält: - \begin{lstlisting}[language={}] - Vor langer, langer Zeit - gab es einmal - #include "hexe.h" - Die lebte in einem Wald. - \end{lstlisting} - Die Datei \gitfile{hp}{2020ws/script}{hexe.h} enthält: - \begin{lstlisting}[language={}] - eine kleine Hexe. - \end{lstlisting} - Der Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc -E -P maerchen.c¿ - \end{lstlisting} - produziert die Ausgabe - \begin{lstlisting}[style=terminal] - Vor langer, langer Zeit - gab es einmal - eine kleine Hexe. - Die lebte in einem Wald. - \end{lstlisting} - Mit der Option \lstinline[style=cmd]{-E} weisen wir \lstinline[style=cmd]{gcc} an, - nicht zu compilieren, sondern nur den Präprozessor aufzurufen. - Die Option \lstinline[style=cmd]{-P} unterdrückt Herkunftsangaben, - die normalerweise vom Compiler verwendet werden, - um Fehlermeldungen den richtigen Zeilen in den richtigen Dateien - zuordnen zu können. Ohne das \lstinline[style=cmd]{-P} lautet die Ausgabe: - \begin{lstlisting}[style=terminal] - # 1 "maerchen.c" - # 1 "<built-in>" - # 1 "<command-line>" - # 1 "maerchen.c" - Vor langer, langer Zeit - gab es einmal - # 1 "hexe.h" 1 - eine kleine Hexe. - # 3 "maerchen.c" 2 - Die lebte in einem Wald. - \end{lstlisting} - - Nichts anderes geschieht, wenn man das klassische \file{hello.c} - (Datei: \gitfile{hp}{2020ws/script}{hello-1.c} compiliert: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} - Die Datei \file{stdio.h} ist wesentlich länger als \gitfile{hp}{2020ws/script}{hexe.txt} in dem o.\,a.\ - Beispiel, und sie ruft weitere Include-Dateien auf, - so daß wir insgesamt auf über 800 Zeilen Quelltext kommen. - - Die spitzen Klammern anstelle der Anführungszeichen bedeuten, - daß es sich um eine \newterm{Standard-Include-Datei\/} handelt, - die nur in den Standard-Include-Verzeichnissen gesucht werden soll, - nicht jedoch im aktuellen Verzeichnis. - - \subsection{Bibliotheken einbinden} - - Tatsächlich ist von den über 800 Zeilen aus \file{stdio.h} nur eine - einzige relevant, nämlich: - \begin{lstlisting} - extern int printf (__const char *__restrict __format, ...); - \end{lstlisting} - Dies ist die Deklaration einer Funktion, die sich von einer - "`normalen"' Funktionsdefinition nur wie folgt unterscheidet: - \begin{itemize} - \item - Die Parameter \lstinline{__const char *__restrict __format, ...} - heißen etwas ungewöhnlich. - \item - Der Funktionskörper \lstinline|{ ... }| fehlt. Stattdessen folgt auf die - Kopfzeile direkt ein Semikolon \lstinline{;}. - \item - Der Deklaration ist das Schlüsselwort \lstinline{extern} vorangestellt. - \end{itemize} - Dies bedeutet für den Compiler: - "`Es gibt diese Funktion und sie sieht aus, wie beschrieben. - Benutze sie einfach, und kümmere dich nicht darum, wer die Funktion schreibt."' - - \begin{experts} - Wenn wir tatsächlich nur \lstinline{printf()} benötigen, - können wir also die Standard-Datei \file{stdio.h} durch eine eigene ersetzen, - die nur die o.\,a.\ Zeile \lstinline{extern int printf (...)} enthält. - (Dies ist in der Praxis natürlich keine gute Idee, weil nur derjenige, der die - Funktion \lstinline{printf()} geschrieben hat, den korrekten Aufruf kennt. - In der Praxis sollten wir immer diejenige Include-Datei benutzen, - die gemeinsam mit der tatsächlichen Funktion ausgeliefert wurde.) - \end{experts} - - \breath - - Der Präprozessor kann nicht nur \lstinline{#include}-Direktiven auflösen. - Mit \lstinline{#define} kann man sog.\ \newterm{Makros\/} definieren, - die bei Benutzung durch einen Text ersetzt werden. - Auf diese Weise kann man \newterm{Konstante\/} definieren. - - Beispiel: \gitfile{hp}{2020ws/script}{higher-math-1.c} - \begin{lstlisting} - #include <stdio.h> - - #define VIER 4 - - int main (void) - { - printf ("2 + 2 = %d\n", VIER); - return 0; - } - \end{lstlisting} - - Genau wie bei \lstinline{#include} nimmt der Präprozessor auch bei \lstinline{#define} - eine rein textuelle Ersetzung vor, ohne sich um den Sinn des Ersetzten zu kümmern. - - Beispiel: \gitfile{hp}{2020ws/script}{higher-math-2.c} - \begin{lstlisting} - #include <stdio.h> - - #define wuppdich printf - #define holla main - #define pruzzel return - #define VIER 4 - - int holla (void) - { - wuppdich ("2 + 2 = %d\n", VIER); - pruzzel 0; - } - \end{lstlisting} - - Dies kann zu Problemen führen, sobald Berechnungen ins Spiel kommen. - - Beispiel: \gitfile{hp}{2020ws/script}{higher-math-3.c} - \begin{lstlisting} - #include <stdio.h> - - #define VIER 2 + 2 - - int main (void) - { - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; - } - \end{lstlisting} - Hier z.\,B.\ sieht man mit \lstinline[style=cmd]{gcc -E rechnen.c}, - daß die Ersetzung des Makros \lstinline{VIER} wie folgt lautet: - \begin{lstlisting} - printf ("2 + 3 * 4 = %d\n", 2 + 3 * 2 + 2); - \end{lstlisting} - Der C-Compiler wendet die Regel "`Punktrechnung geht vor Strichrechnung"' an - und erfährt überhaupt nicht, daß das \lstinline{2 + 2} aus einem Makro enstanden ist. - - Um derartige Effekte zu vermeiden, setzt man arithmetische - Operationen innerhalb von Makros in Klammern. - - Beispiel: \gitfile{hp}{2020ws/script}{higher-math-4.c} - \begin{lstlisting} - #define VIER (2 + 2) - \end{lstlisting} - - (Es ist in den meisten Situationen üblich, Makros in \lstinline{GROSSBUCHSTABEN} zu benennen, - um darauf hinzuweisen, daß es sich eben um einen Makro handelt.) - - Achtung: Hinter Makro-Deklaration kommt üblicherweise \emph{kein\/} Semikolon. - - \begin{experts} - Wenn man ein Semikolon setzt, gehört dies mit zum Ersetzungstext des Makros. - Dies ist grundsätzlich zulässig, führt aber zu sehr seltsamen C-Quelltexten. - -- siehe z.\,B.\ \gitfile{hp}{2020ws/script}{higher-math-5.c}. - \end{experts} - - \breath - - Das nächste Beispiel illustriert, wie man Bibliotheken schreibt und verwendet. - - Es besteht aus drei Quelltexten: - - \gitfile{hp}{2020ws/script}{philosophy.c}: - \begin{lstlisting} - #include <stdio.h> - #include "answer.h" - - int main (void) - { - printf ("The answer is %d.\n", answer ()); - return 0; - } - \end{lstlisting} - - \goodbreak - \gitfile{hp}{2020ws/script}{answer.c}: - \begin{lstlisting} - int answer (void) - { - return 42; - } - \end{lstlisting} - - \goodbreak - \gitfile{hp}{2020ws/script}{answer.h}: - \begin{lstlisting} - extern int answer (void); - \end{lstlisting} - - Das Programm \gitfile{hp}{2020ws/script}{philosophy.c} verwendet eine Funktion \lstinline{answer()}, die - in der Datei \gitfile{hp}{2020ws/script}{answer.h} extern deklariert ist. - - Der "`normale"' Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O philosophy.c -o philosophy¿ - \end{lstlisting} - liefert die Fehlermeldung: - \begin{lstlisting}[style=terminal] - /tmp/ccr4Njg7.o: In function `main': - philosophy.c:(.text+0xa): undefined reference to `answer' - collect2: ld returned 1 exit status - \end{lstlisting} - Diese stammt nicht vom Compiler, sondern vom \newterm{Linker}. - Das Programm ist syntaktisch korrekt und wird auch korrekt in eine Binärdatei umgewandelt - (hier: \file{/tmp/ccr4Njg7.o}). - Erst beim Zusammenbau ("`Linken"') der ausführbaren Datei (\file{philosophy}) - tritt ein Fehler auf. - - Tatsächlich wird die Funktion \lstinline{answer()} - nicht innerhalb von \gitfile{hp}{2020ws/script}{philosophy.c}, sondern in einer separaten Datei \gitfile{hp}{2020ws/script}{answer.c}, - einer sog.\ \newterm{Bibliothek\/} definiert. - Es ist möglich (und üblich), Bibliotheken separat vom Hauptprogramm zu compilieren. - Dadurch spart man sich das Neucompilieren, - wenn im Hauptprogramm etwas geändert wurde, nicht jedoch in der Bibliothek. - - Mit der Option \lstinline[style=cmd]{-c} weisen wir \lstinline[style=cmd]{gcc} an, - nur zu compilieren, jedoch nicht zu linken. Die Aufrufe - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -c philosophy.c¿ - $ ¡gcc -Wall -O -c answer.c¿ - \end{lstlisting} - produzieren die Binärdateien \file{philosophy.o} und \file{answer.o}, - die sogenannten \newterm{Objekt-Dateien} (daher die Endung \file{.o} oder \file{.obj}). - - Mit dem Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc philosophy.o answer.o -o philosophy¿ - \end{lstlisting} - bauen wir die beiden bereits compilierten Objekt-Dateien zu einer - ausführbaren Datei \file{philosophy} (hier ohne Endung) zusammen. - - Es ist auch möglich, im Compiler-Aufruf gleich beide C-Quelltexte zu - übergeben: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O philosophy.c answer.c -o philosophy¿ - \end{lstlisting} - In diesem Fall ruft \lstinline[style=cmd]{gcc} zweimal den Compiler auf - (für jede C-Datei einmal) und anschließend den Linker. - - \subsection{Bibliotheken verwenden (Beispiel: OpenGL)} - - Die \newterm{OpenGL\/}-Bibilothek dient dazu, - unter Verwendung von Hardware-Unterstützung dreidimensionale Grafik auszugeben. - - Die einfachste Art und Weise, OpenGL in seinen Programmen einzusetzen, - erfolgt über eine weitere Bibliothek, das \newterm{OpenGL Utility Toolkit (GLUT)}. - - Die Verwendung von OpenGL und GLUT erfolgt durch Einbinden der Include-Dateien - \begin{lstlisting} - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> - \end{lstlisting} - und die Übergabe der Bibliotheken \lstinline[style=cmd]{-lGL -lGLU -lglut} im Compiler-Aufruf: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut -o cube¿ - \end{lstlisting} - (Dies ist der Aufruf unter Unix. - Unter Microsoft Windows ist der Aufruf etwas anders - und hängt von der verwendeten Version der GLUT-Bibliothek ab. - Für Details siehe die Dokumentation der GLUT-Bibliothek - sowie die Datei \gitfile{hp}{2020ws/script}{egal.txt}.) - - Die Bibliothek stellt uns fertig geschriebene Programmfragmente zur Verfügung, insbesondere: - \begin{itemize} - \item - Funktionen: z.\,B.\ \lstinline{glutInit (&argc, argv);} - \item - Konstante: z.\,B.\ \lstinline{GLUT_RGBA} - \item - Datentypen: z.\,B.\ \lstinline{GLfloat} - \end{itemize} - - Manche OpenGL-Funktionen erwarten als Parameter ein Array. - Dies gilt z.\,B.\ beim Setzen von Farben oder beim Positionieren einer Lichtquelle: - \begin{lstlisting} - GLfloat light0_position[] = {1.0, 2.0, -2.0, 1.0}; - glLightfv (GL_LIGHT0, GL_POSITION, light0_position); - \end{lstlisting} - - Ein weiteres wichtiges allgemeines Konzept, - das in OpenGL eine Rolle spielt, ist die Übergabe einer Funktion an die Bibliothek. - Man nennt dies das \newterm{Installieren einer Callback-Funktion}. - \begin{lstlisting} - void draw (void) - { ... } - - glutDisplayFunc (draw); - \end{lstlisting} - Wir übergeben die -- von uns geschriebene -- Funktion \lstinline{draw()} - an die OpenGL-Funktion \lstinline{glutDisplayFunc()}. - Dies bewirkt, daß OpenGL immer dann, wenn etwas gezeichnet werden soll, \lstinline{draw()} aufruft. - Innerhalb von \lstinline{draw()} können wir also unsere Zeichenbefehle unterbringen. - - \breath - - Die OpenGL-Bibliothek ist sehr umfangreich - und kann im Rahmen dieser Vorlesung nicht im Detail behandelt werden. - Um trotzdem damit arbeiten zu können, - lagern wir bestimmte Teile -- Initialisierung und das Setzen von Farben -- - in eine eigene Bibliothek \file{opengl-magic} aus, die wir als "`Black Box"' verwenden. - Der Compiler-Aufruf lautet dann: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic.c -o cube¿ - \end{lstlisting} - (Wer in eigenen Projekten mehr mit OpenGL machen möchte, - ist herzlich eingeladen, die Funktionsweise von \file{opengl-magic} zu studieren.) - - \begin{itemize} - \item - Das Beispielprogramm \gitfile{hp}{2020ws/script}{cube-1.c} illustriert, - wie man grundsätzlich überhaupt ein geometrisches Objekt zeichnet. - In diesem Fall handelt es sich um einen Würfel der Kantenlänge \lstinline{0.5}, - von dem wir nur die Vorderfläche sehen, also ein Quadrat. - \begin{lstlisting}[gobble=8] - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> - #include "opengl-magic.h" - - void draw (void) - { - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); - } - - int main (int argc, char **argv) - { - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(12.5,6.4){\vector(-1,0){1}} - \put(12.6,6.4){\makebox(0,0)[l]{Bildschirm löschen}} - \put(7.5,5.95){\vector(-1,0){1}} - \put(7.6,5.95){\makebox(0,0)[l]{Rotanteil 100\,\%, Grünanteil 70\,\%, Blauanteil 0\,\%}} - \put(5.5,5.5){\vector(-1,0){1}} - \put(5.6,5.5){\makebox(0,0)[l]{Würfel zeichnen}} - \put(4.0,5.05){\vector(-1,0){1}} - \put(4.1,5.05){\makebox(0,0)[l]{Zeichnung "`abschicken"'}} - \put(5.2,4.6){\vector(-1,0){1}} - \put(5.3,4.6){\makebox(0,0)[l]{fertige Zeichnung zeigen; neues "`Zeichenpapier"' bereitlegen}} - \put(6.0,2.15){\vector(-1,0){1}} - \put(6.1,2.15){\makebox(0,0)[l]{Callback-Funktion installieren (s.\,o.)}} - \put(5.0,1.7){\vector(-1,0){1}} - \put(5.1,1.7){\makebox(0,0)[l]{Endlosschleife: Ab jetzt werden nur noch Callbacks aufgerufen.}} - \end{picture} - \item - In \gitfile{hp}{2020ws/script}{cube-2.c} kommt eine Drehung um \lstinline{-30} Grad - um eine schräge Achse \lstinline{(0.5, 1.0, 0.0)} hinzu. - Der Würfel ist jetzt als solcher zu erkennen. - - Jeder Aufruf von \lstinline{glRotatef()} bewirkt, - daß alle nachfolgenden Zeichenoperationen gedreht ausgeführt werden. - - \item - In \gitfile{hp}{2020ws/script}{cube-3.c} kommt als zusätzliches Konzept eine weitere Callback-Funktion hinzu, - nämlich ein \newterm{Timer-Handler}. - Durch den \lstinline{glutTimerFunc()}-Aufruf veranlassen wir OpenGL, - die von uns geschriebene Funktion \lstinline{timer_handler()} aufzurufen, - sobald \lstinline{50} Millisekunden vergangen sind. - - Innerhalb von \lstinline{timer_handler()} rufen wir \lstinline{glutTimerFunc()} erneut auf, - was insgesamt zur Folge hat, daß \lstinline{timer_handler()} periodisch alle 50 Millisekunden - aufgerufen wird. - - Die "`Nutzlast"' der Funktion \lstinline{timer_handler()} besteht darin, - eine Variable \lstinline{t} um den Wert \lstinline{0.05} zu erhöhen - und anschließend mittels \lstinline{glutPostRedisplay()} ein Neuzeichnen anzufordern. - Dies alles bewirkt, daß die Variable \lstinline{t} die aktuelle Zeit seit Programmbeginn - in Sekunden enthält und daß \lstinline{draw()} zwanzigmal pro Sekunde aufgerufen wird. - -% \item -% Weil das Bild während des Neuzeichnens die ganze Zeit zu sehen ist, -% flackert in \gitfile{hp}{2020ws/script}{cube-3.c} der Bildschirm. -% Dies wird in \gitfile{hp}{2020ws/script}{cube-3a.c} dadurch behoben, -% daß die Zeichnung zunächst in einem unsichtbaren Pufferspeicher aufgebaut wird. -% Erst die fertige Zeichnung wird mit dem Funktionsaufruf \lstinline{swapBuffers()} sichtbar gemacht. -% -% Damit dies möglich ist, muß beim Initialisieren ein doppelter Puffer angefordert werden. -% Zu diesem Zweck ersetzen wir die Bibliothek \gitfile{hp}{2020ws/script}{opengl-magic.c} -% durch \gitfile{hp}{2020ws/script}{opengl-magic-double.c}. -% -% Der Compiler-Aufruf lautet dann: -% \begin{lstlisting}[style=terminal,gobble=8] -% $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic-double.c -o cube¿ -% \end{lstlisting} -% -% Unabhängig davon heißt die Include-Datei weiterhin \gitfile{hp}{2020ws/script}{opengl-magic.h}. -% Dies illustriert, daß der Include-Mechanismus des Präprozessors -% und der Zusammenbau-Mecha"-nismus des Linkers tatsächlich voneinander unabhängig sind. -% -% \begin{experts} -% (Durch das Austauschen von Bibliotheken, insbesondere bei dynamischen Bibliotheken -% (Endung \file{.so} unter Unix bzw.\ \file{.dll} unter Microsoft Windows) -% ist es möglich, das Verhalten bereits fertiger Programme zu beeinflussen, -% ohne das Programm neu compilieren zu müssen. -% Dies kann zu Testzwecken geschehen, zur Erweiterung des Funktionsumfangs -% oder auch zum Einschleusen von Schadfunktionen.) -% \end{experts} - - \item - In \gitfile{hp}{2020ws/script}{cube-3.c} dreht sich der Würfel zunächst langsam, dann immer schneller. - Dies liegt daran, daß sich jedes \lstinline{glRotatef()} - auf alle nachfolgenden Zeichenbefehle auswirkt, - so daß sich sämtliche \lstinline{glRotatef()} aufaddieren. - - Eine Möglichkeit, stattdessen eine gleichmäßige Drehung zu erreichen, - besteht darin, den Wirkungsbereich des \lstinline{glRotatef()} zu begrenzen. - Dies geschieht durch Einschließen der Rotation in das Befehlspaar \lstinline{glPushMatrix()} - und \lstinline{glPopMatrix()}: - Durch \lstinline{glPopMatrix()} wird das System wieder in denjenigen Zustand versetzt, - in dem es sich vor dem Aufruf von \lstinline{glPushMatrix()} befand. - - Dies ist in \gitfile{hp}{2020ws/script}{cube-4.c} (langsame Drehung) und \gitfile{hp}{2020ws/script}{cube-5.c} (schnelle Drehung) umgesetzt. - - \end{itemize} - - \subsubsection*{Aufgabe} - - Für welche elementaren geometrischen Körper - stellt die GLUT-Bibliothek Zeichenroutinen zur Verfügung? - - \subsubsection*{Lösung} - - Ein Blick in die Include-Datei \file{glut.h} - verweist uns auf eine andere Include-Datei: - \begin{lstlisting} - #include "freeglut_std.h" - \end{lstlisting} - Wenn wir darin nach dem Wort \lstinline{glutSolidCube} suchen, - finden wir die Funktionen: - \begin{lstlisting} - glutSolidCube (GLdouble size); - glutSolidSphere (GLdouble radius, GLint slices, GLint stacks); - glutSolidCone (GLdouble base, GLdouble height, GLint slices, GLint stacks); - glutSolidTorus (GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); - glutSolidDodecahedron (void); - glutSolidOctahedron (void); - glutSolidTetrahedron (void); - glutSolidIcosahedron (void); - glutSolidTeapot (GLdouble size); - \end{lstlisting} - Zu jeder \lstinline{glutSolid}-Funktion gibt es auch eine \lstinline{glutWire}-Funktion, - beispielsweise \lstinline{glutWireCube()} als Gegenstück zu \lstinline{glutSolidCube()}. - - In demselben Verzeichnis finden wir auch eine Datei \file{freeglut\_ext.h} - mit weiteren Funktionen dieses Typs: - \begin{lstlisting} - glutSolidRhombicDodecahedron (void); - glutSolidSierpinskiSponge (int num_levels, GLdouble offset[3], GLdouble scale); - glutSolidCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks); - \end{lstlisting} - - Die GLUT-Bibliothek kennt insbesondere standardmäßig eine Funktion zum Zeichnen einer Teekanne - und als Erweiterung eine Funktion zum Zeichnen eines Sierpinski-Schwamms. - - \breath - - Die weiteren OpenGL-Beispielprogramme illustrieren den Umgang mit Transformationen. - \begin{itemize} - \item - Die Beispielprogramme \gitfile{hp}{2020ws/script}{cube-5.c} und \gitfile{hp}{2020ws/script}{cube-6.c} - illustrieren eine weitere Transformation der gezeichneten Objekte, - nämlich die Translation (Verschiebung). - - Jeder Transformationsbefehl wirkt sich jeweils - auf die \emph{danach\/} erfolgenden Zeichenbefehle aus. - Um sich zu veranschaulichen, welche Transformationen auf ein gezeichnetes Objekt wirken - (hier z.\,B.\ auf \lstinline{glutSolidCube()}), - muß man die Transformationen in der Reihenfolge \emph{von unten nach oben\/} ausführen. - - \item - Das Beispielprogramm \gitfile{hp}{2020ws/script}{orbit-1.c} - verwendet weitere Transformationen und geometrische Objekte, - um die Umlaufbahn des Mondes um die Erde zu illustrieren. - - Darüberhinaus versieht es die gezeichneten Objekte "`Mond"' und "`Erde"' mit realistischen Texturen (NASA-Fotos). - Die hierfür notwendigen doch eher komplizierten Funktionsaufrufe - wurden wiederum in eine Bibliothek (\file{textured-spheres}) ausgelagert. - - \end{itemize} - -\iffalse - - \subsection{Standard-Pfade} - - Wenn eine Bibliothek regelmäßig von vielen Programmierern benutzt - wird, wird sie üblicherweise an einem Standard-Ort abgelegt, z.\,B.\ in - dem Verzeichnis \file{/usr/lib}. - - \lstinline[style=cmd]{gcc} erwartet, daß die Namen von Bibliotheksdateien mit \file{lib} - beginnen und die Endung \file{.a} oder \file{.so} haben. (\file{.a} steht für - "`Archiv"', da eine \file{.a}-Datei mehrere \file{.o}-Dateien enthält. - \file{.so} steht für "`shared object"' und bezeichnet eine Bibliothek, die - erst zur Laufzeit eingebunden wird und von mehreren Programmen - gleichzeitig benutzt werden kann. Andere übliche Bezeichnungen - sind \file{.lib} anstelle von \file{.a} und \file{.dll} anstelle von \file{.so}.) - - Mit der Option \lstinline[style=cmd]{-lfoo} teilen wir \lstinline[style=cmd]{gcc} mit, daß wir eine Datei - \file{libfoo.a} aus einem der Standardverzeichnisse verwenden möchten. - ("`foo"' ist eine metasyntaktische Variable und steht für ein - beliebiges Wort.) Auch der Aufruf \lstinline[style=cmd]{-lm} zum Einbinden der - Mathematik-Bibliothek ist nichts anderes. Tatsächlich gibt es - eine Datei \file{libm.a} im Verzeichnis \file{/usr/lib}. - \begin{verbatim} - gcc test.c -lm -o test\end{verbatim} - ist somit dasselbe wie - \begin{verbatim} - gcc test.c /usr/lib/libm.a -o test\end{verbatim} - - Mit der Option \lstinline[style=cmd]{-L /foo/bar} können wir ein Verzeichnis \file{/foo/bar} - dem Suchpfad hinzufügen. ("`bar"' ist eine weitere metasyntaktische - Variable.) - \begin{verbatim} - gcc test.c -L /home/joe/my_libs -lmy -o test\end{verbatim} - compiliert \file{test.c} und linkt es mit einer Bibliothek \file{libmy.a}, - nach der nicht nur in den Standardverzeichnissen (\file{/usr/lib}, - \file{/usr/local/lib} u.\,a.), sondern zusätzlich im Verzeichnis - \file{/home/joe/my\_libs} gesucht wird. - - Auf gleiche Weise kann man mit \lstinline[style=cmd]{-I /foo/bar} Verzeichnisse für - Include-Dateien (s.\,o.)\ dem Standardsuchpfad hinzufügen. - -\fi - - \subsection{Projekt organisieren: make} - - In größeren Projekten ruft man den Compiler (und Präprozessor und - Linker) nicht "`von Hand"' auf, sondern überläßt dies einem weiteren - Programm namens \lstinline[style=cmd]{make}. - - \lstinline[style=cmd]{make} sucht im aktuellen Verzeichnis nach einer Datei \file{Makefile} - (ohne Dateiendung). (Normalerweise gibt es nur ein Makefile pro - Verzeichnis. Falls es doch mehrere gibt, kann man die Datei, z.\,B.\ - \file{Makefile.1}, mit \lstinline[style=cmd]{-f} - auch explizit angeben: \lstinline[style=cmd]{make -f Makefile.1}.) - - \subsubsection{make-Regeln} - - Ein Makefile enthält sog.\ Regeln, um Ziele zu erzeugen. - Eine Regel beginnt mit der Angabe des Ziels, gefolgt von einem - Doppelpunkt und den Dateien (oder anderen Zielen), von denen es - abhängt. Darunter steht, mit einem Tabulator-Zeichen eingerückt, der - Programmaufruf, der nötig ist, um das Ziel zu bauen. - \begin{lstlisting}[language=make] - philosophy.o: philosophy.c answer.h - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - Achtung: Ein Tabulator-Zeichen läßt sich optisch häufig nicht von - mehreren Leerzeichen unterscheiden. \lstinline[style=cmd]{make} - akzeptiert jedoch nur das Tabulator-Zeichen. - - Die o.\,a.\ Regel bedeutet, daß jedesmal, wenn sich \gitfile{hp}{2020ws/script}{philosophy.c} oder - \gitfile{hp}{2020ws/script}{answer.h} geändert hat, \lstinline[style=cmd]{make} - das Programm \lstinline[style=cmd]{gcc} in der beschriebenen Weise aufrufen soll. - - Durch die Kombination mehrerer Regeln lernt \lstinline[style=cmd]{make}, - welche Befehle in welcher Reihenfolge aufgerufen werden müssen, - je nachdem, welche Dateien geändert wurden. - - \breath - - Beispiel: \file{Makefile.orbit-x1} - - Der Aufruf - \begin{lstlisting}[style=terminal] - $ ¡make -f Makefile.orbit-x1¿ - \end{lstlisting} - bewirkt beim ersten Mal: - \begin{lstlisting}[style=terminal] - gcc -Wall -O orbit-x1.c opengl-magic-double.c textured-spheres.c \ - -lGL -lGLU -lglut -o orbit-x1 - \end{lstlisting} - Beim zweiten Aufruf stellt \lstinline[style=cmd]{make} fest, daß sich keine der Dateien - auf der rechten Seite der Regeln (rechts vom Doppelpunkt) geändert - hat und ruft keine Programme auf: - \begin{lstlisting}[style=terminal] - make: »orbit-x1« ist bereits aktualisiert. - \end{lstlisting} - - \subsubsection{make-Macros} - - Um wiederkehrende Dinge (typischerweise: Listen von Dateinamen oder - Compiler-Optionen) nicht mehrfach eingeben zu müssen, kennt \lstinline[style=cmd]{make} - sog.\ Macros: - \begin{lstlisting}[language=make] - PHILOSOPHY_SOURCES = philosophy.c answer.h - \end{lstlisting} - Um den Macro zu expandieren, setzt man ihn in runde Klammern mit - einem vorangestellten Dollarzeichen. Die Regel - \begin{lstlisting}[language=make] - philosophy.o: $(PHILOSOPHY_SOURCES) - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - ist also nur eine andere Schreibweise für: - \begin{lstlisting}[language=make] - philosophy.o: philosophy.c answer.h - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - - \breath - - Beispiel: \file{Makefile.blink} - - Die Beispielprogramme \file{blink-\lstinline{*}.c} sind dafür gedacht, - auf einem Mikrocontroller zu laufen. - Der Compiler-Aufruf erfordert zusätzliche Optionen - (z.\,B.\ \lstinline[style=cmd]{-Os -mmcu=atmega32}), - und es müssen zusätzliche Entwicklungswerkzeuge - (z.\,B.\ \lstinline[style=cmd]{avr-objcopy}) aufgerufen werden -- - ebenfalls mit den richtigen Optionen. - Der Prozeß des Zusammenbauens wird durch ein Makefile \file{Makefile.blink} verwaltet. - - \file{Makefile.blink} speichert den Namen des Quelltextes - (ohne die Endung \file{.c}) in einem Macro. - Durch Ändern allein dieses Macros ist es daher möglich, - das Makefile für ein anderes Projekt einzusetzen. - - Zusätzlich führt \file{Makefile.blink} eine neue Regel \lstinline{clean} ein. - Diese bewirkt üblicherweise, daß alle automatisch erzeugten Dateien - gelöscht werden: - \begin{lstlisting}[language=make] - clean: - rm -f $(TARGET).elf $(TARGET).hex - \end{lstlisting} - Rechts vom Doppelpunkt nach \lstinline[language=make]{clean} befinden sich keine - Abhängigkeitsdateien. Dies hat zur Folge, daß die Aktion - (\lstinline{rm -f ...}) bei \lstinline[style=cmd]{make clean} - grundsätzlich immer ausgeführt wird, also nicht nur, wenn sich irgendeine Datei geändert hat. - - \begin{experts} - Ebenfalls üblich ist eine weitere Regel \lstinline[language=make]{install}, - die bewirkt, daß die Zieldateien - (bei einem Programm typischerweise eine ausführbare Datei, - bei einer Bibliothek typischerweise \file{.a}-, \file{.so}- sowie \file{.h}-Dateien) - an ihren endgültigen Bestimmungsort kopiert werden. - \end{experts} - - \subsubsection{Fazit: 3 Sprachen} - - Um in C programmieren zu können, muß man also tatsächlich drei - Sprachen lernen: - \begin{itemize} - \item C selbst, - \item die Präprozessor-Sprache - \item und die \lstinline[style=cmd]{make}-Sprache. - \end{itemize} - Durch Entwicklungsumgebungen wie z.\,B.\ \file{Eclipse} läßt sich der - \lstinline[style=cmd]{make}-Anteil teilweise automatisieren. (\file{Eclipse} z.\,B.\ schreibt ein - Makefile; andere Umgebungen übernehmen die Funktionalität von \lstinline[style=cmd]{make} - selbst.) Auch dort muß man jedoch die zu einem Projekt gehörenden - Dateien verwalten. - - Wenn sich dann eine Datei nicht an dem Ort befindet, - erhält man u.\,U.\ wenig aussagekräftige Fehlermeldungen, z.\,B.: - \begin{lstlisting}[style=terminal] - make: *** No rule to make target `MeinProgramm.elf', needed by `elf'. Stop. - \end{lstlisting} - Wenn man dann um die Zusammenhänge weiß ("`Welche Bibliotheken verwendet mein - Programm? Wo befinden sich diese? Und wie erfährt der Linker davon?"'), - kann man das Problem systematisch angehen und ist nicht auf Herumraten - angewiesen. - - \section{Hardwarenahe Programmierung} - - \subsection{Bit-Operationen} - - \setlength{\unitlength}{12pt} - - \subsubsection{Zahlensysteme} - - \subsubsection*{Dezimalsystem} - \begin{itemize} - \item - Basis: 10 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - \end{itemize} - \begin{verbatim} - 137 137 - + 42 - ---- - 179 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{Einer: $7 \cdot 10^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{Zehner: $3 \cdot 10^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{Hunderter: $1 \cdot 10^2$}} - \put(2.5,0.5){\mbox{$137_{10} = 1 \cdot 10^2 + 3 \cdot 10^1 + 7 \cdot 10^0 - = 100 + 30 + 7 = 137$}} - \end{picture} - - \goodbreak - \subsubsection*{Hexadezimalsystem} - \begin{itemize} - \item - Basis: 16 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F - \end{itemize} - \begin{verbatim} - 137 A380 - + B747 - ----- - 15AC7 - \end{verbatim} - \begin{picture}(0,0)(-0,-0.25) - \put(18.6,4.2){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$7 \cdot 16^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$3 \cdot 16^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 16^2$}} - \put(2.5,0.5){\mbox{$137_{16} = 1 \cdot 16^2 + 3 \cdot 16^1 + 7 \cdot 16^0 - = 256 + 48 + 7 = 311$}} - \end{picture} - \begin{itemize} - \item - Schreibweise in C: \quad \texttt{0x137} - \end{itemize} - - \goodbreak - \subsubsection*{Oktalsystem} - \begin{itemize} - \item - Basis: 8 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7 - \end{itemize} - \begin{verbatim} - 137 137 - + 42 - ---- - 201 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \put(19.6,3.7){\mbox{\scriptsize\texttt{1}}} - \put(19.1,3.7){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$7 \cdot 8^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$3 \cdot 8^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 8^2$}} - \put(2.5,0.5){\mbox{$137_8 = 1 \cdot 8^2 + 3 \cdot 8^1 + 7 \cdot 8^0 - = 64 + 24 + 7 = 95$}} - \put(2.5,-0.6){\mbox{$42_8 = 4 \cdot 8^1 + 2 \cdot 8^0 - = 32 + 2 = 34$}} - \put(2.5,-1.7){\mbox{$201_8 = 2 \cdot 8^2 + 0 \cdot 8^1 + 1 \cdot 8^0 - = 128 + 1 = 129$}} - \end{picture} - \vspace{0.75cm} - \begin{itemize} - \item - Schreibweise in C: \quad \texttt{0137} - \end{itemize} - - \subsubsection*{Rechner für beliebige Zahlensysteme: GNU bc} - \begin{lstlisting}[style=terminal] - $ ¡bc - ibase=8 - 137¿ - 95 - ¡obase=10 - 137 + 42¿ - 201 - \end{lstlisting} - \begin{picture}(0,0)(0.5,1.2) - \color{red} - \put(8.0,7.25){\vector(-1,0){3}} - \put(8.5,7){\mbox{Eingabe zur Basis 8}} - \put(8.0,6.25){\vector(-1,0){4}} - \put(8.5,6){\mbox{Ausgabe zur Basis 10}} - \put(9.0,5.25){\vector(-1,0){2}} - \put(9.5,5){\mbox{Eingabe zur Basis 8 ($10_8 = 8$)}} - \put(8.0,3.25){\vector(-1,0){4}} - \put(8.5,3){\mbox{Ausgabe zur Basis 8}} - \end{picture}\vspace{-2ex} - - \goodbreak - \subsubsection*{Binärsystem} - \begin{itemize} - \item - Basis: 2 - \item - Gültige Ziffern: 0, 1 - \end{itemize} - \begin{verbatim} - 110 110 - + 1100 - ----- - 10010 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \put(19.1,3.8){\mbox{\scriptsize\texttt{1}}} - \put(18.6,3.8){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$0 \cdot 2^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$1 \cdot 2^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 2^2$}} - \put(2.5,0.5){\mbox{$110_2 = 1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0 - = 4 + 2 + 0 = 6$}} - \end{picture} - \begin{itemize} - \item - Binär-Zahlen ermöglichen es, elektronisch zu rechnen \dots - \item - und mehrere "`Ja/Nein"' (Bits) zu einer einzigen Zahl zusammenzufassen. - \goodbreak - \item - \textbf{Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise - in Binär-Zahlen umrechnen:} - \end{itemize} - \vspace*{-6mm} - \begin{verbatim} - 000 0 0000 0 1000 8 - 001 1 0001 1 1001 9 - 010 2 0010 2 1010 A - 011 3 0011 3 1011 B - 100 4 0100 4 1100 C - 101 5 0101 5 1101 D - 110 6 0110 6 1110 E - 111 7 0111 7 1111 F - \end{verbatim} - \vspace*{-1cm} - \begin{itemize} - \item[] - Beispiel: $1101011_2 = 153_8 = 6{\rm B}_{16}$ - \item[] - Anwendungsbeispiel: Oktal-Schreibweise für Unix-Zugriffsrechte\\ - \lstinline[style=terminal]|-rw-r-----| $= 0\,110\,100\,000_2 = 640_8$ \qquad \lstinline[style=terminal]|$ chmod 640 file.c|\\ - \lstinline[style=terminal]|-rwxr-x---| $= 0\,111\,101\,000_2 = 750_8$ \qquad \lstinline[style=terminal]|$ chmod 750 subdir| - \end{itemize} - - \goodbreak - \subsubsection*{IP-Adressen (IPv4)} - \begin{itemize} - \item - Basis: 256 - \item - Gültige Ziffern: 0 bis 255, getrennt durch Punkte - \item - Kompakte Schreibweise für Binärzahlen mit 32 Ziffern (Bits) - \end{itemize} - \begin{verbatim} - 192.168.0.1 - - - - - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(8.75,5.25){\vector(-1,1){1.41}} - \put(9.25,5){\mbox{$1 \cdot 256^0$}} - \put(8.75,4.25){\vector(-1,1){2.41}} - \put(9.25,4){\mbox{$0 \cdot 256^1$}} - \put(8.25,3.25){\vector(-1,1){3.41}} - \put(8.75,3){\mbox{$168 \cdot 256^2$}} - \put(7.5,2.25){\vector(-1,1){4.41}} - \put(8.0,2){\mbox{$192 \cdot 256^3$}} - \put(2.5,0.5){\mbox{$192.168.0.1_{256} = 11000000\,10101000\,00000000\,00000001_2$}} - \end{picture} - \vspace*{-0.5cm} - - \goodbreak - \subsubsection{Bit-Operationen in C} - \begin{verbatim} - 0110 0110 0110 0110 0110 - + 1100 | 1100 & 1100 ^ 1100 ~ 1100 >> 2 - ----- ----- ----- ----- ----- ----- - 10010 1110 0100 1010 0011 0001 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Addition}} - \put(8.5,1.0){\mbox{Oder}} - \put(14.0,1.0){\mbox{Und}} - \put(18.0,1.0){\mbox{Exklusiv-Oder}} - \put(24.5,1.0){\mbox{Negation}} - \put(29.0,1.0){\mbox{Bit-Verschiebung}} - \end{picture} - - \begin{verbatim} - 01101100 01101100 01101100 - | 00000010 & 11110111 ^ 00010000 - --------- --------- --------- - 01101110 01100100 01111100 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Bit gezielt setzen}} - \put(12.5,1.0){\mbox{Bit gezielt löschen}} - \put(22.5,1.0){\mbox{Bit gezielt umklappen}} - \end{picture} - \begin{itemize} - \item - Bits werden häufig von rechts und ab 0 numeriert (hier: 0 bis 7),\\ - um die Maskenerzeugung mittels Schiebeoperatoren zu erleichtern. - \item - Die Bit-Operatoren (z.\,B.\ \lstinline|&| in C) - wirken jeweils auf alle Bits der Zahlen. - \hfill{\color{red}\lstinline|6 & 12 == 4|}\qquad\strut\\ - Die logischen Operatoren (z.\,B.\ \lstinline|&&| in C) - prüfen die Zahl insgesamt auf $\ne 0$. - \hfill{\color{red}\lstinline|6 && 12 == 1|}\qquad\strut\\ - Nicht verwechseln! - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 (also das dritte Bit von rechts) in einer 8-Bit-Zahl auf 1 setzen: - \begin{verbatim} - 00000001 01101100 - << 2 | 00000100 - --------- --------- - 00000100 01101100 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(3.5,1.0){\mbox{Maske für Bit 2}} - \put(12.5,1.0){\mbox{Bit gezielt setzen}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,a |= 1 << 2;, - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 in einer 8-Bit-Zahl auf 0 setzen: - \begin{verbatim} - 00000001 01101100 - << 2 ~ 00000100 & 11111011 - --------- --------- --------- - 00000100 11111011 01101000 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(3.5,1.0){\mbox{Maske zum Löschen von Bit 2 erzeugen}} - \put(22.5,1.0){\mbox{Bit gezielt löschen}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,a &= ~(1 << 2);, - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 aus einer 8-Bit-Zahl extrahieren: - \begin{verbatim} - 00000001 01101100 00000100 - << 2 & 00000100 >> 2 - --------- --------- --------- - 00000100 00000100 00000001 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Maske für Bit 2}} - \put(12.5,1.0){\mbox{Bit 2 isolieren}} - \put(22.5,1.0){\mbox{in Zahl 0 oder 1 umwandeln}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,x = (a & (1 << 2)) >> 2;, - \end{itemize} - - \bigbreak - - Beispiel: Netzmaske für 256 IP-Adressen - \begin{verbatim} - 192.168. 1.123 - & 255.255.255. 0 - ---------------- - 192.168. 1. 0 - \end{verbatim} - \begin{picture}(0,0)(0,0) - \color{red} - \put(14.0,6.25){\vector(-1,0){2}} - \put(14.5,6){\mbox{IP-Adresse eines Rechners}} - \put(14.0,5.25){\vector(-1,0){2}} - \put(14.5,5){\mbox{Netzmaske: $255 = 11111111_2$}} - \put(14.0,3.25){\vector(-1,0){2}} - \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}} - \end{picture}\vspace{-6ex} - - \bigbreak - - Beispiel: Netzmaske für 8 IP-Adressen - \begin{verbatim} - 192.168. 1.123 01111011 - & 255.255.255.248 & 11111000 - ---------------- --------- - 192.168. 1.120 01111000 - \end{verbatim} - \begin{picture}(0,0)(0,0) - \color{red} - \put(14.0,6.25){\vector(-1,0){2}} - \put(14.5,6){\mbox{IP-Adresse eines Rechners}} - \put(14.0,5.25){\vector(-1,0){2}} - \put(14.5,5){\mbox{Netzmaske}} - \put(14.0,3.25){\vector(-1,0){2}} - \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}} - \end{picture}\vspace{-6ex} - - \subsection{Programmierung von Mikrocontrollern} - - Ein Mikrocontroller ist ein elektronischer Baustein, - der einen kompletten Computer mit eingeschränkter Funktionalität enthält. - - Mit "`eingeschränkter Funktionalität"' ist gemeint, - daß auf einem Mikrocontroller kein Universal-Betriebssystem läuft, - sondern daß darauf nur ein einziges Programm läuft, - nämlich die Anwendungs-Software. - - Wenn ein Baustein einen kompletten Computer enthält, - der leistungsfähig genug ist, - daß darauf ein Universal-Betriebssystem laufen kann, - spricht man normalerweise nicht mehr von einem Mikrocontroller, - sondern von einem Ein-Chip-Computer. - Der Übergang ist fließend. - - \breath - - Da ein Mikrocontroller nicht über die Leistung verfügt, - einen Compiler laufen zu lassen, - erfolgt die Entwicklung von Software für Mikrocontroller - auf einem "`normalen"' Computer. - Diese Art der Software-Entwicklung, - bei der ein Computer Software für einen ganz anderen Computer erzeugt, - bezeichnet man als \newterm{Cross-Entwicklung}. - Die einzelnen Werkzeuge heißen entsprechend - \newterm{Cross-Compiler}, \newterm{Cross-Assembler\/} und \newterm{Cross-Linker}. - - Beispiel: Erzeugen einer ausführbaren Datei \file{blink.elf} - aus einem C-Quelltext \file{blink.c} - für einen Mikrocontroller vom Typ ATmega328P - \begin{lstlisting}[style=cmd] - avr-gcc -Wall -Os -mmcu=atmega328p blink.c -o blink.elf - \end{lstlisting} - - Damit der Mikrocontroller die ausführbare Datei ausführen kann, - muß man sie mit einem speziellen Werkzeug auf den Mikrocontroller - \newterm{herunterladen}. - Hierfür ist es oft notwendig, die Datei vorher in ein anderes Dateiformat - zu konvertieren. - - Beispiel: Konvertierung der ausführbaren Datei \file{blink.elf} - aus dem ELF-Dateiformat in das Intel-HEX-Format: - \begin{lstlisting}[style=cmd] - avr-objcopy -O ihex blink.elf blink.hex - \end{lstlisting} - - Anschließend kann die Datei auf den Mikrocontroller heruntergeladen werden. - Beispiel: Herunterladen der Datei \file{blink.hex} - in den Flash-Speicher eines ATmega328P-Mikrocontrollers - auf einem Mikrocontroller-Board vom Typ Arduino Uno - über die Schnittstelle \file{/dev/ttyACM0} - \begin{lstlisting}[style=cmd] - avrdude -P /dev/ttyACM0 -c arduino -p m328p -U flash:w:blink.hex - \end{lstlisting} - - \subsection{I/O-Ports} - - Es gibt drei grundlegende Mechanismen für die Kommunikation zwischen dem Prozessor - und einem externen Gerät: - \begin{itemize} - \item - Über Output-Ports kann der Prozessor das Gerät aktiv steuern, - \item - über Input-Ports kann er es aktiv abfragen, - \item - und über Interrupts kann das externe Gerät im Prozessor Aktivitäten auslösen. - \end{itemize} - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - - \setlength{\unitlength}{1cm} - - Input- und Output-Ports, zusammengefaßt: I/O-Ports, - sind spezielle Speicherzellen, die mit einem externen Gerät verbunden sind. - \begin{itemize} - \item - Ein in einen Output-Port geschriebener Wert bewirkt eine Spannungsänderung in einer Leitung, - die zu einem externen Gerät führt. - \item - Wenn ein externes Gerät eine Spannung an eine Leitung anlegt, die zu einer Speicherzelle führt, - kann der Prozessor diese als Input-Port lesen. - \end{itemize} - - Um z.\,B.\ auf einen Druck auf einen Taster zu warten, - kann ein Program periodisch in einer Schleife einen Input-Port lesen - und die Schleife erst dann beenden, wenn der Wert für "`Taster gedrückt"' gelesen wurde. - - Diese Methode heißt "`Busy Waiting"': Der Prozessor ist vollständig mit Warten beschäftigt. - Wenn gleichzeitig noch andere Aktionen stattfinden sollen, - müssen diese in der Schleife mit berücksichtigt werden. - - \bigskip - \goodbreak - - Beispiel für die Verwendung eines Output-Ports: Roboter-Steuerung\\ - Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\ - Suchbegriff: setMotorDir - \goodbreak - \begin{lstlisting} - void setMotorDir(uint8_t left_dir, uint8_t right_dir) - { - mleft_dir = left_dir; - mright_dir = right_dir; - mleft_des_dir = left_dir; - mright_des_dir = right_dir; - if(left_dir) - PORTC |= DIR_L; - else - PORTC &= ~DIR_L; - if(right_dir) - PORTC |= DIR_R; - else - PORTC &= ~DIR_R; - } - \end{lstlisting} - - Die Variable \lstinline|PORTC| ist ein Output-Port. - Durch Manipulation einzelner Bits in dieser Variablen - ändert sich die Spannung an den elektrischen "`Beinchen"' des Mikrocontrollers. - Hierdurch wird die Beschaltung von Elektromotoren umgepolt. - - (Die Konstanten \lstinline|DIR_L| und \lstinline|DIR_R| sind "`Bitmasken"', - d.\,h.\ Zahlen, die in ihrer Binärdarstellung nur eine einzige $1$ und ansonsten Nullen haben. - Durch die Oder- und Und-Nicht-Operationen werden einzelne Bits in \lstinline|PORTC| auf $1$ bzw.\ $0$ gesetzt.) - - \bigskip - - Die direkte Ansteuerung von I/O-Ports ist nur auf Mikrocontrollern üblich. - Auf Personal-Computern erfolgt die gesamte Ein- und Ausgabe über Betriebssystem-"`Treiber"'. - Anwenderprogramme greifen dort i.\,d.\,R.\ nicht direkt auf I/O-Ports zu. - - \subsection{Interrupts} - - Ein Interrupt ist ein Unterprogramm, das nicht durch einen Befehl (\lstinline|call|), - sondern durch ein externes Gerät (über ein Stromsignal) aufgerufen wird. - - Damit dies funktionieret, muß die Adresse, an der sich das Unterprogramm befindet, - an einer jederzeit auffindbaren Stelle im Speicher hinterlegt sein. - Diese Stelle heißt "`Interrupt-Vektor"'. - - Da ein Interrupt jederzeit erfolgen kann, - hat das Hauptprogramm keine Chance, vor dem Aufruf die Registerinhalte zu sichern. - Für Interrupt-Unterprogramme, sog.\ Interrupt-Handler, - ist es daher zwingend notwendig, sämtliche Register vor Verwendung zu sichern - und hinterher zurückzuholen. - - \bigskip - - Beispiel für die Verwendung eines Interrupts: Roboter-Steuerung\\ - Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\ - Suchbegriff: ISR - \begin{lstlisting} - ISR (INT0_vect) - { - mleft_dist++; - mleft_counter++; - /* ... */ - } - \end{lstlisting} - \begin{itemize} - \item - Durch das Schlüsselwort \lstinline|ISR| anstelle von z.\,B.\ \lstinline|void| - teilen wir dem Compiler mit, daß es sich um einen Interrupt-Handler handelt, - so daß er entsprechenden Code zum Sichern der Registerinhalte einfügt. - \item - Durch die Namensgebung \lstinline|INT0_vect| teilen wir dem Compiler mit, - daß er den Interrupt-Vektor Nr.\ 0 (also den ersten) - auf diesen Interrupt-Handler zeigen lassen soll. - \end{itemize} - (Tatsächlich handelt es sich bei \lstinline|ISR| und \lstinline|INT0_vect| um Macros.) - - Die Schreibweise ist spezifisch für die Programmierung des Atmel AVR ATmega - unter Verwendung der GNU Compiler Collection (GCC). - Bei Verwendung anderer Werkzeuge und/oder Prozessoren - kann dasselbe Programm völlig anders aussehen. - Wie man Interrupt-Handler schreibt und wie man Interrupt-Vektoren setzt, - ist ein wichtiger Bestandteil der Dokumentation der Entwicklungswerkzeuge. - - \bigskip - - Die so geschriebene Funktion wird immer dann aufgerufen, wenn die - Hardware den Interrupt Nr.\ 0 auslöst. Wann das der Fall ist, hängt - von der Beschaltung ab. Im Falle des RP6 geschieht es dann, wenn - ein Sensor an der linken Raupenkette einen schwarzen Streifen auf - der Encoder-Scheibe registriert, also immer dann, wenn sich die - linke Raupenkette des Roboters um eine bestimmte Strecke gedreht - hat. - - Jedesmal wenn sich die Raupenkette um einen Teilstrich weitergedreht hat, - werden also zwei Zähler inkrementiert. - Wir können dies nutzen, um z.\,B.\ durch Auslesen des Zählers \lstinline|mleft_dist| - die zurückgelegte Entfernung zu messen. - (Die RP6-Bibliothek selbst stellt nur eine Zeit- und eine Geschwindigkeitsmessung zur Verfügung.) - Wie dies konkret geschehen kann, sei im folgenden vorgestellt. - - \goodbreak - - Methode 1: Verändern des Interrupt-Handlers - \begin{itemize} - \item - Da die Bibliothek \lstinline|RP6RobotBase| im Quelltext vorhanden ist, - können wir sie selbst ändern und in den Interrupt-Handler - \lstinline|ISR (INT0_vect)| einen eigenen Zähler für Sensor-Ticks einbauen. - \item - Wenn wir diesen zum Zeitpunkt A auf 0 setzen und zum Zeitpunkt B - auslesen, erfahren wir, wieviele "`Ticks"' der Roboter dazwischen - zurückgelegt hat. - \end{itemize} - - Methode 2: Verwenden eines vorhandenen Zählers - \begin{itemize} - \item - Tatsächlich enthält \lstinline|ISR (INT0_vect)| bereits zwei Zähler, die - bei jedem Sensor-"`Tick"' hochgezählt werden: \lstinline|mleft_dist| und - \lstinline|mleft_counter|. - \item - Einer davon (\lstinline|mleft_dist|) wird bei jedem \lstinline|move()| auf 0 - zurückgesetzt. Für diesen Zähler enthält \lstinline|RP6RobotBaseLib.h| - einen "`undokumentierten"' Makro \lstinline|getLeftDistance()|, um ihn - auszulesen. - \item - Bei sorgfältiger Lektüre von \lstinline|RP6RobotBaseLib.c| erkennt man, daß - es unproblematisch ist, den Zähler vom Hauptprogramm aus auf 0 zu - setzen. (Dies ist jedoch mit Vorsicht zu genießen: In einer - eventuellen Nachfolgeversion der Bibliothek muß dies nicht mehr - der Fall sein!) - \end{itemize} - - Methode 3: Abfrage der Sensoren mittels Busy Waiting - \begin{itemize} - \item - Alternativ zur Verwendung des Interrupt-Handlers kann man auch - von der eigenen Hauptschleife aus den Sensor periodisch abfragen - und bei jeder Änderung einen Zähler hochzählen. - \item - Diese Methode heißt "`Busy Waiting"'. Sie hat den Vorteil der - Einfachheit aber den Nachteil, daß der Prozessor "`in Vollzeit"' - damit beschäftigt ist, einen Sensor abzufragen, und eventuelle - andere Aufgaben nur noch "`nebenher"' erledigen kann. - \item - Wenn aus irgendwelchen Gründen der Interrupt-Mechanismus nicht - verwendet werden kann (z.B. weil der Prozessor über kein - Interrupt-Konzept verfügt), könnten wir die Lichtschranke alternativ auch mit einem Input-Port - verdrahten und mittels Busy Waiting abfragen. - - Dies funktioniert nur dann, wenn die Schleife wirklich regelmäßig den Sensor abfragt. - Sobald der Prozessor längere Zeit mit anderen Dingen beschäftigt ist, - können beim Busy Waiting Signale der Lichtschranke verlorengehen. - Dieses Problem besteht nicht bei Verwendung von Interrupts. - \end{itemize} - - \subsection{volatile-Variable} - - Im C-Quelltext fällt auf, daß die Zähler-Variablen \lstinline|mleft_dist| und \lstinline|mleft_counter|\\ - als \lstinline|volatile uint16_t mleft_counter| bzw.\ \lstinline|volatile uint16_t mleft_dist| deklariert sind\\ - anstatt einfach nur als \lstinline|uint16_t mleft_counter| und \lstinline|uint16_t mleft_dist|. - - Das Schlüsselwort \lstinline|volatile| teilt dem C-Compiler mit, - daß eine Variable immer im Speicher (RAM) aufbewahrt werden muß - und nicht in einem Prozessorregister zwischengespeichert werden darf. - - Dies ist deswegen wichtig, weil jederzeit ein Interrupt erfolgen - kann, der den Wert der Variablen im Speicher verändert. Wenn im - Hauptprogramm alle "`überflüssigen"' Speicherzugriffe wegoptimiert - wurden, erfährt es nichts von der Änderung. - - Entsprechendes gilt für I/O-Ports: - Wenn ein Programm einen Wert in einen Output-Port schreiben oder aus einem Input-Port lesen soll, - ist es wichtig, daß der Speicherzugriff auch tatsächlich stattfindet. - -\iffalse - - \subsection{Software-Interrupts} - - Manche Prozessoren verfügen über einen Befehl, um Interrupts "`künstlich"' auszulösen. - - Das Betriebssystem MS-DOS verwendet derartige Aufrufe - anstelle von "`normalen"' Unterprogrammaufrufen, - um Programmen Funktionen zur Verfügung zu stellen. - - \bigskip - \goodbreak - - Beispiel: Assembler-Version von \lstinline| printf ("Hello, world!\n") | unter MS-DOS bzw.\ Unix - - \medskip - - \lstinline| |MS-DOS-Version für FASM (gekürzt)\hspace{3cm} Unix-Version für GCC (gekürzt) - \begin{verbatim} - hello db 'Hello, world', 10, 13, '$' hello: - .string "Hello, world!\n" - mov ah, 09h - mov dx, hello pushl $hello - int 21h call printf\end{verbatim} - - \begin{itemize} - \item - Die MS-DOS-Version ruft den Interrupt Nr.\ 33 (hexadezimal: 21) auf: \lstinline| int 21h|.\\ - Die Unix-Version verwendet stattdessen einen normalen Unterprogrammaufruf: \lstinline| call printf|. - \item - Die MS-DOS-Version übergibt Parameter in Prozessorregistern:\\ - Die Konstante \lstinline|09h| im \lstinline|ah|-Register wählt die Funktion "`Textausgabe"' aus;\\ - das \lstinline|dx|-Register enthält einen Zeiger auf den Text. - - Die Unix-Version benutzt den Stack zur Übergabe des Parameters: \lstinline| pushl $hello|.\\ - (\lstinline|$hello| ist ein Zeiger auf den Text.) - \item - Obwohl beide Programme auf demselben Prozessor laufen, - unterscheiden sich die Sprachdialekte der beiden Assember FASM und GCC erheblich voneinander.\\ - (Reihenfolge der Operanden umgekehrt, Suffix \lstinline|l| für "`long"', Präfix \lstinline|$| für Konstanten, \dots) - \end{itemize} - - Derartige "`Software-Interrupts"' verursachen Probleme, - sobald ein Gerät den Interrupt für seinen eigentlichen Zweck verwendet. - MS-Windows verwendet -- außer zur Emulation von MS-DOS -- keine Software-Interrupts mehr. - - \bigskip - - (Ein sehr ähnlicher Mechanismus wird von modernen Betriebssystemen weiterhin für Systemaufrufe genutzt. - Hier geht es darum, den Übergang von potentiell unsicherem Code in Anwenderprogrammen - zum vertrauenswürdigen Code des Betriebssystems zu kontrollieren. Für Details siehe:\\ - \url{http://de.wikipedia.org/wiki/Software-Interrupt}, \url{http://de.wikipedia.org/wiki/Systemaufruf}) - -\fi - - \subsection{Byte-Reihenfolge -- Endianness} - - \subsubsection{Konzept} - - Beim Speichern von Werten, - die größer sind als die kleinste adressierbare Einheit\\ - (= Speicherzelle oder Speicherwort, häufig 1 Byte), werden mehrere Speicherworte belegt. - - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - \begin{displaymath} - 1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16} - \end{displaymath} - - Diese 16-Bit-Zahl kann auf zwei verschiedene Weisen - in zwei 8-Bit-Speicherzellen gespeichert werden: - \begin{center} - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-1pt}{04} & \raisebox{-1pt}{03} & \strut \newterm{Big-Endian}, "`großes Ende zuerst"', \\\cline{1-2} - \multicolumn{2}{c}{} & für Menschen leichter lesbar \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-1pt}{03} & \raisebox{-1pt}{04} & \strut \newterm{Little-Endian}, "`kleines Ende zuerst"', \\\cline{1-2} - \multicolumn{2}{c}{} & bei Additionen effizienter \\ - \multicolumn{2}{c}{} & (Schriftliches Addieren beginnt immer beim Einer.) - \end{tabular} - \end{center} - Welche Konvention man verwendet, ist letztlich Geschmackssache - und hängt von der verwendeten Hardware (Prozessor) und Software ab. - Man spricht hier von der \newterm{Endianness\/} (Byte-Reihenfolge) der Hardware bzw.\ der Software. - - Im Kontext des Datenaustausches ist es wichtig, - sich auf eine einheitliche Endianness zu verständigen. - Dies gilt insbesondere für: - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - - \goodbreak - \subsubsection{Dateiformate} - - Als Beispiel für Dateiformate, in denen die Reihenfolge der Bytes - in 16- und 32-Bit-Zahlen spezifiziert ist, seien hier Audio-Formate genannt: - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian - \goodbreak - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - Insbesondere ist es bei AIFF-Dateien wichtig, zu prüfen, - um welche Variante es sich handelt, anstatt sich auf eine bestimmte Byte-Reihenfolge zu verlassen. - - Bei Dateiformaten mit variabler Endianness ist es sinnvoll und üblich, - die Endianness durch eine Kennung anzuzeigen. - Dies geschieht häufig am Anfang der Datei (im "`Vorspann"' -- "`Header"'). - - \bigbreak - - Als weiteres Beispiel seien zwei Monochrom-Grafik-Formate genannt. - Hier steht jedes Bit für einen schwarzen bzw.\ weißen Bildpunkt, - daher spielt die Reihenfolge der Bits in den Bytes eine entscheidende Rolle. - (Diese Grafik-Formate werden in Übungsaufgaben weiter vertieft.) - \begin{itemize} - \item - PBM-Dateien: Big-Endian, \newterm{MSB first\/} -- die höchstwertige Binärziffer ist im Bild links - \item - XBM-Dateien: Little-Endian, \newterm{LSB first\/} -- die höchstwertige Binärziffer ist im Bild rechts - \end{itemize} - MSB/LSB = most/least significant bit - - Achtung: Die Abkürzungen "`MSB/LSB"' werden manchmal auch für "`most/least significant \emph{byte}"' verwendet. - Im konkreten Fall ist es ratsam, die verwendete Byte- und Bit-Reihenfolge genau zu recherchieren - bzw.\ präzise zu dokumentieren. - -% \bigbreak -% -% Weiteres Beispiel: Textdateien im Format "`UTF-16"'. -% Hier stehen jeweils zwei aufeinanderfolgende Bytes für eine 16-Bit-Zahl. -% Am Dateianfang steht stets der Wert $65279 = \lstinline|FEFF|_{16}$ \dots - - \subsubsection{Datenübertragung} - - Bei der Übertragung von Daten über Leitungen - spielt sowohl die Reihenfolge der Bits in den Bytes ("`MSB first"' bzw.\ "`LSB first"') - als auch die Reihenfolge der Bytes in den übertragenen Zahlen ("`Big-/Little-Endian"') eine Rolle. - - Als Beispiele seien genannt: - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): MSB first - \item - I$^2$C: LSB first - \item - USB: beides - - Um Übertragungsfehler erkennen zu können, werden im USB-Protokoll - bestimmte Werte einmal gemäß der MSB-first- und einmal gemäß der LSB-first-Konvention - übertragen und anschließend auf Gleichheit geprüft. - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - Insbesondere gilt für die Übertragung z.\,B.\ einer 32-Bit-Zahl über das Internet, - daß die vier Bytes von links nach rechts (Big-Endian) übertragen werden, - die acht Bits innerhalb jedes Bytes hingegen von rechts nach links (LSB first). - - \subsection{Binärdarstellung von Zahlen} - - Es gibt unendlich viele verschiedene ganze Zahlen. - Da Speicherplatz begrenzt ist, können Rechner nur begrenzt viele Zahlen darstellen. - In der Praxis legt man sich auf eine Anzahl von Bits fest, - die eine Zahl maximal belegen darf. - Typischerweise handelt es sich bei dieser Anzahl von Bits - um eine Zweierpotenz: 8, 16, 32, 64. - - Eine 8-Bit-Zahl kann per definitionem Binärzahlen von 0000\,0000 bis 1111\,1111 - darstellen. Dezimal sind dies die Zahlen von 0 bis 255. - Wenn man die 8-Bit-Zahl 255 inkrementiert (= um 1 erhöht), - gibt es einen Überlauf, und das Rechenergebnis ist 0: - Die Binärzahl 1111\,1111 + 1 = 1\,0000\,0000 hat 9 Bits. - Wenn man das oberste Bit abschneidet, bleibt der Wert 0 übrig. - - Auf Computern macht man sich dieses Verhalten - für die Binärdarstellung negativer Zahlen zunutze: - Wenn 255 + 1 (dezimal geschrieben, mit 8-Bit-Zahlen berechnet) den Wert 0 ergibt, - dann ist 255 dasselbe wie $-1$. - - Allgemein gilt: Diejenige Zahl $y$, die ich auf eine Zahl $x$ addieren muß, - um auf einem $n$-Bit-Rechner einen Überlauf und das Rechenergebnis $0$ zu erhalten, - ist die \emph{$n$-Bit-Binärdarstellung von $-x$\/}). - - Um diese Zahl direkt auszurechnen, geht man folgendermaßen vor: - \begin{enumerate} - \item - Man invertiert alle Bits der Zahl.\\ - Aus 0010\,1100 (= Binärdarstellung von 44) wird so zum Beispiel 1101\,0011. - \item - Man addiert 1 zu der erhaltenen Zahl:\\ - 1101\,0011 + 1 = 1101\,0100 (= 8-Bit-Binärdarstellung von $-44$). - \end{enumerate} - Diese Darstellung negativer Zahlen heißt \newterm{Zweierkomplement}. - - \goodbreak - - Theoretisch kann man jede Zahl bei gegebener Rechengenauigkeit - sowohl als postive als auch als negative Zahl interpretieren. - Die folgende Konvention hat sich als sinnvoll heraugestellt: - \begin{itemize} - \item - Entweder betrachtet man alle Zahlen als positiv, - \item - oder man betrachtet Zahlen, deren oberstes Bit gesetzt ist, als negativ\\ - und die anderen als positiv. - \end{itemize} - - Für normale Anwendungen ist die genaue Anzahl der Bits einer Ganzzahl-Variablen - unerheblich, sofern der Wertebereich groß genug für die durchzuführenden - Rechnungen ist. In diesen Fällen verwendet man in C den Datentyp \lstinline{int} - für vorzeichenbehaftete ganze Zahlen und \lstinline{unsigned int} (oder kurz: - \lstinline{unsigned}) für vorzeichenlose. Für die Ausgabe mit \lstinline{printf()} - verwendet man \lstinline{%d} oder \lstinline{%i} für vorzeichenbehaftete und - \lstinline{%u} für vorzeichenlose ganze Zahlen. - - Für spezielle Situationen, in denen die genaue Anzahl der Bits eine Rolle spielt, - stellt C (unter Verwendung von \lstinline{#include <stdint.h>}) spezielle Datentypen bereit: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \newcommand{\xdots}{\hspace*{-0.7em}\dots,\hspace*{-0.7em}} - \begin{tabular}{|c|c|c|rcl|}\hline - C-Datentyp & Bits & Vorzeichen & \multicolumn{3}{c|}{Wertebereich} \\\hline\hline - \lstinline,int8_t, & 8 & ja & $-128$, & \xdots & $127$ \\\hline - \lstinline,uint8_t, & 8 & nein & $0$, & \xdots & $255$ \\\hline - \lstinline,int16_t, & 16 & ja & $-32\,768$, & \xdots & $32\,767$ \\\hline - \lstinline,uint16_t, & 16 & nein & $0$, & \xdots & $65\,535$ \\\hline - \lstinline,int32_t, & 32 & ja & $-2\,147\,483\,648$, & \xdots & $2\,147\,483\,647$ \\\hline - \lstinline,uint32_t, & 32 & nein & $0$, & \xdots & $4\,294\,967\,295$ \\\hline - \lstinline,int64_t, & 64 & ja & $9\,223\,372\,036\,854\,775\,808$, & \xdots & $9\,223\,372\,036\,854\,775\,807$ \\\hline - \lstinline,uint64_t, & 64 & nein & $0$, & \xdots & $18\,446\,744\,073\,709\,551\,615$ \\\hline - \end{tabular} - \end{center} - - Man beachte, daß es keine "`allein richtige"' Binärdarstellung einer negativen Zahl gibt; - diese hängt vielmehr von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab. - Auf einem 8-Bit-Rechner ist $255$ dasselbe wie $-1$, - auf einem 16-Bit-Rechner ist $255$ eine "`völlig normale"' Zahl; - stattdessen ist $65535$ dasselbe wie $-1$. - - Ebensowenig gibt es einen "`allein richtigen"' Zahlenwert eines Bitmusters. - Dieser Zahlenwert hängt von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab - und davon, ob man überhaupt negative Zahlen zuläßt - oder vielleicht alle Zahlen als positive Zahlen interpretiert. - - \breath - - Beispiel: Für welche Zahl steht der Speicherinhalt 1001\,0000\,1100\,0011 - (binär) = 90a3 (hexadezimal)? - - Die richtige Antwort auf diese Frage hängt vom Datentyp ab, - also von der Bitgenauigkeit des Rechenwerks - und davon, ob wir überhaupt mit Vorzeichen rechnen: - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur unteres Byte, Little-Endian)\\ - als \lstinline,uint8_t,: & $163$ & (nur unteres Byte, Little-Endian)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - - \breath - - Siehe auch: \url{http://xkcd.com/571/} - - \subsection{Speicherausrichtung -- Alignment} - - Ein 32-Bit-Prozessor kann auf eine 32-Bit-Variable effizienter zugreifen, - wenn die Speicheradresse der Variablen ein Vielfaches von 32 Bits, also 4 Bytes ist. - Eine Variable, auf die dies zutrifft, heißt "`korrekt im Speicher ausgerichtet"' ("`aligned"'). - - "`Effizienter"' kann bedeuten, - daß Maschinenbefehle zum Arbeiten mit den Variablen schneller abgearbeitet werden. - Es kann aber auch bedeuten, - daß der Prozessor gar keine direkte Bearbeitung von inkorrekt ausgerichteten Variablen erlaubt. - In diesem Fall bedeutet eine inkorrekte Speicherausrichtung, - daß für jede Operation mit der Variablen anstelle eines einzelnen Maschinenbefehls - ein kleines Programm aufgerufen werden muß. - - \bigskip - - Um zu verstehen, welche Konsequenzen dies für die Arbeit mit Rechnern hat, - betrachten wir die folgenden Variablen: - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - - Die Anordnung dieser Variablen im Speicher könnte z.\,B.\ folgendermaßen aussehen: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & & \\\cline{2-4} - \texttt{3003} & & \lstinline|c| & \\\cline{2-4} - \texttt{3002} & & & \\\cline{2-2}\cline{4-4} - \texttt{3001} & & \bup & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Ein optimierender Compiler wird für eine korrekte Ausrichtung der Variablen \lstinline|b| sorgen, - beispielsweise durch Auffüllen mit unbenutzten Speicherzellen: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & \lstinline|c| & \\\cline{2-4} - \texttt{3003} & & & \\\cline{2-2}\cline{4-4} - \texttt{3002} & & \bup & \\\cline{2-4} - \texttt{3001} & & & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Alternativ ist es dem Compiler auch möglich, - die korrekte Ausrichtung durch "`Umsortieren"' der Variablen herzustellen - und dadurch "`Löcher"' zu vermeiden: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & & \\\cline{2-4} - \texttt{3003} & & & \\\cline{2-2}\cline{4-4} - \texttt{3002} & & \bup & \\\cline{2-4} - \texttt{3001} & & \lstinline|c| & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Fazit: Man kann sich als Programmierer nicht immer darauf verlassen, - daß die Variablen im Speicher in einer spezifischen Weise angeordnet sind. - - In vielen existierenden Programmen geschieht dies dennoch. - Diese Programme sind fehlerhaft. - Dort kann es z.\,B.\ passieren, daß nach einem Upgrade des Compilers - schwer lokalisierbare Fehler auftreten. - - \bigskip - \goodbreak - - Entsprechende Überlegungen gelten für 64-Bit- und 16-Bit-Prozessoren. - Die Größe der Variablen, aufgerundet auf die nächste Zweierpotenz, gibt eine Ausrichtung vor. - Die Registerbreite des Prozessors markiert die größte Ausrichtung, die noch berücksichtigt werden muß. - - Bei 8-Bit-Prozessoren stellt sich die Frage nach der Speicherausrichtung normalerweise nicht, - weil die kleinste adressierbare Einheit eines Speichers selten kleiner als 8 Bits ist. - - Beispiele: - \begin{itemize} - \item - Eine 64-Bit-Variable auf einem 64-Bit-Prozessor muß auf 64 Bits ausgerichtet sein. - \item - Eine 32-Bit-Variable auf einem 64-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein. - \item - Eine 64-Bit-Variable auf einem 32-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein. - \item - Eine 64-Bit-Variable auf einem 8-Bit-Prozessor braucht nur auf 8 Bits ausgerichtet zu sein. - \end{itemize} - - Bei der Definition von Datenformaten tut man gut daran, - die Ausrichtung der Daten von vorneherein zu berücksichtigen, - um auf möglichst vielen -- auch zukünftigen -- Prozessoren - eine möglichst effiziente Bearbeitung zu ermöglichen. - - Wenn ich beispielsweise ein Dateiformat definiere, in dem 128-Bit-Werte vorkommen, - ist es sinnvoll, diese innerhalb der Datei auf 128 Bits (16 Bytes) auszurichten, - auch wenn mein eigener Rechner nur über einen 64-Bit-Prozessor verfügt. - -\iffalse - - \section{Ergänzungen und Ausblicke} - - \subsection{String-Operationen} - - Die Include-Datei \file{string.h} deklariert eine Sammlung nützlicher Funktionen - für den Umgang mit Strings (\lstinline{char *}). - - In den Sortierprogrammen \file{sort-\lstinline{*}.c} wurde davon bereits - die Funktion \lstinline{strcmp()} verwendet. - - \lstinline{strcmp (foo, bar)} liefert den Wert \lstinline{-1} zurück, - wenn der String \lstinline{foo} alphabetisch kleiner ist als der String \lstinline{bar}, - sie liefert \lstinline{0} zurück, wenn beide Strings gleich sind, - und sie liefert \lstinline{1} zurück, wenn \lstinline{foo} alphabetisch größer ist als \lstinline{bar}. - - \subsection{Dateien} - - \begin{itemize} - \item - \file{fhello.c} ist das klassische "`Hello, world!"`-Programm in einer Variante, - die in eine Datei \file{hello.txt} anstelle der Standardausgabe schreibt. - - \begin{experts} - Auch die Standardausgabe ist übrigens eine "`normale"' Datei. - \lstinline{printf (foo)} ist nur eine Abkürzung für \lstinline{fprintf (stdout, foo)}. - \end{experts} - \item - \file{fread-1.c} zeigt, wie man zeilenweise aus einer Textdatei liest. - - Dieses Programm prüft nicht, ob die Datei tatsächlich - erfolgreich geöffnet werden konnte. - Dies hat zur Folge, daß im Fehlerfall versucht wird, - auf einen \lstinline{NULL}-Pointer zuzugreifen -- also einen Absturz. - - Das Programm ist somit grob fehlerhaft. - \item - \file{fread-2.c} zeigt, wie es besser geht: - Wenn die Datei nicht geöffnet werden kann, - wird eine Fehlermeldung ausgegeben und das Programm kontrolliert beendet. - - Es besteht aber weiterhin ein Problem: - Die Fehlerursache "`Datei nicht gefunden"' wurde lediglich geraten. - Sie kann falsch sein und somit, anstatt hilfreich zu sein, - den Benutzer in die Irre führen. - - Auch dieses Programm ist also noch grob fehlerhaft. - \item - \file{fread-3.c} zeigt die korrekte Vorgehensweise: - Mit Hilfe der Systemvariablen \lstinline{errno} (deklariert in \file{errno.h}) - und der Funktion \lstinline{strerror()} (deklariert in \file{string.h}) - wird geprüft, welcher Fehler vorliegt. - Anhand dieser Information wird dann die vom Betriebssystem - für diesen Fall vorgesehene Fehlermeldung ausgegeben. - \end{itemize} - - Dieselben Überlegungen zur Fehlerbehandlung gelten natürlich auch - für das Öffnen einer Datei zum Schreiben, hier also auch für \file{fhello.c}. - -\fi - - \section{Algorithmen} - - \subsection{Differentialgleichungen} - - Eine mathematische Gleichung mit einer gesuchten Zahl $x$, z.\,B. - \begin{displaymath} - x + 2 = -x - \end{displaymath} - läßt sich leicht nach der Unbekannten $x$ auflösen. - (In diesem Fall lautet die Lösung: $x = -1$.) - - Wesentlich schwieriger ist es, - eine mathematische Gleichung mit einer gesuchten Funktion $x(t)$ zu lösen, z.\,B.: - \begin{displaymath} - x'(t) = -x(t)\qquad\mbox{mit}\qquad x(0) = 1 - \end{displaymath} - Um hier auf die Lösung $x(t) = e^{-t}$ zu kommen, - sind bereits weitreichende mathematische Kenntnisse erforderlich. - - Eine derartige Gleichung, die einen Zusammenhang zwischen der gesuchten Funktion - und ihren Ableitungen vorgibt, heißt \newterm{Differentialgleichung}. - Viele physikalisch-technische Probleme werden durch Differentialgleichungen beschrieben. - - \goodbreak - - \subsubsection{Beispiel: Pendelschwingung} - - \begin{minipage}{9.4cm} - \setlength{\parskip}{\smallskipamount} - Das Verhalten eines Fadenpendels (mathematisches Pendel) - wird durch seine Auslenkung $\phi$ als Funktion der Zeit $t$ beschrieben. - Wie kann man $\phi(t)$ berechnen? - - Wie aus anderen Veranstaltungen (Grundlagen der Physik, Mechanik) her bekannt sein sollte, - wirkt auf ein Fadenpendel, das um den Winkel $\phi(t)$ ausgelenkt ist, - die tangentiale Kraft $F = -m \cdot g \cdot \sin\phi(t)$. - Gemäß der Formel $F = m \cdot a$ bewirkt diese Kraft - eine tangentiale Beschleunigung $a = -g \cdot \sin\phi(t)$. - (Das Minuszeichen kommt daher, daß die Kraft der Auslenkung entgegengesetzt wirkt.) - - Wenn das Pendel die Länge $l$ hat, können wir dieselbe tangentiale Beschleunigung - mit Hilfe der zweiten Ableitung des Auslenkungswinkels $\phi(t)$ berechnen: - $a = l \cdot \phi''(t)$ (Winkel in Bogenmaß). - Durch Gleichsetzen erhalten wir eine Gleichung, - die nur noch eine Unbekannte enthält, nämlich die Funktion $\phi(t)$. - - Um $\phi(t)$ zu berechnen, müssen wir also die Differentialgleichung - \begin{displaymath} - \phi''(t) = -\frac{g}{l} \cdot \sin\phi(t) - \end{displaymath} - lösen. - \end{minipage}\hfill - \begin{minipage}{5.5cm} - \begin{center} - \begin{pdfpic} - \psset{unit=1.5cm}% - \begin{pspicture}(0,0)(0,0) - \SpecialCoor - \psline[linewidth=1pt](3;-110)(0,0) - \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.34;-20)(1.00;-90)} - \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.94;-110)(1.00;-90)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.34;-20)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.94;-110)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(1.00;-90)} - \rput(3.25;-110){\rput(0.64;-20){\makebox(0,0){$F$}}} - \rput(3.25;-110){\rput(1.30;-90){\makebox(0,0){$m\cdot g$}}} - \pscircle*(3;-110){0.07} - \psline[linewidth=0.5pt,linestyle=dashed](0,0)(0,-1.9) - \psarc[linewidth=0.5pt,arrows=<-](0,0){1.5}{-110}{-90} - \rput(1.3;-100){\makebox(0,0){$\phi$}} - \psarc[linewidth=0.5pt,linestyle=dashed,arrows=<->,arcsepA=0.12](0,0){3}{-110}{-70} - \rput(0,-4.5){\psstrut} - \end{pspicture} - \end{pdfpic} - \end{center} - \end{minipage} - - \breath - - \begin{experts} - Diese Differentialgleichung läßt sich mit "`normalen"' Mitteln nicht lösen, - daher verwendet man in der Praxis meistens die Kleinwinkelnäherung - $\sin\phi \approx \phi$ (für $\phi \ll 1$) - und löst stattdessen die Differentialgleichung: - \begin{displaymath} - \phi''(t) = -\frac{g}{l} \cdot \phi(t) - \end{displaymath} - Für ein mit der Anfangsauslenkung $\phi(0)$ losgelassenes Pendel - lautet dann das Ergebnis: - \begin{displaymath} - \phi(t) = \phi(0)\cdot\cos(\omega t)\qquad\mbox{mit}\qquad\omega=\sqrt{\frac{g}{l}} - \end{displaymath} - Das Beispielprogramm \gitfile{hp}{2020ws/script}{pendulum-1.c} illustriert, - welche Bewegung sich aus diesem $\phi(t)$ ergibt. - \end{experts} - - \subsubsection{Das explizite Euler-Verfahren} - - Um eine Differentialgleichung mit Hilfe eines Computers näherungsweise \newterm{numerisch\/} zu lösen, - stehen zahlreiche Lösungsverfahren zur Verfügung. - Im folgenden soll das einfachste dieser Verfahren, das \newterm{explizite Euler-Verfahren\/} - (auch \newterm{Eulersches Polygonzugverfahren\/} genannt) vorgestellt werden. - - Wir betrachten das System während eines kleinen Zeitintervalls $\Delta t$. - Während dieses Zeitintervalls sind alle von der Zeit $t$ abhängigen Funktionen - -- z.\,B.\ Ort, Geschwindigkeit, Beschleunigung, Kraft -- näherungsweise konstant. - - Bei konstanter Geschwindigkeit $v$ ist es einfach, - aus dem Ort $x(t)$ zu Beginn des Zeitintervalls - den Ort $x(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen: - \begin{displaymath} - x(t + \Delta t) = x(t) + \Delta t \cdot v - \end{displaymath} - - Bei konstanter Kraft $F = m \cdot a$ - und somit konstanter Beschleunigung $a$ ist es ebenso einfach, - aus der Geschwindigkeit $v(t)$ zu Beginn des Zeitintervalls - die Geschwindigkeit $v(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen: - \begin{displaymath} - v(t + \Delta t) = v(t) + \Delta t \cdot a - \end{displaymath} - - Wenn wir dies in einer Schleife durchführen und jedesmal $t$ um $\Delta t$ erhöhen, - erhalten wir Näherungen für die Funktionen $x(t)$ und $v(t)$. - - \breath - - Für das oben betrachtete Beispiel (Fadenpendel) - müssen wir in jedem Zeitintervall $\Delta t$ - zunächst die tangentiale Beschleunigung $a(t)$ aus der tangentialen Kraft berechnen, - die sich wiederum aus der momentanen Auslenkung $\phi(t)$ ergibt: - \begin{displaymath} - a = -g \cdot \sin\phi - \end{displaymath} - Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Beschleunigung - berechnen wir die neue tangentiale Geschwindigkeit: - \begin{displaymath} - v(t + \Delta t) = v(t) + \Delta t \cdot a - \end{displaymath} - Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Geschwindigkeit - berechnen wir schließlich die neue Winkelauslenkung $\phi$, - wobei wir einen kleinen Umweg über den Kreisbogen $x = l\cdot\phi$ machen: - \begin{displaymath} - \phi(t + \Delta t) = \frac{x(t + \Delta t)}{l} - = \frac{x(t) + \Delta t \cdot v}{l} - = \phi(t) + \frac{\Delta t \cdot v}{l} - \end{displaymath} - - Ein C-Programm, das diese Berechnungen durchführt (Datei: \gitfile{hp}{2020ws/script}{pendulum-2.c}), enthält als Kernstück: - \goodbreak - \begin{lstlisting} - #define g 9.81 - #define l 1.0 - #define dt 0.05 - #define phi0 30.0 /* degrees */ - - float t = 0.0; - float phi = phi0 * M_PI / 180.0; - float v = 0.0; - - void calc (void) - { - float a = -g * sin (phi); - v += dt * a; - phi += dt * v / l; - } - \end{lstlisting} - \goodbreak - Jeder Aufruf der Funktion \lstinline{calc()} - versetzt das Pendel um das Zeitintervall \lstinline{dt} in die Zukunft. - - Es ist vom Verfahren her nicht notwendig, mit der Kleinwinkelnäherung $\sin\phi\approx\phi$ zu arbeiten. - Das Beispielprogramm \gitfile{hp}{2020ws/script}{pendulum-3.c} illustriert, - welchen Unterschied die Kleinwinkelnäherung ausmacht. - - Wie gut arbeitet das explizite Euler-Verfahren? - Um dies zu untersuchen, lösen wir eine Differentialgleichung, - deren exakte Lösung aus der Literatur bekannt ist, - nämlich die Differentialgleichung mit Kleinwinkelnäherung. - Das Beispielprogramm \gitfile{hp}{2020ws/script}{pendulum-4.c} vergleicht beide Lösungen miteinander. - Für das betrachtete Beispiel ist die Übereinstimmung recht gut; - für Präzisionsberechnungen ist das explizite Euler-Verfahren jedoch nicht genau (und stabil) genug. - Hierfür sei auf die Lehrveranstaltungen zur numerischen Mathematik verwiesen. - - \subsubsection*{Bemerkung} - - Das Beispielprogramm \gitfile{hp}{2020ws/script}{pendulum-4.c} berechnet mit überzeugender Übereinstimmung - dasselbe Ergebnis für die Auslenkung des Pendels auf zwei verschiedene Weisen: - \begin{enumerate} - \item - über eine Formel, die einen Cosinus enthält, - \item - mit Hilfe der Funktion \lstinline{calc()}, die nur Grundrechenarten verwendet. - \end{enumerate} - Dies läßt die Natur der Verfahren erahnen, mit deren Hilfe es möglich ist, - Sinus, Cosinus und andere kompliziertere Funktionen - nur unter Verwendung der Grundrechenarten zu berechnen. - - \goodbreak - - \subsection{Rekursion} - - Aus der Mathematik ist das Beweisprinzip der \newterm{vollständigen Induktion\/} bekannt: - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - Wenn auf diese Weise die Lösbarkeit eines Problems bewiesen wurde, - ist es direkt möglich, das Problem im Computer \emph{tatsächlich\/} zu lösen, - nämlich durch einen \newterm{rekursiven Algorithmus}. - - \breath - - Ein klassisches Beispiel für ein rekursiv lösbares Problem sind die Türme von Hanoi: - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben auf größeren liegen. - \end{itemize} - - \goodbreak - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - - \small - - Bildquelle: \url{http://commons.wikimedia.org/wiki/File:Tower\_of\_Hanoi.jpeg}\\ - Urheber: \url{http://en.wikipedia.org/wiki/User:Evanherk}\\ - Lizenz: GNU FDL (Version 1.2 oder später) oder\\ - Creative Commons Attribution-Share Alike (Version 3.0 Unported) - - \end{center} - - \goodbreak - Die rekursive Lösung des Problems lautet: - \begin{itemize} - \item - Wenn $n = 1$ ist, also nur eine Scheibe vorliegt, - läßt sich diese "`einfach so"' an den Zielplatz verschieben. - In diesem Fall sind wir direkt fertig. - \item - Wenn $n - 1$ Scheiben als verschiebbar vorausgesetzt werden, - lautet die Vorgehensweise:\\ - verschiebe die oberen $n - 1$ Scheiben auf einen Hilfsplatz,\\ - verschiebe die darunterliegende einzelne Scheibe auf den Zielplatz,\\ - verschiebe die $n - 1$ Scheiben vom Hilfsplatz auf den Zielplatz. - \end{itemize} - - \goodbreak - Dieser Algorithmus läßt sich unmittelbar in eine Programmiersprache übersetzen: - \begin{lstlisting} - void verschiebe (int n, int start, int ziel) - { - if (n == 1) - verschiebe_1_scheibe (start, ziel); - else - { - verschiebe (1, start, hilfsplatz); - verschiebe (n - 1, start, ziel); - verschiebe (1, hilfsplatz, ziel); - } - } - \end{lstlisting} - -\iffalse - - \subsection{Floodfill} - - Siehe die Vortragsfolien \file{ainf-20121220.pdf}\\ - sowie die Beispielprogramme \file{fill-\lstinline{*}.c} - - \subsection{Stack und FIFO} - - Siehe Vortragsfolien und Beispielprogramme - - \subsection{Wegfindungsalgorithmus für Roboterfahrzeug} - - Siehe die Vortragsnotizen \file{ainf-20130117.txt},\\ - die Beispielprogramme \file{text-parcour-\lstinline{*}.c}, - \file{robotext.c} und \file{robotext.h}\\ - sowie die E-Mails "`Wegfindung"' und "`Weg-Finde-Algorithmus"' - -\fi - - \subsection{Aufwandsabschätzungen} - - \subsubsection{Sortieralgorithmen} - - Am Beispiel von Sortieralgorithmen soll hier aufgezeigt werden, - wie man die Lösung eines Problems schrittweise effizienter gestalten kann. - - Als Problem wählen wir das Sortieren eines Arrays (z.\,B.\ von Namen). - - \begin{itemize} - \item - Minimum/Maximum ermitteln: - \gitfile{hp}{2020ws/script}{sort-0.c} (mit "`Schummeln"'), - \gitfile{hp}{2020ws/script}{sort-1.c} (lineare Suche), - \gitfile{hp}{2020ws/script}{sort-2.c} (mit Visualisierung) - \item - Selectionsort: - \gitfile{hp}{2020ws/script}{sort-3.c} (bei Minimumsuche Anfang des Arrays überspringen), - \gitfile{hp}{2020ws/script}{sort-4.c} (Selectionsort), - \gitfile{hp}{2020ws/script}{sort-5.c} (100 Namen), - \gitfile{hp}{2020ws/script}{sort-6.c} (100 Namen, ohne Visualisierung) - \item - Bubblesort: - \gitfile{hp}{2020ws/script}{sort-7.c} (Selectionsort, Minimumsuche mit in der Hauptschleife), - \gitfile{hp}{2020ws/script}{bsort-1.c} (Minimumsuche durch Vergleich benachbarter Strings), - \gitfile{hp}{2020ws/script}{bsort-2.c} (Abbruch in äußerer Schleife, sobald sortiert), - \gitfile{hp}{2020ws/script}{bsort-3.c} (Abbruch auch in innerer Schleife, sobald sortiert) - \item - Quicksort: - \gitfile{hp}{2020ws/script}{qsort-1.c} (Array in 2 Hälften vorsortieren), - \gitfile{hp}{2020ws/script}{qsort-2.c} (rekursiver Aufruf für linke Hälfte), - \gitfile{hp}{2020ws/script}{qsort-3.c} (rekursiver Aufruf für beide Hälften) - \end{itemize} - - Bei "`zufällig"' sortierten Ausgangsdaten arbeitet Quicksort schneller als Bubblesort. - Wenn die Ausgangsdaten bereits nahezu sortiert sind, ist es umgekehrt. - Im jeweils ungünstigsten Fall arbeiten beide Algorithmen gleich langsam. - - \subsubsection{Landau-Symbole} - - Das Landau-Symbol $\mathcal{O}(g)$ mit einer Funktion $g(n)$ - steht für die \newterm{Ordnung\/} eines Algorithmus', - also die "`Geschwindigkeit"', mit der er arbeitet. - Die Variable $n$ bezeichnet die Menge der Eingabedaten, - hier also z.\,B.\ die Anzahl der Namen. - - \begin{center} - \begin{pdfpic} - \psset{unit=1pt} - \begin{pspicture}(-20,-20)(250,200) - \psline[arrows=->](-10,0)(200,0) - \psline[arrows=->](0,-10)(0,200) - \psplot[plotpoints=200]{1}{125}{2 x 0.06 mul exp} - \put(100,190){\mbox{$g(n) \sim 2^n$}} - \psplot[plotpoints=200]{0}{190}{x x mul 0.005 mul} - \put(190,190){\mbox{$g(n) \sim n^2$}} - \psplot[plotpoints=200]{1}{190}{x ln x mul 0.1 mul} - \put(195,100){\mbox{$g(n) \sim n \log n$}} - \psplot[plotpoints=200]{0}{190}{x 0.4 mul} - \put(195,75){\mbox{$g(n) \sim n$}} - \psplot[plotpoints=200]{1}{190}{x ln 10 mul} - \put(195,50){\mbox{$g(n) \sim \log n$}} - \put(210,0){\makebox(0,0)[l]{$n$}} - \put(0,210){\makebox(0,0)[l]{$g(n)$}} - \end{pspicture} - \end{pdfpic} - \end{center} - - \begin{itemize} - \item - $\mathcal{O}(n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten linear wächst. - Um doppelt so viele Namen zu sortieren, benötigt das Programm doppelt so lange. - \item - $\mathcal{O}(n^2)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten quadratisch wächst. - Um doppelt so viele Namen zu sortieren, benötigt das Programm viermal so lange. - \item - $\mathcal{O}(2^n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten exponentiell wächst. - Für jeden Namen, der dazukommt, benötigt das Programm doppelt so lange. - - Ein derartiges Programm gilt normalerweise als inakzeptabel langsam. - \item - $\mathcal{O}(\log n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten logarithmisch wächst. - Für jede Verdopplung der Namen benötigt das Programm nur einen Rechenschritt mehr. - - Ein derartiges Programm gilt als "`traumhaft schnell"'. - Dies wird jedoch nur selten erreicht. - \item - $\mathcal{O}(1)$ bedeutet, daß die Rechenzeit von der Menge der Eingabedaten unabhängig ist: - 1\,000\,000 Namen werden genau so schnell sortiert wie 10. - - Dies ist nur in Ausnahmefällen erreichbar. - \item - $\mathcal{O}(n \log n)$ liegt zwischen $\mathcal{O}(n)$ und $\mathcal{O}(n^2)$. - - Ein derartiges Programm gilt als schnell. - Viele Sortieralgorithmen erreichen dieses Verhalten. - \end{itemize} - - Wie sieht man einem Programm an, wie schnell es arbeitet? - - \begin{itemize} - \item - Vorfaktoren interessieren nicht. - - Wenn ein Code immer -- also unabhängig von den Eingabedaten -- zweimal ausgeführt wird, - beeinflußt das die Ordnung des Algorithmus nicht. - - Wenn ein Code immer -- also unabhängig von den Eingabedaten -- 1\,000\,000mal ausgeführt wird, - mag das Programm für kleine Datenmengen langsam erscheinen. - Für die Ordnung interessiert jedoch nur das Verhalten für große Datenmengen, - und dort kann dasselbe Programm durchaus schnell sein. - \item - Jede Schleife, die von $0$ bis $n$ geht, - multipliziert die Rechenzeit des innerhalb der Schleife befindlichen Codes mit $n$. - - Eine Doppelschleife (Schleife innerhalb einer Schleife) hat demnach $\mathcal{O}(n^2)$. - \goodbreak - \item - Wenn sich die Grenzen einer Schleife ständig ändern, nimmt man den Durschschnitt. - - Beispiel: - \begin{lstlisting}[gobble=8] - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - ... - \end{lstlisting} - Die äußere Schleife wird immer $n$-mal ausgeführt, - die innere \emph{im Durchschnitt\/} $\frac{n}{2}$-mal, was proportional zu $n$ ist. - - Zusammen ergibt sich $\mathcal{O}(n^2)$. - \item - Bei Rekursionen muß man mitzählen, wie viele Schleifen hinzukommen. - - Bei Quicksort wird z.\,B.\ in jeder Rekursion - eine Schleife von $0$ bis $n$ (aufgeteilt) ausgeführt. - Bei jeder Rekursion wird das Array "`normalerweise"' halbiert, - d.\,h.\ die Rekursionstiefe ist proportional zum Logarithmus von $n$ (zur Basis 2). - Daraus ergibt sich die Ordnung $\mathcal{O}(n\log n)$ für den "`Normalfall"' des Quicksort. - (Im ungünstigsten Fall kann sich auch $\mathcal{O}(n^2)$ ergeben.) - \end{itemize} - - Für eine präzise Definition der Landau-Symbole siehe z.\,B.: - \url{http://de.wikipedia.org/wiki/Landau-Symbole} - - \section{Objektorientierte Programmierung} - -\iffalse - - In Abschnitt \ref{Strukturen} haben wir Funktionen geschrieben, - die eine \lstinline{struct}-Variable bearbeiten. - - Das Konzept, Funktionen möglichst eng mit den Daten zu bündeln, - die sie bearbeiten, ist ein wichtiger Aspekt der \newterm{objektorientierten Programmierung}. - - Das Beispielprogramm \file{dates-1.c} illustriert einen Satz von Funktionen - zur Bearbeitung von \file{date}-Objekten, sog.\ \newterm{Methoden}. - Methoden erwarten als "`standardisierten"' ersten Parameter das Objekt: - einen Zeiger \lstinline{this} auf ein C-\lstinline{struct}. - Wenn der Satz von Funktionen vollständig ist, ist es nicht mehr nötig, - direkt auf die Datenfelder des \lstinline{struct}s zuzugreifen. - Dies nennt man \newterm{Kapselung}. - - Viele Sprachen (z.\,B.\ C++ als Weiterentwicklung von C) - unterstützen objektorientierte Programmierung durch Sprachelemente. - In diesen Sprachen ist der \lstinline{this}-Parameter i.\,d.\,R.\ nicht sichtbar, - sondern implizit. - - Das Beispielprogramm \file{dates-2.c} geht noch einen Schritt weiter - und verankert im Objekt Zeiger auf Methoden -- sog.\ \newterm{virtuelle Methoden}. - Dieses mit den Callback-Funktionen vergleichbare Konzept ermöglicht es, - verschiedenen, miteinander "`verwandten"' Objekten Methoden mit gleichen Namen - zuzuordnen, die sich aber unterschiedlich verhalten. - Dies nennt man \newterm{Polymorphie}. - - Wenn die o.\,a.\ "`Verwandschaft"' von Objekten darin besteht, - daß das eine Objekt ein anderes erweitert (zusätzliche Datenfelder und Methoden, - evtl.\ veränderte, \newterm{überschriebene\/} virtuelle Methoden), - spricht man von \newterm{Vererbung}. - Das Objekt, das erweitert wird, ist der \newterm{Vorfahre\/} des anderen Objekts. - - In Sprachen wie C, die keine Sprachelemente für objektorientierte Programmierung - zur Verfügung stellen, kann dennoch Objektorientierung "`zu Fuß"' erreicht werden. - Die GUI-Bibliothek GTK+, - die ursprünglich für das Bildverarbeitungsprogramm GIMP entwickelt wurde, - inzwischen aber in zahlreichen Programmen (z.\,B.\ Mozilla Firefox) ihren Dienst tut, - funktioniert auf diese Weise. - -\fi - - \addtocounter{subsection}{-1} - \subsection{Dynamische Speicherverwaltung} - - Variable in C haben grundsätzlich eine feste Größe. - Dies gilt auch für Arrays: - Auch mit der Schreibweise ohne Größenangabe, z.\,B. - \lstinline|int a[] = { 2, 3, 5, 7 };| - handelt es sich \emph{nicht\/} um ein Array veränderlicher Größe. - Die \lstinline{[]}-Schreibweise besagt lediglich, - daß der Compiler die Größe des Arrays anhand des Initialisierers - (hier: \lstinline|{ 2, 3, 5, 7 }|) selbst berechnen soll. - Das Beispiel \lstinline|int a[] = { 2, 3, 5, 7 };| ist nur eine andere Schreibweise für - \lstinline|int a[4] = { 2, 3, 5, 7 };|. - - Um \emph{tatsächlich\/} Arrays mit einer variablen Anzahl von Elementen verwenden - zu können, ist es in C notwendig, durch einen Funktionsaufruf explizit Speicher zu - reservieren: - \begin{lstlisting} - #include <stdlib.h> - ... - int *a = malloc (4 * sizeof (int)); - ... - free (a); - \end{lstlisting} - - \lstinline{malloc()} reserviert Speicher, \lstinline{free()} gibt ihn wieder frei. - - Man beachte, daß man in C auf Zeiger mit dem \lstinline{[]}-Operator - genau wie auf "`normale"' Arrays mit einem Index zugreifen kann: - \begin{lstlisting} - int *a = malloc (4 * sizeof (int)); - ... - for (int i = 0; i < 4; i++) - printf ("%d\n", a[i]); - \end{lstlisting} - - Es gibt normalerweise keine Möglichkeit, einem Zeiger (hier: \lstinline{a}) anzusehen, - wie groß der Speicherbereich ist, auf den er zeigt. - Diesen Wert muß sich das Programm selbst merken, typischerweise in einer Variablen: - \begin{lstlisting} - int n = 4; - int *a = malloc (n * sizeof (int)); - ... - for (int i = 0; i < n; i++) - printf ("%d\n", a[i]); - \end{lstlisting} - - \subsection{Konzepte und Ziele} - - Für viele Anwendungen ist der o.\,a.\ Mechanismus der \newterm{dynamischen Arrays\/} - noch nicht flexibel genug: Auch wenn die Anzahl der Elemente nicht mehr festliegt, - so müssen doch alle genau dieselbe Größe haben. In vielen Situationen möchte man - jedoch eine vorher nicht festgelegte Anzahl von Objekten unterschiedlichen Typs in - einer Schleife abarbeiten -- z.\,B.\ verschiedene geometrische Objekte in einem - Zeichenprogramm oder verschiedene Bedienelemente (Button, Zeichenbereich, - Eingabefeld, \dots) in einer graphischen Benutzeroberfläche (Graphical User - Interface -- GUI). - - Um dieses Problem zu lösen, speichert man Zeiger auf Objekte unterschiedlicher Größe - in einem dynamischen Array. - Dies funktioniert, weil alle Zeiger -- auch wenn sie auf unterschiedlich große - Objekte zeigen -- die gleiche Größe haben - und daher in demselben Array koexistieren können. - - \breath - - Um alle diese Objekte in einer Schleife auf gleiche Weise behandeln zu können, - benötigt man standardisierte Funktionen, die mit dem Objekt arbeiten. - Diese nennt man \newterm{Methoden}. - - Eine Methode bewirkt unterschiedliche Dinge, - je nachdem, auf welches Objekt sie angewandt wird. - Dies hängt vom Typ des Objekts ab. - Um dies zu realisieren, kann man ein Objekt als \lstinline{struct}-Variable - speichern, die zusätzlich zum eigentlichen Inhalt - eine Kennung für den Objekttyp als Datenfeld enthält. - In der Methode fragt man diese Typkennung ab - und entscheidet auf dieser Grundlage, was die Methode bewirkt. - - Dies kann über \lstinline{if}-Abfragen (oder \lstinline{switch}-Anweisungen) - geschehen, bei sehr vielen unterschiedlichen Objekttypen entarten derartige - Methoden jedoch zu sehr unübersichtlichen \lstinline{if}-Ketten. - Weiter unten werden elegantere Wege zur Realisierung von Methoden vorgestellt. - - \breath - - Objekte, die einen gemeinsamen Anteil von Eigenschaften haben - und sich typischerweise in demselben Array befinden, - bezeichnet man als \newterm{miteinander verwandt}. - Der "`kleinste gemeinsame Nenner"' dieser Objekte, - also ein Objekttyp der \emph{nur\/} den gemeinsamen Anteil enthält, - heißt \newterm{Basisklasse\/} oder \newterm{gemeinsamer Vorfahr\/} - der Objekte. Umgekehrt heißt ein Objekttyp, der eine Basisklasse um neue - Eigenschaften erweitert, \newterm{abgeleitete Klasse\/} - oder \newterm{Nachfahre} der Basisklasse. - - Eigenschaften, die ein Objekttyp mit seinem Vorfahren gemeinsam hat, - bezeichnet man als \newterm{vom Vorfahren geerbt}. - - \breath - - Ein "`Array von Objekten"' wird zunächst als Array von Zeigern auf die Basisklasse - realisiert; die Zeiger zeigen aber in Wirklichkeit - auf Objekte von abgeleiteten Klassen. - Diese Möglichkeit, unterschiedliche Objekte gemeinsam zu verwalten, - bezeichnet man als \newterm{Polymorphie} (griechisch: \emph{Vielgestaltigkeit\/}). - - \subsection{Beispiel: Zahlen und Buchstaben} - - Als Beispiel konstruieren wir eine Struktur, - die Zahlen und Buchstaben (Strings) gemeinsam verwalten soll, - also gewissermaßen ein Array, - das sowohl ganze Zahlen (\lstinline{int}) - als auch Strings (\lstinline{char *}) als Elemente haben kann. - - Zu diesem Zweck definieren wir zwei \lstinline{struct}-Datentypen - \lstinline{t_integer} und \lstinline{t_string}, - die als Inhalt (\lstinline{content}) eine ganze Zahl bzw.\ einen String enthalten - und zusätzlich eine Typ-Kennung (hier: \lstinline{int type}). - Weiterhin definieren wir einen gemeinsamen Vorfahren \lstinline{t_base}, - der \emph{nur\/} die Typ-Kennung enthält. - - \goodbreak - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - } t_base; - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - int content; - } t_integer; - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - char *content; - } t_string; - \end{lstlisting} - \end{minipage} - \end{center} - - Man beachte, daß diese drei \lstinline{struct}-Datentypen - trotz der absichtlichen Gemeinsamkeiten - aus Sicht des C-Compilers nichts miteinander zu tun haben; - sie sind voneinander vollkommen unabhängige Datentypen. - - Unser "`Array von Zahlen und Buchstaben"' - erzeugen wir nun als Array von Zeigern auf den Basistyp, - lassen die Zeiger aber in Wirklichkeit - auf Variablen der abgeleiteten Datentypen zeigen: - - \begin{lstlisting} - #define T_INTEGER 1 - #define T_STRING 2 - - t_integer i = { T_INTEGER, 42 }; - t_string s = { T_STRING, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL }; - \end{lstlisting} - \begin{picture}(0,0.9)(0,-0.6) - \color{red} - \put(2.975,0.75){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - - Damit der Compiler dies ohne Warnung akzeptiert, - ist eine explizite Typumwandlung des jeweiligen Zeigers auf den abgeleiteten Typ - in einen Zeiger auf den Basistyp erforderlich. - - Bei der Benutzung der abgeleiteten Typen - erfolgt wieder eine explizite Typumwandlung, nur diesmal in umgekehrter Richtung: - - \begin{lstlisting} - void print_object (t_base *this) - { - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); - } - ... - for (int i = 0; object[i]; i++) - print_object (object[i]); - \end{lstlisting} - - (Beispiel-Programm: \gitfile{hp}{2020ws/script}{objects-7.c}) - - Die expliziten Typumwandlungen sind ein gravierender Nachteil dieser - Vorgehensweise, denn sie schalten jegliche Überprüfung durch den Compiler aus. - Der Programmierer ist komplett selbst dafür verantwortlich, - daß die \lstinline{struct}-Datentypen gemeinsame Felder haben - und daß der Zeiger jeweils auf den richtigen \lstinline{struct}-Typ zeigt. - - Die folgenden Abschnitte stellen Möglichkeiten vor, - diese Nachteile abzumildern. - - \breath - - Die Verwendung von Zeigern auf "`normale"' Variable ist in der Praxis unüblich. - Stattdessen reserviert man mit \lstinline{malloc()} Speicher für die Objekte. - Es hat sich bewährt, für diesen Zweck eine spezielle Funktion, - den sog.\ \newterm{Konstruktor\/} zu schreiben. - Der Konstruktor kann den reservierten Speicher auch direkt - mit sinnvollen Werten initialisieren, wodurch wieder eine Fehlerquelle wegfällt. - - \begin{lstlisting} - t_integer *new_integer (int i) - { - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; - } - - t_string *new_string (char *s) - { - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; - } - ... - - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - \end{lstlisting} - - (Beispiel-Programm: \gitfile{hp}{2020ws/script}{objects-8.c}) - - \subsection{Unions} - - Explizite Typumwandlungen sind unsicher und nach Möglichkeit zu vermeiden. - Eine Alternative ergibt sich durch Verwendung des Datentyps \lstinline{union}. - - Eine \lstinline{union} sieht formal wie ein \lstinline{struct} aus. - Der Unterschied besteht darin, daß die Datenfelder eines \lstinline{struct} - im Speicher \emph{hintereinander\/} liegen, - wohingegen sich die Datenfelder einer \lstinline{union} - \emph{denselben Speicherbereich teilen}. - - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - #include <stdint.h> - - typedef union - { - int8_t i; - uint8_t u; - } num8_t; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - int main (void) - { - num8_t n; - n.i = -3; - printf ("%d\n", n.u); - return 0; - } - \end{lstlisting} - \end{minipage} - - Die im o.\,a.\ Beispiel konstruierte \lstinline{union} - spricht dieselbe Speicherzelle einerseits als \lstinline{int8_t} an - und andererseits als \lstinline{uint8_t}. - Das Beispiel-Programm (Datei: \gitfile{hp}{2020ws/script}{unions-1.c}) - nutzt dies aus, um die negative Zahl \lstinline{-3} - als positive 8-Bit-Zahl auszugeben (Berechnung des Zweierkomplements). - - \breath - - In der objektorientierten Programmierung in C - nutzt man \lstinline{union}-Datentypen, - um ohne explizite Typumwandlung denselben Speicherbereich - als Objekte verschiedenen Typs zu interpretieren: - - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - - typedef struct - { - int type; - } t_base; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - typedef struct - { - int type; - int content; - } t_integer; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - typedef struct - { - int type; - char *content; - } t_string; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object; - \end{lstlisting} - \end{minipage} - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - \end{lstlisting} - \end{minipage} - \end{center} - - (Beispiel-Programm: \gitfile{hp}{2020ws/script}{objects-9.c}) - - Das Ansprechen falscher Speicherbereiche - wird hierdurch zwar nicht völlig ausgeschlossen; - der Compiler hat jedoch wesentlich mehr Möglichkeiten - als bei expliziten Typumwandlungen, - den Programmierer vor derartigen Fehlern zu bewahren. - - Das Problem, von Hand dafür sorgen zu müssen, - daß die \lstinline{struct}-Datentypen zueinander passende Datenfelder enthalten, - bleibt weiterhin bestehen. - - \breath - - Ein alternativer Ansatz besteht darin, - nur die veränderlichen Eigenschaften der Objekte - in einer \lstinline{union} zu speichern -- - siehe Aufgabe 1 (c) bis (e) in den Übungen vom 19.\,12.\,2016 - (Datei: \gitfile{hp}{2016ws/20161219}{hp-uebung-20161219.pdf}). - - \goodbreak - - \subsection{Beispiel: graphische Benutzeroberfläche (GUI)} - - \href{http://www.gtk.org/}{GTK+} ist eine weit verbreitete Bibliothek - zur Erstellung graphischer Benutzeroberflächen (Graphical User Interface -- GUI). - Sie wurde ursprünglich - für das Bildverarbeitungsprogramm \href{http://www.gimp.org}{GIMP} geschrieben, - kommt aber u.\,a.\ auch im Web-Browser - \href{http://www.mozilla.org}{Mozilla Firefox} zum Einsatz. - - GTK+ ist in C geschrieben und objektorientiert. - Die Bibliothek verwendet intern einige der hier besprochenen Vorgehensweisen - zur Realisierung objektorientierter Programmierung in C. - - Die Beispielprogramme \href{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/script}% - {\file{gtk-1.c} bis \file{gtk-7.c}} demonstrieren, - wie man mit Hilfe von GTK+ ein einfaches GUI-Programm schreibt, - das graphische Objekte (Rechteck, Kreis, Dreieck) auf den Bildschirm zeichnet - und sich nach dem Anklicken eines Buttons beendet. - - Die Bedienelemente der GUI sind in GTK+ Objekte. - Hier ein paar Beispiele: - \begin{itemize} - \item - \lstinline{GtkWidget} ist die Basisklasse für alle GUI-Elemente. - \item - \lstinline{GtkContainer} ist ein Nachfahre von \lstinline{GtkWidget}.\\ - Dieses Objekt kann, ähnlich einem Array, andere Objekte enthalten. - \item - \lstinline{GtkWindow} ist ein Fenster auf dem Bildschirm.\\ - Es ist ein Nachfahre von \lstinline{GtkContainer} - und kann daher andere Objekte enthalten. - \item - \lstinline{GtkDrawingArea} ist ein rechteckiger Zeichenbereich auf dem Bildschirm. - \item - \lstinline{GtkButton} ist ein Bedienknopf.\\ - Durch Anklicken des Knopfes kann der Benutzer Aktionen auslösen. - \end{itemize} - - Um bei einer abgeleiteten Klasse (z.\,B.\ \lstinline{GtkWindow}) - Eigenschaften der Basisklasse (z.\,B.\ \lstinline{GtkContainer}) nutzen zu können, - verwendet GTK+ explizite Typumwandlungen, die in Präprozessor-Macros gekapselt sind. - Um zum Beispiel ein \lstinline{GtkWindow}-Objekt \lstinline{window} - als \lstinline{GtkContainer} ansprechen zu können, - verwendet man \lstinline{GTK_CONTAINER (window)}. - - Ähnlich wie in OpenGL/GLUT erfolgt auch in GTK+ das Zeichnen - sowie die Verarbeitung von Benutzereingaben (Tastatur, Maus) - über Callbacks. - - In \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/2016ws/20161219/hp-2016ws-p4.pdf}% - {Praktikumsversuch 4} haben Sie selbst weitere Erfahrungen mit GTK+ gesammelt - und gleichzeitig eine eigene Objekt-Hierarchie - (für graphische Objekte: Rechteck, Kreis, Dreieck) programmiert. - - \subsection{Virtuelle Methoden} - - In großen Programmen wird die Anzahl der verwendeten Objekt-Datentypen - schnell sehr groß. Eine Methode, die per \lstinline{if} unterscheiden muß, - welche Art von Objekt sie gerade bearbeitet, - enthält dann lange \lstinline{if}-Ketten - und wird dadurch sehr unübersichtlich. - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - Es wäre vorteilhaft, wenn alle Methoden, - die sich auf einen bestimmten Objekttyp beziehen, - auch nebeneinander im Quelltext stehen könnten, - anstatt sich über den gesamten Quelltext zu verteilen - (weil jede Funktion einen \lstinline{if}-Zweig für diesen Objekttyp hat). - - \begin{lstlisting} - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - Um dies zu realisieren, verwendet man \emph{Zeiger auf Funktionen}: - - \begin{lstlisting} - typedef struct - { - void (*print) (union t_object *this); - } t_base; - - typedef struct - { - void (*print) (union t_object *this); - int content; - } t_integer; - - typedef struct - { - void (*print) (union t_object *this); - char *content; - } t_string; - \end{lstlisting} - - Um in C einen Zeiger auf eine Funktion zu deklarieren, - deklariert man eine "`normale"' Funktion, - deren "`Name"' die Gestalt \lstinline{(*print)} hat -- - mit dem vorangestellten Stern und den umschließenden Klammern. - (Merkregel: Das, worauf \lstinline{print} zeigt -- also \lstinline{*print} --, - ist eine Funktion.) - - Der Aufruf einer derartigen Funktion erfolgt - über den im Objekt gespeicherten Zeiger: - - \begin{lstlisting} - for (int i = 0; object[i]; i++) - object[i]->print (object[i]); - \end{lstlisting} - - Eine derartige Funktion, die für verschiedene Objekttypen existiert - und bei deren Aufruf automatisch "`die passende"' Funktion ausgewählt wird, - heißt \newterm{virtuelle Methode}. - - \breath - - Jeder Methode wird ein Zeiger \lstinline{t_object *this} auf das Objekt - als Parameter mitgegeben. - - Bei der Deklaration der virtuellen Methode innerhalb des Objekt-Typs - wird daher der Union-Typ \lstinline{t_object} bereits benötigt. - Dieser kann jedoch erst später deklariert werden, - wenn die darin enthaltenen Objekt-Typen bekannt sind. - - Um dieses Problem zu lösen, muß die \lstinline{union t_object} - "`doppelt"' deklariert werden: - - \begin{lstlisting} - typedef union t_object - { - t_base base; - t_integer integer; - t_string string; - } t_object; - \end{lstlisting} - - Dadurch daß \lstinline{t_object} auch oben, - hinter dem Schlüsselwort \lstinline{union} steht, - ist neben dem Datentyp \lstinline{t_object} - auch ein Datentype \lstinline{union t_object} - (in einem separaten Namensraum) bekannt. - Derartig deklarierte Typen kann man \newterm{vorwärts-deklarieren\/}: - Wenn man eine Zeile - \begin{lstlisting} - union t_object; - \end{lstlisting} - den anderen Deklarationen voranstellt, - wissen diese, daß es später eine \lstinline{union t_object} geben wird. - Zeiger auf diese -- noch unbekannte -- \lstinline{union} - dürfen dann bereits in Deklarationen -- hier: Funktionsparameter -- - verwendet werden. - - \breath - - Das Beispiel-Programm \gitfile{hp}{2020ws/script}{objects-12.c} illustriert, - wie man virtuelle Methoden in C realisieren kann. - - In größeren Projekten ist es nicht effizient, - in jeder einzelnen Objektinstanz (= Variable des Objekttyps) - sämtliche Zeiger auf sämtliche virtuellen Methoden zu speichern. - Stattdessen speichert man in der Objektinstanz - lediglich einen Zeiger auf eine Tabelle von Zeigern auf die virtuellen Methoden, - die sog.\ \newterm{virtuelle Methodentabelle} -- - siehe das Beispiel-Programm \gitfile{hp}{2020ws/script}{objects-13.c}. - - \subsection{Einführung in C++} - - Objektorientierte Programmierung in C ist sehr mühselig und fehleranfällig: - Objekt-Datentypen müssen manuell so abgeglichen werden, - daß sie in ihren ersten Datenfeldern übereinstimmen, - Konstruktoren müssen manuell erstellt werden, usw. - - Um diese Probleme zu beheben, wurden neue Computersprachen entwickelt, - die objektorientierte Programmierung durch neue Sprachelemente unterstützen. - Die objektorientierte Weiterentwicklung von C ist C++. - Andere bekannte objektorientierte Sprachen sind Java, Python, C\#, JavaScript, - PHP, verschiedene Pascal-Dialekte und viele weitere. - - Das Beispiel-Programm \gitfile{hp}{2020ws/script}{objects-14.cpp} - ist eine direkte Übersetzung von \gitfile{hp}{2020ws/script}{objects-12.c} nach C++. - In C++ kümmert sich der Compiler um die Vererbung zwischen den Objekt-Datentypen, - um die Verwaltung der Zeiger auf virtuelle Methoden, - um korrekte Konstruktoren und um vieles mehr. - Auch die Übergabe des Objekt-Zeigers \lstinline{this} an Methoden - erfolgt in C++ automatisch: Aus \lstinline{object[i]->base.print (object[i]);} - wird \lstinline{object[i]->print ();}. - - Dadurch daß der Compiler viele Aufgaben übernimmt, - die der Programmierer ansonsten manuell abarbeiten müßte, - wird der Quelltext kürzer und weniger fehleranfällig. - - \section{Datenstrukturen} - - \subsection{Stack und FIFO} - - Eine häufige Situation beim Programmieren ist, - daß man ein Array für eine gewisse Maximalmenge von Einträgen anlegt, - aber nur zum Teil nutzt. - - Einem derartigen Array ein Element hinzuzufügen, ist einfach: - Man erhöht die Variable, die die Auslastung des Arrays speichert. - Ebenso einfach ist das Entfernen des zuletzt eingefügten Elements: - Man erniedrigt die Variable, die die Auslastung des Arrays speichert. - - "`Einfach"' bedeutet hier, daß die benötigte Rechenzeit gering ist. - Genaugenommen ist die Rechenzeit immer gleich groß, - egal wie viele Elemente sich bereits im Array befinden. - Die Komplexität (Landau-Symbol) der Operation, - am Ende des Arrays ein Element einzufügen oder zu entfernen, - ist $\mathcal{O}(1)$. - - Eine derartige Struktur eignet sich gut, - um Elemente in der Reihenfolge des Eintreffens zu speichern, - sie aber in \emph{umgekehrter\/} Reihenfolge wieder abzuarbeiten. - Man "`stapelt"' gewissermaßen die Elemente in dem Array. - Aus diesem Grunde heißt diese Struktur \newterm{Stack\/} (engl.: \emph{Stapel}) - oder \newterm{LIFO\/} für \emph{last in, first out}. - - Andere Operationen -- z.\,B.\ das Einfügen oder Löschen von Elementen - in der Mitte -- sind aufwendiger, da man die im Array befindlichen Elemente - in einer Schleife beiseiteschieben muß. - Die Rechenzeit ist proportional zur Anzahl der Elemente, - die sich bereits im Array befinden: $\mathcal{O}(n)$. - - Das Suchen in einem bereits sortieren Array ist hingegen in $\mathcal{O}(\log n)$ - möglich: Man beginnt die Suche in der Mitte und prüft, - ob sich das gesuchte Element in der unteren oder in der oberen Hälfte befindet. - In der ermittelten Hälfte beginnt man die Suche wieder in der Mitte -- - so lange, bis man nur noch ein einzelnes Element vor sich hat. - - Das Beispiel-Programm \gitfile{hp}{2020ws/script}{stack-11.c} illustriert, - wie man einen Stack mit den o.\,g.\ Funktionalitäten implementieren kann. - - \breath - - Eine weitere wichtige Situation ist, - daß man anfallende Daten zwischenspeichern - und \emph{in derselben Reihenfolge\/} wieder abarbeiten möchte. - Eine Struktur, die dies ermöglicht, heißt \newterm{FIFO\/} - für \emph{first in, first out}. - - Um einen FIFO zu realisieren, verwendet man nicht eine einzelne Variable, - die den genutzten Teil des Arrays speichert, sondern zwei: - Ein Schreib-Index markiert, an welcher Stelle Platz - für das nächste einzufügende Element ist; - ein Lese-Index markiert das zuerst eingefügte Element. - Beide Indizes werden bei Verwendung hochgezählt. - Wenn sie gleich sind, ist der FIFO leer. - - Der entscheidende Trick: Wenn eine der beiden Indexvariablen - das Ende des Arrays erreicht, wird sie wieder auf 0 gesetzt. - Die beiden Indexvariablen arbeiten also \emph{ringförmig\/}; - der FIFO wird durch einen \newterm{Ringpuffer\/} realisiert. - - Beispiel-Programm: \gitfile{hp}{2020ws/script}{fifo-8.c} - - \subsection{Verkettete Listen} - - In Arrays ist das Einfügen in der Mitte sehr aufwendig ($\mathcal{O}(n)$). - Um das Einfügen zu vereinfachen, hat man sich die folgende Struktur überlegt: - - \begin{itemize} - \item - Jeder Datensatz ist ein \lstinline{struct}, - der zusätzlich zum eigentlichen Inhalt noch einen Zeiger - auf das nächste Element enthält. - \item - Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}. - \item - Eine Variable (z.\,B.\ \lstinline{first}) zeigt auf das erste Element. - \item - Wenn die Liste leer ist, zeigt bereits die \lstinline{first}-Variable - auf \lstinline{NULL}. - \end{itemize} - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3)--(7); - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \end{quote} - - Eine derartige Struktur heißt eine \newterm{(einfach) verkettete Liste}. - - Wenn nun ein zusätzliches Element in die Liste eingefügt werden soll, - geschieht dies durch "`Umbiegen"' der Zeiger, - die auf das jeweils nächste Element zeigen: - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3) to[out=0] (5); - \draw[-latex](5) to[in=180] (7); - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \end{quote} - - Unabhängig von der Gesamtzahl der Elemente, - die sich bereits in der Liste befinden, - müssen für das Einfügen eines Elements genau 2 Zeiger neu gesetzt werden. - Der Aufwand für das Einfügen beträgt somit $\mathcal{O}(1)$. - - Diesem Vorteil steht der Nachteil gegenüber, - daß es bei einer verketteten Liste nicht mehr möglich ist, - "`einfach so"' auf das Element mit einem bekannten Index zuzugreifen; - dies kann nun nur noch über eine Schleife geschehen. - Während bei einem Array der wahlfreie Zugriff in $\mathcal{O}(1)$ möglich ist, - geschieht dies bei einer verketteten Liste in $\mathcal{O}(n)$. - - Als Konsequenz ist auch das Suchen in $\mathcal{O}(\log n)$ nicht mehr möglich; - auch dies erfordert nun $\mathcal{O}(n)$. - - \subsection{Bäume} - - Für datenintensive Anwendungen -- insbesondere Datenbanken -- - ist es wünschenswert, \emph{sowohl\/} den wahlfreien Zugriff - \emph{als auch\/} das Einfügen in der Mitte \emph{als auch\/} - das Suchen und das sortierte Einfügen möglichst effizient zu realisieren. - - Dies geschieht über rekursive Datenstrukturen, sog.\ \newterm{Bäume}. - - \breath - - Wie bei einer verketteten Liste sind die Elemente -- die \newterm{Knoten\/} -- - eines Baums \lstinline{struct}-Variable. - Zusätzlich zum eigentlichen Inhalt speichert man darin noch Zeiger - auf größere bzw.\ kleinere Elemente. - - Im einfachsten Fall enthält jeder Knoten genau einen Inhalt - und jeweils einen Zeiger auf kleinere bzw.\ größere Elemente: - - \begin{lstlisting} - typedef struct node - { - int content; - struct node *left, *right; - } node; - \end{lstlisting} - - Ein aus derartigen Knoten aufgebauter Baum - verzweigt sich an jedem Knoten in jeweils zwei Teilbäume - und heißt daher \newterm{binärer Baum}. - - Die Struktur emöglicht es, - jeweils "`zwischen"' zwei bereits eingefügten Knoten noch weitere einzufügen. - Wenn in einen derartigen sortierten binären Baum nacheinander die Zahlen - 7, 3, 137 und 5 eingefügt werden, ergibt sich das folgende Bild: - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(root) at (0,0) {\lstinline{node *root;}}; - \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7}; - \draw[-latex](root)--(7); - \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137}; - \draw[-latex](7)--(137); - \node(137_left) at (1,-4.5) {\lstinline{NULL}}; - \node(137_right) at (3,-4.5) {\lstinline{NULL}}; - \draw[-latex](137)--(137_left); - \draw[-latex](137)--(137_right); - \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3}; - \draw[-latex](7)--(3); - \node(3_left) at (-3,-4.5) {\lstinline{NULL}}; - \draw[-latex](3)--(3_left); - \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5}; - \draw[-latex](3)--(5); - \node(5_left) at (-2,-6) {\lstinline{NULL}}; - \node(5_right) at (0,-6) {\lstinline{NULL}}; - \draw[-latex](5)--(5_left); - \draw[-latex](5)--(5_right); - \end{tikzpicture} - \end{quote} - - Sowohl das Einfügen als auch die Ausgabe und die Suche - erfolgen in Bäumen \emph{rekursiv}. - Der Rechenaufwand hängt dabei von der Rekursionstiefe, - also von der "`Tiefe"' des Baums ab. - Da die Tiefe mit der maximal möglichen Anzahl der Knoten logarithmisch wächst, - ist Einfügen und Suchen in $\mathcal{O}(\log n)$ möglich. - Dies ist ein Kompromiß zwischen den Verhalten eines Arrays - (Einfügen in $\mathcal{O}(n)$, Suchen in $\mathcal{O}(\log n)$) - und dem einer verketteten Liste (Einfügen in $\mathcal{O}(1)$, - Suchen in $\mathcal{O}(n)$). - Ein sortiertes Einfügen in einen Baum - ermöglicht eine Sortierung in $\mathcal{O}(n\log n)$. - - Dies funktioniert nur, wenn die Tiefe des Baums tatsächlich nur logarithmisch - mit der Anzahl der Knoten wächst. - Wenn man in dem oben beschriebenen einfachen Fall eines binären Baums - die Elemente in bereits sortierter Reihenfolge einfügt, - entartet der Baum zu einer verketteten Liste. - Suchen ist dann nur noch in $\mathcal{O}(n)$ möglich - und Sortieren in $\mathcal{O}(n^2)$. - - Um dies zu vermeiden, wurden teils aufwendige Strategien entwickelt, - den Baum jederzeit \newterm{balanciert}, - d.\,h.\ in logarithmischer Tiefe zu halten. - Derartige \newterm{balancierte Bäume\/} finden Verwendung - in realen Datenbank-Programmen. - -\end{document} diff --git a/script/hp-slides-title-2020ws.pdf b/script/hp-slides-title-2020ws.pdf deleted file mode 100644 index 5f9b06adb89e7eed1d8b163cabc6c2955153bdad..0000000000000000000000000000000000000000 Binary files a/script/hp-slides-title-2020ws.pdf and /dev/null differ diff --git a/script/hp-slides-title-2020ws.tex b/script/hp-slides-title-2020ws.tex deleted file mode 100644 index 0ab157f1bb3f3134cdb74c302bee3fb45214fef8..0000000000000000000000000000000000000000 --- a/script/hp-slides-title-2020ws.tex +++ /dev/null @@ -1,75 +0,0 @@ -% hp-slides-title-2020ws.pdf - Title Page for Lecture Slides on Low-Level Programming -% Copyright (C) 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} - -\setlength{\parskip}{\medskipamount} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{Wintersemester 2020/21} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{Wichtiger Hinweis} - -\begin{frame}[plain] - - \vfill - - \shownosectionnonumber - - \vspace*{-\medskipamount} - - Diese Vortragsfolien dienen dazu, den Vortrag der/des Lehrenden zu unter-\\stützen. - Sie enthalten \textbf{nur einen Teil} der Lerninhalte. - Wie groß dieser Teil ist, hängt von den konkreten Lerninhalten ab - und kann von "`praktisch alles"' bis "`praktisch gar nichts"' schwanken. - Diese Folien alleine sind daher - \textbf{nicht für ein Selbststudium geeignet!} - Hierfür sei auf das Skript verwiesen, - in dem allerdings keine tagesaktuellen Änderungen enthalten sind. - - Mindestens genauso wichtig wie die Vortragsfolien sind die Beispiel-Programme, - die vor Ihren Augen in den Vorlesungen erarbeitet werden. - Diese sind im Git-Repository - (\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}) - mit allen Zwischenschritten enthalten und befinden sich - in den zu den jeweiligen Kalenderdaten gehörenden Verzeichnissen - (z.\,B.\ für den 10.\kern0.5pt10.\,2020 unter - \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2020ws/20201105/}\kern1pt). - - Wenn Sie die Übungsaufgaben bearbeiten, nutzen Sie die Gelegenheit, - Ihre Lösungen in den Übungen überprüfen zu lassen. - Wer nach Vergleich mit der Musterlösung zu dem Schluß kommt, - alles richtig gelöst zu haben, erlebt sonst in der Klausur oft eine - unangenehme Überraschung. - - \strut\hfill In jedem Fall: \emph{Viel Erfolg!} - -\end{frame} - -\end{document} diff --git a/script/if-0.c b/script/if-0.c deleted file mode 100644 index dfb4aec197bbb12584bbaceb35181fc7f0b015f2..0000000000000000000000000000000000000000 --- a/script/if-0.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; -} diff --git a/script/if-1.c b/script/if-1.c deleted file mode 100644 index e3104ff36e95c10188beb787fb2a2c27457a17b2..0000000000000000000000000000000000000000 --- a/script/if-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; -} diff --git a/script/if-2.c b/script/if-2.c deleted file mode 100644 index 295496a3d67ae6220d8ed49724cab55e4dc6115e..0000000000000000000000000000000000000000 --- a/script/if-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - return 0; -} diff --git a/script/if-3.c b/script/if-3.c deleted file mode 100644 index 514672ff98b5524216ef2c14bfb2a0601c0177e9..0000000000000000000000000000000000000000 --- a/script/if-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - return 0; -} diff --git a/script/if-4.c b/script/if-4.c deleted file mode 100644 index e82781f53b33882eef10cca825fb6ebe9b886942..0000000000000000000000000000000000000000 --- a/script/if-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - { - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - } - return 0; -} diff --git a/script/if-5.c b/script/if-5.c deleted file mode 100644 index af167ac2baf8a2467e87d1ec1c6fb43cc967ed81..0000000000000000000000000000000000000000 --- a/script/if-5.c +++ /dev/null @@ -1,5 +0,0 @@ -#include<stdio.h> -int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a); -printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf( -"a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n"); -printf("Das tut man nicht.\n");}return 0;} diff --git a/script/if-6.c b/script/if-6.c deleted file mode 100644 index aa0c257019586c9371441e379bb777e2888804bb..0000000000000000000000000000000000000000 --- a/script/if-6.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b; - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0); - printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0); - printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23); - return 0; -} diff --git a/script/incdate-0.c b/script/incdate-0.c deleted file mode 100644 index 5c54eb2087df82f7b4ddf4fb394cec6fc5899d28..0000000000000000000000000000000000000000 --- a/script/incdate-0.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-1.c b/script/incdate-1.c deleted file mode 100644 index df35af04eb9a60e5ce4a23e1ba696c03c43ea445..0000000000000000000000000000000000000000 --- a/script/incdate-1.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; /* FIXME */ -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-2.c b/script/incdate-2.c deleted file mode 100644 index 255cae70abca2e526ce4bbe487ee0f5f8fd25580..0000000000000000000000000000000000000000 --- a/script/incdate-2.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; /* FIXME */ - d->day = 1; - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-3.c b/script/incdate-3.c deleted file mode 100644 index 6ed5cd4190ebbeec448728d7b0cc6778abe63684..0000000000000000000000000000000000000000 --- a/script/incdate-3.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 12; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-4.c b/script/incdate-4.c deleted file mode 100644 index 86c6e623c566d1cd8f67d3c3268fec016c3c7bbc..0000000000000000000000000000000000000000 --- a/script/incdate-4.c +++ /dev/null @@ -1,40 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 30; - d->month = 4; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; /* FIXME */ - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-5.c b/script/incdate-5.c deleted file mode 100644 index e97980c292d7d25c2a30beb74b5a390e67768720..0000000000000000000000000000000000000000 --- a/script/incdate-5.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 30; - d->month = 4; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - days_in_month = 28; /* FIXME */ - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-6.c b/script/incdate-6.c deleted file mode 100644 index 1ce6f6a8a6a64d5ea0d81b048a6287e901ba3ae3..0000000000000000000000000000000000000000 --- a/script/incdate-6.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-7.c b/script/incdate-7.c deleted file mode 100644 index 983c0fdbe8de409f38006c1507cde49727e5102c..0000000000000000000000000000000000000000 --- a/script/incdate-7.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-8.c b/script/incdate-8.c deleted file mode 100644 index b8d4d5fe2b4d1766b66e4f7ec0aad0c273902f93..0000000000000000000000000000000000000000 --- a/script/incdate-8.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2100; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-9.c b/script/incdate-9.c deleted file mode 100644 index 288491ae9feb71fc79d32c2a09c1b34469c1d173..0000000000000000000000000000000000000000 --- a/script/incdate-9.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2000; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - { - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - } - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/input-1.c b/script/input-1.c deleted file mode 100644 index ed33d5ddcde9772002f639a19ffd6ce105307080..0000000000000000000000000000000000000000 --- a/script/input-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; -} diff --git a/script/input-2.c b/script/input-2.c deleted file mode 100644 index 6b8995d3639f2f34f74ac4b309bcc7be0f895325..0000000000000000000000000000000000000000 --- a/script/input-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; -} diff --git a/script/io-ports-and-interrupts.pdf b/script/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/script/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/script/logo-hochschule-bochum-cvh-text-v2.pdf b/script/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/script/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/script/logo-hochschule-bochum.pdf b/script/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/script/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/script/loop-1.c b/script/loop-1.c deleted file mode 100644 index 8cca7d3e184272d08d3ddebe4c13a5afa7a1cd6e..0000000000000000000000000000000000000000 --- a/script/loop-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - return 0; -} diff --git a/script/loop-2.c b/script/loop-2.c deleted file mode 100644 index 1098615d2ec421e20303e52a73b96b65ec254613..0000000000000000000000000000000000000000 --- a/script/loop-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i; - for (i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - return 0; -} diff --git a/script/loop-3.c b/script/loop-3.c deleted file mode 100644 index ff95622ceb9310bbc5b1d6c4b71e89ed9b83af68..0000000000000000000000000000000000000000 --- a/script/loop-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i; - for (i = 1; 10; i + 1) - printf ("%d\n", i); - return 0; -} diff --git a/script/maerchen.c b/script/maerchen.c deleted file mode 100644 index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000 --- a/script/maerchen.c +++ /dev/null @@ -1,4 +0,0 @@ -Vor langer, langer Zeit -gab es einmal -#include "hexe.h" -Die lebte in einem Wald. diff --git a/script/mathe-1.c b/script/mathe-1.c deleted file mode 100644 index 6a099f1e281242f3d6892e7538dc4b140dc4b861..0000000000000000000000000000000000000000 --- a/script/mathe-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", 23 + 19); - return 0; -} diff --git a/script/moon-texture.png b/script/moon-texture.png deleted file mode 120000 index 1af16e6965c37de47d65304f0a45287800177f97..0000000000000000000000000000000000000000 --- a/script/moon-texture.png +++ /dev/null @@ -1 +0,0 @@ -../common/moon-texture.png \ No newline at end of file diff --git a/script/objects-12.c b/script/objects-12.c deleted file mode 100644 index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000 --- a/script/objects-12.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; - -typedef struct -{ - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/script/objects-13.c b/script/objects-13.c deleted file mode 100644 index 81ef279b060e0b6290194fdeda8c3330cb716cdd..0000000000000000000000000000000000000000 --- a/script/objects-13.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->integer.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - return 0; -} diff --git a/script/objects-14.cpp b/script/objects-14.cpp deleted file mode 100644 index ea40a139bacadb6ce4de30312bb0c1b6c21d9c8e..0000000000000000000000000000000000000000 --- a/script/objects-14.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -struct TBase -{ - virtual void print () = 0; -}; - -struct TInteger: TBase -{ - int content; - virtual void print (); - TInteger (int i); -}; - -struct TString: TBase -{ - char *content; - virtual void print (); - TString (char *s); -}; - -void TInteger::print () -{ - printf ("Integer: %d\n", content); -} - -void TString::print () -{ - printf ("String: \"%s\"\n", content); -} - -TInteger::TInteger (int i) -{ - content = i; -} - -TString::TString (char *s) -{ - content = s; -} - -int main (void) -{ - TBase *object[] = { new TInteger (42), - new TString ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->print (); - - return 0; -} diff --git a/script/objects-7.c b/script/objects-7.c deleted file mode 100644 index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000 --- a/script/objects-7.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -int main (void) -{ - t_integer i = { T_INTEGER, 42 }; - t_string s = { T_STRING, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/script/objects-8.c b/script/objects-8.c deleted file mode 100644 index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000 --- a/script/objects-8.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -t_integer *new_integer (int i) -{ - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; -} - -t_string *new_string (char *s) -{ - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; -} - -int main (void) -{ - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/script/objects-9.c b/script/objects-9.c deleted file mode 100644 index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000 --- a/script/objects-9.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_object (t_object *this) -{ - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/script/opengl-magic.c b/script/opengl-magic.c deleted file mode 100644 index 121353940b3db8bdcc6193ef110aebdd75a0de1a..0000000000000000000000000000000000000000 --- a/script/opengl-magic.c +++ /dev/null @@ -1,49 +0,0 @@ -#if defined(__APPLE__) || defined(MACOSX) - #include <OpenGL/gl.h> - #include <OpenGL/glu.h> - #include <GLUT/glut.h> -#else - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> -#endif - -#include "opengl-magic.h" - -void init_opengl (int *argcp, char **argv, char *window_name) -{ - glutInit (argcp, argv); - glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); - glutInitWindowSize (1024, 768); - glutCreateWindow (window_name); - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); - gluPerspective (20.0, -1.33333, 3.0, 7.0); - glMatrixMode (GL_MODELVIEW); - glLoadIdentity (); - glTranslatef (0.0, 0.0, -5.0); - glClearColor (0.0, 0.0, 0.0, 0.0); - glEnable (GL_DEPTH_TEST); - glEnable (GL_LIGHTING); - glEnable (GL_LIGHT0); - static GLfloat light0_position[] = { 1.0, 0.0, 1.0, 0.0 }; - glLightfv (GL_LIGHT0, GL_POSITION, light0_position); -} - -void set_material_color (float r, float g, float b) -{ - GLfloat color[] = { r, g, b }; - glMaterialfv (GL_FRONT, GL_AMBIENT, color); - glMaterialfv (GL_FRONT, GL_DIFFUSE, color); -} - -#if defined(__APPLE__) || defined(MACOSX) - -void glutSolidCylinder (double radius, double height, int slices, int stacks) -{ - GLUquadricObj *q = gluNewQuadric (); - gluCylinder (q, radius, radius, height, slices, stacks); - gluDeleteQuadric (q); -} - -#endif diff --git a/script/opengl-magic.h b/script/opengl-magic.h deleted file mode 100644 index afa963a5fab8ac6ba323f724c0dcb51a995a76aa..0000000000000000000000000000000000000000 --- a/script/opengl-magic.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef OPENGL_MAGIC_H -#define OPENGL_MAGIC_H - -extern void init_opengl (int *argcp, char **argv, char *window_name); -extern void set_material_color (float r, float g, float b); - -#ifdef __MACOSX__ - extern void glutSolidCylinder (double radius, double height, int slices, int stacks); -#endif - -#endif /* OPENGL_MAGIC_H */ diff --git a/script/orbit-1.c b/script/orbit-1.c deleted file mode 100644 index 1f963cf44d937ba0627d7bc224930a7bcd39d27b..0000000000000000000000000000000000000000 --- a/script/orbit-1.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" -#include "textured-spheres.h" - -float t = 0.0; -GLuint earth_texture, moon_texture; - -void draw_earth (void) -{ - glPushMatrix (); - glRotatef (90, 1.0, 0.0, 0.0); - glRotatef (100.0 * t, 0.0, 0.0, 1.0); - draw_textured_sphere (earth_texture, 0.25512, 63, 20); - glPopMatrix (); -} - -void draw_moon (void) -{ - glPushMatrix (); - glRotatef (90, 1.0, 0.0, 0.0); - glRotatef (-90, 0.0, 0.0, 1.0); - draw_textured_sphere (moon_texture, 0.06952, 31, 10); - glPopMatrix (); -} - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glPushMatrix (); - glRotatef (23.44, 1.0, 0.0, -1.0); - draw_earth (); - glRotatef (5.145, 0.0, 1.0, 1.0); - glRotatef (30.0 * t, 0.0, -1.0, 0.0); - glTranslatef (0.9, 0.0, 0.0); - draw_moon (); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Orbit"); - init_texture ("earth-texture.png", &earth_texture); - init_texture ("moon-texture.png", &moon_texture); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/output-1.c b/script/output-1.c deleted file mode 100644 index d4f8b191d6d4491df2661046ce99c21ec2045a60..0000000000000000000000000000000000000000 --- a/script/output-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf (42); - return 0; -} diff --git a/script/output-2.c b/script/output-2.c deleted file mode 100644 index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000 --- a/script/output-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d\n", 42); - return 0; -} diff --git a/script/output-3.c b/script/output-3.c deleted file mode 100644 index d099c14a9d196ed21cf3bd07945b59221eccebcb..0000000000000000000000000000000000000000 --- a/script/output-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2); - return 0; -} diff --git a/script/output-4.c b/script/output-4.c deleted file mode 100644 index 9f2674e21e43a2566d9c4f4f0548af05801c6a7b..0000000000000000000000000000000000000000 --- a/script/output-4.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n"); - return 0; -} diff --git a/script/params-1.c b/script/params-1.c deleted file mode 100644 index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000 --- a/script/params-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/script/params-2.c b/script/params-2.c deleted file mode 100644 index d4ac6da31fe8138bf4b42326445a1ea2e2684a7d..0000000000000000000000000000000000000000 --- a/script/params-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; argv[i] != NULL; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/script/params-3.c b/script/params-3.c deleted file mode 100644 index 412c451645508ecd8e65c695f47b8ffb822657a2..0000000000000000000000000000000000000000 --- a/script/params-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (char **p = argv; *p; p++) - printf ("argv[p] = \"%s\"\n", *p); - return 0; -} diff --git a/script/pgscript.sty b/script/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/script/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/script/pgslides.sty b/script/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/script/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/script/philosophy.c b/script/philosophy.c deleted file mode 100644 index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000 --- a/script/philosophy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/script/pointers-1.c b/script/pointers-1.c deleted file mode 100644 index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000 --- a/script/pointers-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/script/qsort-1.c b/script/qsort-1.c deleted file mode 100644 index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000 --- a/script/qsort-1.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/qsort-2.c b/script/qsort-2.c deleted file mode 100644 index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000 --- a/script/qsort-2.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/qsort-3.c b/script/qsort-3.c deleted file mode 100644 index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000 --- a/script/qsort-3.c +++ /dev/null @@ -1,74 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (r > left) - quicksort (name, left, r); - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/sfmath.sty b/script/sfmath.sty deleted file mode 120000 index 599e505416fb5a096f751581a66c53bc109e935d..0000000000000000000000000000000000000000 --- a/script/sfmath.sty +++ /dev/null @@ -1 +0,0 @@ -../common/sfmath.sty \ No newline at end of file diff --git a/script/sort-0.c b/script/sort-0.c deleted file mode 100644 index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000 --- a/script/sort-0.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int find_first (char **name) -{ - return 2; -} - -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); - printf ("%s\n", name[first]); - return 0; -} diff --git a/script/sort-1.c b/script/sort-1.c deleted file mode 100644 index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000 --- a/script/sort-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (strcmp (name[i], name[first]) < 0) - first = 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 }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/script/sort-2.c b/script/sort-2.c deleted file mode 100644 index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000 --- a/script/sort-2.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = 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 }; - int first = find_first (name); - display (name, first, -1); - return 0; -} diff --git a/script/sort-3.c b/script/sort-3.c deleted file mode 100644 index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000 --- a/script/sort-3.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = 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 }; - int first = find_first (name, 0); - display (name, first, -1); - return 0; -} diff --git a/script/sort-4.c b/script/sort-4.c deleted file mode 100644 index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000 --- a/script/sort-4.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-5.c b/script/sort-5.c deleted file mode 100644 index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000 --- a/script/sort-5.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-6.c b/script/sort-6.c deleted file mode 100644 index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000 --- a/script/sort-6.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; -// display (name, left, right); -// usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-7.c b/script/sort-7.c deleted file mode 100644 index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000 --- a/script/sort-7.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = sorted; - for (int i = sorted + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/stack-11.c b/script/stack-11.c deleted file mode 100644 index 89629d661097948711db9ed252f568aa4a15440a..0000000000000000000000000000000000000000 --- a/script/stack-11.c +++ /dev/null @@ -1,64 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -void push_at (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void push_sorted (int x) -{ - int left = 0; - int right = stack_pointer; - while (left < right - 1) - { - int i = (left + right) / 2; - if (x < stack[i]) - right = i; - else - left = i; - } - push_at (x, right); -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - printf ("\n"); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - push_sorted (5); - show (); - push_sorted (256); - show (); - push_sorted (42); - push_sorted (13); - push_sorted (107); - show (); - return 0; -} diff --git a/script/statements-1.c b/script/statements-1.c deleted file mode 100644 index 92514b3c0bcccc1ff4eb032037407a122a2b02e8..0000000000000000000000000000000000000000 --- a/script/statements-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - 2 + 2; - return 0; -} diff --git a/script/statements-2.c b/script/statements-2.c deleted file mode 100644 index 475bce5c85b75e4e57d0d1fee9179daaf6647dbf..0000000000000000000000000000000000000000 --- a/script/statements-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x; - x = printf ("%d\n", 2 + 2); - printf ("%d\n", x); - return 0; -} diff --git a/script/strings-1.c b/script/strings-1.c deleted file mode 100644 index d06457baea6cca1429b4c37026c8af1a8500a676..0000000000000000000000000000000000000000 --- a/script/strings-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%d", hello_world[i++]); - return 0; -} diff --git a/script/strings-14.c b/script/strings-14.c deleted file mode 100644 index dd05111f79e0573d616522593362f6f93beb89e7..0000000000000000000000000000000000000000 --- a/script/strings-14.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; -} diff --git a/script/strings-15.c b/script/strings-15.c deleted file mode 100644 index fed7abe314e9db92eb804177d9aae413b60fb4c6..0000000000000000000000000000000000000000 --- a/script/strings-15.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; -} diff --git a/script/strings-16.c b/script/strings-16.c deleted file mode 100644 index 731a6b182fcc38e984565425a141d50bb09893df..0000000000000000000000000000000000000000 --- a/script/strings-16.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; -} diff --git a/script/strings-2.c b/script/strings-2.c deleted file mode 100644 index 4128aea3e056e146850c1b7ded7a7a2e16dbfcba..0000000000000000000000000000000000000000 --- a/script/strings-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%c", hello_world[i++]); - return 0; -} diff --git a/script/strings-3.c b/script/strings-3.c deleted file mode 100644 index a2e12ba883dc8e7f16dbc53319566c5b942bc791..0000000000000000000000000000000000000000 --- a/script/strings-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - char *p = hello_world; - while (*p) - printf ("%c", *p++); - return 0; -} diff --git a/script/strings-4.c b/script/strings-4.c deleted file mode 100644 index dc9602c6d3ea235a66f167b3db1c345aad181a2c..0000000000000000000000000000000000000000 --- a/script/strings-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *p = "Hello, world!"; - printf ("%s\n", p); - return 0; -} diff --git a/script/structs-1.c b/script/structs-1.c deleted file mode 100644 index 1cc76786c7595897b141cf492d9ac747e19bb000..0000000000000000000000000000000000000000 --- a/script/structs-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -int main (void) -{ - date today = { 1, 11, 2016 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/structs-2.c b/script/structs-2.c deleted file mode 100644 index 9bfa4cbfb321487fbeed8022de0c027ab7e468e2..0000000000000000000000000000000000000000 --- a/script/structs-2.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 1; - (*d).month = 11; - (*d).year = 2016; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; -} diff --git a/script/structs-3.c b/script/structs-3.c deleted file mode 100644 index 2abdd1fb052263976666b9a8bdf0646871936b47..0000000000000000000000000000000000000000 --- a/script/structs-3.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 1; - d->month = 11; - d->year = 2016; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; -} diff --git a/script/textured-spheres.c b/script/textured-spheres.c deleted file mode 100644 index aee3dc199ab3bd0c85c63d22e5cfdc9456ca2188..0000000000000000000000000000000000000000 --- a/script/textured-spheres.c +++ /dev/null @@ -1,168 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <sys/stat.h> -#include <png.h> -#include "textured-spheres.h" - -#ifndef __USE_POSIX - extern int fileno (FILE *stream); -#endif - -static png_byte *load_png_file (char *filename, unsigned *w, unsigned *h) -{ - FILE *f = fopen (filename, "rb"); - if (!f) - return NULL; - - /* is it a PNG file? */ - png_byte buf[8]; - if (fread (buf, 1, 8, f) != 8) - { - fclose (f); - return NULL; - } - if (!png_check_sig (buf, 8)) - { - fclose (f); - return NULL; - } - - png_struct *png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - if (!png_ptr) - { - fclose (f); - return NULL; - } - - png_info *info_ptr = png_create_info_struct (png_ptr); - if (!info_ptr) - { - fclose (f); - png_destroy_read_struct (&png_ptr, NULL, NULL); - return NULL; - } - - if (setjmp (png_jmpbuf (png_ptr))) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_init_io (png_ptr, f); - png_set_sig_bytes (png_ptr, 8); - png_read_info (png_ptr, info_ptr); - - png_uint_32 width; - png_uint_32 height; - int bit_depth; - int color_type; - png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, - &color_type, NULL, NULL, NULL); - - /* tell libpng to strip 16 bit/color files down to 8 bits/color */ - if (bit_depth == 16) - png_set_strip_16 (png_ptr); - /* expand paletted colors into true RGB triplets */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - png_set_expand (png_ptr); - /* expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ - if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_expand (png_ptr); - /* expand paletted or RGB images with transparency to full alpha channels - so the data will be available as RGBA quartets. */ - if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_expand (png_ptr); - /* transform grayscale images into rgb */ - if (color_type == PNG_COLOR_TYPE_GRAY - || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb (png_ptr); - - if (color_type & PNG_COLOR_MASK_ALPHA) - png_set_strip_alpha (png_ptr); - - png_read_update_info (png_ptr, info_ptr); - png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, - &color_type, NULL, NULL, NULL); - if (color_type != PNG_COLOR_TYPE_RGB - && color_type != PNG_COLOR_TYPE_RGB_ALPHA) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_uint_32 row_bytes = png_get_rowbytes (png_ptr, info_ptr); - if (row_bytes & 0x01) - row_bytes++; - - png_byte *png_pixels = malloc (row_bytes * height * sizeof (png_byte)); - if (png_pixels == NULL) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_byte **row_pointers = malloc (height * sizeof (png_bytep)); - if (row_pointers == NULL) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - free (png_pixels); - png_pixels = NULL; - return NULL; - } - - int i; - for (i = 0; i < height; i++) - row_pointers[i] = png_pixels + i * row_bytes; - - png_read_image (png_ptr, row_pointers); - - png_read_end (png_ptr, info_ptr); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - fclose (f); - - if (w) - *w = width; - if (h) - *h = height; - free (row_pointers); - - return png_pixels; -} - -void init_texture (char *image_filename, GLuint *texture) -{ - unsigned image_width, image_height; - png_byte *image = load_png_file (image_filename, &image_width, &image_height); - if (!image) - { - fprintf (stderr, "textured-spheres.c: cannot open texture file \"%s\"", - image_filename); - exit (1); - } - glGenTextures (1, texture); - glBindTexture (GL_TEXTURE_2D, *texture); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image_width, image_height, GL_RGB, GL_UNSIGNED_BYTE, image); -} - -void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks) -{ - static GLfloat white_color[] = { 1.0, 1.0, 1.0 }; - glMaterialfv (GL_FRONT, GL_AMBIENT, white_color); - glMaterialfv (GL_FRONT, GL_DIFFUSE, white_color); - glBindTexture (GL_TEXTURE_2D, texture); - glEnable (GL_TEXTURE_2D); - GLUquadric *sphere = gluNewQuadric (); - gluQuadricTexture (sphere, GL_TRUE); - gluSphere (sphere, radius, slices, stacks); - glDisable (GL_TEXTURE_2D); -} diff --git a/script/textured-spheres.h b/script/textured-spheres.h deleted file mode 100644 index aa2fb4f4f6d609bbab3f524069cac8a56636c712..0000000000000000000000000000000000000000 --- a/script/textured-spheres.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TEXTURED_SPHERES_H -#define TEXTURED_SPHERES_H - -#include <GL/gl.h> -#include <GL/glu.h> - -extern void init_texture (char *image_filename, GLuint *texture); -extern void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks); - -#endif /* TEXTURED_SPHERES_H */ diff --git a/script/unions-1.c b/script/unions-1.c deleted file mode 100644 index 87e5325939f6b045d78f92d62eacdbe2045e3190..0000000000000000000000000000000000000000 --- a/script/unions-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - int8_t i; - uint8_t u; -} num8_t; - -int main (void) -{ - num8_t n; - n.i = -3; - printf ("%d\n", n.u); - return 0; -}