Guest User

asdf

a guest
Oct 15th, 2011
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.59 KB | None | 0 0
  1. #include <stdio.h> /** Einbinden der benötigten Bibliotheken. */
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef enum {False,True} boolean; /** eigenen Datentyp boolean definieren, um später die Überpfüfung der römischen zahlen mit einem Wahrheitswert zu machen. */
  6.  
  7. void deztorom(int dezzahl) /** Funktion um eine Dezimalzahl in eine Römische umzuwandeln. Erwartet einen integer Wert. */
  8. {
  9.     char ziffern[13][3] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X",
  10.                        "IX", "V", "IV", "I"};
  11.     int zahlen[13] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
  12.     int i=0, zahl;
  13.  
  14.     zahl = dezzahl;
  15.     while (zahl > 0) /** Schleife läuft solange, bis "zahl" 0 erreicht */
  16.     {
  17.         if (zahl/zahlen[i] >= 1) /** Wenn sich "zahl" durch den entsprechenden Wert aus dem Array "zahlen" teilen lässt, wird die äquivalente römische Ziffer ausgegeben. */
  18.         {
  19.             printf(ziffern[i]); /** Ausgabe der römischen Ziffer. */
  20.             zahl -= zahlen[i]; /** Der Wert aus dem array "zahlen" wird von Zahl abgezogen, damit im nächsten Durchlauf mit der neuen Zahl gerechnet werden kann. */
  21.         }
  22.         else /** Ansonsten wird der "i" um 1 erhöht, um im nächsten Durchlauf mit der nächsten Zahl zu arbeiten. */
  23.         {
  24.             i++;
  25.         }
  26.     }
  27.     printf("\n");
  28. }
  29.  
  30. boolean check(const char *romzahl) /** Funktion um zu Überprüfen, ob die eingegebene römische Zahl unerlaubte zeichen enthält. Erwartet eine römische Zahl. */
  31. {
  32.     boolean ret; /** Rückgabewert */
  33.     int i;
  34.     char temp;
  35.  
  36.     ret = True; /** Wird erstmal auf true gesetzt. */
  37.     for (i=0; i < strlen(romzahl); i++) /** Läuft solange "i" nicht die Länge der übergebenen römischen Zahl erreicht. */
  38.     {
  39.         temp = romzahl[i];  /** Weist "temp" einen Wert aus der römsichen Zahl zu, um */
  40.         if (strrchr("IVXLCDM",temp) == NULL) /** die Ziffer zu überprüfen, ob nur die erlaubten zeichen enthalten sind. Sollte das Zeichen nicht gefunden werden, gibt die Funktion "NULL" zurück. */
  41.         {
  42.             ret = False; /** Falls "strrchr" "NULL" zurückgibt, besteht "temp" nicht aus den erlaubten Zeichen. Also wird der Rückgabewert auf "False" gesetzt.*/
  43.             break; /** Falls ein falscher Wert gefunden wurde, wird die Schleife abgebrochen. */
  44.         }
  45.     }
  46.     return ret; /** Rüchgabe von "True" bzw. "False" */
  47. }
  48.  
  49.  
  50. int ziffertodez(char z) /** Funktion um eine römische Ziffer in eine Dezimalzahl umzuwandeln. Erwartet ein "char". */
  51. {
  52.     int dezimalzahl;
  53.  
  54.     dezimalzahl = 0;
  55.     switch (z) /** Je nachdem, welche Ziffer "z" ist, wird "dezimalzahl" der entsprechende Wert zugewiesen. (Enstprechend den Regeln.) */
  56.     {
  57.         case 'I':
  58.             dezimalzahl = 1;
  59.             break;
  60.         case 'V':
  61.             dezimalzahl = 5;
  62.             break;
  63.         case 'X':
  64.             dezimalzahl = 10;
  65.             break;
  66.         case 'L':
  67.             dezimalzahl = 50;
  68.             break;
  69.         case 'C':
  70.             dezimalzahl = 100;
  71.             break;
  72.         case 'D':
  73.             dezimalzahl = 500;
  74.             break;
  75.         case 'M':
  76.             dezimalzahl = 1000;
  77.             break;
  78.     }
  79.     return dezimalzahl; /** Die ermittelte Dezimalzahl wird als Rückgabewert übergeben. */
  80. }
  81.  
  82. int zahltodez(const char *romzahl) /** Funktion, um eine römische Zahl in eine Dezimalzahl umzuwandeln. Erwarted ein char array als Übergabe. */
  83. {
  84.     int dezimalzahl;/** Deklaration der nötigen variablen */
  85.     int index;
  86.     int len;
  87.     unsigned int dezimalzahl1,dezimalzahl2;
  88.  
  89.     dezimalzahl = 0;
  90.     index = 0;
  91.     len = strlen(romzahl); /** Der variable "len" wird die Länge des übergebenen Arrays zugewiesen. */
  92.  
  93.     do
  94.     {
  95.         dezimalzahl1 = ziffertodez(romzahl[index]); /** "dezimalzahl1" bekommt den dezimalen Wert einer Ziffer des übergebenen Arrays überwiesen. */
  96.         dezimalzahl2 = ziffertodez(romzahl[index+1]); /** "dezimalzahl2" bekommt den dezimalen Wert der darauffolgenden Ziffer des übergebenen Arrays überwiesen. */
  97.  
  98.         if (dezimalzahl1 < dezimalzahl2) /** Dieses Konstrukt, weist "dezimalzahl" einen entsprechenden Wert zu, falls eine kleinere römische Zahl vor einer grösseren steht. */
  99.         {                                /** Bei diesem Fall wird die Regel, das die kleinere Zahl von der grösseren Zahl abgezogen wird zutage. */
  100.             if (strncmp(&romzahl[index],"IV",2)==0)
  101.                 dezimalzahl += 4;
  102.             else if (strncmp(&romzahl[index],"IX",2)==0)
  103.                 dezimalzahl += 9;
  104.             else if (strncmp(&romzahl[index],"XL",2)==0)
  105.                 dezimalzahl += 40;
  106.             else if (strncmp(&romzahl[index],"XC",2)==0)
  107.                 dezimalzahl += 90;
  108.             else if (strncmp(&romzahl[index],"CD",2)==0)
  109.                 dezimalzahl += 400;
  110.             else if (strncmp(&romzahl[index],"CM",2)==0)
  111.                 dezimalzahl += 900;
  112.             else
  113.             {
  114.                 dezimalzahl = 0; /** Sollte das nicht der fall sein, wird nur eine 0 zugewiesen, um Folgefehler zu verhindern. */
  115.                 break;
  116.             }
  117.  
  118.             index = index + 2; /** Nach der Umwandlung, wird der Index erhöht um 2, da, wenn der obige fall eingetreten ist, bereits 2 Zeichen umgewandelt wurden. */
  119.         }
  120.         else
  121.         {
  122.             dezimalzahl = dezimalzahl + dezimalzahl1; /** Wenn das "if" oben nicht zutrifft, wird "dezimalzahl" einfach mit sich selbst, und dem deziamlen Wert der römischen Ziffer addiert.  */
  123.             index = index + 1; /** Der index wird um 1 erhöht, um mit der nächsten Ziffer fortzufahren.*/
  124.         }
  125.     } while (index < len); /** Die Schleife läuft solange, bis der index = der Länge der übergebenen römischen zahl ist. */
  126.  
  127.     return dezimalzahl; /** Die umgewandelte zahl wird zurückgegeben. */
  128. }
  129.  
  130.  
  131. int main(int argc, char *argv[]) /** Mainfunktion*/
  132. {
  133.     int zahl1, zahl2, sw, erg; /** Variablendeklaration.*/
  134.  
  135.     if(argc == 4) /** Überprüfen, ob die richtige Anzahl Parameter eingegeben wurde. (4, weil ein parameter der Dateiname/pfad ist.)*/
  136.     {
  137.         sw = (*argv[2]); /** "sw" wird der Inhalt des zweiten parameters zugewiesen, also "+" oder "-". */
  138.         if(check(argv[1]) == True && check(argv[3]) == True) /** Überprüfung ob die übergebenen römischen zahlen unerlaubte zeichen enthalten. */
  139.         {
  140.             zahl1 = zahltodez(argv[1]); /** Die erste römische zahl wird in dezimal umgewandelt, und in einer integer variable gespeichert.*/
  141.             zahl2 = zahltodez(argv[3]); /** Die zweite römische zahl wird in dezimal umgewandelt, und in einer integer variable gespeichert.*/
  142.             if(sw == '+') /** Im falle, das "+" eingegeben wurde, werden die zahlen addiert, im Falle von "-" subtrahiert, und in einer weiteren Variable gespeichert.*/
  143.             {
  144.                 erg = zahl1 + zahl2;
  145.             }
  146.             else if(sw == '-')
  147.             {
  148.                 erg = zahl1 - zahl2;
  149.             }
  150.             else
  151.             {
  152.                 printf("Ungueltiger Operator!\n"); /** Falls weder "+" noch "-" gefunden wird, muss ein falscher operator eingegeben worden sein, und es wird eine entsprechende fehlermeldung ausgegeben.*/
  153.             }
  154.             if(erg < 1 || erg > 3888) /** Überprüfung, ob das Ergebniss sich innerhalb des römischen Zahlenbereichs befindet.*/
  155.             {
  156.                 printf("Das Ergebniss ist nicht als roemische Zahl darstellbar.\n"); /** Für nicht, wird eine Fehlermeldung ausgegeben. */
  157.             }
  158.             else
  159.             {
  160.                 deztorom(erg); /** Ansonsten wird die Funktion "deztorom" aufgerufen, um das Ergebniss erneut in eine römische Zahl umzuwandeln, und auszugeben. */
  161.             }
  162.         }
  163.         else
  164.         {
  165.             printf("Ungueltige Zeichen!\n"); /** Falls die überprüfung einer zahl "False" zurückgibt, wird eine entsprechende meldung übergeben.*/
  166.         }
  167.     }
  168.     else
  169.     {
  170.         printf("Zu viele oder zu wenige Parameter eingegeben!\n"); /** Falls zu wenige oder zu viel parameter erkannt wurden, wird eine entsprechende Meldung ausgegeben. */
  171.     }
  172.     return 0;
  173. }
  174.  
  175.  
Advertisement
Add Comment
Please, Sign In to add comment