Informatik I for D-MAVT Exercise Session 4
Administratives Ich bin nächste Woche abwesend Übungsstunde vom 31.3.2010 Jens Puwein wird mich vertreten Im selben Raum (HG D1.1) Zusammen mit seiner Übungsgruppe Übungen können an Jens abgegeben werden, er wird sie mir dann weitergeben
Bemerkung Übungen bis jetzt zufriedenstellend gelöst Speziell die Programmieraufgaben! Aber: mehr Disziplin bei Übungsabgabe Abgabe jeweils Mittwoch in Übungsstunde
Compiler reserviert 4 Bytes im Speicher Nachbesprechung Nicht initialisierte Variablen haben einen zufälligen Wert Je nach Compilereinstellung (z.B. MS Visual Studio C++-Compiler im Debug-Modus) macht Compiler automatische Initialisierung mit 0 Speicheradresse Speicherinhalt Compiler reserviert 4 Bytes im Speicher 0x7820 int a; 0x7824 a1 a2 a3 a4 0x7828 Der Wert von a ist was auch immer zuvor an dieser Speicheradresse gespeichert war (interpretiert als Integer)!
Übung 2: Gültige Variablennamen Beginnen mit Buchstabe oder _ aber nicht mit einer Ziffer Dürfen keine Sonderzeichen enthalten
Übung 2: Auswertung von algebraischen Operatoren Bsp: 7.0 * (3 / 7) * 5 7.0 * 5 0.0 5.0 Es gilt: 4 int 4.f float 4.0 double Ergebnistyp: double
Übung 2: Typkonvertierung Bsp: double(9/2) double(4) 4.0 (double)9/2 9.0 / 2 9.0 / 2.0 4.5 Ergebnistyp: double Ergebnistyp: double
Übung 2: Programmanalyse Eine instanziierte Variable hat immer einen Wert der Wert kann zufällig sein (wenn nicht initialisiert) oder definiert (nach Initialisierung) Bsp: int main() { int s1, s2 = 4; double d1, d2 = 4.0; … } s1 und d1 haben zufällige Werte s2 = 4 und d2 = 4.0
? ? ? ? Repetition: if – else I Einfache Verzweigungen int a = 4; if (a = 2) cout << "a == 2" << endl; else cout << "a != 2" << endl; Ausgabe: a == 2 a = 4; if (2 = a) Ausgabe: Kompiliert nicht! if (a == 3) Ausgabe: a != 2 if (3 == a) ? ? ? ?
Repetition: if – else II Geschachtelte Verzweigungen bool a = false; bool b = true; if (a) cout << "a == true"; else if(b) cout << "a == false && b == true"; cout << "a == false && b == false"; Ausgabe: a == false && b == true bool a = true; bool b = true; if (a) cout << "a == true" << endl cout << "a == false" << endl; cout << "b == true" << endl; Ausgabe: a == true b == true ? ?
Verkürzte Operatoren Inkrement / Dekrement Verkürzte Zuweisungs-Operatoren x++ // postfix a = b++; // a = b; b = b + 1; ++x // prefix a = ++b; // b = b + 1; a = b; x-- // postfix a = b--; // a = b; b = b - 1; --x // prefix a = --b; // b = b - 1; a = b; x += 2; // x = x + 2 x -= 2; // x = x - 2 X *= 2; // x = x * 2 x /= 2; // x = x / 2 x %= 2; // x = x % 2
Kontrollstrukturen: while – Schleifen Bedingung: Muss vom Typ bool sein Anweisungsblock wird solange wiederholt bis die Bedingung zu false auswertet Nach Abarbeitung des Anweisungsblock wird die Bedingung immer neu ausgewertet Die Bedingung muss im Anweisungsblock verändert werden, sonst können Endlosschleifen entstehen
Kontrollstrukturen: while – Schleifen int a = 1, b = 0; while(a = 0) b += 1; Werte von a, b? Anzahl Iterationen? a = 0, b = 0 Keine Iteration int a = 5, b = 0; while( a > 5 && a < 10) a = 5, b = 0 while(a > b) b += 2; a = 5, b = 6 3 Iterationen while(a = 3) Endlosschleife! ? ? ? ?
Kontrollstruktur: do while – Schleifen Die Bedingung wird erst nach Ausführung des Anweisungsblocks ausgewertet Der Anweisungsblock wird mindestens einmal ausgeführt
Kontrollstrukturen: do - while – Schleifen int a = 1, b = 0; do b += 1; while(a = 0) Werte von a, b? Anzahl Iterationen? a = 0, b = 1 1 Iteration int a = 5, b = 0; while( a > 5 && a < 10) a = 5, b = 1 b += 2; while(a > b) a = 5, b = 6 3 Iterationen ? ? ?
Kontrollstruktur: for – Schleife I Initialisierung: Definieren des Schleifen Indexes Abbruchbedingung: Die Schleife wird abgearbeitet bis die Abbruchbedingung zu true auswertet Inkrement: Schleifen Index wird aktualisiert
Kontrollstruktur: for – Schleife II Allgemeiner Ablauf einer for – Schleife Initialisierung des Indexes Auswertung der Abbruchbedingung Abarbeitung des Anweisungsblocks Aktualisierung des Inkrements Springe zu Schritt 2.
Kontrollstruktur: for – Schleife III Beispiel: for(int i = 0; i < 10; i *= i, i -= 3) cout << i << ", "; ? Ausgabe: 0, -3, 6,
Schleifen: break - Anweisung break : Schleife wird vorzeitig abgebrochen Kann in while, do-while und for – Schleifen verwendet werden double d = 0.0; for(int i = 1; i < 100; i++){ if (i > 5){ cout << "i = " << i << endl; break; } d += 1.0/i; cout << "d = " << d << endl; Ausgabe: i = 6 d = 1/1 + 1/2 + 1/3 + 1/4 + 1/5 = 2.2833 ?
Schleifen: continue - Anweisung continue : Rest des Anweisungsblocks wird übersprungen und die nächste Iteration ausgeführt double d = 0.0; for(int i = 1; i < 100; i++){ if (i > 5){ cout << i << ", "; continue; } d += 1.0/i; cout << "d = " << d << endl; Ausgabe: i = 6, 7, 8, 9, 10, … 99 d = 1/1 + 1/2 + 1/3 + 1/4 + 1/5 = 2.2833 ?
Übung 4 – Aufgabe 1 Transformiere die while Schleife in eine do-while Schleife Transformiere die do-while Schleife in eine while Schleife ? int t = 17, f = 0; while(t > 3) t /= 2 f += t; if( t > 3) do t /= 2; while(t > 3); int a = 2, b = 0; do{ a *= a; b += a; }while(a < 30) while(a < 30){ } ?
Übung 4 – Aufgabe 1 Transformiere die for - Schleife in eine while - Schleife Transformiere die while - Schleife in eine for - Schleife int k = 0; for (int a = 0; a < 15; a *= a, a -= 3) k = a; int a = 0; while(a < 15){ a *= a; a -= 3; } ? ? int i = 25, j = 0; int k = 0; while(i > j && i > 0){ k = i; i = i – 2*j; j++; } for(int i = 25, j = 0; i > j && i > 0; i = i-2*j,j++)
? ? ? Übung 4 – Aufgabe 2 Programmanalyse 1. int main(int argc, char** argv){ 2. int a, b, c; 3. cout << "Einlesen von a und b " << endl; 4. cin >> a >> b; 5. while(b != 0){ 6. c = a % b; 7. a = b; 8. b = c; 9. } 10. cout << "a = " << a << endl; 11. return 0; 12. } Was gibt das Programm aus, wenn a = 11 und b = 7? Ausgabe: 1 Was gibt das Programm aus, wenn a = 12 und b = 9? Ausgabe: 3 Was berechnet dieses Programm? ggT (grösster gemeinsamer Teiler) ? ? ?
Übung 4 – Aufgabe 3 Um Zufallszahlen zu generieren verwende srand srand kann mit time(NULL)initialisiert werden Dokumentation zu srand und time findet ihr unter http://www.cplusplus.com/reference/ Verwendet zwei verschachtelte Schleifen Die äussere Schleife wird für alle n Stellen des Passworts ausgeführt Die innere Schleife generiert solange ein neues Zeichen bis das gewünschte Zeichen vorliegt Gewünschte Zeichen sind A-z, 0-9, und Sonderzeichen (siehe ASCII-Tabelle)
ASCII-Tabelle
© Roland Angst, 2010 Institute of Visual Computing Advanced Topics ostream::operator<< ostream& operator<< (bool& val ); ostream& operator<< (int& val ); ostream& operator<< (long& val ); ostream& operator<< (float& val ); ... ostream Ein Datentyp wie bool, int, float, … operator<< Eigentlich wie eine Funktion (z.B. main()) Aber mit speziellem Syntax Auch +,-,*, usw. sind Operatoren! Wozu könnten Operatoren nützlich sein? © Roland Angst, 2010 Institute of Visual Computing
© Roland Angst, 2010 Institute of Visual Computing Advanced Topics std::cout Eine Variable (genannt Object) vom Typ ostream Wird in <iostream> definiert und initialisiert std::cout<< “Hallo Welt!”; Ruft den <<-Operator des ostream-Objects cout auf: Äquivalentes Statement: std::cout<<(“Hallo Welt”); Demo… © Roland Angst, 2010 Institute of Visual Computing