From b017c5775cbe2ae4b31dae208f014d7a4e8dbf97 Mon Sep 17 00:00:00 2001 From: b0rbor4d Date: Wed, 15 Apr 2026 00:26:04 +0200 Subject: [PATCH] Add Checkpoint solution: checkpoint_b.c --- exercises/checkpoint_b.c | 242 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 exercises/checkpoint_b.c diff --git a/exercises/checkpoint_b.c b/exercises/checkpoint_b.c new file mode 100644 index 0000000..29a9e29 --- /dev/null +++ b/exercises/checkpoint_b.c @@ -0,0 +1,242 @@ +// ============================================ +// Checkpoint B: Taschenrechner +// Lösung für Selbsttest nach Modul 3-4 +// ============================================ + +#include +#include +#include +#include + +// ============================================ +// MATHEMATISCHE FUNKTIONEN +// ============================================ + +// Grundrechenarten +double add(double a, double b) { + return a + b; +} + +double subtract(double a, double b) { + return a - b; +} + +double multiply(double a, double b) { + return a * b; +} + +double divide(double a, double b, int* error) { + if (b == 0) { + *error = 1; + return 0; + } + *error = 0; + return a / b; +} + +// Erweiterte Funktionen +double power(double base, int exp) { + double result = 1; + for (int i = 0; i < abs(exp); i++) { + result *= base; + } + if (exp < 0) { + result = 1 / result; + } + return result; +} + +// Rekursive Fakultät +long long factorial(int n) { + // Base Case + if (n < 0) return -1; // Fehler + if (n <= 1) return 1; + + // Recursive Case + return n * factorial(n - 1); +} + +// ============================================ +// MENÜ-SYSTEM +// ============================================ +void print_menu() { + printf("\n╔════════════════════════════════╗\n"); + printf("║ TASCHENRECHNER ║\n"); + printf("╠════════════════════════════════╣\n"); + printf("║ 1. Addition (+) ║\n"); + printf("║ 2. Subtraktion (-) ║\n"); + printf("║ 3. Multiplikation (*) ║\n"); + printf("║ 4. Division (/) ║\n"); + printf("║ 5. Potenz (x^n) ║\n"); + printf("║ 6. Fakultät (n!) ║\n"); + printf("║ 7. Alle Operationen zeigen ║\n"); + printf("║ 0. Beenden ║\n"); + printf("╚════════════════════════════════╝\n"); + printf("Wahl: "); +} + +void print_result(const char* operation, double a, double b, double result) { + printf("\n┌────────────────────────────────┐\n"); + printf("│ Ergebnis: │\n"); + printf("│ %.2f %s %.2f = %.4f │\n", a, operation, b, result); + printf("└────────────────────────────────┘\n"); +} + +// ============================================ +// EINGABE MIT FEHLERBEHANDLUNG +// ============================================ +double get_number(const char* prompt) { + double num; + printf("%s", prompt); + while (scanf("%lf", &num) != 1) { + printf("Ungültige Eingabe! Bitte Zahl eingeben: "); + while (getchar() != '\n'); // Buffer leeren + } + return num; +} + +int get_int(const char* prompt) { + int num; + printf("%s", prompt); + while (scanf("%d", &num) != 1) { + printf("Ungültige Eingabe! Bitte ganze Zahl eingeben: "); + while (getchar() != '\n'); + } + return num; +} + +// ============================================ +// ALLE OPERATIONEN ANZEIGEN +// ============================================ +void demo_all_operations() { + printf("\n=== Demonstration aller Operationen ===\n\n"); + + double a = 10, b = 3; + int error; + + printf("Mit a = %.2f, b = %.2f:\n\n", a, b); + + printf("Addition: %.2f + %.2f = %.2f\n", a, b, add(a, b)); + printf("Subtraktion: %.2f - %.2f = %.2f\n", a, b, subtract(a, b)); + printf("Multiplikation: %.2f * %.2f = %.2f\n", a, b, multiply(a, b)); + + double div_result = divide(a, b, &error); + if (!error) { + printf("Division: %.2f / %.2f = %.4f\n", a, b, div_result); + } + + printf("Potenz: %.2f^%d = %.4f\n", a, 3, power(a, 3)); + printf("Fakultät: %d! = %lld\n", 5, factorial(5)); + + // Division durch 0 testen + printf("\nFehlerbehandlung:\n"); + divide(a, 0, &error); + if (error) { + printf("Division durch 0 erkannt! Fehlercode: %d\n", error); + } +} + +// ============================================ +// HAUPTPROGRAMM +// ============================================ +int main() { + printf("╔════════════════════════════════════════════════════════╗\n"); + printf("║ CHECKPOINT B: TASCHENRECHNER (LÖSUNG) ║\n"); + printf("╚════════════════════════════════════════════════════════╝\n"); + printf("\nFeatures:\n"); + printf(" ✓ Menü-System mit switch-case\n"); + printf(" ✓ Funktionen für jede Operation\n"); + printf(" ✓ Rekursive Fakultät\n"); + printf(" ✓ Fehlerbehandlung (Division durch 0)\n"); + printf(" ✓ Eingabe-Validierung\n\n"); + + int choice; + double a, b, result; + int error; + bool running = true; + + while (running) { + print_menu(); + + if (scanf("%d", &choice) != 1) { + printf("Ungültige Eingabe!\n"); + while (getchar() != '\n'); + continue; + } + + switch (choice) { + case 0: + running = false; + printf("\nAuf Wiedersehen!\n"); + break; + + case 1: // Addition + a = get_number("Erste Zahl: "); + b = get_number("Zweite Zahl: "); + result = add(a, b); + print_result("+", a, b, result); + break; + + case 2: // Subtraktion + a = get_number("Erste Zahl: "); + b = get_number("Zweite Zahl: "); + result = subtract(a, b); + print_result("-", a, b, result); + break; + + case 3: // Multiplikation + a = get_number("Erste Zahl: "); + b = get_number("Zweite Zahl: "); + result = multiply(a, b); + print_result("*", a, b, result); + break; + + case 4: // Division + a = get_number("Dividend: "); + b = get_number("Divisor: "); + result = divide(a, b, &error); + if (error) { + printf("\n⚠ Fehler: Division durch 0 nicht erlaubt!\n"); + } else { + print_result("/", a, b, result); + } + break; + + case 5: // Potenz + a = get_number("Basis: "); + { + int exp = get_int("Exponent (Ganzzahl): "); + result = power(a, exp); + printf("\n┌────────────────────────────────┐\n"); + printf("│ %.4f ^ %d = %.4f │\n", a, exp, result); + printf("└────────────────────────────────┘\n"); + } + break; + + case 6: // Fakultät + { + int n = get_int("n (Fakultät von): "); + if (n < 0) { + printf("\n⚠ Fehler: Fakultät nur für n ≥ 0 definiert!\n"); + } else if (n > 20) { + printf("\n⚠ Fehler: n zu groß (Overflow)! Max: 20\n"); + } else { + long long fact = factorial(n); + printf("\n┌────────────────────────────────┐\n"); + printf("│ %d! = %lld │\n", n, fact); + printf("└────────────────────────────────┘\n"); + } + } + break; + + case 7: // Demo + demo_all_operations(); + break; + + default: + printf("\nUngültige Wahl! Bitte 0-7 wählen.\n"); + } + } + + return 0; +}