Add Checkpoint solution: checkpoint_b.c
This commit is contained in:
242
exercises/checkpoint_b.c
Normal file
242
exercises/checkpoint_b.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user