65
Informatik 1 Übung 5

Informatik 1

  • 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

Page 1: Informatik 1

Informatik 1

Übung 5

Page 2: Informatik 1

NACHBESPRECHUNGÜbung 5

Page 3: Informatik 1

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

Page 4: Informatik 1

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

Page 5: Informatik 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, ...

Page 6: Informatik 1

Ganzzahldivision

• Auf Ganzzahl-Division achtenAusdruck Wert

1/10 0

1.0/10 0.1

1/10.0 0.1

Page 7: Informatik 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)

Page 8: Informatik 1

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

Page 9: Informatik 1

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)

Page 10: Informatik 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– ...

Page 11: Informatik 1

WIEDERHOLUNGVorlesung 5

Page 12: Informatik 1

VARIABLENEinzelne Werte

Page 13: Informatik 1

Variablen

• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt• Vereinfachtes Bespiel– Nur integer– Nur 7 Speicherzellen

Page 14: Informatik 1

Variablen

• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt

Name Addresse Inhalt

0000

0001

0002

0003

0004

0005

0006

Page 15: Informatik 1

Variablen

• Variablen in Speicherzellen gespeichert• Jede Speicherzelle hat Adresse und Inhalt

Name Addresse Inhalt

x 0000 ???

0001

0002

0003

0004

0005

0006

int x;

Page 16: Informatik 1

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;

Page 17: Informatik 1

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;

Page 18: Informatik 1

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;

Page 19: Informatik 1

ARRAYSAufeinanderfolgende Werte

Page 20: Informatik 1

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

Page 21: Informatik 1

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;

Page 22: Informatik 1

POINTER (ZEIGER)Verweise auf Werte

Page 23: Informatik 1

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;

Page 24: Informatik 1

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;

Page 25: Informatik 1

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;

Page 26: Informatik 1

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;

Page 27: Informatik 1

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;

Page 28: Informatik 1

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

Page 29: Informatik 1

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;

Page 30: Informatik 1

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;

Page 31: Informatik 1

Pointer

• &x– Adresse der Variablen x

• *x– Wert der Zelle, auf welche x zeigt– „dem Pfeil folgen“

Page 32: Informatik 1

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;

Page 33: Informatik 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;

Page 34: Informatik 1

ARRAYS UND ZEIGERGemeinsamkeiten

Page 35: Informatik 1

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

Page 36: Informatik 1

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

Page 37: Informatik 1

LESEN VON ZEIGERN

Page 38: Informatik 1

Leseweise

• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links

const int * const x[2];

x ist ...

Page 39: Informatik 1

Leseweise

• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links

const int * const x[2];

x ist ein Array von zwei ...

Page 40: Informatik 1

Leseweise

• Beim Variablennamen starten• Nach aussen arbeiten– nach rechts, dann nach links

const int * const x[2];

x ist ein Array von zwei konstanten ...

Page 41: Informatik 1

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 ...

Page 42: Informatik 1

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...

Page 43: Informatik 1

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

Page 44: Informatik 1

DYNAMISCHER SPEICHER

Page 45: Informatik 1

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;

Page 46: Informatik 1

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

Page 47: Informatik 1

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;

Page 48: Informatik 1

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;

Page 49: Informatik 1

QUIZ

Page 50: Informatik 1

Quiz

• Was gibt das Programm aus?

int x = 10;int y = 20;

cout << x;

Page 51: Informatik 1

Quiz

• Was gibt das Programm aus?

int x = 10;int y = 20;int* p = &y;

cout << p;

Page 52: Informatik 1

Quiz

• Was gibt das Programm aus?

int x = 10;int y = 20;int* p = &y;

cout << *p;

Page 53: Informatik 1

Quiz

• Was gibt das Programm aus?

int x = 10;int y = 20;int* p;

cout << p;

Page 54: Informatik 1

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;

Page 55: Informatik 1

Quiz

• Was gibt das Programm aus?

int x[2] = {10, 20};

cout << (x+1);

Page 56: Informatik 1

Quiz

• Was gibt das Programm aus?

int x[2] = {10, 20};

cout << *x + 1;

Page 57: Informatik 1

Quiz

• Was gibt das Programm aus?

int x[2] = {10, 20};

cout << *(x + 1);

Page 58: Informatik 1

STRUCTSVariablenverbunde

Page 59: Informatik 1

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;

Page 60: Informatik 1

Structs

• Zugriff auf Elemente• „member“ auf Englisch

vector2D v;

v.x = 10;v.y = 10;

Page 61: Informatik 1

Structs

• Zuweisung kopiert alle Elemente– Anderst als bei Arrays

vector2D v;vector2D w;

v = w;

Page 62: Informatik 1

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;

Page 63: Informatik 1

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;

Page 64: Informatik 1

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

Page 65: Informatik 1

ÜBUNGSerie 6