Informatik 1
Übung 5
NACHBESPRECHUNGÜbung 5
Korrekturen
• Ich prüfe keine Syntax– schreibt wenn was nicht kompiliert
• Lösungen müssen nicht perfekt sein– Testat gibt es für ernst gemeinte Lösungsversuche
• Formatiert euren Code schön– sonst geb ich mir auch keine Mühe
• Musterlösungen anschauen
Ich gebe nicht auf
• Code schön formatierenif (x > 0) { a = 1; b = 1;
// Kommentar. if (y > 0) { c = 1; } else { d = 1; }
e = 1;}
Variablentyp
• Richtige Typen verwendenTyp Verwendung Werte
bool Wahrheitswert true, false
char/wchar_t Ein Zeichen 'a', 'b', ...
int Eine ganze Zahl 0, 1, ...
float/double Eine reelle Zahl 0.0, 0.1, ...
Ganzzahldivision
• Auf Ganzzahl-Division achtenAusdruck Wert
1/10 0
1.0/10 0.1
1/10.0 0.1
Charakter
• Buchstaben entsprechen Zahlen• Wenn möglich Buchstaben verwenden
bool isCapital = 'A' < c && c < 'Z'; bool isCapital = 65 < c && c < 90;
char c = 'A'; char c = 65;
if(antwort == 'y') if(antwort == 121)
Identische Blöcke
• Copy-Paste vermeiden
if(i<10) { switch(i) { case 0: cout << "Null"; break; case 1: cout << "Eins"; break; }} else { switch(i%10) { case 0: cout << "Null"; break; case 1: cout << "Eins"; break; }}
string s;switch(i%10) { case 0: s = "Null"; break; case 1: s = "Eins"; break;}
if(i<10) { cout << s;} else { cout << s;}
Division durch 0
• Arithmetische Operationen prüfen– Division durch 0– Logarithmus einer negativen Zahl– ...
• In if-Bedingung: als erstes prüfen– Vorzeitiger Abbruch der Auswertung
int x = 1;int y = 0;int z = x / y;
if(y!=0 && x/y > 1)
Arithmetische Operationen
• CPU kann nur multiplizieren und addieren• xy, sin(x), √x, ... müssen berechnet werden– Iterative multiplikation (siehe Übung 4)– Tabellierte Werte– Gleichungssystem lösen– Taylorreihe– ...
WIEDERHOLUNGVorlesung 5
VARIABLENEinzelne Werte
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt• Vereinfachtes Bespiel– Nur integer– Nur 7 Speicherzellen
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt
Name Addresse Inhalt
0000
0001
0002
0003
0004
0005
0006
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt
Name Addresse Inhalt
x 0000 ???
0001
0002
0003
0004
0005
0006
int x;
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt
Name Addresse Inhalt
x 0000 10
0001
0002
0003
0004
0005
0006
int x;x = 10;
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt
Name Addresse Inhalt
x 0000 10
y 0001 ???
0002
0003
0004
0005
0006
int x;x = 10;int y;
Variablen
• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt
Name Addresse Inhalt
x 0000 10
y 0001 10
0002
0003
0004
0005
0006
int x;x = 10;int y;y = x;
ARRAYSAufeinanderfolgende Werte
Arrays
• Mehrere aufeinanderfolgende Zellen
Name Addresse Inhalt
x 0000 10
y 0001 10
z[0] 0002 ???
z[1] 0003 ???
0004
0005
0006
int x = 10;int y = 10;int z[2];
Arrays
• Mehrere aufeinanderfolgende Zellen
Name Addresse Inhalt
x 0000 10
y 0001 10
z[0] 0002 20
z[1] 0003 30
0004
0005
0006
int x = 10;int y = 10;int z[2];z[0] = 20;z[1] = 30;
POINTER (ZEIGER)Verweise auf Werte
Pointer
• Pointer verweisen auf andere Speicherzellen• Wert vom Pointer– Adresse einer anderen Speicherzelle
// Variablen, welche auf eine andere Speicherzelle zeigt,// welche wiederum den gegebenen Typ speichert.typ* name;
Pointer
• Pointer verweisen auf andere Speicherzellen• Wert vom Pointer– Adresse einer anderen Speicherzelle
int x; // x speichert eine ganze Zahlint* p; // p speichert die Adresse einer ganzen Zahlp = &x; // die Adresse von x wird in p gespeichert
// Variablen, welche auf eine andere Speicherzelle zeigt,// welche wiederum den gegebenen Typ speichert.typ* name;
Pointer
• Pointer verweisen auf andere Speicherzellen
Name Addresse Inhalt
x 0000 10
y 0001 10
p 0002 ???
0003
0004
0005
0006
int x = 10;int y = 10;int* p;
Pointer
• Pointer verweisen auf andere Speicherzellen
Name Addresse Inhalt
x 0000 10
y 0001 10
p 0002 [0001]
0003
0004
0005
0006
int x = 10;int y = 10;int* p;p = &y;
Pointer
• NULL bedeutet „zeigt auf nichts“
Name Addresse Inhalt
x 0000 10
y 0001 10
p 0002 [NULL]
0003
0004
0005
0006
int x = 10;int y = 10;int* p;p = NULL;
Pointer
• Pointer verweisen auf andere Speicherzellen• Dereferenzieren– Zugriff auf die adressierte Speicherzelle
int x;int* p = &x;*p = 10; // p zeigt auf x, also wird in x die 10 gespeichert
Pointer
• Pointer verweisen auf andere Speicherzellen
Name Addresse Inhalt
x 0000 10
y 0001 10
p 0002 [0001]
0003
0004
0005
0006
int x = 10;int y = 10;int* p;p = &y;
Pointer
• Pointer verweisen auf andere Speicherzellen
Name Addresse Inhalt
x 0000 10
y 0001 20
p 0002 [0001]
0003
0004
0005
0006
int x = 10;int y = 10;int* p;p = &y;*p = 20;
Pointer
• &x– Adresse der Variablen x
• *x– Wert der Zelle, auf welche x zeigt– „dem Pfeil folgen“
Pointer
• Beliebig viele Indirektionen
Name Addresse Inhalt
x 0000 10
px 0001 [0000]
ppx 0002 [0001]
pppx 0003 [0002]
0004
0005
0006
int x;int* px = &x;int** ppx = &px;int*** pppx = &ppx;
***pppx = 1;
Pointer-Arithmetik
• Addition auf Adressen• Zeiger + konstante Zahl
Name Addresse Inhalt
x[0] 0000 10
x[1] 0001 10
p 0002 [0000]
q 0003 [0001]
0004
0005
0006
int x[2] = {10,10};int* p = &x;int* q = p+1;
ARRAYS UND ZEIGERGemeinsamkeiten
Arrays
• Name des Arrays = Zeiger auf die erste Zelle
int x[2];
int* p = x; // p zeigt auf das erste Element in xint* p = &(x[0]); // p zeigt auf das erste Element in x
Arrays
• Array-Index = Pointer-Arithmetik
int x[2];
int x1 = x[1]; // x1 wird das zweite Element von x zugewiesenint x1 = *(x+1); // x1 wird das zweite Element von x zugewiesen
LESEN VON ZEIGERN
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ...
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ein Array von zwei ...
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ein Array von zwei konstanten ...
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ein Array von zwei konstanten Zeigern ...
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ein Array von zwei konstanten Zeigern auf ein integer...
Leseweise
• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links
const int * const x[2];
x ist ein Array von zwei konstanten Zeigern auf ein integer, der konstant ist
DYNAMISCHER SPEICHER
Speicher reservieren
• Operator new• Erstellt eine neue Speicherzelle– Typ muss angegeben werden– Gibt Zeiger auf die neue Zelle zurück
int* p;
// Erstellt Speicherplatz für einen neuen integer// p zeigt auf die neu angelegte Speicherzellep = new int;
Speicher freigeben
• Operator delete• Löscht eine zuvor erstellte Speicherzelle– Achtung: Zeiger werden ungültig
// Erstellt Speicherplatz für einen neuen integerint* p = new int;
// Löscht die Speicherzelle, auf welche p zeigtdelete p;
// p zeigt hier immer noch auf die Speicherzelle, die nicht mehr gibt
Speicher freigeben
• Operator delete• Löscht eine zuvor erstellte Speicherzelle– Achtung: Zeiger werden ungültig
// Erstellt Speicherplatz für einen neuen integerint* p = new int;
// Löscht die Speicherzelle, auf welche p zeigtdelete p;
// p zurücksetzenp = NULL;
Arrays
• Arrays anlegen und freigeben
int N;
// Erstellt Speicherplatz für N neue integerint* p = new int[N];
// Zugriff mit und ohne Array-Syntaxp[1] = 10;*(p+1) = 10;
// Löscht alle Speicherzellendelete[] p;
QUIZ
Quiz
• Was gibt das Programm aus?
int x = 10;int y = 20;
cout << x;
Quiz
• Was gibt das Programm aus?
int x = 10;int y = 20;int* p = &y;
cout << p;
Quiz
• Was gibt das Programm aus?
int x = 10;int y = 20;int* p = &y;
cout << *p;
Quiz
• Was gibt das Programm aus?
int x = 10;int y = 20;int* p;
cout << p;
Quiz
• Was gibt das Programm aus?
int x = 10;int y = 20;int* p = &x;
*p = 11;p = &y;*p = 21;
cout << x;cout << y;
Quiz
• Was gibt das Programm aus?
int x[2] = {10, 20};
cout << (x+1);
Quiz
• Was gibt das Programm aus?
int x[2] = {10, 20};
cout << *x + 1;
Quiz
• Was gibt das Programm aus?
int x[2] = {10, 20};
cout << *(x + 1);
STRUCTSVariablenverbunde
Structs
• Ein struct fasst mehrere Variablen zusammen• Definiert einen neuen Typ
// Definiere einen neuen Typ mit zwei integer-Elementenstruct vector2D { int x; int y;};
vector2d v;
Structs
• Zugriff auf Elemente• „member“ auf Englisch
vector2D v;
v.x = 10;v.y = 10;
Structs
• Zuweisung kopiert alle Elemente– Anderst als bei Arrays
vector2D v;vector2D w;
v = w;
Structs
• Elemente vom Struct in benachbarten Zellen• Wie beim Array
Name Addresse Inhalt
v.x 0000 ???
v.y 0001 ???
0002
0003
0004
0005
0006
vector2D v;
Structs
• Elemente vom Struct in benachbarten Zellen• Wie beim Array
Name Addresse Inhalt
v.x 0000 10
v.y 0001 20
0002
0003
0004
0005
0006
vector2D v;v.x = 10;v.y = 20;
Structs und Zeiger
• Zeiger auf structs möglich• Verkürzte Syntax für Elementzugriff
vector2D v;vector2D* pv = &v;
(*pv).x = 10; // Setze Element „x“ vom referenzierten Vektor auf 10pv->x = 10; // Setze Element „x“ vom referenzierten Vektor auf 10
ÜBUNGSerie 6