diff --git a/P04_Modularisieren_von_C_Code/README.md b/P04_Modularisieren_von_C_Code/README.md index 9b83ae0..60db94b 100644 --- a/P04_Modularisieren_von_C_Code/README.md +++ b/P04_Modularisieren_von_C_Code/README.md @@ -1,41 +1,9 @@ # 04 - Modularisieren von C Code -```{eval-rst} -.. figure:: zhaw_neg_P2945.jpg - :width: 100px - :name: logo - :align: right -``` +![](./modularisieren_von_c_code.JPG) ___ -```{eval-rst} -.. figure:: modularisieren_von_c_code.JPG - :width: 500px - :name: logo - :align: center -``` - - -___ - -## Inhalt - -{ref}`04_introduction` - -{ref}`04_learning_objectives` - -{ref}`04_task_01` - -{ref}`04_task_02` - -{ref}`04_grading` - -{ref}`04_appendix` - -___ - -(04_introduction)= ## 1. Übersicht In diesem Praktikum üben Sie modulare Programmierung indem Sie ein @@ -48,18 +16,13 @@ In der zweiten Aufgabe erstellen Sie Makefile Regeln für die drei Schritte von den C Source Files zur graphischen Darstellung der Abhängigkeiten. -```{eval-rst} -.. figure:: uebersicht.png - :width: 500px - :name: uebersicht - :align: center -``` + +![](./uebersicht.png) Im Anhang ist eine Übersicht über die verwendeten File Formate gegeben. -(04_learning_objectives)= ## 2. Lernziele In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen. @@ -79,7 +42,6 @@ Erweitern Sie die vorgegebenen Code Gerüste, welche im `git` Repository `snp-lab-code` verfügbar sind. -(04_task_01)= ## 3. Aufgabe 1: Modularisieren Das zu ergänzende Programm dep2dot hat folgende Funktionalität: @@ -240,7 +202,6 @@ System.out.println( -(04_task_02)= ## 4. Aufgabe 2: Makefile Regeln Die folgenden drei Schritte erstellen von einem C Source File eine @@ -253,12 +214,9 @@ graphische Darstellung der Abhängigkeiten: Sie sollen für die Compiler-ähnlichen Programme `dep2dot` und `dot` Makefile Regeln schreiben. -```{eval-rst} -.. figure:: uebersicht.png - :width: 500px - :name: uebersicht - :align: center -``` + +![](./uebersicht.png) + Das Programm `dep2dot` hat folgende Funktionalität: @@ -294,12 +252,8 @@ firefox dep.png Als Resultat sollte Firefox folgende Graphik darstellen: -```{eval-rst} -.. figure:: dep_dot.png - :width: 150px - :name: dep_dot - :align: center -``` +![](./dep_dot.png) + @@ -347,8 +301,7 @@ dargestellt wird. * 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. - -(04_grading)= +___ ## 5. Bewertung Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden. @@ -361,41 +314,24 @@ Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmco | 2 | Neue Regeln hinzufügen | 2 | +___ - -(04_appendix)= ## 6. Anhang - - - ### 6.1 Verwendete zusätzliche Sprach Elemente - - -
**Sprach Element** - - -**Beschreibung** - -
- - - ```C fprintf(stderr, "v=%d", v) ``` - +**Beschreibung** Formatierte Ausgabe auf den Standard Error Stream. Siehe ***man 3 stderr*** und ***man 3 fprintf***. -
- ### 6.2 Verarbeitung und verwendete File Formate @@ -525,12 +461,7 @@ digraph G { } ``` -```{eval-rst} -.. figure:: bsp_dot.png - :width: 210px - :name: bsp_dot - :align: center -``` +![](./bsp_dot.png) #### 6.2.3 png File diff --git a/build/html/.buildinfo b/build/html/.buildinfo index 7660e1c..d069f9b 100644 --- a/build/html/.buildinfo +++ b/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 5c323e642e12d9fbf3c26fc7fc5af7e8 +config: ec1c17e11e152d8570ac6dba2421115f tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/build/html/P01_Erste_Schritte_mit_C/README.html b/build/html/P01_Erste_Schritte_mit_C/README.html index 7928381..a4e55d0 100644 --- a/build/html/P01_Erste_Schritte_mit_C/README.html +++ b/build/html/P01_Erste_Schritte_mit_C/README.html @@ -5,6 +5,10 @@ + + + + 01 - Erste Schritte mit C — SNP Labs documentation @@ -105,7 +109,7 @@

6. Aufgabe 4: Zeichen und Wörter zählen

-

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.

Gegeben ist die main Funktion des Programms. Ergänzen Sie die enum Definition und die fehlenden Funktionen:

@@ -353,7 +357,7 @@ Schreibt formatierten Text auf den stderr Stream.

  • 03 - Bit Operationen, Struct, Typedef
  • -
  • 04 - Modularisieren von C Code
  • +
  • 04 - Modularisieren von C Code
  • 05 - Arrays/Strings/TicTacToe
  • 06 - Personen Verwaltung – Linked List
  • 07 - Prozesse und Threads
  • @@ -397,7 +401,7 @@ Schreibt formatierten Text auf den stderr Stream.

    ©2022, stsh. | - Powered by Sphinx 4.4.0 + Powered by Sphinx 4.3.2 & Alabaster 0.7.12 | diff --git a/build/html/P03_Bit_Operation_struct_typedef/README.html b/build/html/P03_Bit_Operation_struct_typedef/README.html index cb958f4..eea0603 100644 --- a/build/html/P03_Bit_Operation_struct_typedef/README.html +++ b/build/html/P03_Bit_Operation_struct_typedef/README.html @@ -5,6 +5,10 @@ + + + + 03 - Bit Operationen, Struct, Typedef — SNP Labs documentation @@ -15,7 +19,7 @@ - + @@ -81,44 +85,44 @@

    1. Basis Operationen

    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

  • -
  • 04 - Modularisieren von C Code
  • +
  • 04 - Modularisieren von C Code
  • 05 - Arrays/Strings/TicTacToe
  • 06 - Personen Verwaltung – Linked List
  • 07 - Prozesse und Threads
  • @@ -327,7 +331,7 @@ @@ -357,7 +361,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..d346073 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 @@ -15,6 +19,8 @@ + + @@ -33,26 +39,10 @@

    04 - Modularisieren von C Code

    - +


    - -
    -
    -

    Inhalt

    -

    1. Übersicht

    -

    2. Lernziele

    -

    3. Aufgabe 1: Modularisieren

    -

    4. Aufgabe 2: Makefile Regeln

    -

    5. Bewertung

    -

    6. Anhang

    -
    -
    -

    1. Übersicht

    +

    1. Übersicht

    In diesem Praktikum üben Sie modulare Programmierung indem Sie ein Java Programm (bestehend aus drei Java Files) in ein entsprechendes C Programm aus drei Modulen (aus je einem Header- und Implementations- @@ -61,13 +51,11 @@ entsprechenden Module mit kompiliert werden.

    In der zweiten Aufgabe erstellen Sie Makefile Regeln für die drei Schritte von den C Source Files zur graphischen Darstellung der Abhängigkeiten.

    -
    -../_images/uebersicht.png -
    +

    Im Anhang ist eine Übersicht über die verwendeten File Formate gegeben.

    -

    2. Lernziele

    +

    2. Lernziele

    In diesem Praktikum lernen Sie die Handgriffe um ein Programm zu modularisieren, d.h. in mehrere Module aufzuteilen.

    -

    3. Aufgabe 1: Modularisieren

    +

    3. Aufgabe 1: Modularisieren

    Das zu ergänzende Programm dep2dot hat folgende Funktionalität:

    Ergänzen Sie in modularize/src den Code in triangle.c, read.h, read.c, rectang.h und rectang.c so @@ -216,7 +204,7 @@ table th:nth-of-type(2) {

    -

    4. Aufgabe 2: Makefile Regeln

    +

    4. Aufgabe 2: Makefile Regeln

    Die folgenden drei Schritte erstellen von einem C Source File eine graphische Darstellung der Abhängigkeiten:

      @@ -226,9 +214,7 @@ graphische Darstellung der Abhängigkeiten:

    Sie sollen für die Compiler-ähnlichen Programme dep2dot und dot Makefile Regeln schreiben.

    -
    -../_images/uebersicht.png -
    +

    Das Programm dep2dot hat folgende Funktionalität:

    1. Es liest von stdin die vom Compiler generierten @@ -256,14 +242,12 @@ firefox dep.png

      Als Resultat sollte Firefox folgende Graphik darstellen:

      -
      -../_images/dep_dot.png -
      +

      Definieren Sie im Makefile Regeln, welche die einzelnen Schritte von 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,13 +268,21 @@ 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

    +

    5. Bewertung

    Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden.

    @@ -319,24 +311,18 @@ dargestellt wird.

    +
    -

    6. Anhang

    +

    6. Anhang

    6.1 Verwendete zusätzliche Sprach Elemente

    - - -

    Sprach Element

    -
    -

    Beschreibung

    -
    -
    fprintf(stderr, "v=%d", v)
    +
    fprintf(stderr, "v=%d", v)
     
    -
    +

    Beschreibung

    Formatierte Ausgabe auf den Standard Error Stream. Siehe man 3 stderr und man 3 fprintf.

    -

    6.2 Verarbeitung und verwendete File Formate

    @@ -418,40 +404,41 @@ 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

    @@ -481,11 +468,35 @@ Format. Es wird oft in Web Pages verwendet.

    Navigation

    -