Informatik 1 (251-0832-00) D-MAVT F2010 Letzte Übungsstunde
Evaluation S3 Frage zu Assistierenden INFK Anz. Der/die Assistent/in war fachlich k.ä. 0 kompetent 1 0 2 0 3 0 4 23% 3 5 77% 10 MW = 4.8 SA = 0.4 ungültig 0 gültig 13 k.ä. 1 2 3 4 5 23% 50% 100% 77% MW = 4.8 SA = 0.4 un ülti 0 ülti 13 S4 Frage zu Assistierenden INFK Anz. Der/die Assistent/in vermochte den k.ä. 0 Stoff verständlich und anschaulich 1 0 zu erklären 2 0 3 31% 4 4 62% 8 5 8% 1 MW = 3.8 SA = 0.6 ungültig 0 gültig 13 k.ä. 1 2 3 4 5 8% 50% 100% 31% 62% Kommentare: Mehr Tipps für die Übungen wären hilfreich gewesen. Punktevergabe ok - eher streng.
Nachbesprechung Blatt 10 Im Konstruktor müssen alle Datenmitglieder initialisiert werden. cpolynom::cpolynom() { for (i = 0, i <= deg, ++i){ coef[i] = 0; // alle Koeffizienten auf 0 setzen cpolynom::cpolynom() { deg = 0; coef = new double[1]; coef[0] = 0.0;
Nachbesprechung Blatt 10 Der Zuweisungsoperator soll das Objekt auf der linken Seite der Zuweisung verändern! cpolynom cpolynom::operator= (const cpolynom& rhs) { cpolynom ret; ret.deg = rhs.deg; for (int i = 0; i <= deg; ++i) ret.coef[i] = rhs.coef[i]; return ret; cpolynom& cpolynom::operator= (const cpolynom& rhs) { if (this!= &rhs) { delete[] this->coef; this->coef = new double[rhs.deg+1]; this->deg = rhs.deg; for (int i = 0; i <= this->deg; ++i) this->coef[i] = rhs.coef[i]; return *this;
Nachbesprechung Blatt 10 cpolynom cpolynom::operator+ (const cpolynom &rhs) { cpolynom sum = *this ; if (sum.deg < rhs.deg) sum.deg = rhs.deg; for (int i = sum.deg; i >= 0; --i) sum.coef[i] += rhs.coef[i]; return sum; Beim operator+ braucht man ein Objekt mit dem richtigen Speicherplatz! cpolynom cpolynom::operator+ (const cpolynom &rhs) { cpolynom sum; if (this->deg >= rhs.deg) { sum = *this; for (int i = rhs.deg; i >= 0; --i) sum.coef[i] += rhs.coef[i]; else { sum = rhs; for (int i = this->deg; i >= 0; --i) sum.coef[i] += this->coef[i]; return sum; Man könnte den Ansatz oben auch dadurch reparieren, dass man die Funktion realloc verwendet. Eher kompliziert, aber leicht effizienter...
Nachbesprechung Blatt 10 Anstelle von const int kann auch int gebraucht werden; nur umgekehrt nicht. void foo (const int& a); void bar (int& b); int a; const int b; foo(a); // OK foo(b); // OK bar(a); // OK bar(b); // NOK Nach einer Funktionsdefinition braucht es kein Semikolon. Dies ist nur nach Klassendefinitionen (wozu auch structs gehören) notwendig. void foo (const int& a) {... ; // Semikolon nicht nötig
Nachbesprechung Blatt 11 Aufgabe 1 - Memory Layout Die eine Variante traversiert das Feld nicht in der natürlichen Weise. Dadurch kommt es aufgrund der Grösse des Feldes vermehrt zu Ladeanweisungen. int a[n][4]; a[0] a[1] a[2]... Aufgabe 3 - Raytracer erweitern In der letzten Stunde haben Sie gesehen, wie zwei Spiegel in der Szene aussehen. Falls Sie selbst ein interessantes Bild generiert haben, können Sie dieses an Cyril Flaig <cflaig@inf.ethz.ch> senden. Es wird gegebenenfalls auf der Homepage veröffentlicht.
Nachbesprechung Blatt 11 Aufgabe 2 - Ausdrücke b) Wenn man die Funktion f auf die doubles a und b anwendet, ist der Betrag des Resultates ungerade und grösser als 12. int f (double, double); double a, b; (f(a,b) > 12 f(a,b) < -12) && f(a,b) % 2!= 0; c) Der Quotient von x und y ist ein Teiler von 30, wobei y nicht Null ist. int x, y; y!= 0 && 30 % (x / y) == 0;
Nachbesprechung Blatt 11 Aufgabe 2 - Ausdrücke d) Der double q ist eine ganzzahlige Quadratzahl. #include <cmath> double q; (static_cast<int>(sqrt(q)) * static_cast<int>(sqrt(q))) == q; e) Wenn x grösser ist als y, dann ist y ein Teiler von x. int x, y; x <= y x % y == 0;
Blatt 12, Aufgabe 1 Stammbaum Definieren Sie eine geeignete Struktur, um den folgenden Stammbaum zu speichern. Die Stuktur soll den Namen der Person und einen Zeiger auf deren Vater und deren Mutter enthalten. Person shmi = { Shmi, 0, 0; Person anakin = { Anakin, 0, &Shmi;... Für c) können Sie davon ausgehen, dass alle relavanten Zeiger nicht-null sind. Für d) verwenden Sie einen STL Container!
Blatt 12, Aufgabe 2 Benutzernamen generieren int main(int argc, int* argv[]) { if (argc!= 2) return 1; ifstream infile(argv[1]); if (!infile) { cout << "Kann Datei " << argv[1] << " nicht oeffnen!" << endl; return 1; string vorname, name; string usernames; infile >> vorname >> name; while (!infile.eof()) { // Generiere Benutzernamen und gib ihn aus infile >> vorname >> name; return 0; Namen und Vornamen aus einer Datei auslesen und eindeutige Benutzernamen generieren. Die Benutzernamen sollen: genau 6 Zeichen enthalten. aus kleinen Buchstaben bestehen. tolower(char) wenn möglich aus Vorund Nachnamen bestehen (z.b. Yves Brise ybrise).
Blatt 12, Aufgabe 2 Schreiben Sie eine Funktion, die aus einem zusätzlichen Vornamen und Nachnamen den Benutzernamen generiert. Dazu hat die Funktion Zugriff auf die bislang generierten Benutzernamen (usernames). string genusername(string vorname, string nachname, string &usernames); Suchen Sie in den schon generierten Namen nach den neuen Kandidaten. string tmpuser; size_t found = string::npos; found = usernames.find(tmpuser); if (found == string::npos) { // Name existiert noch nicht! Weitere Tipps zum Gebrauch der string Klasse und Datei Ein- und Ausgabe finden Sie auf den Folien zur Vorlesung 11; insbesondere auf Folien 7 und 17ff.
Prüfungsaufgabe String-Zahl-Umwandlung (22 von 120 Punkten) Schreiben Sie die Funktion convert_a_to_i, welche einen String (char*) in eine positive ganze Zahl umwandelt. Z.B. soll 42 in 42 umgewandelt werden. Überlegen Sie sich die Signatur der Funktion und implementieren Sie sie. Der Rückgabewert soll die Zahl als int sein oder -1 falls ein Fehler auftritt. Mögliche Fehler sind: Die Zahl ist negativ. Der String enthält auch Zeichen, die keine Ziffern sind. Der String hat die Länge 0. Das Zeichen 0 hat ASCII Code 48 und das Zeichen 9 hat den Code 57.
Prüfungsaufgabe Lösung #include <iostream> int convert_a_to_i(char* string, int n) { if (n <= 0) return -1; int ret = 0; int cur; for (int i = 0; i < n; ++i) { ret *= 10; cur = static_cast<int>(string[i]) - 48; if (cur < 0 cur > 9) return -1; ret += cur; return ret; int main() { std::cout << convert_a_to_i("123s", 4) << std::endl; std::cout << convert_a_to_i("-123", 4) << std::endl; std::cout << convert_a_to_i("1239887", 7) << std::endl; return 0;
Goodbye Wie schon mehrfach erwähnt: Heute ist die letzte Übungsstunde! Abgaben zu Serie 12 bitte ausschliesslich per Email. Die Korrekturen und Testatinfos kommen auch per Email zurück (bis spätestens 8.6.). Korrigierte und nicht abgeholte Serien können sie bei mir im Büro abgeholt werden. Sie sind ab dem 27.5. bei Frau Salow CAB G19.1 hinterlegt. Bitte Legi mitbringen. ACHTUNG: Wir werden die Serien für 4 Wochen aufbewahren; danach werden sie entsorgt. Viel Erfolg bei der Prüfung!