/* loes5-1.c
Loesung der Aufgabe 5.1: Eine Funktion soll eine ganze Zahl in einem
vereinfachten roemischen Zahlensystem dargestellen
*/
#include <stdio.h>
void roemischesSystem (int zahl);
void roemischesSystem (int zahl)
{
int wertigkeiten[7] = {1000, 500, 100, 50, 10, 5, 1 };
char symbole[7] = { 'M', 'D', 'C', 'L', 'X', 'V', 'I'};
/* zur Demonstration habe ich symbole als normalen Vektor initialisiert,
nicht als Zeichenkette char symbole[8] = "MDCLXVI"; siehe Kap 10, 11
Die Initialisierung erspart das muehsame wertigkeiten[0] = 1000, usw.
*/
int anzahl;
int z;
int i, j;
char s[50];
int k = 0; /* aktuelle Position in der Zeichenkette s */
z = zahl; /* weil die Zahl jetzt ja veraendert wird */
for (i = 0; i < 7; i++) {
anzahl = z / wertigkeiten[i]; /* Anzahl der "Scheine" je Wertigkeit */
z -= anzahl * wertigkeiten[i]; /* Rest berechnen */
for (j = 0; j < anzahl; j++)
s[k++] = symbole[i];
/* Falls gewuenscht: Leerzeichen nach der 1000-er, 100-er, 10-er Gruppe
Die Loesung schaut nicht sehr elegant aus */
if ( (s[k-1] == 'M' && z < 1000) ||
((s[k-1] == 'D' || s[k-1] == 'C') && z < 100) ||
((s[k-1] == 'L' || s[k-1] == 'X') && z < 10)
) s[k++] = ' ';
}
s[k] = '\0';
printf("%5i = %s\n", zahl, s);
}
/* eine Alternative waere noch, die zusammengestellte Zeichenkette als Argument
der Funktion zur Verfuegung zu stellen
void roemischesSystem (int zahl, char *s);
*/
int main(void)
{
int z;
printf("%s%s",
"Umrechnung von Zahlen (0 - 5000) in ein vereinfachtes roemisches Zahlensystem:\n",
"Ende mit z = 0\n");
do {
printf("z = "); scanf("%i", &z);
roemischesSystem(z);
} while (z > 0);
return 0;
}