Advertisement
madegoff

C_Kurs_7Blatt

Nov 8th, 2023
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.58 KB | None | 0 0
  1. /*
  2. Willkommen zum siebten Aufgabenblatt vom Programmierkurs. Auf diesem Aufabenblatt geht es um Pointer.
  3. Dieses Blatt ist vergleichsweise lang. Die Erfahrung hat gezeigt, dass Studierende insgesamt
  4. weniger Zeit in IntroProg investieren müssen, wenn Sie sich anfangs gründlich mit Pointern beschäftigt haben.
  5.  
  6. Um die Tests für dieses Blatt zu kompilieren und zu starten, führen Sie den folgenden Befehl aus:
  7. cc -std=c11 -g -Wall 07ex_test.c -o 07ex_test.o -lm && ./07ex_test.o
  8. */
  9.  
  10. #include "07ex_header.h"
  11. #include <stdio.h>
  12. #include <stdint.h>
  13. #include <stdbool.h>
  14.  
  15. /*
  16. Aufgabe 1a:
  17. `x` zeigt auf einen 32-bit Integer. Geben Sie diesen Integer zurück.
  18. */
  19. int32_t retrieve_from_pointer(int32_t *x) {
  20.  
  21.     return *x;
  22. }
  23.  
  24. /*
  25. Aufgabe 1b:
  26. `x` zeigt auf einen 32-bit Integer. Setzen Sie diesen Integer auf 42.
  27. */
  28. void set_through_pointer1(int32_t *x) {
  29.  
  30.     *x = 42;
  31.     return;
  32. }
  33.  
  34. /*
  35. Aufgabe 1c:
  36. `x` zeigt auf einen 32-bit Integer. `y` _ist_ ein 32-bit Integer. Setzen Sie den Wert, auf den `x` zeigt, auf den
  37. Wert von `y`.
  38. */
  39. void set_through_pointer2(int32_t *x, int32_t y) {
  40.     *x = y;
  41.     return;
  42. }
  43.  
  44. /*
  45. Aufgabe 1d:
  46. `x` und `y` zeigen beide auf 32-bit Integer. Setzem Sie den Wert auf den `x` zeigt auf den Wert auf den `y` zeigt.
  47. Lassen Sie den Wert auf den `y` zeigt dabei unverändert.
  48. */
  49. void set_through_pointer3(int32_t *x, int32_t *y) {
  50.     *x=*y;
  51.     return;
  52. }
  53.  
  54. /*
  55. Aufgabe 1e:
  56. `x` und `y` zeigen beide auf 32-bit Integer. Vertauschen Sie den Wert auf den `x` zeigt und den Wert auf den `y` zeigt.
  57. */
  58. void swap(int32_t *x, int32_t *y) {
  59.  
  60.     int32_t temp = *x;
  61.     *x = *y;
  62.     *y = temp;
  63.     return;
  64. }
  65.  
  66. /*
  67. Aufgabe 1f:
  68. `x` und `y` zeigen beide auf 32-bit Integer. Geben Sie zurück, ob `x` und `y` auf den _gleichen_ (Englisch: _equal_)
  69. Wert zeigen (d.h. die Folgen von Einsen und Nullen an den beiden Speicherpositionen sind identisch).
  70. */
  71. bool point_to_equal_values(int32_t *x, int32_t *y) {
  72.     if(*x==*y) return true; //unterschied zw *x==*y und x==y ???
  73.     else return false;
  74. }
  75.  
  76. /*
  77. Aufgabe 1g:
  78. `x` und `y` zeigen beide auf 32-bit Integer. Geben Sie zurück, ob `x` und `y` auf den _selben_ (Englisch: _same_)
  79. Wert zeigen (d.h. die Speicherpositionen sind identisch).
  80. */
  81. bool point_to_same_values(int32_t *x, int32_t *y) {
  82.     if(x==y) return true;
  83.     else return false;
  84. }
  85.  
  86. /*
  87. Dieses Struct kennen Sie schon (vom fünften Aufgabenblatt).
  88. */
  89. typedef struct RGB_ {
  90.     float r; /* Rotkomponente */
  91.     float g; /* Grünkomponente */
  92.     float b; /* Blaukomponente */
  93. } RGB;
  94.  
  95. /*
  96. Aufgabe 2a:
  97. `x` zeigt auf eine Farbe. Geben Sie diese Farbe zurück.
  98. */
  99. RGB retrieve_from_pointer_struct(RGB *x) {
  100.     RGB color = *x;
  101.     return color;
  102. }
  103.  
  104. /*
  105. Aufgabe 2b:
  106. `x` zeigt auf eine Farbe. Setzen Sie diese Farbe auf `Flieder` (rot 0.86, grün 0.82, blau 1.0).
  107. */
  108. void set_through_pointer_struct1(RGB *x) {
  109.     x->r=0.86;
  110.     x->g=0.82;
  111.     x->b=1.0;
  112.     return;
  113. }
  114.  
  115. /*
  116. Aufgabe 2c:
  117. `x` zeigt auf eine Farbe. `y` _ist_ eine Farbe. Setzen Sie den Wert auf den `x` zeigt auf den Wert von `y`.
  118. */
  119. void set_through_pointer_struct2(RGB *x, RGB y) {
  120.     *x = y;
  121.     return;
  122. }
  123.  
  124. /*
  125. Aufgabe 2d:
  126. `x` und `y` zeigen beide auf Farben. Setzen Sie den Wert auf den `x` zeigt auf den Wert auf den `y` zeigt.
  127. Lassen Sie den Wert auf den `y` zeigt dabei unverändert.
  128. */
  129. void set_through_pointer_struct3(RGB *x, RGB *y) {
  130.     *x = *y;
  131.     return;
  132. }
  133.  
  134. /*
  135. Aufgabe 2e:
  136. `x` und `y` zeigen beide auf Farben. Vertauschen Sie den Wert auf den `x` zeigt und den Wert auf den `y` zeigt.
  137. */
  138. void swap_struct(RGB *x, RGB *y) {
  139.     RGB temp = *x;
  140.     *x = *y;
  141.     *y = temp;
  142.     return;
  143. }
  144.  
  145. /*
  146. Aufgabe 2f:
  147. `x` und `y` zeigen beide auf Farben. Geben Sie zurück, ob `x` und `y` auf den _gleichen_ (Englisch: _equal_)
  148. Wert zeigen (d.h. die Folgen von Einsen und Nullen an den beiden Speicherpositionen sind identisch).
  149. */
  150. bool point_to_equal_values_struct(RGB *x, RGB *y) {
  151.     if(x->b==y->b && x->r==y->r && x->g==y->g) return true;
  152.     else return false;
  153. }
  154.  
  155. /*
  156. Aufgabe 2g:
  157. `x` und `y` zeigen beide auf Farben. Geben Sie zurück, ob `x` und `y` auf den _selben_ (Englisch: _same_)
  158. Wert zeigen (d.h. die Speicherpositionen sind identisch).
  159. */
  160. bool point_to_same_values_struct(RGB *x, RGB *y) {
  161.     if(x==y) return true;
  162.     else return false;
  163. }
  164.  
  165. /*
  166. Aufgabe 3a:
  167. `x` zeigt auf eine Farbe. Geben Sie ihre Blaukomponente zurück.
  168. */
  169. float retrieve_from_pointer_field(RGB *x) {
  170.     return x->b;
  171. }
  172.  
  173. /*
  174. Aufgabe 3b:
  175. `x` zeigt auf eine Farbe. Setzen Sie ihre Blaukomponente auf 0.
  176. */
  177. void set_through_pointer_field1(RGB *x) {
  178.     x->b = 0.0;
  179.     return;
  180. }
  181.  
  182. /*
  183. Aufgabe 3c:
  184. `x` zeigt auf eine Farbe. `y` _ist_ eine Farbe. Setzen Sie den Wert der Blaukomponente der Farbe auf die `x` zeigt auf
  185. den Wert der Blaukomponente von `y`.
  186. */
  187. void set_through_pointer_field2(RGB *x, RGB y) {
  188.     x->b = y.b;
  189.     return;
  190. }
  191.  
  192. /*
  193. Aufgabe 3d:
  194. `x` und `y` zeigen beide auf Farben. Setzen Sie den Wert der Blaukomponente der Farbe auf die `x` zeigt auf den Wert der
  195. Blaukomponente der Farbe auf die `y` zeigt.
  196. Lassen Sie den Wert auf den `y` zeigt dabei unverändert.
  197. */
  198. void set_through_pointer_field3(RGB *x, RGB *y) {
  199.     x->b=y->b;
  200.     return;
  201. }
  202.  
  203. /*
  204. Aufgabe 3e:
  205. `x` und `y` zeigen beide auf Farben. Vertauschen Sie den Wert der Blaukomponente der Farbe, auf die `x` zeigt
  206. und den Wert der Blaukomponente der Farbe, auf die `y` zeigt.
  207. */
  208. void swap_field(RGB *x, RGB *y) {
  209.     float temp = x->b;
  210.     x->b = y->b;
  211.     y->b = temp;
  212.     return;
  213. }
  214.  
  215. /*
  216. Aufgabe 3f:
  217. `x` und `y` zeigen beide auf Farben. Geben Sie zurück, ob `x` und `y` auf Farben mit _gleicher_ (Englisch: _equal_)
  218. Blaukomponente zeigen (d.h. die Folgen von Einsen und Nullen an den beiden Speicherpositionen sind identisch).
  219. */
  220. bool point_to_equal_values_field(RGB *x, RGB *y) {
  221.     if(x->b == y->b) return true;
  222.     else return false;
  223. }
  224.  
  225. /*
  226. Aufgabe 3g:
  227. `x` und `y` zeigen beide auf Farben. Geben Sie zurück, ob `x` und `y` auf Farben mit der _selben_ (Englisch: _same_)
  228. Blaukomponente zeigen (d.h. die Speicherpositionen sind identisch).
  229. */
  230. bool point_to_same_values_field(RGB *x, RGB *y) {
  231.     if(x == y) return true; //x.b == y.b funkt net?
  232.     else return false;
  233. }
  234.  
  235.  
  236. /*
  237. Aufgabe 4:
  238. Die `07ex_header.h` Datei enthält ein paar sehr komplexe Funktionen um _fizzledipps_, _flabbles_,
  239. und _frumples_ zu berechnen.
  240.  
  241. Berechnen Sie den _flabble_ von `x` und dem _fizzledipp_ von `x`. Berechnen Sie den _frumple_ von dieser Zahl und 27,
  242. und geben Sie diesen Wert zurück. Oder als Term ausgedrückt: frumple(flabble(x, fizzledipp(x)), 27).
  243. Hinweis: flabble soll als _zweites_ Argument das Ergebnis von fizzledipp erhalten, und frumple ebenfalls als _zweites_
  244. Argument die 27. `x` und der fizzledipp von `x` sind unterschiedliche Zahlen!
  245. */
  246.  
  247. int32_t frumpleflabblefizzledipp(int32_t x) {
  248.  
  249.     int32_t ptr_x = x; //kopie von x
  250.     fizzledipp(&ptr_x); //value of ptr_x changed
  251.  
  252.     int32_t res1 = flabble(&x,&ptr_x);
  253.     int32_t res2;
  254.  
  255.     int32_t zahl = 27;
  256.  
  257.     frumple(res1, &zahl, &res2);
  258.     return res2;
  259.  
  260. }
  261.  
  262.  
  263.  
  264. /*
  265. Pancakes? Pancakes!
  266. Ein ordentlicher Pfannkuchenhaufen hat mehrere Schichten, und zwar aus Obst, Schlagsahne, oder tatsächlichem Teigfladen.
  267. */
  268. typedef enum Layer_ { Fruit, Cream, ActualPancake } Layer;
  269.  
  270. /*
  271. Ein Pfannkuchenhaufen besteht aus einer Schicht, auf der möglicherweise ein weiterer Pfannkuchenhaufen liegt:
  272. */
  273. typedef struct PileOfPancakes_ PileOfPancakes;
  274. struct PileOfPancakes_ {
  275.     Layer layer; /* Die unterste Schicht. */
  276.     PileOfPancakes *further_layers; /* Weitere Schichten, oder `null` falls keine mehr folgen. */
  277. };
  278.  
  279. /*
  280. Aufgabe 5a:
  281. Geben Sie zurück, wie viele Fruchtschichten der gegebene Pfannkuchenhaufen enthält.
  282. */
  283. int32_t count_fruit_layers(PileOfPancakes p) {
  284.  
  285.     int32_t counter = 0;
  286.     PileOfPancakes current = p;
  287.  
  288.     while(current.further_layers != NULL){
  289.         if(current.layer == 0) counter++;
  290.         current = *current.further_layers;
  291.     }
  292.  
  293.     if(current.layer == 0) counter ++;
  294.  
  295.     return counter;
  296. }
  297.  
  298. /*
  299. Aufgabe 5b:
  300. Ein Pfannkuchenhaufen ist *stabil*, wenn die erste und letzte Schicht tatsächliche Teigfladen (`ActualPancake`) sind.
  301. Geben Sie zurück, ob der gegebene Pfannkuchenhaufen stabil ist.
  302. */
  303. bool is_stable(PileOfPancakes p) {
  304.  
  305.     int right_for_first = 0;
  306.     int right_for_last = 0;
  307.  
  308.     PileOfPancakes current = p;
  309.  
  310.     if(current.layer == 2) right_for_first = 1;
  311.  
  312.     while(current.further_layers != NULL){
  313.         current = *current.further_layers;
  314.     }
  315.  
  316.     if(current.layer == 2) right_for_last = 1;
  317.  
  318.     if(right_for_first==1 && right_for_last==1) return true;
  319.     else return false;
  320. }
  321.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement