650 likes | 807 Views
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
E N D
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 • Musterlösungen anschauen
Ich gebe nicht auf • Code schön formatieren if (x > 0) { a = 1; b = 1; // Kommentar. if (y > 0) { c = 1; } else { d = 1; } e = 1; }
Variablentyp • Richtige Typen verwenden
Ganzzahldivision • Auf Ganzzahl-Division achten
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 intx = 1; inty = 0; intz = 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 • ...
Vorlesung 5 wiederholung
Einzelne Werte Variablen
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
Variablen • Variablen in Speicherzellen gespeichert • Jede Speicherzelle hat Adresse und Inhalt int x;
Variablen • Variablen in Speicherzellen gespeichert • Jede Speicherzelle hat Adresse und Inhalt int x; x = 10;
Variablen • Variablen in Speicherzellen gespeichert • Jede Speicherzelle hat Adresse und Inhalt int x; x = 10; int y;
Variablen • Variablen in Speicherzellen gespeichert • Jede Speicherzelle hat Adresse und Inhalt int x; x = 10; int y; y = x;
Aufeinanderfolgende Werte Arrays
Arrays • Mehrere aufeinanderfolgende Zellen int x = 10; int y = 10; int z[2];
Arrays • Mehrere aufeinanderfolgende Zellen int x = 10; int y = 10; int z[2]; z[0] = 20; z[1] = 30;
Verweise auf Werte Pointer (Zeiger)
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 // Variablen, welche auf eine andere Speicherzelle zeigt, // welche wiederum den gegebenen Typ speichert. typ* name; int x; // x speichert eine ganze Zahl int* p; // p speichert die Adresse einer ganzen Zahl p = &x; // die Adresse von x wird in p gespeichert
Pointer • Pointer verweisen auf andere Speicherzellen int x = 10; int y = 10; int* p;
Pointer • Pointer verweisen auf andere Speicherzellen int x = 10; int y = 10; int* p; p = &y;
Pointer • NULL bedeutet „zeigt auf nichts“ 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 int x = 10; int y = 10; int* p; p = &y;
Pointer • Pointer verweisen auf andere Speicherzellen 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 int x; int* px = &x; int** ppx = &px; int*** pppx = &ppx; ***pppx = 1;
Pointer-Arithmetik • Addition auf Adressen • Zeiger + konstante Zahl int x[2] = {10,10}; int* p = &x; int* q = p+1;
Gemeinsamkeiten Arrays und Zeiger
Arrays • Name des Arrays =Zeiger auf die erste Zelle int x[2]; int* p = x; // p zeigt auf das erste Element in x int* 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 zugewiesen int x1 = *(x+1); // x1 wird das zweite Element von x zugewiesen
Leseweise • Beim Variablennamen starten • Nach aussen arbeiten • nach rechts, dann nach links const int * constx[2]; x ist ...
Leseweise • Beim Variablennamen starten • Nach aussen arbeiten • nach rechts, dann nach links const int * constx[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
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 Speicherzelle p = newint;
Speicher freigeben • Operator delete • Löscht eine zuvor erstellte Speicherzelle • Achtung: Zeiger werden ungültig // Erstellt Speicherplatz für einen neuen integer int*p = new int; // Löscht die Speicherzelle, auf welche p zeigt delete 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 integer int*p = new int; // Löscht die Speicherzelle, auf welche p zeigt delete p; // p zurücksetzen p = NULL;
Arrays • Arrays anlegen und freigeben int N; // Erstellt Speicherplatz für N neue integer int*p = new int[N]; // Zugriff mit und ohne Array-Syntax p[1] = 10; *(p+1) = 10; // Löscht alle Speicherzellen delete[] p;
Quiz • Was gibt das Programm aus? int x = 10; int y = 20; cout << x;