Add Checkpoint solution: checkpoint_b.c

This commit is contained in:
2026-04-15 00:26:04 +02:00
parent d1fc3fdb2c
commit b017c5775c

242
exercises/checkpoint_b.c Normal file
View File

@@ -0,0 +1,242 @@
// ============================================
// Checkpoint B: Taschenrechner
// Lösung für Selbsttest nach Modul 3-4
// ============================================
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
// ============================================
// 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;
}