/* 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;
}