Beispiel 15: arabienZuRom II

06.11.2016 09: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;
char roemischeZiffern[8] = "mdclxvi";
int ziffernWert[7] = {1000,500,100,50,10,5,1};
int stelle=0;

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


return resultat;
}

Beispiel 15: 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;

Hier steht dagegen nur: "Reserviere (implizit) so viel
Speicher wie Du brauchst, um eine Speicheradresse zu verwalten."
char roemischeZiffern[8] = "mdclxvi";
int ziffernWert[7] = {1000,500,100,50,10,5,1};
int stelle=0;

resultat = new char[10];
Hier steht: Ich möchte explizit bis aus weiteres zehn Byte
zur Verfügung haben, auf die kein anderes Programm zugreifen darf. Dieser
Speicher steht also auch zur Verfügung, wenn die Funktion innerhalb derer
'new' verwendet wird, endet.
Der Teil des Speichers des Rechners, den der Benutzer
explizit durch Aufrufe von 'new' verwaltet, heißt der Heap eines
Programmes.
for (int i = 0; i < 7; i++)
    {
    while (arabisch >= ziffernWert[i])
          {
          resultat[stelle] = roemischeZiffern[i];
          arabisch -= ziffernWert[i];
          stelle++;
          }
    }
resultat[stelle]='\0';

Hier steht für das Programm: Gib jenen Speicher wieder frei, den Du unter
der Bezeichnung 'resultat' zur Verwaltung einer Speicheradresse reserviert
hast. Die zehn durch 'new' angeforderten Bytes sind also nicht betroffen!


return resultat;
}

Anhang: example15.cpp

Schlagwörter: