PVK Informatik I 1.Teil Grundlagen Variablen Operatoren Fallunterscheidung Schleifen Kurzschreibweise Pointer Array Dynamische Strukturen Funktionen 1
Grundlagen #include <iostream> #include <string> using namespace std; int main() { // Einzeiliger Kommentar /* Mehrzeiliger Kommentar */ cin >> name; //variable einlesen cout << "hallo"; //Textausgabe cout << "hallo " << name << endl; } return 0; 2
Variablen Deklaration: int variable1; Definition/Initialiesierung: variable1 = 40; L-Value / R-Value: int var2 = variable1; Zufallswert nach der Deklaration: Int var3; var3 ist nicht 0! 3
Variablentypen int Ganze Zahl 4 Byte float Kommazahl 4 Byte double Kommazahl 8 Byte bool Wahr/Falsch 1 Byte char Zeichen 1 Byte string Zeichenkette 1 Byte pro Zeichen 4
Variablentypen II 4 4. 4.f '4' "4" char float string int double 5
Nullen bei Kommazahlen 4. == 4.0.4 == 0.4 4.f == 4.0f 6
Boolean True == 1 False == 0 0 == False Alles andere == True Für C++ macht es keinen Unterschied int z = true * 2 + 4; //6 7
Variablen definieren int zahl = 2; int zahl(2); int zahl; zahl = 2; FALSCH: int zahl; zahl(2); Falle: int a, b = 4; 8
Gültige Variablennamen Erlaubte Zeichen: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 _ Beginne mit Buchstaben (oder _)! 9
Operatoren Operatoren: + - * / % Modulo < > <= >= == gleich!= ungleich ++ -- && Rückgabetyp Typ der Operanden Integer Boolean Boolean Boolean Typ des Operanden Boolean 10
Prioritäten Gehört auf die Zusammenfassung E-mail Anhang Punkt vor Strich = kommt meist zuletzt 11
Prioritäten II a = b % 4 && ++i j == 3 + 3. ; a = (((b % 4) &&(++i)) (j==6.)); Benutze Klammern 12
Casts (sind auch Operatoren) int a = 6.0f; Wird automatisch umgewandelt. Expliziter Cast: int b = (int) 6.0f; //wie in C int b = int( 6.0f ); //nur C++ 13
Integerdivision 4 / 3 == 1 Operanden sind Integer -> Ergebnis auch float(4) / 3 double(4) / 3 4.f / 3 4. / 3 Vermutlich mind. 1 Teilaufgabe der Prüfung 14
Fallunterscheidung if(antwort=="y" antwort=="y") { n=n+1; } else if((antwort=="y" antwort=="y") && n==0) { n=0; } else{ cout << "y oder n?"; } 15
If/Else Hinweise Wenn bedingung 0 (false) ist, wird die Anweisung nicht ausgeführt, sonst schon. && vor Falle: if (true) { int i = 3; } cout << i; { } definiert einen Block 16
Ternär - Kurzschreibweise a==2? 0 : 2; Ist a == 2? Falls ja, dann gib 0 zurück, sonst 2. k = a==2? 0 : 2; k = (a==2? 0 : 2); 17
Fallunterscheidung II switch (x) { //Prüfe x case 1: //Wenn x==1 cout << "Eins"; //weitere Anweisungen hier break; //Wichtig!! case 2: cout << "Zwei"; break; default: cout << "X ist nicht 1 oder 2"; } 18
Switch Hinweise break; ist wichtig default: ist optional x muss int oder char sein! 19
Schleifen int i=0; int j=1; while(i<5) { cout << i*j << " "; j=i+2; i++; // i=i+1; } int j,i=0; do{ j=i+1; cout << i++*j << " "; } while(i<5) 20
While / Do-While Hinweise Verwende, wenn nicht von Anfang an klar ist, wie oft die schleife durchgeführt werden soll. Do while wird mindestens 1 Mal durchgeführt. While mindestens 0 Mal. Endlosschleife, wenn die Bedingung nie false wird. 21
For for(int i=0,j=1; i<5; i++, j=i+1) { } cout << i*j << " "; Verwenden, wenn am Anfang bekannt ist, wie oft die schleife durchgeführt wird. for(initial.; Bedingung; Schluss.) {Block} 22
Schleifen umwandeln for(initial.; Bedingung; Schluss.) {Block} Initialisierung while(bedingung) {Block; Schluss.} 23
if (false) cout << "Nein"; cout << "Ja"; Schleifen - Fallen Wenn der Block { } fehlt wird alles bis zum nächsten ; ausgeführt (also ein Befehl). if( true i++ ); i++ wird nicht ausgeführt, weil das if faul ist. 24
Break und Continue break; bricht die aktuelle Schleife sofort ab. Gehe zu: nach der Schleife continue; bricht den aktuellen Durchgang der Schleife sofort ab. Gehe zu: nächster Durchgang. 25
Kurzschreibweise int i = 1; j = i++; //j=1 j = ++i; //j=2 Das gleiche für -- i += 2; i = i + 2; i *= 2; i = i * 2; -= /= %= 26
Zufallszahlen erzeugen #include <ctime> #include <cstdlib> Im main: srand(time(null)); int z = rand() % 67; Zufallszahl 0-66 27
Pointer Weiss wo du wonsch! Weiss wie du usgsesch! int a = 2; int * p = &a; Falle: * bei der Deklaration hat eine andere Bedeutung als überall sonst. 28
Const Pointer const int * p; Zielwert kann nicht geändert werden Int * const p; Adresse kann nicht geändert werden. Rückwärts lesen: int * const p; Ich bin ein konstanter Pointer von einem Integer 29
Pointer verwenden *p Gehe zur Zieladresse von p und nimm den Wert. p ist also ein Pointer &a Gib mir die Adresse von der Variable a. a ist also KEIN Pointer (meistens) 30
Pointer verwenden II int a = 3; Int b = 2; int * p = &a; *p = 4; *&a p = &*&b; p = Adresse; *p = Wert; 31
Pointer Hinweise Die Adresse ist eine Art Zahl: p++; p = p+3; Nur bei Arrays sinnvoll! *p == p[0]; *(p+1) == p[1]; *(p+x) == p[x]; 32
Array - Aktenschrank Arrays sind in C++ fast wie Pointer. int a[4]; float b[x]; x muss bekannt sein, bevor, der Array definiert wird und bevor das Programm kompiliert wird. Sonst macht der Compiler automatisch: float * b = new float[x]; Mögliche Prüfungsfrage 33
Array II int a[2] = { 2 }; char b[] = { 'a', 'b', 'c' }; FALSCH: int c[]; Int d[1] = { 3, 2 }; 34
Array und Pointer int a[3]; int * p; p = a; cout << p[1]; FALSCH: int z[3]; a = z; Arrays können kein L-Value sein! 35
Dynamische Strukturen Der Heap Der Pointer weiss wo es ist. int * p = new int; int * q = new int[5]; Typ * pointer = new Typ; new gibt immer die Adresse zurück! Der new-operator alloziert Speicher 36
Dynamische Strukturen II Was ihm Heap ist, hält (fast) ewig. Bloss nicht die Adresse verlieren. Speicher deallozieren delete p; delete[] q; Delete ist der Auftragskiller unter den Operatoren. Er braucht nur eine Adresse. Sonst gibts ein Memory-Leak. Faustregel: Immer wenn new, dann auch delete! 37
Funktionen double max(double a, double b) { } return a>b? a : b; Rückgabetyp Funktionsname( Parameter ) { } //ganz viel Rechnen return Rückgabewert; 38
Funktionen - Prototyp Der Prototyp oder der Kopf der Funktion enthält: Rückgabewert Funktionsnamen Parametertypen ; am Ende double max(double, double); Parameternamen dürfen stehen, werden aber vom Compiler ignoriert. 39
Prototyp - Verwendung double max(double, double); int main() { max(3, 2); } double max(double a, double b) { return a>b? a : b; } 40
Funktionen - Return Nach dem return ist alles aus. Was nach dem return steht, wird in den Rückgabetyp umgewandelt (falls nötig/möglich) Wenn nichts zurückgegeben werden soll hat die Funktion den Rückgabetypen void und hat kein return. Sonst ist ein Return notwendig 41
Funktionen Parameter int func(int a, double b) { //some magic return 0; } func(3, 2.); Das Passiert: Int a = 3; double b = 2.;... 42
Referenzen int b = 2; int & a = b; a ist nun eine Referenz auf b. a ist KEIN Pointer a IST b. a = 3; cout << b; FALSCH: Int & a = 4; 43
Call by Reference void swap(int &a, int &b) { int temp = b; b = a; a = temp; } int x=3, y=5; swap(x,y); Das Passiert: Int & a = x; Int & b = y; 44
Pointer als Parameter void swap(int *a, int *b) { int temp = *b; *b = *a; *a = temp; } int x=3, y=5; swap( &x, &y ); Das Passiert: Int * a = &x; Int * b = &y; 45
Array als Parameter int give(int * a) { return a[0]; } int x[]={3,3,6}; give( x ); Das Passiert: int * a = x; 46
Array als Parameter II Ein Spezialfall: int give(int a[]) { return a[0]; } int x[]={3,3,6}; give( x ); Das geht obwohl das hier nicht gehen würde: int a[] = x; 47
Array als Parameter III FALSCH: int give(int a[2]) { return a[0]; } int x[]={3,3,6}; give( x ); Der Parameter muss hier explizit die länge 2 haben! 48
Funktionen - Überladen double max(double a, double b) { } return a>b? a : b; int max(int a, int b) { } return a>b? a : b; 49
Funktionen Überladen II Damit eine Funktion überladen werden kann, müssen die Köpfe der Funktionen mindestens einen dieser Unterschiede haben: Anzahl Parameter Typ mindestens eines Parameters Rückgabetyp reicht NICHT als Unterschied. 50
Funktionen Default-Wert int max(int a, int b = 0) { } return a>b? a : b; max(3); // b = 0; max(3, 2); Nur die letzen Parameter dürfen einen Default-Wert haben (Theoretisch alle zusammen) 51
PVK Informatik I 2.Teil Funktionen Structs Klassen Etc. 52
Eine Funktion backen Zutaten: Parameter Rückgabewert Eine Mission 53
Eine Funktion backen II Zubereitung: Lies die Mission. Lies die Mission nochmal unterstreiche wichtiges. Schreibe den Kopf des Programms Überlege eine Vorgehensweise Siehe deine Zusammenfassung an. Steht dort ein ähnliches Beispiel? Wenn nicht void als Rückgabetyp, dann muss mindestens ein return rein. Das Programm muss nicht gut sein, sondern nur richtig! 54
Eine Funktion backen - Beispiel Schreiben Sie eine Funktion die überprüft, ob eine ganze Zahl eine Primzahl ist oder nicht. Falls die Zahl eine Primzahl ist, gibt sie true zurück sonst false. Eine Primzahl ist eine natürliche Zahl, die nur durch 1 und sich selbst teilbar ist. (Als Teiler kommen nur natürliche Zahlen in Frage) Basisprüfung Informatik I 2010 Aufgabe 3b) 55
Eine Funktion backen - Beispiel Schreiben Sie eine Funktion die überprüft, ob eine ganze Zahl eine Primzahl ist oder nicht. Falls die Zahl eine Primzahl ist, gibt sie true zurück sonst false. Eine Primzahl ist eine natürliche Zahl, die nur durch 1 und sich selbst teilbar ist. (Als Teiler kommen nur natürliche Zahlen in Frage) Basisprüfung Informatik I 2010 Aufgabe 3b) 56
Eine Funktion backen - Beispiel 1 Parameter vom Typ Integer. Call-by-value. Rückgabewert vom Typ Boolean bool prim(int zahl); Teilbar heisst Modulo = 0 Zahl % 5 == 0 // Teilbar durch 5 Überprüfe auf Teilbarkeit mit allen natürlichen Zahlen. Alle? Nein. Nur jene zwischen 1 und sich selbst 57
Eine Funktion backen - Beispiel Prüfe alle = eine Schleife! Anzahl durchgänge bekannt! -> For-Schleife Initialiserung: int i = 2; // weil > 1 Bedingungen: i < zahl Schlussanweisung i++ 58
Eine Funktion backen - Beispiel bool prim(int zahl) { for( int i = 2; i < zahl; i++ ) { //??? } } Prüfe auf Teilbarkeit if( Zahl % i == 0 ) {} 59
Eine Funktion backen - Beispiel bool prim(int zahl) { for( int i = 2; i < zahl; i++ ) { if( zahl % i == 0 ) { //Die Zahl hat einen Teiler!! // -> keine Primzahl } } //Die Schleife ist fertig. /* Wenn wir nie im if waren, hatte die Zahl keine Teiler */ // -> Primzahl } Es fehlen nur noch die Returns 60
Eine Funktion backen - Beispiel bool prim(int zahl) { for( int i = 2; i < zahl; i++ ) { if( zahl % i == 0 ) { return false; } } return true; } En Guete 61
Rekursive Funktionen 62
Funktionen und Variablen Funktion int b() { return 3; } int a = b(); Gehe zu b() Variable int b = 3; int a = b; Gehe zu b Nimm den Wert Rechne Nimm den Wert 63
Pointer zurückgeben 1.So tun, als wolle man einen Pointer erstellen. int * bsp... 2.Eine Funktion daraus machen int * bsp(int a, double b) { //... int * p = new int(4); return p; } 3.Eine Adresse zurückgeben! Macht meist nur mit dynamischen Variablen Sinn 64
Structs Structs stehen zu Klassen, wie Arrays zu Pointer In C++ ist eine Struct eine eingeschränkte Form der Klasse. Structs kennt die Bezeichungen private, public und protected nicht. Es wird alles public. 65
Structs - Syntax struct name{ int a,b; double c; bool k; name f; //NEIN name * g; //ok }; //Wenn dieses ; fehlt...... muss stattdessen eine Variable stehen. name bsp = { 3, 3, 4.2, true }; Das können nur Structs (nicht Klassen) 66
Klassen Wenn wir selbst Funktionen bauen können, dann können wir auch unsere eigenen Typen basteln. Das sind Klassen! Begriffe: Instanz = Objekt Member = Eigenschaften + Methoden Eigenschaften = Variablen Methoden = Funktionen 67
Klassen - Syntax class Klassenname { private: //das folgende ist privat int a; //eine Eigenschaft //private funktion int private_func(); //... public: //das folgende ist public Klassenname() {}; //default constructor //constructor Klassenname(int aa); //noch ein constructor Klassenname(int aa, int bb); int b; //öffentliche funk. void public_func() {} //... friend int andere_funktion(); }; //Das ; ist wichtig 68
Klassen - Zugriffsspezifikationen public: Alle dürfen zugreifen private: Nur in der Klasse zugreifbar (+friends) protected: private + vererbar (+friends) Wenn nichts steht, dann ist es private! 69
Methode definieren 1.In der Klasse wie eine normale Funktion 2.Ausserhalb der Klasse mit einem Zusatz: Klassenname:: Muss direkt vor dem Namen der Methode stehen. int Klassenname::private_func() { //Das Übliche //Am Ende noch ein return } 70
Objekt Erstellen klassenname v; klassenname * w = new klassenname; Benutzen v.b = 4; v.public_func() Variable und Funktion sind public in klassenname 71
Objekt II klassenname * w = new klassenname; (*w).b = 4; Klammer notwendig w->b = 4; Macht das gleiche. -> ist ein neuer Operator. Bei Struct ist es gleich. 72
This-Pointer Innerhalb jeder Klasse ist ein this Pointer definiert. Der this Pointer zeigt auf das aktuelle Objekt klassenname var1; var1.public_func(); void public_func(){ this->a = 3; } this zeigt hier auf var1 Warum? 73
This-Pointer II class bsp{ private: int a, len; public: void set(int a, int length) { len = length; a = a;??? this-> a = a; } }; 74
Vererbung Nicht Prüfungsrelevant 75
Constructor: Ein Objekt backen klassenname v; Führt den Default-Constructor aus. Selber backen Dadurch wird der Default-Constructor gelöscht. Überladbar: Verschiedene Rezepte möglich Public: Alle dürfen probieren 76
Constructor II class Klassenname { private: int a; public: klassenname(int aa) { a = aa; } klassenname() { }; } a = 0; 77
Memory-Leak class bsp { private: double * a; public: bsp() { a = new double[9999999]; } }; 78
Destructor/Deconstructor class bsp { private: double * a; public: bsp() { a = new double[9999999]; } ~bsp() { }; } delete[] a; Nur wegen new! 79
Kopierconstructor Ist auch nur ein Constructor Wird automatisch aufgerufen, wenn: bsp a; bsp b = a; int func(bsp x) { return 0; } func(a); 80
Kopierconstructor II Falsch: Klassenname(Klassenname v) { a = v.a; *b = *(v.b); } Richtig: Klassenname(const Klassenname& v) { a = v.a; *b = *(v.b); } 81
Kopierconstructor III Es gibt einen Default-Kopierconstructor Muss NUR selbst definiert werden, wenn dynamische Strukturen in der Klasse sind (new). 82
Operatoren überladen bsp a; bsp b; bsp c = a + b; Was passiert in der letzten Zeile? Das dürfen/müssen wir selber definieren. 83
Operatoren überladen II // Der "+"-Operator bsp operator+(const bsp & v) { //erstelle Objekt bsp c; //fülle es c.a = a + v.a; *(c.b) = *b + *(v.b); return c; } Meistens mit const und & 84
Operatoren überladen III Beispiele auf die Zusammenfassung Wahrscheinlich 1 Teilaufgabe bei der Prüfung 85
Fallen & Hinweise Kompilierfehler: Codeblocks zeigt einen Fehler, wenn man auf das Zahnrad klickt. Ausführfehler (Laufzeitfehler): Das Programm startet. Plötzlich stüzt es ab, bzw. zeigt einen Fehler in der Konsole. Gründe: Zugriff ausserhalb eines Arrays 86
Fallen & Hinweise const int a = 3; int b = 4; int & c = a; const int & d = b; 87