Skip to content

Instantly share code, notes, and snippets.

@randombyte-developer
Created December 9, 2018 14:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save randombyte-developer/cc03137bdd1707b7c5cc3683b3ea2030 to your computer and use it in GitHub Desktop.
Save randombyte-developer/cc03137bdd1707b7c5cc3683b3ea2030 to your computer and use it in GitHub Desktop.
Praktikum2
#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <Windows.h>
#define OK 1;
#define ERROR_STEUER_KLASSE -1
#define ERROR_MIN_MAX -2
#define ERROR_SCHRITTWEITE -3
#define ANZAHL_FREIBETRAEGE 2
#define ANZAHL_STEUERSAETZE 4
const int freibetraege[ANZAHL_FREIBETRAEGE] = {10000, 20000};
typedef struct {
int obere_schwelle;
float steuer_faktor;
} steuersatz;
const steuersatz steuersaetze[ANZAHL_STEUERSAETZE] = {
{12000, 0.15f},
{28000, 0.22f},
{50000, 0.32f},
{INT_MAX, 0.45f}
};
BOOL ist_steuer_klasse_gueltig(int steuer_klasse) {
return steuer_klasse >= 0 && steuer_klasse < ANZAHL_FREIBETRAEGE;
}
int bereinige_einkommen(int steuer_klasse, int einkommen) {
if (ist_steuer_klasse_gueltig(steuer_klasse)) {
return max(0, einkommen - freibetraege[steuer_klasse]);
}
return ERROR_STEUER_KLASSE;
}
float berechne_steuer(int steuer_klasse, int einkommen) {
int bereinigtes_einkommen = bereinige_einkommen(steuer_klasse, einkommen);
if (bereinigtes_einkommen == ERROR_STEUER_KLASSE) {
return ERROR_STEUER_KLASSE;
}
float steuern = 0;
int rest_einkommen = bereinigtes_einkommen;
int vorherige_obere_schwelle = 0;
for (int i = 0; i < ANZAHL_STEUERSAETZE; i++) {
if (rest_einkommen <= 0) break;
steuersatz steuersatz = steuersaetze[i];
int schwellen_differenz = steuersatz.obere_schwelle - vorherige_obere_schwelle;
vorherige_obere_schwelle = steuersatz.obere_schwelle;
int zu_versteuernder_betrag = min(rest_einkommen, schwellen_differenz);
steuern += zu_versteuernder_betrag * steuersatz.steuer_faktor;
rest_einkommen -= zu_versteuernder_betrag;
}
return steuern;
}
int zeige_tabelle(int min_einkommen, int max_einkommen, int schrittweite, int steuer_klasse) {
if (min_einkommen < 0 || max_einkommen < 0 || min_einkommen >= max_einkommen) {
return ERROR_MIN_MAX;
}
if (schrittweite <= 0) {
return ERROR_SCHRITTWEITE;
}
if (!ist_steuer_klasse_gueltig(steuer_klasse)) {
return ERROR_STEUER_KLASSE;
}
printf("%16s%16s%16s\n", "Einkommen", "Steuer", "Steuersatz");
for (int einkommen = min_einkommen; einkommen <= max_einkommen; einkommen += schrittweite) {
float steuern = berechne_steuer(steuer_klasse, einkommen);
float steuersatz_gesamt = (steuern / einkommen) * 100;
if (steuern == 0) {
steuersatz_gesamt = 0;
}
printf("%16i%16.1f%16.1f\n", einkommen, steuern, steuersatz_gesamt);
}
return OK;
}
void main() {
int min = -1;
int max = -1;
int schrittweite = -1;
int steuer_klasse = -1;
printf("Minimales Einkommen: ");
scanf_s("%i", &min);
printf("Maximales Einkommen: ");
scanf_s("%i", &max);
printf("Schrittweite: ");
scanf_s("%i", &schrittweite);
printf("Steuerklasse (1 oder 2): ");
scanf_s("%i", &steuer_klasse);
printf("\n");
steuer_klasse--;
int ergebnis = zeige_tabelle(min, max, schrittweite, steuer_klasse);
switch (ergebnis) {
case ERROR_STEUER_KLASSE:
printf("Ungueltige Steuerklasse!\n");
break;
case ERROR_MIN_MAX:
printf("Ungueltige Grenzwerte!\n");
break;
case ERROR_SCHRITTWEITE:
printf("Ungueltige Schrittweite!\n");
break;
}
printf("\n");
system("PAUSE");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment