Upload
gale
View
23
Download
0
Embed Size (px)
DESCRIPTION
Informatik 1. Übung 5. Übung 5. Nachbesprechung. 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 - PowerPoint PPT Presentation
Citation preview
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