Advertisement
madegoff

C_Kurs_1Blatt

Nov 8th, 2023
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.03 KB | None | 0 0
  1. /*
  2. Willkommen zum ersten Aufgabenblatt vom Programmierkurs.
  3.  
  4. Diese Datei enthält Aufgabenstellungen als Kommentare, sowie Bereiche in denen die Lösungen implementiert werden können.
  5. Nachdem Sie in einem Terminal mittels des `cd` Befehls in das Verzeichnis gewechselt sind, in dem diese Datei liegt,
  6. können Sie mit folgendem Befehl ihre Lösungen überprüfen:
  7. cc -std=c11 -g -Wall 01ex_test.c -o 01ex_test.o -lm && ./01ex_test.o
  8.  
  9. Mehr Details dazu gibt es in der ersten Aufgabenstellung, außerdem wird dieses System ausführlich im ersten Tutorium vorgestellt.
  10.  
  11. Auf diesem Blatt geht es unter anderem um:
  12. - Variablendeklarationen (`int variable_name = expression;`)
  13. - Variablenzuweisungen (`variable_name = expression;`)
  14. - Arithmetische Ausdrücke (+, -, *, /, %)
  15. - Vergleichsausdrücke (==, !=, <, <=, >, >=)
  16. - if Abfragen
  17. - while und for Schleifen
  18. */
  19.  
  20. /*
  21. Um ein automatisch überprüfbares Aufgabenblatt bereitzustellen, müssen wir einige Aspekte der
  22. C Programmiersprache verwenden, die Sie noch nicht durch die Vorlesung kennen.
  23. Daher werden wir explizit mit Kommentaren markieren, welche Teile der Datei Sie verändern sollen.
  24. Allen anderen Code in der Datei, wie z.B. die folgenden vier Zeilen, können Sie ignorieren.
  25. */
  26. #include <stdio.h>
  27.  
  28. int simple_assignment(int a, int b) {
  29.     int result = 0;
  30.     /*
  31.     Aufgabe 1a:
  32.     Haben Sie die vorgehenden Zeilen ignoriert? Sehr schön!
  33.  
  34.     Hier beginnt nun die erste Aufgabe. In allen Aufgaben markieren wir den Teil, in dem Sie Code einfügen sollen,
  35.     mithilfe zweier Kommentare: "BEGIN CHANGES" und "END CHANGES". Als erste Aufgabe, sollen Sie schlicht
  36.     die Codezeile `result = a + b;` zwischen diesen beiden Kommentaren einfügen, und dann weiterlesen.
  37.     */
  38.     /* BEGIN CHANGES */
  39.     result = a * b;
  40.     /* END CHANGES */
  41.     /*
  42.     Die Codezeile, die Sie eingefügt haben, weist der Variable `result` die Summe der beiden Variablen `a` und `b` zu.
  43.     Die Initialisierung dieser Variablen haben wir für Sie übernommen. Warum der Aufwand? Weil wir diesen Code
  44.     automatisch überprüfen können. Dazu müssen Sie in einem Terminal den `cd` Befehl benutzen, bis Sie
  45.     in dem Verzeichnis sind, in dem auch diese Datei liegt.
  46.     Dort können Sie den Befehl `cc -std=c11 -g -Wall 01ex_test.c -o 01ex_test.o -lm && ./01ex_test.o`
  47.     ausführen (ohne die "`" Zeichen). Die Ausgabe sollte eine Liste der Aufgaben sein, zusammen mit Hinweisen dazu, dass
  48.     die Aufgaben noch nicht richtig gelöst wurden. Falls Sie keine solche Ausgabe bekommen, können und sollten Sie beim
  49.     betreuten Arbeiten oder im Forum Hilfe suchen.
  50.  
  51.     Die Konsolenausgabe kann etwas unübersichtlich sein. Der folgende Befehl führt ausschließlich die Tests für
  52.     _diese_ Aufgabe durch: `cc -std=c11 -g -Wall 01ex_test.c -o 01ex_test.o -lm && ./01ex_test.o simple_assignment`.
  53.     Lesen Sie die Ausgabe von diesem Befehl durch. Denn tatsächlich müssen Sie in dieser Aufgabe nicht
  54.     die Summe von `a` und `b` berechnen, sondern etwas anderes. Die Testausgabe verrät Ihnen, was genau.
  55.     Ja, wir zwingen Sie gerade dazu, das Testsystem zum Laufen zu bringen und die Ausgabe zu lesen.
  56.     Denn mit den Tests und deren Fehlermeldungen werden Sie sich den ganzen Programmierkurs über beschäftigen.
  57.  
  58.     Wenn Sie den Anweisungen der Testausgabe gefolgt sind, sollten Sie einen grünen, fröhlichen Smiley
  59.     als Ausgabe erhalten. Dann haben Sie die erste Aufgabe erfolgreich gelöst, und Sie können weiterlesen.
  60.     Vergessen Sie nicht, wieder die Tests für _alle_ Aufgaben auszuführen.
  61.     */
  62.  
  63.     /*
  64.     Jetzt folgt wieder Code, den Sie ignorieren können. Lesen Sie im Folgenden einfach nur die Kommentare, fügen Sie
  65.     ihre Lösungen zwischen den CHANGES-Kommentaren ein, _überprüfen Sie ihre Lösungen im Terminal_, und ignorieren
  66.     Sie alles andere.
  67.     */
  68.     return result;
  69. }
  70.  
  71. int nested_expressions(int x, int y) {
  72.     int result = 0;
  73.     /*
  74.     Aufgabe 1b:
  75.     Weisen Sie der Variable `result` den Wert `(x - y)^2` (das Quadrat der Differenz zwischen `x` und `y`) zu.
  76.  
  77.     Dazu können Sie entweder einen großen Ausdruckverwenden, oder aber Sie speichern ein Zwischenergebnis in einer
  78.     selbstdefinierten Variable ab. Probieren Sie gerne beides.
  79.     */
  80.     /* BEGIN CHANGES */
  81.  
  82.     result = x - y;
  83.     result*=result; //warum (x-y)^2 = 2 statt 0 bei x=0, y=0 ???
  84.  
  85.     /* END CHANGES */
  86.     return result;
  87. }
  88.  
  89. int rotation(int a, int b, int c) {
  90.     /*
  91.     Aufgabe 2a:
  92.     Weisen Sie der Variable `a` den ursprünglichen Wert der Variable `b` zu, der Variable `b` den ursprünglichen Wert
  93.     der Variable `c` zu, und der Variable `c` den ursprünglichen Wert der Variable `a` zu.
  94.     Z.B. sollte bei der anfänglichen Variablenbelegung `a = 0, b = 3, c = 7` am Ende
  95.     die Belegung `a = 3, b = 7, c = 0` sein.
  96.     */
  97.     /* BEGIN CHANGES */
  98.  
  99.     // a=0, b=3, c=7 ->erster swap (a,b) -> a=3, b=0, c=7 ->zweiter swap (b,c) -> a=3, b=7, c=0
  100.     int swap1, swap2;
  101.  
  102.     swap1 = a;
  103.     a = b;
  104.     b = swap1;
  105.  
  106.     swap2 = b;
  107.     b = c;
  108.     c = swap2;
  109.  
  110.     /* END CHANGES */
  111.     return a + (b * 256) + (c * 256 * 256); /* Ja, diese Zeile mag überraschend sein. Einfach ignorieren :-) */
  112. }
  113.  
  114. int while_loop(int n) {
  115.     int result = 1;
  116.     int number = 1;
  117.     /*
  118.     Aufgabe 3a:
  119.     Weisen Sie der Variable `result` das Produkt aller natürlichen Zahlen zwischen `1` und `n` (inklusive) zu.
  120.     Benutzen Sie eine _while-Schleife_, um das Produkt zu berechnen.
  121.     `n` ist nie kleiner als `1`.
  122.     */
  123.     /* BEGIN CHANGES */
  124.     while(number < n){
  125.         number++;
  126.         result*=number;
  127.     }
  128.  
  129.     /* END CHANGES */
  130.     return result;
  131. }
  132.  
  133. int for_loop(int n) {
  134.     int result = 1;
  135.     /*
  136.     Aufgabe 3b:
  137.     Weisen Sie der Variable `result` das Produkt aller natürlichen Zahlen zwischen `1` und `n` (inklusive) zu.
  138.     Benutzen Sie eine _for-Schleife_, um das Produkt zu berechnen.
  139.     `n` ist nie kleiner als `1`.
  140.     */
  141.     /* BEGIN CHANGES */
  142.     for (int i = 2; i <= n; i++){
  143.         result*=i;
  144.     }
  145.     /* END CHANGES */
  146.     return result;
  147. }
  148.  
  149. int ones_place(int n) {
  150.     int result = 0;
  151.     /*
  152.     Aufgabe 4a:
  153.     Die *Einerstelle* einer natürlichen Zahl ist ihre letzte Dezimalstelle.
  154.     Z.B. ist die Einerstelle von 543210 die 0, und die Einerstelle von 7 ist die 7.
  155.     Weisen Sie der Variable `result` die Einerstelle von `n` zu.
  156.     Tipp: der `%` Operator sollte vermutlich in der Lösung auftauchen.
  157.     */
  158.     /* BEGIN CHANGES */
  159.     result = n%10;
  160.     /* END CHANGES */
  161.     return result;
  162. }
  163.  
  164. int tens_place(int n) {
  165.     int result = 0;
  166.     /*
  167.     Aufgabe 4b:
  168.     Die *Zehnerstelle* einer natürlichen Zahl ist ihre zweitletzte Dezimalstelle.
  169.     Z.B. ist die Zehnerstelle von 1234 die 3, und die Zehnerstelle von 7 ist die 0.
  170.     Weisen Sie der Variable `result` die Zehnerstelle von `n` zu.
  171.     Tipp: der `/` Operator sollte vermutlich in der Lösung auftauchen.
  172.     */
  173.     /* BEGIN CHANGES */
  174.     result = n % 100;
  175.     result = result/10;
  176.     /* END CHANGES */
  177.     return result;
  178. }
  179.  
  180. int fine_print1() {
  181.     int result = 0;
  182.     /*
  183.     Aufgabe 5a:
  184.     An diesem Punkt haben Sie hoffentlich viele der Testfälle zum Bestehen gebracht.
  185.     Die Testfälle können aber nur ausgewählte Beispiele überprüfen, sie können nie sicherstellen, dass Sie die
  186.     Aufgabe vollständig korrekt beantwortet haben.
  187.     Insbesondere könnten Sie durch diverse if statements für alle Testfälle einfach die richtige Lösung direkt angeben,
  188.     ohne auch nur die Aufgabenstellung zu lesen.
  189.  
  190.     Darum werden wir zur Benotung zusätzliche Testfälle auswerten, zu denen Sie keinen Zugang haben.
  191.     Wir geben uns große Mühe, dass dies keine gemeinen Randfälle sind.
  192.     Aber Punkte gibt es nicht für grüne Tests, sondern für korrektes Beantworten der Aufgabenstellung.
  193.     Die Verantwortung dafür liegt bei Ihnen.
  194.     Um uns zu bestätigen, das Sie dies gelesen und verstanden haben, weisen Sie
  195.     der Variable `result` die Anzahl der Sätze in diesem Kommentar zu.
  196.     */
  197.     /* BEGIN CHANGES */
  198.     result = 8;
  199.     /* END CHANGES */
  200.     return result;
  201. }
  202.  
  203. int fine_print2() {
  204.     int result = 0;
  205.     /*
  206.     Aufgabe 5b:
  207.     Manche Aufgabenstellungen enthalten außerdem Aspekte, die nicht von den Tests abgedeckt werden können.
  208.     Beispielsweise geben die Aufgaben 3a und 3b bestimmte Implementierungstechniken vor. Es ist möglich, solche Aufgaben nicht
  209.     korrekt zu bearbeiten, aber die Tests trotzdem zum Bestehen zu bringen. Beispielsweise könnte man Aufgabe 3b mit einer while-Scheife lösen.
  210.     Wenn wir eine solche "Lösung" bemerken, wird sie *mit null Punkten bewertet*.
  211.  
  212.     Um uns zu bestätigen, das Sie dies gelesen und verstanden haben, weisen Sie der Variable `result` die Anzahl
  213.     der Buchstaben des Nomens in dem Satzteil *zwischen den Sternchen* im vorigen Absatz zu.
  214.     */
  215.     /* BEGIN CHANGES */
  216.     result = 7;
  217.     /* END CHANGES */
  218.     return result;
  219. }
  220.  
  221. int fine_print3() {
  222.     int result = 0;
  223.     /*
  224.     Aufgabe 5c:
  225.     Zu guter Letzt: die Tests zur Benotung werden auf unserem Server ausgeführt, nicht auf Ihrem Computer.
  226.     Manche Teile der Sprache C sind maschinenabhängig, es kann also theoretisch passieren, dass auf unserem Server
  227.     ein Test fehlschlägt, der auf Ihrer Maschine funktioniert hat. Wir geben uns große Mühe, dass das bei unseren
  228.     Aufgaben nicht vorkommt. Aber im Zweifelsfalle liegt die Verantwortung bei Ihnen, dass Ihre Lösung auf allen
  229.     Maschinen das Gleiche tut.
  230.  
  231.     Bevor sie die Aufgaben abgeben, werden Sie die Möglichkeit haben zu prüfen, ob unser Server die Abgaben akzeptiert.
  232.     Falls Ihre Lösung lokal funktioniert aber nicht auf unserem Server, haben Sie dann noch genug Zeit, um beim
  233.     betreuten Arbeiten Hilfe zu suchen.
  234.  
  235.     Schlussendlich zählt aber, ob der Server Ihre finale Abgabe akzeptiert oder nicht, selbst wenn es lokal bei Ihnen
  236.     funktioniert.
  237.     Um uns zu bestätigen, dass Sie das verstanden haben, weisen Sie der Variable `result` den Wert 6174 zu.
  238.     */
  239.     /* BEGIN CHANGES */
  240.     result = 6174;
  241.     /* END CHANGES */
  242.     return result;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement