Beispiel 5: romZuArabien

06.11.2016 07:30 Uhr
#include <iostream>

using namespace std;


int romZuArabien(char *rom);

int main()
{
int zahl1, zahl2, resultat, aktiv;
char roemisch[20];
char aktion;

aktiv=1;
while (aktiv==1)
   {
   cout << "Bitte geben Sie eine römische Zahl ein: ";
   cin >> roemisch;
   zahl1=romZuArabien(roemisch);
   
   cout << "Bitte geben Sie noch eine römische Zahl ein: ";
   cin >> roemisch;
   zahl2=romZuArabien(roemisch);

   cout << "Was soll damit geschehen?" << endl << "(+-*/)" << endl;
   cin >> aktion;

   switch(aktion)
      {
   case '+':
      resultat=zahl1 + zahl2;
      break;
   case '-':
      resultat=zahl1 - zahl2;
      break;
   case '*':
      resultat=zahl1 * zahl2;
      break;
   case '/':
      resultat=zahl1 / zahl2;
      break;
   default:
      cout << "Was meinen Sie mit '" << aktion << endl << "'?" << endl;
      }

   cout << "Das Ergebnis lautet: " << resultat << endl;

   if (zahl1 == 0) aktiv=0;
   }
}

int romZuArabien(
char            *rom)
{
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

if (rom[0]=='0') return 0;

stellen=0;
for (int j; rom[stellen]!='\0'; stellen++)
    {
    for (j = 0; j < 7; j++)
        if (rom[stellen] == roemischeZiffern[j])
           {
           arabisch[stellen] = ziffernWert[j];
           break;
           }
    if (j == 7)
       cout << "Fehler!" << endl <<

               "In Ihrer Eingabe " << rom << " ist " << rom[stellen] <<
               " keine römische Ziffer.";
    }

for (int j=1; j < stellen; j++)
    if (arabisch[j] > arabisch[j-1])
       {
       arabisch[j] -= arabisch[j-1];
       arabisch[j-1] = 0;
       }

resultat=0;
for (int j=0; j < stellen; j++) resultat += arabisch[j];

return resultat;
}

Beispiel 5: Erläuterungen I


#include <iostream>

using namespace std;


//Wir trennen jetzt das Einlesen römischer Zahlen von Ihrer
//Verarbeitung. Dazu erklären wir, dass die jetzt zu verwendende Funktion
//vom Typ "Zeiger auf ein Zeichen" ist.
//Einen "Zeiger" oder "Pointer" können wir uns vorerst als den Beginn eines
//Arrays unbekannter Länge vorstellen.
int romZuArabien(char *rom);

int main()
{
int zahl1, zahl2, resultat, aktiv;
char roemisch[20];
char aktion;

aktiv=1;
while (aktiv==1)
   {
   cout << "Bitte geben Sie eine römische Zahl ein: ";
   cin >> roemisch;
//Hier lesen wir die roemische Zahl ein ...
   zahl1=romZuArabien(roemisch);
//... und hier weisen wir "romZuArabien" an, sie zu
//verarbeiten. Wir sagen auch, daß wir der Funktion "romZuArabien" die
//Variable "roemisch" zur Verarvbeitung übergeben.
//"roemisch", zum Unterschied von "roemisch[0]" etc. steht für die
//ganze Zeichenkette, nicht für ein Zeichen daraus. Ein Zeiger
//war der Beginn eines arrays; roemisch steht für ein Array; der Beginn
//eines Arrays ist also ein Zeiger auf das Array als Ganzes.

   
   cout << "Bitte geben Sie noch eine römische Zahl ein: ";
   cin >> roemisch;
   zahl2=romZuArabien(roemisch);

   cout << "Was soll damit geschehen?" << endl << "(+-*/)" << endl;
   cin >> aktion;

   switch(aktion)
      {
   case '+':
      resultat=zahl1 + zahl2;
      break;
   case '-':
      resultat=zahl1 - zahl2;
      break;
   case '*':
      resultat=zahl1 * zahl2;
      break;
   case '/':
      resultat=zahl1 / zahl2;
      break;
   default:
      cout << "Was meinen Sie mit '" << aktion << endl << "'?" << endl;
      }

   cout << "Das Ergebnis lautet: " << resultat << endl;

   if (zahl1 == 0) aktiv=0;
   }
}

int romZuArabien(
char            *rom)

//Hier bestimmen wir nun, daß, was auch immer der
//Variable "romZuArabien" übergeben wurde, es in ihrem Inneren jedenfalls
//als Variable "rom" verwaltet werden soll.
//In weiterer Folge können wir also "rom" so behandeln, als ob es
//ein Array wäre.
{
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

if (rom[0]=='0') return 0;

stellen=0;
for (int j; rom[stellen]!='\0'; stellen++)
    {
    for (j = 0; j < 7; j++)
        if (rom[stellen] == roemischeZiffern[j])
           {
           arabisch[stellen] = ziffernWert[j];
           break;
           }
    if (j == 7)
       cout << "Fehler!" << endl <<
               "In Ihrer Eingabe " << rom << " ist " << rom[stellen] <<

               " keine römische Ziffer.";
    }

for (int j=1; j < stellen; j++)
    if (arabisch[j] > arabisch[j-1])
       {
       arabisch[j] -= arabisch[j-1];
       arabisch[j-1] = 0;
       }

resultat=0;
for (int j=0; j < stellen; j++) resultat += arabisch[j];

return resultat;
}

Anhang: example5.cpp

Schlagwörter: