Advertisement
madegoff

C_Kurs_3Blatt

Nov 8th, 2023 (edited)
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.73 KB | None | 0 0
  1. /*
  2. Willkommen zum dritten Aufgabenblatt vom Programmierkurs. Auf diesem Aufgabenblatt geht es um folgende neue Konzepte:
  3.  
  4. - Aufrufen von Funktionen
  5. - Definieren von Funktionen
  6.  
  7. Um die Tests für dieses Blatt zu kompilieren und zu starten, führen Sie den folgenden Befehl aus:
  8. cc -std=c11 -g -Wall 03ex_test.c -o 03ex_test.o -lm && ./03ex_test.o
  9. */
  10.  
  11. /* Die folgenden Zeilen enthalten einige C-Notwendigkeiten die Sie momentan ignorieren können. */
  12. #include "03_canvas.h"
  13. #include <stdio.h>
  14. /* Hier enden die Dinge, die Sie ignorieren können */
  15.  
  16. /*
  17. Der folgende Code ist ein Beispiel für eine Funktionsdefinition. Die Funktion gibt `1` zurück falls `n` ein
  18. ganzzahliges Vielfaches von `k` ist, und `0` falls nicht.
  19. Innerhalb dieses Aufgabenblattes können Sie diese Funktion frei verwenden. Ein Funktionsaufruf könnte zum Beispiel
  20. `is_multiple_of(n, 2)` sein. Dieser gäbe `1` zurück wenn `n` gerade ist, und `0` wenn `n` ungerade ist.
  21.  
  22. Für dieses und alle weiteren Aufgabenblätter animieren wir Sie, selbstständig Funktionen zu schreiben um Teilprobleme zu lösen.
  23. Sie können zum Beispiel `is_multiple_of` in mehreren Aufgaben auf diesem Blatt verwenden. Wenn wir die nicht vordefiniert hätten,
  24. hätte es sich für Sie gelohnt, sie selbst zu definieren.
  25. Teilprobleme zu identifizieren und losgelöst vom ursprünglichen Kontext als Hilfsfunktion zu implementierem ist
  26. ein großer Teil von kompetentem Programmieren.
  27. */
  28. int is_multiple_of(int n, int k) {
  29.     int remainder = n % k;
  30.     return remainder == 0;
  31. }
  32.  
  33. /*
  34. Aufgabe 1a:
  35.  
  36. Geben Sie in dieser Funktion die Summe der ersten `n` natürlichen Zahlen (exklusive der Null) zurück, die durch `m` teilbar sind.
  37. */
  38. int sum_of_divisibles(int n, int m) {
  39.  
  40.     int num = 1;
  41.     int res = 0;
  42.     int counter = 0;
  43.     while(counter<n){
  44.         if(is_multiple_of(num,m)){
  45.             res+=num;
  46.             counter++;
  47.         }
  48.         num++;
  49.     }
  50.     return res;
  51. }
  52.  
  53. /*
  54. Aufgabe 1b:
  55.  
  56. Geben Sie in dieser Funktion die Summe der ersten `n` natürlichen Zahlen (exklusive der Null) zurück, die durch `l` und durch `m` teilbar sind.
  57. */
  58. int sum_of_doubly_divisibles(int n, int l, int m) {
  59.  
  60.     int num = 1;
  61.     int res = 0;
  62.     int counter = 0;
  63.     while(counter<n){
  64.         if((is_multiple_of(num,m))&&(is_multiple_of(num,l))){
  65.             res+=num;
  66.             counter++;
  67.         }
  68.         num++;
  69.     }
  70.     return res;
  71. }
  72.  
  73. /*
  74. Aufgabe 2a:
  75. Die folgenden Aufgaben (und auch weitere Aufgaben auf den kommenden Aufgabenblättern) erlauben es Ihnen,
  76. einfache Grafiken zu erstellen.
  77. In dieser Funktion starten wir mit einer komplett weißen "Canvas" (deutsch: "Leinwand") `c` und färben bestimmte Pixel schwarz.
  78. Die Canvas ist ein zweidimensionales Raster aus Pixeln, ein einfaches, mit Code bearbeitbares Bild.
  79. Dank der bereitgestellten Funktionen brauchen Sie nicht verstehen, wie der Computer Bilder repräsentiert. Sie müssen nur wissen,
  80. wie Sie die Funktion `canvas_set_black` aufrufen, um die Canvas zu manipulieren.
  81. */
  82. Canvas first_canvas_exercise(Canvas c) {
  83.     /*
  84.     Die `canvas_set_black` Funktion bekommt drei Parameter. Eine Canvas, sowie eine
  85.     x-Koordinate und eine y-Koordinate innerhalb dieser Canvas.
  86.     Die linke untere Ecke der Canvas ist der Koordinatenursprung, dort sind die x- und die y-Koordinate jeweils `0`.
  87.     Nach rechts steigen die x-Koordinaten, nach oben die y-Koordinaten.
  88.     */
  89.     c = canvas_set_black(c, 1, 5);
  90.     c = canvas_set_black(c, 2, 1);
  91.     c = canvas_set_black(c, 13, 4);
  92.  
  93.     /*
  94.     Diese drei Funktionsaufrufe hier drüber färben drei unterschiedliche Pixel der Canvas schwarz.
  95.     Versuchen Sie sich vorzustellen, wo diese drei Pixel gemäß unseres Koordinatensystems sein sollten.
  96.  
  97.     Führen Sie jetzt den Test für diese Aufgabe aus, indem Sie diesen Befehl nutzen:
  98.     cc -std=c11 -g -Wall 03ex_test.c -o 03ex_test.o -lm && ./03ex_test.o first_canvas_exercise
  99.  
  100.     Der Test wird fehlschlagen, da wir drei leicht andere Pixel-Positionen schwarz gefärbt haben wollen. Schauen Sie sich
  101.     die Test-Ausgabe an. Diese sollte Sie darüber informieren, dass ein Bild in einem "Feedback" Verzeichnis (im aktuellen Verzeichnis)
  102.     gespeichert wurde, welches Ihnen die Abweichung darstellt.
  103.     Öffnen Sie das Bild (eventuell müssen Sie etwas hineinzoomen, es ist recht klein).
  104.     Das Bild ist in drei Segmente unterteilt. Zuerst das Bild welches Sie erstellt haben,
  105.     dann das erwartete Bild, und als drittes eine Visualisierung
  106.     welche Pixel in ihrer Farbe vom erwarteten Bild abweichen.
  107.  
  108.     Nutzen Sie diese Visualisierung, um die drei Funktionsaufrufe oben so zu verändern, dass Ihr Bild und das erwartete
  109.     Bild übereinstimmen. Sie können den Test beliebig oft ausführen, um neue Feedback-Bilder zu erzeugen.
  110.  
  111.     Desweiteren existiert die `canvas_save_debug(Canvas c)` Funktion. Dieser können Sie jederzeit eine Canvas übergeben,
  112.     um sie als Bild abzuspeichern. Die Bilder erscheinen im "Debug" Ordner und sind
  113.     aufsteigend nummeriert, falls Sie für eine Canvas die Funktion mehrfach aufrufen. Probieren Sie die Funktion doch
  114.     ein paar mal mit dem Canvas in dieser Aufgabe aus, zum Beispiel jedes mal nachdem ein Pixel gesetzt wurde!
  115.  
  116.     Sobald der Test erfolgreich ist, verschwindet das Feedback. Anstelle dessen können sie Ihre erfolgreiche Lösung
  117.     im "Success" Ordner bestaunen :). Dies gilt genauso für alle weiteren Canvas-Aufgaben!
  118.     */
  119.  
  120.     return c;
  121. }
  122.  
  123. /*
  124. Aufgabe 2b:
  125. In dieser Aufgabe sollen Sie die vier Ecken der Canvas schwarz färben.
  126. Dafür benötigen sie die Höhe und Breite einer gegebenen Canvas.
  127. Um die Höhe und Breite herauszufinden können (und müssen) sie die `canvas_width` und `canvas_height` Funktionen nutzen. Diesen
  128. Funktionen übergeben Sie eine Canvas (so: `canvas_width(c)` und `canvas_height(c)`) und bekommen dann jeweils
  129. die Breite und Höhe zurückgegeben.
  130. Hinweis: Koordinaten beginnen bei `0`, nicht bei `1`.
  131. */
  132. Canvas color_corners(Canvas c) {
  133.  
  134.     int width = canvas_width(c)-1;
  135.     int height = canvas_height(c)-1;
  136.  
  137.     canvas_set_black(c,0,0); //links unten
  138.     canvas_set_black(c,width,0); //rechts unten
  139.     canvas_set_black(c,width,height); //rechts oben
  140.     canvas_set_black(c,0,height); //links oben
  141.  
  142.     return c;
  143. }
  144.  
  145. /*
  146. Aufgabe 2c:
  147. Färben Sie alle Pixel der Canvas schwarz.
  148. */
  149. Canvas paint_it_black(Canvas c) {
  150.  
  151.     int width = canvas_width(c)-1;
  152.     int height = canvas_height(c)-1;
  153.  
  154.     for(int i=0; i<=width; i++){
  155.         for(int j=0; j<=height; j++){
  156.             canvas_set_black(c,i,j);
  157.         }
  158.     }
  159.  
  160.     return c;
  161. }
  162.  
  163. /*
  164. Aufgabe 2d:
  165. Färben Sie den ersten Pixel der ersten Reihe von oben schwarz, dann die ersten beiden Pixel der zweiten Reihe, die
  166. ersten drei der dritten Reihe und so weiter (falls das unklar war, führen Sie einfach den Test aus
  167. und schauen sich das erwartete Ergebnis an).
  168. Falls eine Reihe nicht breit genug ist, färben Sie alle Pixel dieser Reihe schwarz.
  169. */
  170. Canvas descending_diagonal(Canvas c) {
  171.  
  172.     int width = canvas_width(c)-1;
  173.     int height = canvas_height(c)-1;
  174.  
  175.     for(int i=0; i<=width; i++){
  176.         for(int j=0; j<=height-i; j++){
  177.             canvas_set_black(c,i,j);
  178.         }
  179.     }
  180.  
  181.     return c;
  182. }
  183.  
  184. /*
  185. Aufgabe 3a:
  186. Diese Funktion soll ein gefülltes schwarzes Rechteck auf die Canvas zeichnen. Die obere linke Ecke des Rechtecks hat die
  187. Koordinaten `(x, y)`. Die Breite des Rechtecks ist `width`, und die Höhe ist `height`. Falls das Rechteck nicht
  188. auf die Canvas passt, sollen einfach die Teile ignoriert werden welche außerhalb liegen würden.
  189. */
  190. Canvas draw_rectangle(Canvas c, int x, int y, int width, int height) {
  191.  
  192.     int total_width = canvas_width(c)-1;
  193.     int total_height = canvas_height(c)-1;
  194.  
  195.  
  196.     for(int i = x; i < x+width; i++){
  197.         for(int j = y; j > y-height; j--){
  198.             if(i<=total_width && j<=total_height && i>=0 && j>=0){ //pruefen ob koordinaten auf canvas passen
  199.  
  200.  
  201.                 canvas_set_black(c,i,j);
  202.             }
  203.         }
  204.     }
  205.  
  206.     return c;
  207. }
  208.  
  209. /*
  210. Aufgabe 3b:
  211. Diese Funktion soll ein gefülltes schwarzes Rechteck auf die Canvas zeichnen. Die obere linke Koordinate des Rechtecks
  212. ist `(x0, y0)` und die untere rechte Koordinate ist `(x1, y1)`, und es gilt immer `x1 >= x0` und `y1 <= y0`.
  213. Falls das Rechteck nicht auf die Canvas passt, sollen einfach die Teile ignoriert werden welche außerhalb liegen würden.
  214.  
  215. Tipp: Ob Sie diese Funktion von Grund auf implementieren oder `draw_rectangle` von Aufgabe 3a nutzen ist Ihnen überlassen.
  216. Wir empfehlen beides auszuprobieren und selbst zu entscheiden welche Lösung Sie eleganter finden.
  217. */
  218. Canvas draw_rectangle_via_corners(Canvas c, int x0, int y0, int x1, int y1) {
  219.  
  220.     int width = x1-x0+1;
  221.     int height = y0-y1+1;
  222.     draw_rectangle(c, x0, y0, width, height);
  223.     return c;
  224. }
  225.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement