Upload
yngvi-streifel
View
105
Download
0
Embed Size (px)
Citation preview
Willkommen!
Informatik I/II PVK
Informatik I/II PVK 2
Über mich
Name: Benjamin Knecht Vertiefungsrichtung: „Computer & Netzwerke“ Hilfsassistent für Technische Informatik I/II Projektleiter für Orxonox (www.orxonox.net) Verwendung von Programmiersprachen im
Studium 1. Semesterarbeit (Symbian C) 2. Semesterarbeit (Java) Masterarbeit (C++)
Informatik I/II PVK 3
Kursablauf
Montag: Grundlagen in C/C++ Dienstag: Objektorientierung in C++ und
mögliche Prüfungsaufgabe Mittwoch: Einführung in Java und
Unterschiede zu C++ Donnerstag: Konzepte der OO-
Programmierung (Bäume, Backtracking, Spieltheorie etc.)
Freitag: Prüfungsaufgaben für Informatik II, Fragen und Vertiefung Slides sind auf: www.benjaminknecht.ch/info-pvk
Informatik I/II PVK 4
Was wird besprochen?
Inhalt der Zusammenfassung Grundlagen zum Verständnis von C/C++
und Java Programmierkonzepte Prüfungsaufgaben Falls erwünscht Übungsaufgaben
Informatik I/II PVK 5
Fragen
Fragen bitte sofort stellen bei … Unklarheiten Fehler meinerseits
Anregungen zum Kursablauf mehr Theorie? mehr eigenständiges Arbeiten? Besprechung bestimmter Übungen
Informatik I/II PVK 6
Ablauf heute
Allgemeines zum Programmieren Variablen und Basistypen Operatoren Schleifen Arrays und Pointer
char-Array (string) Referenzen
Funktionen
Informatik I/II PVK 7
Programmieren allgemein
Implementierung von Algorithmen Berechnungen Such-Algorithmen
Verarbeitung von Daten Datenbanken
Simulieren von Abläufen Spiele etc...
Informatik I/II PVK 8
Erstellung eines Programms
Compiler
Quellcode
Assembler
Assemblerprogramm
Maschinencode
Linker
Ausführbares Programm
Lader/Binder
Programm im Speicherbereich
Instruktionen
...ProgramCounter
Variablen
...
Bibliotheken
Hauptspeicher
Informatik I/II PVK 9
Compiler – gcc und g++
Compiler für C++ (g++) Kompilieren
g++ -g –c file1.cpp –I ~/include/ Linken
g++ -Wall -o myprog myprog.o file1.o –L ~/lib/ -lmylib
Informatik I/II PVK 10
Fehler
Kompilierfehler (z.B.: Syntaxfehler) Linkerfehler (fehlende Bibliothek) Laufzeitfehler (runtime error)
Fehler der zur Zeit des Kompilierens nicht klar war
segmentation fault (Fehler bei Speicherzugriff)
Informatik I/II PVK 11
Variablen & Basistypen
Wir kennen folgende Basistypen char char c = 'A'; (ASCII-Satz) int int i = 100231564; double double d = 3.123456; float float f = 3.23f; bool bool isTrue = true;
Speicherplatz der Datentypen abhängig von Betriebssystem
sizeof Operator findet Grösse des Typs Rundungsungenauigkeit bei Fliesskommazahlen
Informatik I/II PVK 12
Definitionsbereiche
Befinden sich in <climits> Definiert als CHAR_MIN, SCHAR_MAX, UINT_MIN, DOUBLE_MAX etc.
unsigned und signed Erstes Bit wird für Vorzeichen benötigt
Variablen laufen über kann nur schwer geprüft werden
Informatik I/II PVK 13
Namenskonvention
Variablennamen dürfen '_', 'a-z', 'A-Z' und '0-9' enthalten.
Verboten: Zahlen am Anfang „__“ am Anfang (zwei '_') „_Grossbuchstaben“ Keywords
Empfohlen wird camelCase für Variablen und für Klassennamen CamelCase
Mehr gute Styletipps: http://www.orxonox.net/wiki/c++_styleguide
Informatik I/II PVK 14
Typenkonversion
Implizite Konvertierung int i = 3.425; // i == 3
Explizite Konvertierung (float)15/4
Typenkonversion hat höhere Präzendenz als /
Informatik I/II PVK 15
Null
Basistypen haben alle einen speziellen Null-Wert
int 0 double 0.0 float 0.0f char '\0' bool false (Pointer) null
Informatik I/II PVK 16
Arithmetische Operatoren
5 bekannte arithmetische Operatoren +, -, *, /, %
Lesevorgang von links nach rechts Unterschiedliche Präzedenz
*, /, % binden stärker als +, - Präzedenzliste in Zusammenfassung
Informatik I/II PVK 17
Verkürzte Operatoren
++, --, +=, *= etc. i++; ist eine Kurzform von i=i+1; i--; entspricht i=i-1;
achte auf Unterschied von i++ und ++i
i+=3; ist eine Kurzform von i=i+3; etc.
Informatik I/II PVK 18
Anweisungen
Werte werden kopiert mit = int a = 3; int b = a; // Kopie von Integer
Deklaration schafft bereits Speicherplatz, aber noch undefiniert
Wird erst bei grösseren Objekten wichtig
Informatik I/II PVK 19
Vergleichsoperatoren
Vergleichsoperatoren erzeugen einen boolschen Ausdruck
==, !=, <, <=, >, >= lässt sich immer nach true oder false
auswerten bool tiny = number <= 0.000001;
true → 1 false → 0 0 → false != 0 → true Achtung == nie mit = verwechseln!
Informatik I/II PVK 20
Logische Operatoren
Logische Operatoren verknüpfen boolsche Ausdrücke
&&, ||, ! bool b = 17 < a && a < 30;
auf keinen Fall 17 < a < 30 ist immer true
b != 0 && a/b < 1.3 sollte b == 0 gelten, teilen wir bei a/b durch 0 obiger Ausdruck wird aber fehlerfrei
ausgewertet, weil ein false auf der linken Seite weiteres Auswerten erübrigt
Informatik I/II PVK 21
Bit Operatoren
Bitoperatoren verändern Werte auf Bitebene
<<, >>, |, &, ^, ~ es gibt auch verkürzte Versionen (<<= etc.) i >>= 1; entspricht i /= 2; Vorsicht: ^ ist nicht für Exponenten sondern
XOR-Operation ~ nicht mit boolschem ! verwechseln
Informatik I/II PVK 22
Scopes
Scopes werden mit {, } eingegrenzt Variablen sind nur innerhalb ihres Scopes
sichtbar Scopes können beliebig verschachtelt werden Existieren Variablen mit gleichem Namen, so
zählt die „lokalere“ Variable
Informatik I/II PVK 23
Scopes Beispiel
int a = 3;int main(){
double b = a*3.14159;{
char a = 'h';b -= a;b += ::a;
}a++;return 0;
}
Obwohl die Variable a mehrmals deklariert wird, ist folgender Code korrekt.
Wegen dem Scope ist klar, für welche Bereiche a ein int ist und wann ein char
::a holt vom Scope versteckte, globale Variablen hervor
Informatik I/II PVK 24
if-else Statements
if (Bedingung1)
{
Anweisung1; // Falls Bedingung1 wahr
}
else
{
Anweisung2; // Falls Bedingung1 falsch
}
Informatik I/II PVK 25
if-else Statements
Vorsicht bei einzeiligen if-Statements und Verschachtelung
if (x < 0) if (y != 0) // do something else if (y != 0) // do something else
Informatik I/II PVK 26
if-else Statements
else gehört zu zweitem if if (x < 0)
if (y != 0) // do something else if (y != 0) // do something else
Informatik I/II PVK 27
Inline if
Wenn man einen Ausdruck schnell testen will
(Bedingung) ? wahr : falsch Bsp: int a = (x > 0) ? x : 0;
Gilt aber generell als schlechter Programmierstil
Informatik I/II PVK 28
switch Statement switch (Integerausdruck) {
case Konstante1:
Anweisung1;
break;
case Konstante2:
case Konstante3:
Anweisung2;
break;
default:
Standardanweisung;
}
Integerausdruck kann auch ein char sein
Informatik I/II PVK 29
for, while und do-while Schleife
for (Initialisierung; Bedingung; Update) {} while (Bedingung) {} do {} while (Bedingung)
for (int i = 0, int j = 1; j < size; i++, j++)
Ist Bedingung leer, so ist sie immer true
Vorzeitiges abbrechen (break) oder weiterfahren (continue) möglich. Ansonsten Ausführung bis Bedingung falsch.
Alle Schleifen sind gegenseitig austauschbar
Informatik I/II PVK 30
Arrays
Arrays sind fixe Bereiche einer konstanten Länge und eines beliebigen Typs im Speicher
Deshalb müssen Arrays auch mit einer Konstanten deklariert/initialisiert werden
int days[30]; // 30 ist konstant int days[30] = {20, 21, 24, 32, 24, 20, 16}; int days[] = {20, 21, 24}; // size 3
Der Index des Arrays geht von 0 bis length-1 int t = (days[0] + days[1])/2; Wird auf ein Element ausserhalb der Grösse des
Arrays zugegriffen wird ein Laufzeitfehler ausgelöst
Informatik I/II PVK 31
Mehrdimensionale Arrays
Arrays können auch beliebig mehrdimensional sein
int test[][2] = {{1,2},{2,3},{4,5}}; Grösse des Arrays kann aber nur für erste
Dimension wie oben automatisch erkannt werden
int test[][] = {{1,2},{4,5}}; Geht also nicht
Informatik I/II PVK 32
Char-Arrays
Eine besondere Sorte von Arrays sind die char-Arrays oder Strings
char name[] = „Stefan“; Strings sind terminiert mit dem null-char '\0'
Das obere Array hat also die Länge 7 Vorsicht: 'a' + 'b' wird nicht zu „ab“.
Stattdessen werden ASCII werte addiert.
Weil char-Arrays so grauenhaft sind, wird in C++ ein string Object zur Verfügung gestellt
char-Arrays sind in der Regel also zu vermeiden
Informatik I/II PVK 33
Pointer Ein Pointer zeigt irgendwo auf den Speicher
Variable Funktion etc.
int number = 100;int* pt = &number;*pt = 200;
& liefert die Speicheradresse einer beliebigen Variable
Mit * kann man den Pointer wieder dereferenzieren und auf den Wert an der Speicheradresse zugreifen.
Je nach Architektur ist ein Pointer nur wenige Bytes gross (Adresse im Speicher)
Informatik I/II PVK 34
Pointer 2
Pointer sind meistens von einem Datentyp. Es gibt aber auch den void-Pointer
(void)* pt = (void*)&a; Oder aber einen Pointer auf einen Pointer
int a = 5;int* b = &a;int** c = &b;
Vorsicht bei solchen Deklarationen double *p1, p2;
Die Pointer Variable hat jedoch ihren eigenen Typ
Informatik I/II PVK 35
Arrays sind ja nur Pointer
Die Variable des Arrays zeigt auf das erste Element im Speicher
int a[] = {1,5,9,4,8,6}
1
5
9
4
8
6
...
a
Informatik I/II PVK 36
Arrays sind ja nur Pointer
Die Variable des Arrays zeigt auf das erste Element im Speicher
int a[] = {1,5,9,4,8,6}
1
5
9
4
8
6
...
a
int* b = a;
,b
Informatik I/II PVK 37
Arrays sind ja nur Pointer
Die Variable des Arrays zeigt auf das erste Element im Speicher
int a[] = {1,5,9,4,8,6}
1
5
9
4
8
6
...
a
int* b = a;b = &a[3];
b
Informatik I/II PVK 38
Arrays sind ja nur Pointer
Die Variable des Arrays zeigt auf das erste Element im Speicher
int a[] = {1,5,9,4,8,6}
1
5
9
8
6
...
a
int* b = a;b = &a[3];
b*b = 10;10
Es können also mehrere Pointer auf ein Ziel zeigen oder auf Teile von Objekten
Informatik I/II PVK 39
Referenzen
Eine Referenz ist ein Alias einer anderer Variable (also ein anderer Name, aber die gleiche Stelle im Speicher)
int fussball = 11;int& soccer = fussball; keine Kopie des Wertes
Eine Referenz muss beim Deklarieren initialisiert werden und kann ihre Speicheradresse nachher nicht mehr ändern
Eine Referenz verhält sich wie ein Pointer der bereits dereferenziert wurde.
Informatik I/II PVK 40
Dynamische Speicherverwaltung
Bisher war bereits zu Compilezeit klar wieviel Speicher genutzt wird.
Man kann aber auch zur Laufzeit Speicher allozieren.
Dies macht man mit dem new-Operator double* p_value = new double;
Der new-Operator gibt immer einen Pointer des erzeugten Typs zurück. Also die Adresse des allozierten Speicher.
Informatik I/II PVK 41
Dynamische Speicherverwaltung
Speicher der mit new alloziert wurde wird nicht mehr am Ende des Scopes freigegeben.
Deshalb muss der Programmierer alles was er mit new erzeugt hat irgendwann auch selbst wieder mit delete löschen.
Ansonsten gibt es Memory Leaks double* p_value = new double;...delete p_value;
Informatik I/II PVK 42
Dynamische Arrays
Arrays können jetzt auch dynamisch erstellt werden (also nicht mit konstanter Länge)
int* a_ptr = new int[10]; delete [] a_ptr;
Alle Pointer (ausser void-Pointer) kann man inkrementieren
a_ptr+1 == &a_ptr[1] *(a_ptr+2) == a_ptr[2]
Informatik I/II PVK 43
Funktionen
typenName funktionsName (argumentenListe)
{
Anweisungen;
return value;
}
Sowohl typenName als auch argumentenListe kann void sein
Bei einem Funktionsaufruf werden Argumente und Rückgabewert hin und her kopiert.
Informatik I/II PVK 44
Inline Funktionen
Bei einem konventionellen Funktionsaufruf passiert dies:
Speichern der aktuellen Adresse (für Rücksprung) Sichern von lokalen Variablen Kopieren der Argumente Abarbeiten der Funktion Kopieren des return-values Rücksprung Wiederherstellung des Ausgangszustandes
Deshalb gibt es inline-Funktionen, welche direkt in den Code kopiert werden.
inline double square(double x) { return x*x; }
Informatik I/II PVK 45
Call by Value
double cube(double x)
{
return x*x*x;} Bei kleinen Werten wie double kein Problem, aber
was ist mit grösseren Objekten wie zum Beispiel Arrays?
Informatik I/II PVK 46
Functioncall für Arrays
int smallest(int arr[]); Da ein Array aber auch ein Pointer ist könnte man
das auch so schreiben: int smallest(int* arr);
Das gilt natürlich nicht nur für Arrays sondern auch für Pointer allgemein.
Dieser Aufruf kopiert das Array nicht, sondern nur die Adresse
Das heisst aber auch, dass alle Veränderungen auf den Originaldaten stattfinden!
Informatik I/II PVK 47
Call by Reference
int devide(double& x, double q) {
if (q != 0) {x /= q;return 0;
}return 1;
} Ändert den Originalwert von x x muss nicht dereferenziert werden Rückgabewert gibt an, ob die Operation geglückt
ist
Informatik I/II PVK 48
Default Argumente
double pow(double x, int e = 2); Defaultwerte werden nur in den Prototypen
gesetzt.
Dies erzeugt eigentlich zwei Funktionen (eine mit und eine ohne das zweite Argument)
pow(2.0); // ist 2^2 (= 4) pow(2.0, 3); // ist 2^3 (= 8)
Defaultargumente müssen immer zuletzt stehen double pow(int e = 2, double x);
ist also nicht erlaubt
Informatik I/II PVK 49
Functionpointer
Prototypen kennen wir ja schon: double f(double x);
Funktionspointer sind einfach Pointer auf den Speicher wo die Funktion sich befindet
double (*pf)(double); Dieser Functionpointer kann auf alle Funktionen
zeigen die einen double annehmen und einen double als Rückgabewert haben.
Ein Aufruf geht dann ganz einfach: pf = f; double result = pf(8.23);
Informatik I/II PVK 50
Templates
Eine Funktion (oder sogar Klasse) kann für unterschiedliche Typen erzeugt werden.
template <class Any>void Swap(Any &a, Any &b){ … }
Beispiele dazu wären vector<> und list<>
Der Compiler erzeugt jeweils die Funktionen einzeln für jeden Typ on demand
Informatik I/II PVK 51
Prüfungsaufgabe 1
Programmanalyse Meistens eine Funktion gegeben und deren
„Funktion“ gefragt. Vorgehen:
Verschiedene Werte ausprobieren und Resultate vergleichen
Array-Zustände mitnotieren Auf Syntax achten Keywords
Informatik I/II PVK 52
Prüfungsaufgabe 1
Schreiben Sie für die folgenden drei Teilaufgaben jeweils den Inhalt des Arrays a in die dafür vorgesehene Tabelle. Die Werte des Arrays werden dabei von einer Teilaufgabe zur nächsten übertragen. Das Array a werde an der Adresse 100 angelegt.
int a [8] = {2,4,6,8,10,12,14,16};
a[3] = 5; *a = a[6];
a[6] = (int)a; int* b = &a[4];
for (int i=0; i<4; i++) b[i] = 2*a[i];
Informatik I/II PVK 53
Lösung zu vorherigem Slide
2 4 6 5 10 12 14 16
14 4 6 5 10 12 100 16
14 4 6 5 28 8 12 10
Informatik I/II PVK 54
Prüfungsaufgabe 1 (cont.)
Zu ermitteln ist der Inhalt von c direkt nach dem Aufruf von foo in main. Schreiben Sie das Resultat in die dafür vorgesehene Tabelle.
void foo(int src[], int dest[], int size) {
for (int i=0; i<size; i++) {
int a=0;
for (int i2=0; i2<=i; i2++) {
a = a+src[i2];}
dest[i] = a;
}
}
int main() {
int b[6] = {2,5,0,-4,-4,1};
int c[6] = {0,0,0,0,0,0};
foo(b,c,6);
return 0;
}
Informatik I/II PVK 55
Lösung zu vorherigen Slide
2 7 7 3 -1 0
Jeweils die Summe der vorherigen Elemente des Ursprungsarrays
Informatik I/II PVK 56
Prüfungsaufgabe 1 (cont.)
Zu wie vielen Lesezugriffen auf das Array b führt der obige Aufruf von foo(b,c,6)?
Die Funktion foo ist ineffizient implementiert. Schreiben Sie eine neue Funktion foo, mit der gleichen Funktionalität aber nur einer for-Schleife. Die Signatur ist bereits angegeben.
void foo(int src[], int dest[], int size)
{
//Insert your code here
Informatik I/II PVK 57
Lösung zu vorherigen Slide
1 + 2 + 3 + 4 + 5 + 6 = 21 Zugriffe auf das Array void foo(int src[], int dest[], int size)
{
int sum = 0;
for (int i = 0; i < size; i++)
{
sum += src[i];
dest[i] = sum;
}
}