Informatik 1

Post on 15-Jan-2016

23 views 0 download

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

transcript

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