Beispiel 14: arabienZuRom

06.11.2016 10:30 Uhr
#include <iostream>

using namespace std;


int addiereRoemisch(char *zahl1, char *zahl2);
int romZuArabien(char *rom);
char *arabienZuRom(int arabisch);

int main()
{
char zahl1[10], zahl2[10];
int ergebnis;
char *ergebnisRoemisch;

cout << "Bitte geben Sie eine erste Zahl ein:";
cin >> zahl1;
cout << "Bitte geben Sie eine zweite Zahl ein:";
cin >> zahl2;

ergebnis=addiereRoemisch(zahl1,zahl2);
ergebnisRoemisch=arabienZuRom(ergebnis);

cout << zahl1 << " + " << zahl2 << " = " << ergebnisRoemisch << endl;
}

int addiereRoemisch(char *zahl1, char *zahl2)
{
int resultat,arab1,arab2;

arab1=romZuArabien(zahl1);
arab2=romZuArabien(zahl2);
resultat=arab1+arab2;

return resultat;
}

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) return 0;
    }

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

char *arabienZuRom(int arabisch)
{
char resultat[10];
char roemischeZiffern[8] = "mdclxvi";
int ziffernWert[7] = {1000,500,100,50,10,5,1};
int stelle=0;

for (int i = 0; i < 8; i++)
    {
    while (arabisch >= ziffernWert[i])
          {
          resultat[stelle] = roemischeZiffern[i];
          arabisch -= ziffernWert[i];
          stelle++;
          }
    }
resultat[stelle]='\0';

return resultat;
}

Beispiel 14: Erläuterungen I

#include <iostream>

using namespace std;


int addiereRoemisch(char *zahl1, char *zahl2);
int romZuArabien(char *rom);
char *arabienZuRom(int arabisch);

int main()
{
char zahl1[10], zahl2[10];
int ergebnis;
char *ergebnisRoemisch;

cout << "Bitte geben Sie eine erste Zahl ein:";
cin >> zahl1;
cout << "Bitte geben Sie eine zweite Zahl ein:";
cin >> zahl2;

ergebnis=addiereRoemisch(zahl1,zahl2);
ergebnisRoemisch=arabienZuRom(ergebnis);

cout << zahl1 << " + " << zahl2 << " = " << ergebnisRoemisch << endl;
}

int addiereRoemisch(char *zahl1, char *zahl2)
{
int resultat,arab1,arab2;

arab1=romZuArabien(zahl1);
arab2=romZuArabien(zahl2);
resultat=arab1+arab2;

return resultat;
}

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) return 0;
    }

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

char *arabienZuRom(int arabisch)
{
char resultat[10];

Hier steht für den Compiler:
Reserviere zehn Bytes Speicher, solange diese Funktion aktiv ist.
char roemischeZiffern[8] = "mdclxvi";
int ziffernWert[7] = {1000,500,100,50,10,5,1};
int stelle=0;

for (int i = 0; i < 8; i++)
    {
    while (arabisch >= ziffernWert[i])
          {
          resultat[stelle] = roemischeZiffern[i];
          arabisch -= ziffernWert[i];
          stelle++;
          }
    }
resultat[stelle]='\0';

Geben wir einer aufrufenden Funktion eine Variable 'zurück',
die Speicher verwaltet, der innerhalb einer aufgerufenen Funktion vom Compiler
zugewiesen wurde, so ist der Inhalt dieses Speichers in der aufrufenden
Funktion nicht definiert.
 

Hier steht (implizit) für den Compiler:
"Gib die oben reservierten zehn Bytes wieder frei, d.h., laß andere Programme /
Programmteile darin abspeichern, was immer sie möchten."
Der Teil des Speichers eines Rechners, den aufgerufene
Funktionen solcherart implizit verwalten, heißt Stack eines Programmes.



return resultat;
}

Anhang: example14.cpp

Schlagwörter: