From 292b3c6650842d91983542d5cf943517da0cf32d Mon Sep 17 00:00:00 2001 From: paulusja Date: Thu, 30 Apr 2026 10:33:24 +0200 Subject: [PATCH] Add new exercises 05 and 06. --- 05/maexchen.c | 35 +++++++++++++++++++ 05/quadPlatten.c | 24 +++++++++++++ 05/wuerfelSpiel.h | 1 + 05/wuerfelSpielMain.c | 64 +++++++++++++++++++++++++++++++++++ 06/divisionMitRest.c | 25 ++++++++++++++ 06/reverseEngineering.c | 39 ++++++++++++++++++++++ 06/rotiere.c | 55 ++++++++++++++++++++++++++++++ 06/wechselgeld.c | 74 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 317 insertions(+) create mode 100644 05/maexchen.c create mode 100644 05/quadPlatten.c create mode 100644 05/wuerfelSpiel.h create mode 100644 05/wuerfelSpielMain.c create mode 100644 06/divisionMitRest.c create mode 100644 06/reverseEngineering.c create mode 100644 06/rotiere.c create mode 100644 06/wechselgeld.c diff --git a/05/maexchen.c b/05/maexchen.c new file mode 100644 index 0000000..59ea169 --- /dev/null +++ b/05/maexchen.c @@ -0,0 +1,35 @@ +/*********************************************************************************************************************************************** + * Schreiben Sie ein Programm, dass das Würfelspiel Mäxchen simuliert. Dabei würfeln mehrere Spieler nach einander mit zwei Würfeln. * + * Jeder Spieler muss ein höheres Ergebnis erzielen als der Spieler zuvor, ansonsten endet das Spiel und der aktuelle Spieler verliert. * + * Das Ergebnis ist wird immer durch Kombination der größeren und der kleineren Augenzahl gebildet, also z.B. 3 und 5 ergibt 53. Ein Pasch ist * + * höher als ungleiche Ergebnisse, also höher als 65. Wird wieder ein Pasch gewürfelt, so muss dieser mit höheren Augenzahlen erzielt werden * + * als zuvor. Das höchste Ergebnis ist 21. Normalerweise sieht nur der aktuelle Spieler sein Ergebnis und kann gegebenenfalls lügen. Der * + * nächste Spieler muss entscheiden, ob er das Ergebnis glaubt oder nicht. Tut er dies, geht das Spiel mit dem Ergebnis ganz normal weiter. * + * Glaubt er das Ergebnis nicht, wird aufgedeckt. Wurde gelogen, verliert der Lügner. Wurde nicht gelogen, verliert der Spieler, der * + * sehen wollte. * + * * + * Implementieren Sie das Spiel mit zwei Spielern, dem Computer und Ihnen. Der Computer beginnt immer. In dieser ersten Version verzichten * + * wir darauf, zu lügen. * + * * + * 1. beispielhafter Ablauf: * + * Der Computer wuerfelt 3 und 5. * + * Der Spieler wuerfelt 1 und 1. * + * Der Computer wuerfelt 1 und 6. * + * Das Spiel ist vorbei! Sie gewinnen! * + * * + * 2. beispielhafter Ablauf: * + * Der Computer wuerfelt 2 und 3. * + * Der Spieler wuerfelt 5 und 3. * + * Der Computer wuerfelt 2 und 6. * + * Der Spieler wuerfelt 1 und 5. * + * Das Spiel ist vorbei! Sie verlieren! * + * * + ***********************************************************************************************************************************************/ + +#include + +int main() +{ + + return 0; +} \ No newline at end of file diff --git a/05/quadPlatten.c b/05/quadPlatten.c new file mode 100644 index 0000000..7a05cde --- /dev/null +++ b/05/quadPlatten.c @@ -0,0 +1,24 @@ +/**************************************************************************************** + * Schreiben Sie ein Programm, das die Laenge und Breite eines Platzes einliest und * + * ausgibt, wie viele quadratische Platten benoetigt werden, um die Flaeche komplett * + * zu bedecken. Dabei sollen so wenig Platten wie möglich verwendet werden. * + * * + * Beispiel: * + * Geben Sie die Laenge des Platzes ein. * + * >> Geben Sie eine positive, ganze Zahl ein: gfdgfd * + * >> Geben Sie eine positive, ganze Zahl ein: -5 * + * >> Geben Sie eine positive, ganze Zahl ein: 55 * + * Geben Sie die Breite des Platzes ein. * + * >> Geben Sie eine positive, ganze Zahl ein: 0 * + * >> Geben Sie eine positive, ganze Zahl ein: rtre * + * >> Geben Sie eine positive, ganze Zahl ein: 100 * + * Sie benoetigen 220 Platten der Groesse 5x5. * + ****************************************************************************************/ + +#include + +int main() +{ + + return 0; +} \ No newline at end of file diff --git a/05/wuerfelSpiel.h b/05/wuerfelSpiel.h new file mode 100644 index 0000000..7dd745d --- /dev/null +++ b/05/wuerfelSpiel.h @@ -0,0 +1 @@ +#define RANDOM_INIT -1 \ No newline at end of file diff --git a/05/wuerfelSpielMain.c b/05/wuerfelSpielMain.c new file mode 100644 index 0000000..7eb6442 --- /dev/null +++ b/05/wuerfelSpielMain.c @@ -0,0 +1,64 @@ +/**************************************************************************** + * Ergänzen Sie die fehlenden Komponenten des untenstehenden Programmteils, * + * sodass das Würfelspiel lauffähig wird. * + * Diese Datei darf dabei NICHT verändert werden!!! * + * Hinweis: Bei Gleichstand gewinnt der Computer. + * * + * Beispielhafter Ablauf des Spiels 1: * + * >> Geben Sie eine positive Zahl ein: fdfsd * + * Fehler! Keine Zahl! * + * >> Geben Sie eine positive Zahl ein: -5 * + * Fehler! Die Zahl ist kleiner 1! * + * >> Geben Sie eine positive Zahl ein: 5 * + * * + * Endstand * + * -------------- * + * Spieler: 21 * + * Computer: 19 * + * -------------- * + * Gewonnen! * + * * + * Beispielhafter Ablauf des Spiels 2: * + * >> Geben Sie eine positive Zahl ein: -1 * + * Fehler! Die Zahl ist kleiner 1! * + * >> Geben Sie eine positive Zahl ein: abc * + * Fehler! Keine Zahl! * + * >> Geben Sie eine positive Zahl ein: 10 * + * * + * Endstand * + * -------------- * + * Spieler: 33 * + * Computer: 45 * + * -------------- * + * Leider verloren! * + * * + ****************************************************************************/ + +#include +#include "wuerfelSpiel.h" + +#define MIN_WUERFEL_ZAHL 1 +#define MAX_WUERFEL_ZAHL 6 + +int main() +{ + int anzahlWuerfe, summeSpieler = 0, summeCpu = 0; + + INIT_WUERFEL(RANDOM_INIT); + + anzahlWuerfe = gibPositiveZahlEin(); + + for(int i = 0; i < anzahlWuerfe; i++) + { + summeSpieler += wuerfel(MIN_WUERFEL_ZAHL, MAX_WUERFEL_ZAHL); + } + + for(int i = 0; i < anzahlWuerfe; i++) + { + summeCpu += wuerfel(MIN_WUERFEL_ZAHL, MAX_WUERFEL_ZAHL); + } + + gibEndstandAus(summeSpieler, summeCpu); + + return 0; +} \ No newline at end of file diff --git a/06/divisionMitRest.c b/06/divisionMitRest.c new file mode 100644 index 0000000..758406a --- /dev/null +++ b/06/divisionMitRest.c @@ -0,0 +1,25 @@ +/******************************************************************************************** + * Schreiben Sie ein Programm, das zwei ganze Zahlen einliest und das Ergebnis der + * ganzzahligen Division der beiden Zahlen sowie den Rest ausgibt. Schreiben Sie eine Funktion, + * die beide Ergebnisse (Division + Rest) zurückgibt. Das Programm soll, wie gehabt, solange + * nach einer Eingabe fragen, bis diese gültig ist. + * + * Beispielablauf: + * Dividend + * Geben Sie eine Zahl ein: qwert + * Fehler! Keine Zahl! + * Geben Sie eine Zahl ein: 32 + * Divisor + * Geben Sie eine Zahl ein: 0 + * Fehler! Die Zahl darf nicht 0 sein! + * Geben Sie eine Zahl ein: 5 + * Ergebnis: 32 / 5 ist 6 mit Rest 2. + ********************************************************************************************/ + +#include + +int main() +{ + + return 0; +} \ No newline at end of file diff --git a/06/reverseEngineering.c b/06/reverseEngineering.c new file mode 100644 index 0000000..22a85ef --- /dev/null +++ b/06/reverseEngineering.c @@ -0,0 +1,39 @@ +/******************************************************************************************** + * Das folgende Programm liest drei ganze Zahlen ein und macht dann etwas damit. + * + * 1) Überlegen Sie, was der Zweck des Programms ist und was es ausgibt (ohne es auszuführen). + * 2) Benennen Sie die Variablen und Funktionen sinnvoll, um den Quelltext verständlicher zu + * machen. + * 3) Probieren Sie das Programm aus und verifizieren Sie Ihre Vermutung. + * + ********************************************************************************************/ + +#include + +void funktion(int a, int b, int* c, int* d) +{ + if(a > b) { + *d = a; + *c = b; + } + else { + *d = b; + *c = a; + } +} + +int main() +{ + int a, b, c, d, e; + + printf("Geben Sie drei ganze Zahlen ein: "); + scanf("%d, %d, %d", &a, &b, &c); + + funktion(a, b, &d, &e); + funktion(b, c, &d, &e); + funktion(a, c, &d, &e); + + printf("Die Ausgabe ist %d, %d.\n", d, e); + + return 0; +} \ No newline at end of file diff --git a/06/rotiere.c b/06/rotiere.c new file mode 100644 index 0000000..194145b --- /dev/null +++ b/06/rotiere.c @@ -0,0 +1,55 @@ +/******************************************************************************************** + * Das folgende Programm liest eine Folge aus vier ganzen Zahlen sowie eine Anzahl n + * ein und und soll die Zahlenfolge n mal rotieren. Dabei soll die Zahlenfolge nach jeder + * Rotation ausgegeben werden. + * + * Implementieren Sie die Rotation, in dem Sie die Variablen geschickt tauschen. + * 1) Überlegen Sie, wie Sie durch Tauschen eine Zahlenfolge rotieren könnten. + * 2) Implementieren Sie eine geeignete Funktion, die zwei Variablen mittels call-by-reference + * tauscht. + * 3) Nutzen Sie diese Funktion, um die vier Variablen n mal zu rotieren. + * + * Beispiel: + * >> Geben Sie vier ganze Zahlen ein (getrennt durch Kommata): 1, 2, 3, 4 + * >> Wie oft soll rotiert werden? 10 + * Vor der Rotation: 1, 2, 3, 4. + * Nach der 1. Rotation: 4, 1, 2, 3 + * Nach der 2. Rotation: 3, 4, 1, 2 + * Nach der 3. Rotation: 2, 3, 4, 1 + * Nach der 4. Rotation: 1, 2, 3, 4 + * Nach der 5. Rotation: 4, 1, 2, 3 + * Nach der 6. Rotation: 3, 4, 1, 2 + * Nach der 7. Rotation: 2, 3, 4, 1 + * Nach der 8. Rotation: 1, 2, 3, 4 + * Nach der 9. Rotation: 4, 1, 2, 3 + * Nach der 10. Rotation: 3, 4, 1, 2 + * + ********************************************************************************************/ + +#include + +int main() +{ + int a, b, c, d, n = 0; + + printf("Geben Sie vier ganze Zahlen ein (getrennt durch Kommata): "); + if (scanf("%d, %d, %d, %d", &a, &b, &c, &d) != 4) + { + printf("Fehlerhafte Eingabe!\n"); + return -1; + } + + while(getchar() != '\n'); + printf("Wie oft soll rotiert werden? "); + if(scanf("%d", &n) != 1 || n < 0) + { + printf("Fehlerhafte Eingabe!\n"); + return -1; + } + + printf("Vor der Rotation: %d, %d, %d, %d.\n", a, b, c, d); + + // TODO + + return 0; +} \ No newline at end of file diff --git a/06/wechselgeld.c b/06/wechselgeld.c new file mode 100644 index 0000000..54750c0 --- /dev/null +++ b/06/wechselgeld.c @@ -0,0 +1,74 @@ +/************************************************************************************************************************** + * Schreiben Sie die fehlenden Funktionen für das untenstehende Programm und ergänzen Sie die mit TODO markierten * + * Funktionsaufrufe. Der Rest des Programms darf nicht verändert werden. * + * * + * Das Programm simuliert einen Ticketautomaten, der einen Preis anzeigt und der mittels Eingabe bezahlt werden soll. Der * + * Automat gibt dann mittels Ausgabe das Restgeld in 2-Euro-Münzen, 50-Cent-Münzen und 10-Cent-Münzen zurück. Dabei * + * sollen immer möglichst viele der Münzen mit höheren Wert zurückgegeben werden. Wenn der Restbetrag nicht komplett * + * durch diese Münzen ausbezahlt werden kann, wird die Differenz einbehalten. Der zu bezahlende Preis wird als Simulation * + * zufällig im Intervall [MIN_PREIS_IN_EUROS; MAX_PREIS_IN_EUROS] ermittelt. * + * * + * 1. Möglicher Ablauf: * + * * + * Ticketautomat: Achtung! Restbetraege kleiner 10 Cents koennen nicht ausbezahlt werden! * + * * + * >> Bezahlen Sie bitte 6.31 Euro: 5 * + * >> Bezahlen Sie bitte 6.31 Euro: ghgf * + * >> Bezahlen Sie bitte 6.31 Euro: 10.5199999999 * + * Sie haben 10.51 Euro bezahlt. Der Restbetrag von 4.20 wird nun ausgezahlt. * + * * + * Ihr Wechselgeld: 2x 2-Euro-Muenzen, 0x 50-Cent-Muenzen, 2x 10-Cent-Muenzen. * + * * + * 2. Möglicher Ablauf: * + * * + * Ticketautomat: Achtung! Restbetraege kleiner 10 Cents koennen nicht ausbezahlt werden! * + * * + * >> Bezahlen Sie bitte 9.28 Euro: 9 * + * >> Bezahlen Sie bitte 9.28 Euro: 10 * + * Sie haben 10.00 Euro bezahlt. Der Restbetrag von 0.72 wird nun ausgezahlt. * + * * + * Ihr Wechselgeld: 0x 2-Euro-Muenzen, 1x 50-Cent-Muenzen, 2x 10-Cent-Muenzen. * + * * + * Der Betrag konnte nicht komplett ausgezahlt werden. * + * * + **************************************************************************************************************************/ + + +#include +#include +#include + +#define MIN_PREIS_IN_EUROS 5.15 +#define MAX_PREIS_IN_EUROS 12.95 + + +int main() +{ + int zweiEuroMuenzen, fuenzigCentMuenzen, zehnCentMuenzen, istWechselGeldKomplett; + double preisInEuro, bezahlterBetragInEuro, restBetragInEuro; + + printf("\nTicketautomat: Achtung! Restbetraege kleiner 10 Cents koennen nicht ausbezahlt werden!\n\n"); + + srand(time(NULL)); + + // TODO: Der Preis soll in dieser Simulation zufällig ermittelt werden. Die Preisspanne ist oben als Konstanten hinterlegt. + preisInEuro = ermittlePreis(); + // TODO: Das einzuwerfende Geld muss einer validen Eingabe entsprechen. Dafür muss u.a. mindestens der Preis bezahlt werden. + bezahlterBetragInEuro = wirfGeldEin(preisInEuro); + restBetragInEuro = bezahlterBetragInEuro - preisInEuro; + + printf("Sie haben %.2lf Euro bezahlt. Der Restbetrag von %.2lf wird nun ausgezahlt.\n", bezahlterBetragInEuro, restBetragInEuro); + + /* TODO + istWechselGeldKomplett = errechneWechselgeld(// TODO: Argumente übergeben. Hier sollen u.a.die Anzahl an Münzen gesetzt werden.); + */ + + printf("\nIhr Wechselgeld: %2dx 2-Euro-Muenzen, %2dx 50-Cent-Muenzen, %2dx 10-Cent-Muenzen.\n", zweiEuroMuenzen, fuenzigCentMuenzen, zehnCentMuenzen); + + if(!istWechselGeldKomplett) + { + printf("\nDer Betrag konnte nicht komplett ausgezahlt werden.\n"); + } + + return 0; +} \ No newline at end of file