Programmierpraktikum C++
Wintersemester 2013 / 2014
18. November 2013 – Strukturierung von Anwendungen

Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung
Jan G. Wieners // jan.wieners@uni-koeln.de
Kurzüberblick


Strukturierung von Anwendungen I
 Funktionen
 Call by Value
 Call by Reference

 Auslagerung von Funktionalität in Headerdateien



Zeiger, Adressoperator
Strukturierung von Anwendungen II
 Strukturen
 Objektorientierung: Klassen

Wiederholung 02.11.2010
[…]

int addiereArabisch(int a, int b);
int main() {
[…]
ergebnis = addiereArabisch(zahl1, zahl2);
[…]

}

int addiereArabisch(int a, int b) {
return a + b;

}
[…]

Deklaration: „In meiner
Anwendung existiert eine
Funktion, die ich zu einem
späteren Zeitpunkt definiere“

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

Deklaration 
Funktionskopf, der mit einem
Semikolon abgeschlossen
wird.

[…]
ergebnis = addiereArabisch(zahl1, zahl2);
[…]

}

int addiereArabisch(int a, int b) {
return a + b;

}

Definition: „Auf
diese bestimmte Art
und Weise verfährt
meine Funktion“
Generieren beide Anwendungen dasselbe Ergebnis?
#include <iostream>
using namespace std;

#include <iostream>
using namespace std;

int addition(int operandA, int
operandB) {
return operandA+operandB;
}

int addition(int,int);

int main() {
int zahl1=1;
cout<<addition(zahl1,4)<<endl;
}

==?

int main() {
int zahl1=1;

cout<<addition(zahl1,4)<<endl;
}
int addition(int zahl1, int zahl2) {
return zahl1+zahl2;
}
Funktionen: Call by value
Call by value  Der Compiler fertigt eine Kopie des
Variableninhalts an:
#include <iostream>
using namespace std;
int function(int wert) {
wert += 5;
return wert;
}
int main() {
int zahl = 10;
cout << zahl;
func(zahl);
cout << endl << zahl;
return 0;

}

 Ausgabe?
Funktionen: Call by reference
Call by reference  Compiler fertigt keine Kopie des Variableninhalts
an; wir arbeiten unmittelbar mit der Variablen:
#include <iostream>
using namespace std;
void func(int *wert) {
*wert += 5;

}
int main() {
int zahl = 23;
cout << zahl;
func(&zahl);
cout << zahl;
return 0;

 Ausgabe?

}

&  Adressoperator
*  Zeigeroperator (auch: Inhalts-/Dereferenzierungsoperator)
Zeiger
Bis dato: Variablen





int ganzzahligerWert = 13;
char einzelnesZeichen = ‘A‘;
int[50] eindimensionalesArray;
int[5][5] zweidimensionalesArray;

Beispiel:
 unsigned int i;
 i=1;

Interne Repräsentation der Variable i:
Beispiel:
int wert = 23;
int *zeigerAufWert = NULL;
zeigerAufWert = &wert;
cout << "Vorher: " << endl << wert << endl << zeigerAufWert;
*zeigerAufWert = 42;
cout << "nNachher: " << endl << wert << endl << zeigerAufWert;
 Zeiger dürfen nur auf Variablen verweisen, die denselben
Datentyp haben!
...Funktonalität auslagern...?
Zusammenfassen von Variablen
char roemischeZiffern[8] = "ivxlcdm";
int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000};
Verbindung der Werte aufgrund der Arrayposition

0

1

2

3

4

5

6

I

V

X

L

C

D

M

1

5

10

50

100

500

1000
Zusammenfassen von Variablen
Struct roemisch
{
char roemischeZiffer;
int arabischerWert;
};
struct roemisch werte[7];

0

1

2

3

I, 1

V, 5

X, 10

L, 50

4

5

C, 100 D, 500

6
M, 1000
Übungsaufgabe: Filmdatenbank
Die ultimative Konkurrenz zur Internet Movie Database (IMDb): Erstellen
Sie Ihre eigene Filmdatenbank. Ihre Datenbank soll maximal 100 Einträge
speichern und folgende Elemente aufnehmen können:
 Deutscher Name des Films
 Originaltitel
 Veröffentlichungsjahr
 Regie
Aufgabe 1.1: Überlegen Sie, wie Sie die Datenbank
umsetzen können – welche Datenstruktur bietet
sich für die zu repräsentierenden Informationen an?
Aufgabe 1.2: Implementieren Sie folgenden
Programmablauf (vgl. den oben angeführten
Screenshot):

wird das Zeichen "j" eingegeben, so wird ein
neuer Datensatz angelegt.

wird das Zeichen "n" eingegeben, so wird die
Applikation mit einer Abschiedsmeldung
beendet.

wird das Zeichen "p" eingegeben, so werden
alle bislang in der Datenbank gespeicherten
Einträge angezeigt.
Aufgabe 1.3: Lagern Sie relevante Teile Ihrer
Filmdatenbank in eine eigene Headerdatei bzw.
Bibliothek aus.
/

WiSe 2013 | Programmierpraktikum C++ - 05_Strukturierung von Anwendungen

  • 1.
    Programmierpraktikum C++ Wintersemester 2013/ 2014 18. November 2013 – Strukturierung von Anwendungen Universität zu Köln. Historisch-Kulturwissenschaftliche Informationsverarbeitung Jan G. Wieners // jan.wieners@uni-koeln.de
  • 2.
    Kurzüberblick  Strukturierung von AnwendungenI  Funktionen  Call by Value  Call by Reference  Auslagerung von Funktionalität in Headerdateien   Zeiger, Adressoperator Strukturierung von Anwendungen II  Strukturen  Objektorientierung: Klassen Wiederholung 02.11.2010
  • 3.
    […] int addiereArabisch(int a,int b); int main() { […] ergebnis = addiereArabisch(zahl1, zahl2); […] } int addiereArabisch(int a, int b) { return a + b; }
  • 4.
    […] Deklaration: „In meiner Anwendungexistiert eine Funktion, die ich zu einem späteren Zeitpunkt definiere“ int addiereArabisch(int a, int b); int main() { Deklaration  Funktionskopf, der mit einem Semikolon abgeschlossen wird. […] ergebnis = addiereArabisch(zahl1, zahl2); […] } int addiereArabisch(int a, int b) { return a + b; } Definition: „Auf diese bestimmte Art und Weise verfährt meine Funktion“
  • 5.
    Generieren beide Anwendungendasselbe Ergebnis? #include <iostream> using namespace std; #include <iostream> using namespace std; int addition(int operandA, int operandB) { return operandA+operandB; } int addition(int,int); int main() { int zahl1=1; cout<<addition(zahl1,4)<<endl; } ==? int main() { int zahl1=1; cout<<addition(zahl1,4)<<endl; } int addition(int zahl1, int zahl2) { return zahl1+zahl2; }
  • 6.
    Funktionen: Call byvalue Call by value  Der Compiler fertigt eine Kopie des Variableninhalts an: #include <iostream> using namespace std; int function(int wert) { wert += 5; return wert; } int main() { int zahl = 10; cout << zahl; func(zahl); cout << endl << zahl; return 0; }  Ausgabe?
  • 7.
    Funktionen: Call byreference Call by reference  Compiler fertigt keine Kopie des Variableninhalts an; wir arbeiten unmittelbar mit der Variablen: #include <iostream> using namespace std; void func(int *wert) { *wert += 5; } int main() { int zahl = 23; cout << zahl; func(&zahl); cout << zahl; return 0;  Ausgabe? } &  Adressoperator *  Zeigeroperator (auch: Inhalts-/Dereferenzierungsoperator)
  • 8.
    Zeiger Bis dato: Variablen     intganzzahligerWert = 13; char einzelnesZeichen = ‘A‘; int[50] eindimensionalesArray; int[5][5] zweidimensionalesArray; Beispiel:  unsigned int i;  i=1; Interne Repräsentation der Variable i:
  • 9.
    Beispiel: int wert =23; int *zeigerAufWert = NULL; zeigerAufWert = &wert; cout << "Vorher: " << endl << wert << endl << zeigerAufWert; *zeigerAufWert = 42; cout << "nNachher: " << endl << wert << endl << zeigerAufWert;  Zeiger dürfen nur auf Variablen verweisen, die denselben Datentyp haben!
  • 10.
  • 11.
    Zusammenfassen von Variablen charroemischeZiffern[8] = "ivxlcdm"; int ziffernWert[7] = {1, 5, 10, 50, 100, 500, 1000}; Verbindung der Werte aufgrund der Arrayposition 0 1 2 3 4 5 6 I V X L C D M 1 5 10 50 100 500 1000
  • 13.
    Zusammenfassen von Variablen Structroemisch { char roemischeZiffer; int arabischerWert; }; struct roemisch werte[7]; 0 1 2 3 I, 1 V, 5 X, 10 L, 50 4 5 C, 100 D, 500 6 M, 1000
  • 15.
    Übungsaufgabe: Filmdatenbank Die ultimativeKonkurrenz zur Internet Movie Database (IMDb): Erstellen Sie Ihre eigene Filmdatenbank. Ihre Datenbank soll maximal 100 Einträge speichern und folgende Elemente aufnehmen können:  Deutscher Name des Films  Originaltitel  Veröffentlichungsjahr  Regie Aufgabe 1.1: Überlegen Sie, wie Sie die Datenbank umsetzen können – welche Datenstruktur bietet sich für die zu repräsentierenden Informationen an? Aufgabe 1.2: Implementieren Sie folgenden Programmablauf (vgl. den oben angeführten Screenshot):  wird das Zeichen "j" eingegeben, so wird ein neuer Datensatz angelegt.  wird das Zeichen "n" eingegeben, so wird die Applikation mit einer Abschiedsmeldung beendet.  wird das Zeichen "p" eingegeben, so werden alle bislang in der Datenbank gespeicherten Einträge angezeigt. Aufgabe 1.3: Lagern Sie relevante Teile Ihrer Filmdatenbank in eine eigene Headerdatei bzw. Bibliothek aus.
  • 17.