// ============================================ // 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; }