243 lines
8.3 KiB
C
243 lines
8.3 KiB
C
// ============================================
|
|
// 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;
|
|
}
|