From 71ab7db1bafe430e2f2302342ab3ce7a41535880 Mon Sep 17 00:00:00 2001
From: stsh Schreiben Sie ein C-Programm, welches die Zeichen und Wörter einer mit der Tastatur eingegebenen Zeile zählt. Wortzwischenräume sind entweder Leerzeichen (’ ‘) oder Tabulatoren (‘\t’). Die Eingabe der Zeile mit einem newline-character (‘\n’) abgeschlossen. Danach soll ihr Programm die Anzahl Zeichen und die Anzahl Wörter ausgeben und terminieren. Schreiben Sie ein C-Programm, welches die Zeichen und Wörter einer mit der Tastatur eingegebenen Zeile zählt. Wortzwischenräume sind entweder Leerzeichen (’ ‘) oder Tabulatoren (’\t’). Die Eingabe der Zeile mit einem newline-character (‘\n’) abgeschlossen. Danach soll ihr Programm die Anzahl Zeichen und die Anzahl Wörter ausgeben und terminieren. Verwenden Sie die Setzen Sie eine Schleife ein, die beim Zeichen ‘\n’ terminiert. (Copyright Bild: xkcd.com) (Copyright Bild: xkcd.com)
6. Aufgabe 4: Zeichen und Wörter zählen¶
-
char getchar(void)
Funktion aus der stdio.h
Library, um die Zeichen einzeln einzulesen. Die Funktion getchar
kehrt nicht gleich bei Eingabe des ersten Zeichens zurück, sondern puffert die Daten, bis die Eingabe einer kompletten Zeile mit Return abgeschlossen wird. Dann wird das erste Zeichen aus dem Puffer zurückgegeben und mit weiteren Aufrufen von getchar können die nachfolgenden Zeichen aus dem Puffer gelesen werden. Gibt getchar
das Zeichen \n
zurück, ist die Zeile komplett zurückgegeben und der Puffer ist wieder leer.02: Funktionen, Datentyp “enum”¶
-
1. Übersicht¶
@@ -94,7 +98,7 @@ Beispiel einer Additions-Funktion:
(Copyright Bild: www.planet-wissen.de)
+(Copyright Bild: www.planet-wissen.de)
In der ersten Aufgabe berechnen Sie die Tag pro Monat einer beliebigen Kombination Monat / Jahr. @@ -116,7 +120,7 @@ Erweitern Sie dazu das Programm um folgende Aspekte:
Schaltjahre sind alle Jahre, die durch 4 teilbar sind.
Eine Ausnahme bilden die Jahrhunderte (1600, 1700…). Diese sind keine Schltjahre.
zu den 100er gibt es ebenfalls Ausnahmen: Diese sind immer Schaltjahre, wenn sie durch 400 teilbar sind -… also zum Beispiel 1600 ist eines, nicht jedoch 1700. Weiterführende Details finden Sie unter https://de.wikipedia.org/wiki/Gregorianischer_Kalender
Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen:
(Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung)
+(Quelle: https://de.wikipedia.org/wiki/Wochentagsberechnung)
Hier ist eine für C abgewandelte Variante davon.
weekday = ((day + (13 * m - 1) / 5 + y + y / 4 + c / 4 - 2 * c) % 7 + 7) % 7
alle Zahlen sind int Werte und alles basiert auf int-Arithmetik
@@ -219,9 +223,9 @@ Vorgaben an die Umsetzung
Definieren Sie einen enum Typen mit (typedef) Namen weekday_t dessen Werte die Englischen 3-Zeichen Abkürzungen der Tage sind, nämlich Sun, Mon, … Sat und stel-len Sie sicher dass die Abkürzungen für die Werte 0…6 stehen.
Schreiben Sie eine Funktion weekday_t calculate_weekday(date_t date) nach der Beschreibung der obigen Formel. Das date Argument ist als gültig angenom-men, d.h. es ist ein Programmier-Fehler, wenn das Programm diese Funktion mit einem ungültigen Datum aufruft. Machen Sie dafür als erste Codezeile in der Funktion eine Zu-sicherung (assert(is_valid_date(date));)
-Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti-ger Wert für day erkannt wird, soll assert(!”day is out-of-range”); aufgeru-fen werden.
+
Schreiben Sie eine Funktion void print_weekday(weekday_t day), welche für jeden gülteigen Tag eine Zeile auf stdout schreibt mit den Englischen 3-Zeichen Ab-kürzungen für den Wochentag, z.B. Sonntag: Sun, Montag: Mon, etc. Wenn ein ungülti-ger Wert für day erkannt wird, soll assert(!“day is out-of-range”); aufgeru-fen werden.
Hinweise
-• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung
+• Für interessierte, siehe: https://de.wikipedia.org/wiki/Wochentagsberechnung
@@ -353,7 +357,6 @@ Schreibt formatierten Text auf den stderr Stream.
Manipulationen von einzelnen Bits gehören zu den Basis Operationen und dienen als Grundlagen um weitere komplexere Konstrukte zu schaffen. Verfollständigen sie folgendes Beispiel mit den drei Basis Operationen:
-#include <stdlib.h>
+#include <stdlib.h>
-int main() {
- unsigned int number;
- unsigned int bit = 3; // bit at position 3
+int main() {
+ unsigned int number;
+ unsigned int bit = 3; // bit at position 3
- // Setting a bit
- number = ...; // solution: number |= 1 << bit;
-
- // Clearing a bit
- number = ...; // solution: number &= ~(1 << bit);
-
- // Toggling a bit
- number = ...; // solution; number ^= 1 << bit;
-
- return EXIT_SUCCESS;
-}
+ // Setting a bit
+ number = ...; // solution: number |= 1 << bit;
+
+ // Clearing a bit
+ number = ...; // solution: number &= ~(1 << bit);
+
+ // Toggling a bit
+ number = ...; // solution; number ^= 1 << bit;
+
+ return EXIT_SUCCESS;
+}
2. Variablen tauschen (ohne Dritt-Variable)¶
Zwei Variablen zu vertauschen scheint ein einfach lösbares Problem zu sein. Eine offensichtliche Variante wäre mittels einer temporären Variablen:
-#include <stdlib.h>
-#include <stdio.h>
+#include <stdlib.h>
+#include <stdio.h>
-int main(){
- int a = 3;
- int b = 4;
- printf("a: %d; b: %d\n", a, b);
-
- int temp = a;
- a = b;
- b = temp;
-
- printf("a: %d; b: %d\n", a, b);
- return EXIT_SUCCESS;
-}
+int main(){
+ int a = 3;
+ int b = 4;
+ printf("a: %d; b: %d\n", a, b);
+
+ int temp = a;
+ a = b;
+ b = temp;
+
+ printf("a: %d; b: %d\n", a, b);
+ return EXIT_SUCCESS;
+}
Es gibt aber auch eine Variante, die ohne zusätzliche Variable auskommt. Dabei wird die Tatsache, dass eine zweite XOR Operation eine erste XOR Operation rückgängig macht:
@@ -126,62 +130,62 @@
0111 XOR 0100 = 0011
Somit kommt man von einem XOR Resultat (0111) wieder auf beide Anfangs Operanden zurück indem man einfach ein zweites Mal mit einem Operanden eine XOR Verknüpfung macht. Damit kann ein Operand als Zwischenspeicher dienen und man muss nicht extra eine Zusatzvariable verwenden.
Überlegen sie sich wie sie damit zwei Variablen vertauschen können ohne Zusatzvariable:
-#include <stdlib.h>
-#include <stdio.h>
+#include <stdlib.h>
+#include <stdio.h>
-int main(){
- int a = 3;
- int b = 4;
- printf("a: %d; b: %d\n", a, b);
-
+int main(){
+ int a = 3;
+ int b = 4;
+ printf("a: %d; b: %d\n", a, b);
+
- ...
+ ...
- /* Solutions:
+ /* Solutions:
// a == 0011; b == 0100
a ^= b; // a == 0111; b == 0100
b ^= a; // a == 0111; b == 0011
a ^= b; // a == 0100; b == 0011
- */
-
- printf("a: %d; b: %d\n", a, b);
- return EXIT_SUCCESS;
-}
+ */
+
+ printf("a: %d; b: %d\n", a, b);
+ return EXIT_SUCCESS;
+}
3. Lower- / Uppercase¶
-#include <stdlib.h>
-#include <stdio.h>
+#include <stdlib.h>
+#include <stdio.h>
-int main(){
- char word[8] = "sREedEv";
- char *wordptr = &word[0];
+int main(){
+ char word[8] = "sREedEv";
+ char *wordptr = &word[0];
- while(wordptr < &word[7]) {
- printf("UPPERCASE: %c\n", *wordptr & '_'); // converts the char into uppercase regardless of the current casing
- printf("LOWERCASE: %c\n", *wordptr | ' '); // converts the char into lowercase regardless of the current casing
- wordptr++;
- }
+ while(wordptr < &word[7]) {
+ printf("UPPERCASE: %c\n", *wordptr & '_'); // converts the char into uppercase regardless of the current casing
+ printf("LOWERCASE: %c\n", *wordptr | ' '); // converts the char into lowercase regardless of the current casing
+ wordptr++;
+ }
- return EXIT_SUCCESS;
-}
+ return EXIT_SUCCESS;
+}
4. Prüfen auf 2-er Potenz¶
-#include <stdio.h>
-#include <stdlib.h>
+#include <stdio.h>
+#include <stdlib.h>
-int main(){
- int a=32;
- if(a > 0 && (a & (a - 1)) == 0){
- printf("%d is a power of 2", a);
- }
- return EXIT_SUCCESS;
-}
+int main(){
+ int a=32;
+ if(a > 0 && (a & (a - 1)) == 0){
+ printf("%d is a power of 2", a);
+ }
+ return EXIT_SUCCESS;
+}
@@ -199,11 +203,11 @@
Rechnung wird als ein String über scanf dem Programm übergeben
String wird in Token zerstückelt und in struct gespeichert:
-typedef struct {
- unsigned int operand_1;
- unsigned int operand_2;
- char operation;
-} Expression;
+typedef struct {
+ unsigned int operand_1;
+ unsigned int operand_2;
+ char operation;
+} Expression;
@@ -313,7 +317,6 @@
- 4. Bewertung
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -327,7 +330,7 @@
- Documentation overview
- Previous: 02: Funktionen, Datentyp “enum”
- - Next: 04 - Modularisieren von C Code
+ - Next: 05 - Arrays/Strings/TicTacToe
@@ -357,7 +360,7 @@
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P04_Modularisieren_von_C_Code/README.html b/build/html/P04_Modularisieren_von_C_Code/README.html
index c9a2f44..c467f07 100644
--- a/build/html/P04_Modularisieren_von_C_Code/README.html
+++ b/build/html/P04_Modularisieren_von_C_Code/README.html
@@ -5,6 +5,10 @@
+
+
+
+
04 - Modularisieren von C Code — SNP Labs documentation
@@ -263,7 +267,7 @@ firefox dep.png
den Source Files zu den png
Files ausführen.
Prüfen Sie schliesslich die Umsetzung Aufgabe mittels make dep-clean dep && firefox src/*.png.
-4.1 Neue Regeln hinzufügen¶
+4.1 Neue Regeln hinzufügen¶
Führen Sie im Makefile
an den angegebenen Stellen folgende
Ergänzungen durch
@@ -284,10 +288,17 @@ macht
Die Umsetzung der obigen Änderungen sind erfolgreich, wenn Sie
folgende Shell Command Line erfolgreich ausführen können und in
-Firefox die Abhängigkeiten der C-Files von den Inclu-de Files
+Firefox die Abhängigkeiten der C-Files von den Include Files
dargestellt wird.
make dep-clean dep && firefox src/*.png.
+
+4.2 Resultate analysieren und erklären¶
+
+Analysieren Sie die in der vorherigen Aufgabe erstellten grafischen Darstellungen.
+Erklären Sie was dargestellt wird und stellen Sie den Bezug zum zugehörigen C-Code her.
+
+
5. Bewertung¶
@@ -329,7 +340,7 @@ dargestellt wird.
Beschreibung
-fprintf(stderr, "v=%d", v)
+fprintf(stderr, "v=%d", v)
@@ -418,40 +429,43 @@ andere Formate übersetzt.
Es gibt als Teil dieses Tool-Sets verschiedene Übersetzer. Der hier
verwendete ist der Basis-übersetzer: dot
.
Das dot
-File Format kennt viele Möglichkeiten die Knoten und Kanten
-eines Graphen und de-ren Anordnung anzugeben.
+eines Graphen und deren Anordnung anzugeben.
Der Vorteil eines solchen Tool-Sets ist, dass man den Inhalt (den
Graphen) einfach definieren kann und sich nicht um das komplexe
Problem der ansprechenden Visualisierung kümmern muss.
Beispiel File (dot -Tpng sample.dot > sample.png
)
-digraph G {
- node [shape=box]
- A [label="a.c"];
- B [label="a.h"];
- C [label="b.h"];
+digraph G {
+ node [shape=box]
+ A [label="a.c"];
+ B [label="a.h"];
+ C [label="b.h"];
- subgraph cluster_c0 {
- label="main"; color=black;
- A;
- }
+ subgraph cluster_c0 {
+ label="main"; color=black;
+ A;
+ }
- subgraph cluster_c1 {
- label="others"; style=filled; col-or=lightgrey;
- { B; C; rank=same; }
- }
+ subgraph cluster_c1 {
+ label="others"; style=filled; color=lightgrey;
+ { B; C; rank=same; }
+ }
- A -> B;
- A -> C;
- B -> C;
-}
+ A -> B;
+ A -> C;
+ B -> C;
+}
+
6.2.3 png File¶
Das png
Format ist ein verlustfrei komprimiertes Raster Graphik
Format. Es wird oft in Web Pages verwendet.
-Version: 15.02.2022
+Version: 22.02.2022
@@ -485,7 +499,6 @@ Format. Es wird oft in Web Pages verwendet.
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -527,7 +540,7 @@ Format. Es wird oft in Web Pages verwendet.
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P05_TicTacToe/P05_TicTacToe.html b/build/html/P05_TicTacToe/P05_TicTacToe.html
index 10394d6..7ae4748 100644
--- a/build/html/P05_TicTacToe/P05_TicTacToe.html
+++ b/build/html/P05_TicTacToe/P05_TicTacToe.html
@@ -196,8 +196,8 @@ init_model:… 0/0 FAILED
2. Konzentrieren Sie sich auf den ersten Test der fehlschlägt. Dies ist ein Unit Test, welcher die Funktion model_init() prüft. Suchen Sie die Funktion in src/model.h und src/model.c.
Was ist die geforderte Funktionalität und wie ist sie implementiert?
Suchen Sie die darin aufgerufene model_init() Funktion und implementieren Sie diese.
-void model_init(model_t *instance) {
-assert(instance);
+void model_init(model_t *instance) {
+assert(instance);
// Instructions to the students:
// set all fields of the board to model_state_none
// BEGIN-STUDENTS-TO-ADD-CODE
@@ -215,21 +215,21 @@ Suchen Sie die darin aufgerufene model_init() Funktion und impl
1. Führen Sie make test
aus.
2. Suchen Sie die Funktion model_get_state() in model.h und model.c.
3. Implementieren Sie die intern benutzte Funktion get_state() gemäss der Anleitung im Code.
-model_state_t model_get_state(model_t *instance, model_pos_t pos)
-{
-assert(instance);
-assert_pos(pos);
+model_state_t model_get_state(model_t *instance, model_pos_t pos)
+{
+assert(instance);
+assert_pos(pos);
// Instructions to the students:
// replace the stub implementation my access to the field at the given position.
// BEGIN-STUDENTS-TO-ADD-CODE
-return model_state_none; // stub
+return model_state_none; // stub
// END-STUDENTS-TO-ADD-CODE
-}
+}
@@ -242,36 +242,36 @@ Suchen Sie die darin aufgerufene model_init() Funktion und impl
1. Führen Sie make test
aus.
2. Suchen Sie die Funktion model_get_state() in model.h und model.c.
3. Implementieren Sie die intern benutzte Funktion get_state() gemäss der Anleitung im Code.
-model_state_t model_get_state(model_t *instance, model_pos_t pos)
-{
-assert(instance);
-assert_pos(pos);
+model_state_t model_get_state(model_t *instance, model_pos_t pos)
+{
+assert(instance);
+assert_pos(pos);
// Instructions to the students:
// replace the stub implementation my access to the field at the given position.
// BEGIN-STUDENTS-TO-ADD-CODE
-return model_state_none; // stub
+return model_state_none; // stub
// END-STUDENTS-TO-ADD-CODE
-}
+}
3.4 test_model_can_move¶
Gehen Sie analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion model_can_move().
-int model_can_move(model_t *instance){
-assert(instance);
-if (model_get_winner(instance) == model_state_none) {
+int model_can_move(model_t *instance){
+assert(instance);
+if (model_get_winner(instance) == model_state_none) {
// Instructions to the students:
// scan all fields: return 1 with first field which equals model_state_none
// BEGIN-STUDENTS-TO-ADD-CODE
// END-STUDENTS-TO-ADD-CODE}
-return 0;}
+return 0;}
@@ -283,17 +283,17 @@ Suchen Sie die darin aufgerufene model_init() Funktion und impl
* @param instance [INOUT] The instance which holds the state.
* @param pos [IN] The affected field.
* @param state [IN] The new state of the field.
-*/
-static void set_state(model_t *instance, model_pos_t pos, model_state_t state)
-{
-assert_pos(pos);
+*/
+static void set_state(model_t *instance, model_pos_t pos, model_state_t state)
+{
+assert_pos(pos);
// Instructions to the students:
// set the field of the board to the new state
// BEGIN-STUDENTS-TO-ADD-CODE
// END-STUDENTS-TO-ADD-CODE
-}
+}
Wenn die beiden obigen Teilaufgaben erfolgreich umgesetzt sind, laufen die Tests ohne Fehler durch und das Spiel kann gespielt werden.
@@ -367,7 +367,6 @@ Suchen Sie die darin aufgerufene model_init() Funktion und impl
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -409,7 +408,7 @@ Suchen Sie die darin aufgerufene model_init() Funktion und impl
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P05_TicTacToe/README.html b/build/html/P05_TicTacToe/README.html
index e72691c..a7ecfdf 100644
--- a/build/html/P05_TicTacToe/README.html
+++ b/build/html/P05_TicTacToe/README.html
@@ -5,6 +5,10 @@
+
+
+
+
05 - Arrays/Strings/TicTacToe — SNP Labs documentation
@@ -16,7 +20,7 @@
-
+
@@ -146,27 +150,27 @@ Run Summary: Type Total Ran Passed Failed Inactive
asserts 6 6 0 6 n/a
-
+
Konzentrieren Sie sich auf den ersten Test der fehlschlägt. Dies ist ein Unit Test, welcher die Funktion model_init() prüft. Suchen Sie die Funktion in src/model.h und src/model.c.
Was ist die geforderte Funktionalität und wie ist sie implementiert?
Suchen Sie die darin aufgerufene model_init() Funktion und implementieren Sie diese.
-void model_init(model_t *instance)
-{
- assert(instance);
+void model_init(model_t *instance)
+{
+ assert(instance);
- // Instructions to the students:
- // set all fields of the board to model_state_none
- // BEGIN-STUDENTS-TO-ADD-CODE
+ // Instructions to the students:
+ // set all fields of the board to model_state_none
+ // BEGIN-STUDENTS-TO-ADD-CODE
- // END-STUDENTS-TO-ADD-CODE
-}
+ // END-STUDENTS-TO-ADD-CODE
+}
-
+
Führen Sie make test
und korrigieren Sie obige Funktion, bis der Test nicht mehr fehlschlägt.
@@ -179,21 +183,21 @@ Run Summary: Type Total Ran Passed Failed Inactive
Suchen Sie die Funktion model_get_state() in model.h und model.c.
Implementieren Sie die intern benutzte Funktion get_state() gemäss der Anleitung im Code.
-model_state_t model_get_state(model_t *instance, model_pos_t pos)
-{
- assert(instance);
- assert_pos(pos);
+model_state_t model_get_state(model_t *instance, model_pos_t pos)
+{
+ assert(instance);
+ assert_pos(pos);
- // Instructions to the students:
- // replace the stub implementation my access to the field at the given position.
- // BEGIN-STUDENTS-TO-ADD-CODE
+ // Instructions to the students:
+ // replace the stub implementation my access to the field at the given position.
+ // BEGIN-STUDENTS-TO-ADD-CODE
- return model_state_none; // stub
+ return model_state_none; // stub
- // END-STUDENTS-TO-ADD-CODE
-}
+ // END-STUDENTS-TO-ADD-CODE
+}
@@ -203,20 +207,20 @@ Run Summary: Type Total Ran Passed Failed Inactive
4.3 Teilaufgabe test_model_can_move¶
Gehen Sie analog den obigen Teilaufgaben vor und implementieren Sie, gemäss Vorgaben im Code, die Funktion model_can_move().
-int model_can_move(model_t *instance)
-{
- assert(instance);
- if (model_get_winner(instance) == model_state_none) {
- // Instructions to the students:
- // scan all fields: return 1 with first field which equals model_state_none
- // BEGIN-STUDENTS-TO-ADD-CODE
+int model_can_move(model_t *instance)
+{
+ assert(instance);
+ if (model_get_winner(instance) == model_state_none) {
+ // Instructions to the students:
+ // scan all fields: return 1 with first field which equals model_state_none
+ // BEGIN-STUDENTS-TO-ADD-CODE
- // END-STUDENTS-TO-ADD-CODE
- }
- return 0;
-}
+ // END-STUDENTS-TO-ADD-CODE
+ }
+ return 0;
+}
@@ -230,20 +234,20 @@ Run Summary: Type Total Ran Passed Failed Inactive
* @param instance [INOUT] The instance which holds the state.
* @param pos [IN] The affected field.
* @param state [IN] The new state of the field.
- */
-static void set_state(model_t *instance, model_pos_t pos, model_state_t state)
-{
- assert_pos(pos);
+ */
+static void set_state(model_t *instance, model_pos_t pos, model_state_t state)
+{
+ assert_pos(pos);
- // Instructions to the students:
- // set the field of the board to the new state
- // BEGIN-STUDENTS-TO-ADD-CODE
+ // Instructions to the students:
+ // set the field of the board to the new state
+ // BEGIN-STUDENTS-TO-ADD-CODE
- // END-STUDENTS-TO-ADD-CODE
-}
+ // END-STUDENTS-TO-ADD-CODE
+}
@@ -321,7 +325,6 @@ Run Summary: Type Total Ran Passed Failed Inactive
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 1. Übersicht
- 2. Lernziele
@@ -347,7 +350,7 @@ Run Summary: Type Total Ran Passed Failed Inactive
Related Topics
- Documentation overview
- - Previous: 04 - Modularisieren von C Code
+ - Previous: 03 - Bit Operationen, Struct, Typedef
- Next: 06 - Personen Verwaltung – Linked List
@@ -378,7 +381,7 @@ Run Summary: Type Total Ran Passed Failed Inactive
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P06_Personen_Verwaltung_Linked_List/README.html b/build/html/P06_Personen_Verwaltung_Linked_List/README.html
index 436dae5..5461e9e 100644
--- a/build/html/P06_Personen_Verwaltung_Linked_List/README.html
+++ b/build/html/P06_Personen_Verwaltung_Linked_List/README.html
@@ -5,6 +5,10 @@
+
+
+
+
06 - Personen Verwaltung – Linked List — SNP Labs documentation
@@ -98,18 +102,18 @@ Abbildung 1: Zyklisch verkettete Liste
Die für je eine Person zu speichernden Daten sollen in folgendem C struct
zusammengefasst sein.
#define NAME_LEN 20
-typedef struct {
- char name[NAME_LEN];
- char first_name[NAME_LEN];
- unsigned int age;
-} person_t;
+typedef struct {
+ char name[NAME_LEN];
+ char first_name[NAME_LEN];
+ unsigned int age;
+} person_t;
Jeder Knoten der verketteten Liste soll aus folgendem C struct
bestehen.
-typedef struct node {
- person_t content; // in diesem Knoten gespeicherte Person
- struct node *next; // Pointer auf den nächsten Knoten in der Liste
-} node_t;
+typedef struct node {
+ person_t content; // in diesem Knoten gespeicherte Person
+ struct node *next; // Pointer auf den nächsten Knoten in der Liste
+} node_t;
Vorschlag: zyklisch verkettete Liste
@@ -119,7 +123,7 @@ Abbildung 1: Zyklisch verkettete Liste
Sortiertes Einfügen
Die Personen Records sollen sortiert in die Liste eingefügt werden. Dies bedeutet, dass vom Anker her gesucht werden soll, bis der erste Knoten gefunden wurde dessen Nachfolgeknoten entweder „grösser“ ist als der einzufügende Knoten, oder wo das Ende der Liste erreicht ist. Die Ordnung (grösser, gleich, kleiner) soll so definiert sein:
// if (p1 > p2) { ... }
-if (person_compare(&p1, &p2) > 0) { ... }
+if (person_compare(&p1, &p2) > 0) { ... }
/**
* @brief Compares two persons in this sequence: 1st=name, 2nd=first_name, 3rd=age
* @param a [IN] const reference to 1st person in the comparison
@@ -129,8 +133,8 @@ Abbildung 1: Zyklisch verkettete Liste
* <0 if all previous fields are the same, but for this field, b is greater
* @remark strncmp() is used for producing the result of string field comparisons
* @remark a->age – b->age is used for producing the result of age comparison
- */
-int person_compare(const person_t *a, const person_t *b);
+ */
+int person_compare(const person_t *a, const person_t *b);
Eingabe
@@ -187,12 +191,12 @@ Abbildung 1: Zyklisch verkettete Liste
Kreieren Sie folgende Files in src
und implementieren Sie main.c
basierend auf dem unten von Ihnen gegebenen API.
File person.h
Typ Definitionen:
-person_t... // siehe Beschreibung oben
+person_t... // siehe Beschreibung oben
Funktionsdeklarationen:
// siehe Beschreibung oben
-int person_compare(const person_t *a, const person_t *b);
+int person_compare(const person_t *a, const person_t *b);
@@ -200,7 +204,7 @@ Abbildung 1: Zyklisch verkettete Liste
File list.h
Typ Definitionen:
-person_t... // siehe Beschreibung oben
+person_t... // siehe Beschreibung oben
Funktionsdeklarationen:
@@ -317,7 +321,6 @@ Abbildung 1: Zyklisch verkettete Liste
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 1. Übersicht
@@ -379,7 +382,7 @@ Abbildung 1: Zyklisch verkettete Liste
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P07_Prozesse_und_Threads/README.html b/build/html/P07_Prozesse_und_Threads/README.html
index 0661cbe..9419da2 100644
--- a/build/html/P07_Prozesse_und_Threads/README.html
+++ b/build/html/P07_Prozesse_und_Threads/README.html
@@ -5,6 +5,10 @@
+
+
+
+
07 - Prozesse und Threads — SNP Labs documentation
@@ -252,7 +256,7 @@
Hinweis: ein core Dump ist ein Abbild des Speichers z.B. zum Zeitpunkt, wenn das Programm abstürzt (wie oben mit der Speicher Zugriff Verletzung). Der Dump wird im File core abgelegt und kann mit dem gdb (GNU-Debugger) gelesen werden (siehe README
). Tippen Sie nach dem Starten des Command Line UI des gdb where
gefolgt von list ein, damit sie den Ort des Absturzes sehen. Mit quit
verlassen Sie gdb wieder.
-
+
Wenn Sie ProcA7.e 2
starten, sendet das Kind das Signal 30 an sich selbst. Was geschieht?
@@ -331,7 +335,7 @@
-
+
Setzen Sie in der Thread-Routine vor dem Befehl pthread_exit()
eine unendliche Schleife ein, z.B. while(1) { }
; .
Starten Sie das Programm und beobachten Sie das Verhalten mit top
. Was beobachten Sie und was schliessen Sie daraus?
@@ -389,7 +393,7 @@
Im Abschnitt 4 finden Sie Zusatzinformationen über diese Implementation eines Dämon Prozesses plus weiterführende Informationen.
Aufgaben
-Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit make
und starten Sie das Programm PlapperMaul in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden Hallo, ich bins…. Pidi plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl ps
können Sie Ihre aktiven Prozesse auflisten, auch PlapperMaul. Überlegen Sie sich zuerst, was mit PlapperMaul geschieht, wenn Sie das Fenster schliessen: läuft PlapperMaul weiter? Was geschieht mit PlapperMaul wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen?
+Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit make
und starten Sie das Programm PlapperMaul in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden Hallo, ich bins… Pidi plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl ps
können Sie Ihre aktiven Prozesse auflisten, auch PlapperMaul. Überlegen Sie sich zuerst, was mit PlapperMaul geschieht, wenn Sie das Fenster schliessen: läuft PlapperMaul weiter? Was geschieht mit PlapperMaul wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen?
@@ -553,7 +557,6 @@ Die Firewall können Sie mit folgendem Befehl wiederherstellen:
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -631,7 +634,7 @@ Die Firewall können Sie mit folgendem Befehl wiederherstellen:
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P07_Prozesse_und_Threads/README_P02.html b/build/html/P07_Prozesse_und_Threads/README_P02.html
index 1237156..9e7e657 100644
--- a/build/html/P07_Prozesse_und_Threads/README_P02.html
+++ b/build/html/P07_Prozesse_und_Threads/README_P02.html
@@ -5,6 +5,10 @@
+
+
+
+
09/02 - Dämon Prozesse — SNP Labs documentation
@@ -77,24 +81,24 @@
Im Abschnitt 4 finden Sie Zusatzinformationen über diese Implementation eines Dämon Prozesses plus weiterführende Informationen.
Aufgaben
-Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit make
und starten Sie das Programm PlapperMaul in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden Hallo, ich bins…. Pidi plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl ps
können Sie Ihre aktiven Prozesse auflisten, auch PlapperMaul. Überlegen Sie sich zuerst, was mit PlapperMaul geschieht, wenn Sie das Fenster schliessen: läuft PlapperMaul weiter? Was geschieht mit PlapperMaul wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen?
+Für die folgende Aufgabe benötigen Sie mindestens zwei Fenster (Kommandozeilen-Konsolen). Übersetzen Sie die Programme mit make
und starten Sie das Programm PlapperMaul in einem der Fenster. Das Programm schreibt (ca.) alle 0.5 Sekunden Hallo, ich bins… Pidi plus seine Prozess-ID auf den Bildschirm. Mit dem Shell Befehl ps
können Sie Ihre aktiven Prozesse auflisten, auch PlapperMaul. Überlegen Sie sich zuerst, was mit PlapperMaul geschieht, wenn Sie das Fenster schliessen: läuft PlapperMaul weiter? Was geschieht mit PlapperMaul wenn Sie sich ausloggen und wieder einloggen? Testen Sie Ihre Überlegungen, in dem Sie die entsprechenden Aktionen durchführen. Stimmen Ihre Überlegungen?
-
+
Starten Sie nun das Programm bzw. den Daemon MrTimeDaemon. Stellen Sie die gleichen Überlegungen an wie mit PlapperMaul und testen Sie wiederum, ob Ihre Überlegungen stimmen. Ob MrTimeDaemon noch läuft können Sie feststellen, indem Sie die Zeit abfragen oder den Befehl ps ajx | grep MrTimeDaemon
eingeben: was fällt Ihnen am Output auf? Was schliessen Sie aus Ihren Beobachtungen?
-
+
Starten Sie MrTimeDaemon erneut, was geschieht?
-
+
Stoppen Sie nun MrTimeDaemon mit killall MrTimeDaemon
.
Starten Sie MrTimeDaemon und fragen Sie mit WhatsTheTimeMr localhost
oder mit WhatsTheTimeMr 127.0.0.1
die aktuelle Zeit auf Ihrem Rechner ab.
@@ -110,13 +114,13 @@ Die Firewall können Sie mit folgendem Befehl wiederherstellen:
iptables-restore myTables.txt
-
+
Studieren Sie MrTimeDaemon.c
, Daemonizer.c
und TimeDaemon.c
und analysieren Sie, wie die Daemonisierung abläuft. Entfernen Sie die Kommentare im Macro Out-PutPIDs
am Anfang des Moduls Daemonizer.c
. Übersetzen Sie die Programme mit make und starten Sie MrTimeDaemon
erneut. Analysieren Sie die Ausgabe, was fällt Ihnen auf? Notieren Sie alle für die vollständige Daemonisierung notwendigen Schritte.
-
+
Setzen Sie beim Aufruf von Daemonizer()
in MrTimeDaemon.c
anstelle von lock-FilePath
den Null-Zeiger NULL
ein. Damit wird keine lock-Datei erzeugt. Übersetzen Sie die Programme und starten Sie erneut MrTimedaemon
. Was geschieht bzw. wie können Sie feststellen, was geschehen ist?
Hinweis: lesen Sie das log-File: /tmp/timeDaemon.log.
@@ -207,7 +211,6 @@ Die Firewall können Sie mit folgendem Befehl wiederherstellen:
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -249,7 +252,7 @@ Die Firewall können Sie mit folgendem Befehl wiederherstellen:
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P08_Sync/README.html b/build/html/P08_Sync/README.html
index 1955062..783dfd0 100644
--- a/build/html/P08_Sync/README.html
+++ b/build/html/P08_Sync/README.html
@@ -5,6 +5,10 @@
+
+
+
+
08 - Synchronisationsprobleme — SNP Labs documentation
@@ -88,8 +92,8 @@ Erweitern sie nun alle Prozesse aus Schritt 2 mit den notwendigen Semaphore Oper
Implementieren und testen sie das vollständige Programm.
-coin = sem_open(...,0);
-coffee = sem_open(...,0);
+coin = sem_open(...,0);
+coffee = sem_open(...,0);
Ablaufgraph und Pseudocode für 2 Prozesse und zwei Semaphore
@@ -114,17 +118,17 @@ Analysieren sie die Datenwerte in den Fehlermeldungen, beschreiben sie was die G
Schützen sie nun den Zugriff auf die gemeinsamen Daten mit einem Mutex so, dass alle Threads eine konsistente Sicht der Daten haben.
Wir haben für sie einen Mutex vorbereitet: die Datenstruktur cData enthält die Mutex-Variable mutex, die in startApp.c initialisiert wird. Die Funktionen für das Schliessen und das Öffnen des Mutex (Locks) aus der pthread Bibliothek sind:
-pthread mutex lock(&(cD->lock));
+pthread mutex lock(&(cD->lock));
und
-pthread mutex unlock(&(cD->lock));
+pthread mutex unlock(&(cD->lock));
Überprüfen sie, ob der Kaffee-Automat nun keine Fehlermeldungen mehr ausgibt. Erhö-hen sie dazu auch die Anzahl Kunden CUSTOMERS in commonDefs.h, z.B. auf 10.
-
+
Im Thread des Kaffee-Automaten wird an verschiedenen Orten mehrmals auf die gemeinsamen Daten in cD zugegriffen. Wenn sie die gemeinsamen Daten in lokale Variablen kopieren und dann nur noch auf diese lokalen Variablen zugreifen würden, könn-ten sie dann auf die Synchronisation mit dem Mutex verzichten?
Wie oft kann ein einzelner Kunde einen Kaffee beziehen, bis der nächste Kunde an die Reihe kommt? Hier reicht eine qualitative Aussage.
@@ -146,15 +150,15 @@ Im Folgenden soll eine erzwungene Verarbeitungsreihenfolge implementiert werden:
Implementieren sie nun den Kaffee-Automaten. Ergänzen sie dazu den coffeeTeller und den customer Prozess so mit vier Semaphoren, dass die vorgegebenen Ablaufbedingungen eingehalten werden. Mit welchen Werten müssen die Semaphore initialisiert werden?
Wir haben für sie vier Semaphore vorbereitet: Achtung, sie sind aber noch auskommentiert (siehe commonDefs.h und startApp.c. Die benötigten Semaphor-Funktionen aus der POSIX Bibliothek sind:
-sem_wait(&semaphor);
+sem_wait(&semaphor);
und
-sem_post(&semaphor);
+sem_post(&semaphor);
Analysieren sie die Ausgabe der Prozesse (mehrmals starten). Was fällt auf?
-
+
Gibt Ihr Programm den Output in der korrekten Reihenfolge aus? Falls nicht, wie könnte das gelöst werden?
@@ -290,7 +294,6 @@ Wichtiger
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -369,7 +372,7 @@ Wichtiger
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P09_File_Operations/README.html b/build/html/P09_File_Operations/README.html
index 516a27f..246fb11 100644
--- a/build/html/P09_File_Operations/README.html
+++ b/build/html/P09_File_Operations/README.html
@@ -5,6 +5,10 @@
+
+
+
+
09 - File Operations — SNP Labs documentation
@@ -103,7 +107,6 @@
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -153,7 +156,7 @@
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/P10_IPC/README.html b/build/html/P10_IPC/README.html
index 6b7dd8f..1688137 100644
--- a/build/html/P10_IPC/README.html
+++ b/build/html/P10_IPC/README.html
@@ -5,6 +5,10 @@
+
+
+
+
10 - IPC — SNP Labs documentation
@@ -101,7 +105,6 @@
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -150,7 +153,7 @@
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/README.html b/build/html/README.html
index aa0e72c..c3ea7e1 100644
--- a/build/html/README.html
+++ b/build/html/README.html
@@ -5,6 +5,10 @@
+
+
+
+
SNP - Praktika — SNP Labs documentation
@@ -33,7 +37,7 @@
SNP - Praktika¶
-
+
Übersicht¶
Online Beschreibungen der Praktika und Aufgaben
@@ -70,7 +74,6 @@
- 01 - Erste Schritte mit C
- 02: Funktionen, Datentyp “enum”
- 03 - Bit Operationen, Struct, Typedef
-- 04 - Modularisieren von C Code
- 05 - Arrays/Strings/TicTacToe
- 06 - Personen Verwaltung – Linked List
- 07 - Prozesse und Threads
@@ -112,7 +115,7 @@
©2022, stsh.
|
- Powered by Sphinx 4.4.0
+ Powered by Sphinx 4.3.2
& Alabaster 0.7.12
|
diff --git a/build/html/_images/bsp_dot.png b/build/html/_images/bsp_dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..9435a0cf0a31652b7aeec1087fa3e2e9e7760d5c
GIT binary patch
literal 3375
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 HS{V)x|9$g
zKv0_W-U)1g|L)9w+?{!M_QU(kFk#MfbMLw5o_osgoCLpBk-L5C(JcS~a2q5qqYePv
z00RKmwux`zDSbCHi}4>M4)VIr0Kgmmi$4PI0PQ0H;FhYDwDjAz@1ZVG=l4*DCm?C*
zCk{?fh?T7c0N^o^tYN9Cu|zF)Fug0K_{Bd;5vqQl_=&pIH~)JP%&bpI?kIeD`eXdQ
zTFc!xZwP6BrG2>`7UmyvUyY6I>#Z@Oxu@x2A2Ysu?LPVAm0>elf3VPZR*4p0EZj*h
zA0TQbCX12hRpa+3%afwNJM*!#t>e!e$LoMwKnK7b;&St+&NxN_z@e|G=*wr#M2!Ff
zk6}_`K(lgUGuPvwbBblDcmo3ePXx^_5w8@9{qF%@!@{Jp0k35V{FCFDH2`UZ0OKAr
z(^
_4GbLS_I$;mBkksz-`nB9>`TbqOac|VBek!FlwP
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