Ü B U N G E N zu Programmiersprache 1 (C++) WS 2016/2017 Übungsblatt 9: In der Übungsstunde! 56) Programmieren Sie in der Datei Vector2D-1.cpp eine Klasse Vector2 von 2D Vektoren, sodass das Programm fehlerfrei compiliert werden kann und richtig funktioniert. 57) a) Erzeugen Sie mittels exponentialverteilter Zufallszahlen mit Erwartungswert 6 (Minuten) einen Fahrplan für eine fiktive Linie O, bei der die Busse ab 6 Uhr Früh bis 22 Uhr Abends zufällig alle 6 Minuten abfahren. Rechnen Sie in Minuten und geben Sie auch die Zeitpunkte als Minuten aus. b) Wiederholen Sie den Tag 10000 Mal. Geben Sie nur die ersten 3 Fahrpläne aus. c) Machen Sie eine Statistik über alle Abfahrtsintervalle (mit SimpleStat ). d) Machen Sie eine Statistik über mein Busintervall. Ich komme jeden Tag um 13 Uhr 13 an. Markieren Sie im Fahrplan meinen Bus. e) Sehen Sie nach, mit welchem Bus ich am 1. Tag fahre. Machen Sie eine Statistik über die Abfahrtsintervalle des Busses mit dieser Busnummer. f) Erstellen Sie weitere Statistiken über meine Wartezeit, die Nr. meines Busses, die Anzahl der Busse pro Tag. Übungsblatt 9: Die Aufgaben 58 bis 60 sind Pflicht! 58) a) Sie sollen einen Multiple-Choice-Test entwerfen, bei dem in 12 Fragen jeweils Antwortmöglichkeiten a) bis d) anzukreuzen sind, die entweder wahr oder falsch sind. Sie vergeben pro Frage einen Punkt, wenn darin alle Teilfragen a) bis d) richtig ausgewählt sind. Auf wieviel Punkte kommt im Schnitt ein Student, wenn er jeden Unterpunkt mit Wahrscheinlichkeit p = 0.40 , 0.50, 0.60, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.0 beantworten kann? Machen Sie für jeden dieser Werte von p 1000 Wiederholungen und werten Sie die dabei erzielten Gesamtpunkte statistisch aus: Starten Sie bei jedem Studenten mit 0 Punkten und addieren Sie die Ergebnisse der einzelnen Fragen auf. Jeder Unterpunkt entspricht einer Bernoulli-Stichprobe( p ) (1 richtig, 0 falsch), sodass die Frage selbst als Binomial-Stichprobe(4, p ) mit Werten {0, 1, 2, 3, 4} entsprechend 0, 1, 2, 3 oder 4 richtigen Unterpunkten modelliert werden kann. Nur mit 4 richtigen Unterantworten erhält man den Punkt für die Frage. Für die Statistik verwenden Sie am besten SimpleStat . b) Variieren Sie den Test, indem Sie pro völlig richtig beantworteter Frage 3 Punkte und für eine Frage mit genau einer falschen Unterantwort 1 Punkt vergeben. Ü B U N G E N zu Programmiersprache 1 (C++) WS 2016/2017 59) Bauen Sie die Klasse Vector2 noch weiter aus, sodass am Ende auch das Programm in Vector2D-2.cpp fehlerfrei funktioniert: a) Erweitern Sie die Klasse durch Klassenmethoden Vector2 operator-() const : negatives Vorzeichen Vector2 operator-(const Vector2& b) const : Vektorsubtraktion double operator*(const Vector2& b) const : Skalarprodukt b) Schreiben Sie hinter der Klasse noch folgende Funktionen: double norm(const Vector2& a) : Euklidische Norm double angle(const Vector2& a, const Vector2& b) : Winkel double crossproduct(const Vector2& a, const Vector2& b) : Kreuzprod. Die letzte Funktion müssen Sie auch als Freund in der Klasse deklarieren. 60) a) Kopieren Sie die Datei Int.cpp von der Homepage. Sie verwendet einen Objekttyp Int , den Sie programmieren sollen. Definieren Sie vor dem Programm die Klasse Int , die als privates Attribut den int x besitzt. Ferner schreiben Sie für die Klasse: — Einen Default-Konstruktur, der x auf -1 setzt und Ctor Int(): x = ... ausgibt, — Einen Konstruktur Int(a) , der x auf a setzt und Ctor Int(int): x = ... ausgibt, Einen Destruktor, der Dtor ~Int(): x = ... ausgibt, b) — Einen Copy Constructor Int(const Int& a) , der x auf a.x+100 setzt und Copy-Ctor Int(const Int&): x = ... ausgibt. c) Einen Zuweisungsoperator Int& operator=(const Int& a ), der x auf a.x-1000 setzt, =(const Int&): x = ... ausgibt, und *this als Resultat zurückgibt. Seite 2 Ü B U N G E N zu Programmiersprache 1 (C++) WS 2016/2017 61) WC-Stochastik: Es geht darum, den Klopapierverbrauch der Technik zu simulieren: Es gebe 20 Toiletten und jede Klopapierrolle wird im Schnitt in einem halben Tag verbraucht. Da Nachbestellungen innerhalb einer Woche ausgeliefert werden, möchte man den maximalen Verbrauch pro Woche wissen, um die Nachbestellungsmenge zu optimieren. Simulieren Sie 1000 einzelne Jahre, als Zeiteinheit nehmen wir Wochen. Das Jahr hat dann 52 Wochen, also definieren wir ein Zählarray mit dieser Dimension. Die Lebenszeit einer Klorolle ist 0.1 Wochen (bei einer 5-Tage Woche). In einer Schleife über die Anzahl der WCs ermitteln Sie die Zeitpunkte t , wann eine neue Rolle eingespannt wird. Den entsprechenden Wochenzähler inkrementieren Sie dann (dazu bitte t in einen int umwandeln). Nachdem alle WCs abgearbeitet sind, bestimmen Sie die Woche mit dem höchsten Verbrauch. Diesen Maximalwert speichern Sie in einer SimpleStat -Statistik, die Sie am Ende auswerten. Gibt es in dieser Simulation ‘Durchfall-Wochen’ ? Machen Sie dazu eine Statistik über die Nummern der schlechtesten Wochen. 62) Bauen Sie Aufgabe 59 wie folgt um: a) Definieren Sie eine Klasse Dreieck , die als private Attribute die 3 Eckpunkte Vector2 a , b , c besitzt (die Unterstriche verwendet man oft bei Namen von Klassenattributen). Die Klasse braucht einen Konstruktor mit den 3 Eckpunkten als Argumente. b) Folgende Klassenmethoden erstellen Sie: Vector2 A(), B(), C() const : diese geben die Eckpunkte zurück. Vector2 AB(), BC(), CA() const : diese geben die Seitenvektoren zurück. double a(), b(), c() const : diese geben die Seitenlängen zurück. double alpha(), beta(), gamma() const : diese geben die Winkel zurück. double area() const : gibt die orientierte Fläche zurück. c) Die Ausgabe des Beispiels 59 formen Sie um zu einer Ausgabe des Dreiecksobjekts, wo Sie die neuen Methoden verwenden. D.h. main() besteht am Ende nur noch aus: int main() { Vector2 A{1, 1}, B{5, 2}, C{-1, 7}; // Ecken eines Dreiecks Dreieck T(A, B, C); cout << T; return EXIT_SUCCESS; } Als Klassenmethoden schr Seite 3