Schlagwort: 3.Sitzung 08.11.16

Aufgaben

Posted by

Abgeben Sie Ihre Lösungen zu den folgenden Aufgaben bitte bis vor 7. November in WoMS.

Anmerkung. Wenn, wie heute, ein Teil der Beispiele „für alle“ gekennzeichnet
ist, heißt dies: Diese Aufgabe müssen Sie lösen, damit Sie das für diese
Stunde Vorgesehene erfüllt haben.

„Für Fortgeschrittene“ heißt: Es wird Ihr Verständnis, für den hier
behandelten Stoff vertiefen, wenn Sie eine Lösung abliefern. Wenn Sie unter
Zeitdruck stehen, ignorieren Sie diese Aufgabe aber bitte und gehen Sie zu
denen der nächsten Stunde über.


Aufgabe 1 / für alle:

Schreiben Sie ein c++ Programm, das nach der Sprache des Benutzer fragt.

Je nachdem, wird durch eine englischsprachige und eine deutschsprachige Funktion
nach Namen und Vornamen des Benutzers gefragt. Diese Informationen werden an
das aufrufende Programm zurückgegeben und von diesem am Bildschrim zu einer
Meldung „Herzlich willkommen x y!“ ausgegeben. Auch dies sollte sprachabhängig
geschehen.

Also:

  1. Das Hauptprogramm (main) fragt nach der Sprache.
  2. In Abhängigkeit davon ruft es eine von zwei Funktionen auf, die jeweils
    in einer der beiden Sprachen nach Name / Vorname fragen.
  3. Diese Information wird an das aufrufende Programm zurückgegeben.
  4. main() gibt diese Informationen schließlich, umrahmt mit etwas Begrüßungstext,
    wieder aus.

Hinweis: Wir bauen auf dem Ergebnis dieser Aufgabe nächste Stunde auf. Bitte schicken Sie mir die Lösung vorher!


Aufgabe 2 / für Fortgeschrittene:

Modifizieren Sie das Programm in Beispiel 9 oder Beispiel 10 mit dem
geringstmöglichen Aufwand so, daß sich der Wert der variablen auch im aufrufenden
Programm ändert.

Beispiel 1: anzahlWorte. Bitte erinnern: WISO 210.

Posted by
#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    for (int j=worte[i]; zeile[j] != '\0'; j = j + 1)
        cout << zeile[j];
    cout << endl;
    }
}

Beispiel 1: Erläuterungen I

#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";

Eine Zeichenkette von bis zu 100 Zeichen. Jede Zeichenkette endet mit einer Null.

Im Speicher steht also:

zeile[0]                                                                              D
zeile[1]                                                                              i
zeile[2]                                                                              e
zeile[3]                                                                              s
zeile[4]                                                                              <Leerstelle>
zeile[5]                                                                              i
zeile[6]                                                                              s
zeile[7]                                                                              t
zeile[8]                                                                              <Leerstelle>
zeile[9]                                                                              e
zeile[10]                                                                              i
zeile[11]                                                                              n
zeile[12]                                                                              <Leerstelle>
zeile[13]                                                                              T
zeile[14]                                                                              e
zeile[15]                                                                              x
zeile[16]                                                                              t
zeile[17]                                                                              <Leerstelle>
zeile[18]                                                                              a
zeile[19]                                                                              u
zeile[20]                                                                              s
zeile[21]                                                                              <Leerstelle>
zeile[22]                                                                              m
zeile[23]                                                                              i
zeile[24]                                                                              <Leerstelle>
zeile[25]                                                                              N
zeile[26]                                                                              a
zeile[27]                                                                              c
zeile[28]                                                                              h
zeile[29]                                                                              t
zeile[30]                                                                              .
zeile[31]                                                                              ‚\0‘

int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

Jetzt wurden in unserer Zeichenkette die Leerstellen durch Nullen ersetzt.

Im Speicher steht also:

zeile[0]                                                                              D
zeile[1]                                                                              i
zeile[2]                                                                              e
zeile[3]                                                                              s
zeile[4]                                                                              ‚\0‘
zeile[5]                                                                              i
zeile[6]                                                                              s
zeile[7]                                                                              t
zeile[8]                                                                              ‚\0‘
zeile[9]                                                                              e
zeile[10]                                                                              i
zeile[11]                                                                              n
zeile[12]                                                                              ‚\0‘
zeile[13]                                                                              T
zeile[14]                                                                              e
zeile[15]                                                                              x
zeile[16]                                                                              t
zeile[17]                                                                              ‚\0‘
zeile[18]                                                                              a
zeile[19]                                                                              u
zeile[20]                                                                              s
zeile[21]                                                                              ‚\0‘
zeile[22]                                                                              m
zeile[23]                                                                              i
zeile[24]                                                                              ‚\0‘
zeile[25]                                                                              N
zeile[26]                                                                              a
zeile[27]                                                                              c
zeile[28]                                                                              h
zeile[29]                                                                              t
zeile[30]                                                                              .
zeile[31]                                                                              ‚\0‘

Wenn eine Zeichenkette „irgendwo“ beginnt uns bis zur ersten Null geht, haben wir jetzt doch eigentlich SIEBEN Zeichenketten?

Die Situation könnten wir auch so beschreiben:

zeile[0+0]                                                                              D
zeile[0+1]                                                                              i
zeile[0+2]                                                                              e
zeile[0+3]                                                                              s
zeile[0+4]                                                                              ‚\0‘
zeile[5+0]                                                                              i
zeile[5+1]                                                                              s
zeile[5+2]                                                                              t
zeile[5+3]                                                                              ‚\0‘
zeile[9+0]                                                                              e
zeile[9+1]                                                                              i
zeile[9+2]                                                                              n
zeile[9+3]                                                                              ‚\0‘
zeile[13+0]                                                                              T
zeile[13+1]                                                                              e
zeile[13+2]                                                                              x
zeile[13+3]                                                                              t
zeile[13+4]                                                                              ‚\0‘
zeile[18+0]                                                                              a
zeile[18+1]                                                                              u
zeile[18+2]                                                                              s
zeile[18+3]                                                                              ‚\0‘
zeile[22+0]                                                                              m
zeile[22+1]                                                                              i
zeile[22+2]                                                                              ‚\0‘
zeile[25+0]                                                                              N
zeile[25+1]                                                                              a
zeile[25+2]                                                                              c
zeile[25+3]                                                                              h
zeile[25+4]                                                                              t
zeile[25+5]                                                                              .
zeile[25+6]                                                                              ‚\0‘

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    for (int j=worte[i]; zeile[j] != '\0'; j = j + 1)
        cout << zeile[j];
    cout << endl;
    }

In der obigen Schleife haben wir uns das zu Nutze gemacht, indem wir den Beginn eines Wortes jweils in einem Element des Arrays Worte abgespeichert haben, also:

zeile[worte[0]+0]                                                                              D
zeile[worte[0]+1]                                                                              i
zeile[worte[0]+2]                                                                              e
zeile[worte[0]+3]                                                                              s
zeile[worte[0]+4]                                                                              ‚\0‘
zeile[worte[1]+0]                                                                              i
zeile[worte[1]+1]                                                                              s
zeile[worte[1]+2]                                                                              t
zeile[worte[1]+3]                                                                              ‚\0‘
zeile[worte[2]+0]                                                                              e
zeile[worte[2]+1]                                                                              i
zeile[worte[2]+2]                                                                              n
zeile[worte[2]+3]                                                                              ‚\0‘
zeile[worte[3]+0]                                                                              T
zeile[worte[3]+1]                                                                              e
zeile[worte[3]+2]                                                                              x
zeile[worte[3]+3]                                                                              t
zeile[worte[3]+4]                                                                              ‚\0‘
zeile[worte[4]+0]                                                                              a
zeile[worte[4]+1]                                                                              u
zeile[worte[4]+2]                                                                              s
zeile[worte[4]+3]                                                                              ‚\0‘
zeile[worte[5]+0]                                                                              m
zeile[worte[5]+1]                                                                              i
zeile[worte[5]+2]                                                                              ‚\0‘
zeile[worte[6]+0]                                                                              N
zeile[worte[6]+1]                                                                              a
zeile[worte[6]+2]                                                                              c
zeile[worte[6]+3]                                                                              h
zeile[worte[6]+4]                                                                              t
zeile[worte[6]+5]                                                                              .
zeile[worte[6]+6]                                                                              ‚\0‘

 


Anhang: example1.cpp

 

 

Beispiel 2: anzahlWorte II

Posted by
#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    cout << zeile[worte[i]];
    cout << endl;
    }
}

Beispiel 2: Erläuterungen I

#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }
//Dabei gilt aber nach wie vor, daß 
//zeile[worte[0]] == zeile[0]
//zeile[worte[1]] == zeile[5]
//zeile[worte[2]] == zeile[9]
//zeile[worte[3]] == zeile[13]
//zeile[worte[4]] == zeile[18]
//zeile[worte[5]] == zeile[22]
//zeile[worte[6]] == zeile[25]
//zeile[worte[7]] == zeile[30]
for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
//Wenn wir uns auf eines dieser Zeichen beziehen,
//erhalten wir also genau ein Zeichen - nicht die
//mit diesem Zeichen beginnende Zeichenkette.
    cout << zeile[worte[i]];
    cout << endl;
    }
}

Anhang: example2.cpp

 

 

Beispiel 3: anzahlWorte III

Posted by
#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    cout << &zeile[worte[i]];
    cout << endl;
    }
}

Beispiel 3: Erläuterungen I

#include <iostream>

using namespace std;

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
//Dies erreichen wir durch den Adressoperator, "&".
//Er besagt im folgenden in etwa: weise cout zu
// was als Zeichenkette an der Stelle worte[i] in Zeile beginnt.
//ganz so als ob das eine eigene, von zeile voellig unabhengige Variable waere.
    cout << &zeile[worte[i]];
    cout << endl;
    }
}

Anhang: example3.cpp

Beispiel 4: liesRoemisch

Posted by
#include <iostream>

using namespace std;


int liesRoemisch();

int main()
{
int zahl1, zahl2, resultat, aktiv;
char aktion;

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

   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 liesRoemisch(void)
{
char roemisch[10];
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

cin >> roemisch;
if (roemisch[0]=='0') return 0;

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

               "In Ihrer Eingabe " << roemisch << " ist " << roemisch[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 4: Erläuterungen I

#include <iostream>

using namespace std;


int liesRoemisch();

int main()
{
int zahl1, zahl2, resultat, aktiv;
char aktion;

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

   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 liesRoemisch(void)
{
char roemisch[10];
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

cin >> roemisch;
if (roemisch[0]=='0') return 0;

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

               "In Ihrer Eingabe " << roemisch << " ist " << roemisch[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;
}

Wir rekapitulieren vom Schluß der zweiten Stunde:

  1. Ein Programm, das in C++ geschrieben ist, hat stets eine Funktion
    namens main, die aktiviert wird, wenn ein Benutzer das
    Programm auf dem Rechner aktiviert.
  2. Diese „Hauptfunktion“ hat aber ihrerseits das Recht, beliebig viele weitere
    Funktionen aufzurufen, die jeweils ganz bestimmte Aufgaben erfüllen.
  3. Man teilt ein Programm immer dann in mehrere Funktionen, wenn:
  • Eindeutig definierte Aufgaben immer wieder erfüllt werden müssen
    (wandle eine römische in eine arabische Zahl um).
  • Ein Programm unübersichtlich wird, weil Schleifen zu tief geschachtelt werden
    müssen oder Programmteile zu lang sind.

Ein Programm, das nicht am Bildschirm gelesen werden kann, sondern
gedruckt werden muß um verstanden zu werden, ist
nicht wirklich
professionell.


Beispiel 4: Erläuterungen II

#include <iostream>

using namespace std;


int liesRoemisch(void);

int main()
{
int zahl1, zahl2, resultat, aktiv;
char aktion;

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

   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 liesRoemisch(void)
{
char roemisch[10];
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

cin >> roemisch;
if (roemisch[0]=='0') return 0;

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

               "In Ihrer Eingabe " << roemisch << " ist " << roemisch[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;
}

Inhaltlich ersetzt der Wert, den eine Funktion mit Hilfe der Returnanweisung an das aufrufende Programm zurückgibt, den Namen der Funktion an der Stelle, an dem sie durch Nennung ihres Namens, gefolgt von einem Klammerpaar, aufgerufen wird.


Beispiel 4: Erläuterungen III

#include <iostream>

using namespace std;


int liesRoemisch(void);

int main()
{
int zahl1, zahl2, resultat, aktiv;
char aktion;

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

   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 liesRoemisch(void)
{
char roemisch[10];
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
int arabisch[10], stellen=0, resultat;

cin >> roemisch;
if (roemisch[0]=='0') return 0;

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

Für die Verwendung von Funktionen gelten folgende formalen Regeln:

  1. Eine Funktion muß vor Ihrer Verwendung definiert
    werden. Dazu wird, genau wie bei einer Variablendefinition, zunächst der
    Datentyp des Werts angegeben, den die Funktion zurückgibt. Auf den
    Funktionsnamen folgt ein Klammerpaar, zwischen dem beschrieben wird, welche
    „Argumente“ die Funktion akzeptiert (was uns gleich näher beschäftigen
    wird). Steht dort das Schlüsselwort „void“, heißt dies, daß die Funktion
    keine Argumente akzeptiert. Wie jede Definition wird auch die einer
    Variablen durch ein Semicolon abgeschlossen.
  2. Bei ihrer Verwendung wird der Name der Funktion
    genauso geschrieben, wie bei Ihrer Definition – und zwischen den Klammern
    müssen Parameter stehen, die mit der Definition übereinstimmen. Stand dort
    „void“, muß das Klammerpaar leer bleiben.
  3. Bei ihrer Deklaration werden zunächst die
    Angaben aus der Definition wiederholt; an Stelle des schliessenden Semicolon
    steht hier jetzt jedoch ein Paar geschweifter Klammern, zwischen denen der
    Rumpf der Funktion steht.

Anhang: example4.cpp

 

 

 

Beispiel 5: romZuArabien

Posted by
#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

Beispiel 6: romZuArabien II

Posted by
#include <iostream>

using namespace std;


int romZuArabien(char *rom);

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    if (zeile[worte[i]]=='m') cout << romZuArabien(&zeile[worte[i]]);
    else cout << &zeile[worte[i]];
    cout << endl;
    }
}

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 6: Erläuterungen I

#include <iostream>

using namespace std;


int romZuArabien(char *rom);

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
//Durch diese Trennung von Eingabe und Verarbeitung
//können wir die einmal definierte Funktion " romZuArabien" jetzt auch
//in völlig anderem Kontext verwenden --- z.B. für unser kleines
//"Übersetzungsproblem"!
    if (zeile[worte[i]]=='m') cout << romZuArabien(&zeile[worte[i]]);
    else cout << &zeile[worte[i]];
    cout << endl;
    }
}

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

Anhang: example6.cpp

Beispiel 7: romZuArabien III

Posted by
#include <iostream>

using namespace std;


int romZuArabien(char *rom);

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;
int arabisch;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    arabisch=romZuArabien(&zeile[worte[i]]);
    if (arabisch>0) cout << arabisch;
    else cout << &zeile[worte[i]];
    cout << endl;
    }
}

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

Beispiel 7: Erläuterungen I


#include <iostream>

using namespace std;


int romZuArabien(char *rom);

int main()
{
char zeile[100] =
   "Dies ist ein Text aus mi Nacht.";
int worte[20];
int anzahlWorte;
int arabisch;

worte[0]=0;
anzahlWorte=1;
for (int i=0; zeile[i] != '\0'; i = i + 1)
    if (zeile[i]==' ')
       {
       zeile[i]='\0';
       worte[anzahlWorte]=i+1;
       anzahlWorte=anzahlWorte+1;
       }

for (int i=0; i<anzahlWorte; i++)
    {
    cout << "Ein Wort: ";
    arabisch=romZuArabien(&zeile[worte[i]]);
    if (arabisch>0) cout << arabisch;
    else cout << &zeile[worte[i]];
    cout << endl;
    }
}

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;
//Schliesslich entfernen wir noch die Fehlerbehandlung aus
//romZuArabien und überlassen es der aufrufenden Funktion zu entscheiden,
//was zu geschehen hat, wenn die Funktion mit einem unsinnigen Wert
//aufgerufen wird - indem wir ihr durch einen sonst nicht möglichen
//Wert signalisieren, daß etwas schief gelaufen ist.
    }

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: example7.cpp

Beispiel 8: addiereArabisch

Posted by
#include <iostream>

using namespace std;


int addiereArabisch(int a, int b);

int main()
{
int zahl1, zahl2,ergebnis;

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

ergebnis=addiereArabisch(zahl1,zahl2);

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

int addiereArabisch(int a, int b)
{
int resultat;

resultat=a+b;

return resultat;
}

Beispiel 8: Erläuterungen I


#include <iostream>

using namespace std;


int addiereArabisch(int a, int b);
Funktionen können beliebig viele Parameter haben, die unterschiedliche
Typen haben können. In der Definition der Funktion, ihrem Prototyp
muß der Datentyp jedes Parameters genannt werden. Es ist gute Praxis,
aber nicht notwendig, den Parameters im Prototyp Namen zu geben.

int main()
{
int zahl1, zahl2,ergebnis;

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

ergebnis=addiereArabisch(zahl1,zahl2);
Beim Aufruf der Funktion entspricht jedem Parameter genau
ein Argument mit dem die Funktion aufgerufen wird. Dieses Argument
muß eine Variable oder Konstante exakt des im Prototyp angegebenen Datentyps
sein.

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

int addiereArabisch(int a, int b)
{
In der Deklaration der Funktion muß für jeden Parameter
der Datentyp abermnals genannt werden; er muß mit dem im Prototyp der Funktion
übereinstimmen. 
Es müssen jedoch weder die Namen der Argumente in Prototyp und Funktion, noch
die der Argumente und der Parameter übereinstimmen.
In diesem Beispiel gilt also:
'a' innerhalb von 'addiereArabisch' == 'zahl1' innerhalb von 'main'
'b' innerhalb von 'addiereArabisch' == 'zahl2' innerhalb von 'main'

int resultat;

resultat=a+b;

return resultat;
}

Anhang: example8.cpp

Beispiel 9: addiereArabisch II

Posted by
#include <iostream>

using namespace std;


int addiereArabisch(int a, int b);

int main()
{
int zahl1, zahl2,ergebnis;

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

ergebnis=addiereArabisch(zahl1,zahl2);

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

int addiereArabisch(int a, int b)
{
int resultat;

resultat=a+b;

a=0;
b=0;

return resultat;
}

Beispiel 9: Erläuterungen I

#include <iostream>

using namespace std;


int addiereArabisch(int a, int b);

int main()
{
int zahl1, zahl2,ergebnis;

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

ergebnis=addiereArabisch(zahl1,zahl2);

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

int addiereArabisch(int a, int b)
{

"ist identisch", heißt aber NICHT, daß die beiden Variablen
an der selben Stelle des Speichers verwaltet werden, nur, daß Sie anfangs
den selben Wert haben. Wir können uns vorstellen, daß an dieser Stelle vom
Compiler folgendes Programmstück eingefügt wird:
int a = <Wert-von-Parameter-1-aus-dem-aufrufenden-Programm>;
int b = <Wert-von-Parameter-2-aus-dem-aufrufenden-Programm>;
int resultat;

resultat=a+b;

a=0;
Dies verändert daher nur eine Variable in addiereArabisch(),
nicht in main()!!!
b=0;
Dies verändert daher nur eine Variable in addiereArabisch(),
nicht in main()!!!

return resultat;
}

Anhang: example9.cpp