Software Maintenance - Musterlösung zum Übungsblatt 1 Beispiel 1) Kosten für 12 Monate: Kosten altes Produkt: 1000 * 12 = 12000 Kosten Neuentwicklung: 1000 Wartung des alten Produktes während der Entwicklung + 5000 Kosten der Neuentwicklung + 600 * 11 Kosten der Verwendung für die restlichen 11 Monate ---------------- 12600 Gesamtkosten Eine Neuentwicklung für das nächste Jahr ist nicht sinnvoll. 1000 + 5000 + (x-1)*600 = x*1000 x Anzahl der Monate (immer größer 0) 5400 = 400x 13,5 = x Eine Neuentwicklung zahlt sich ab einen Nutzungszeitraum von 15 Monaten aus. Beispiel 2) Sei F die stochastische Variable, die die Zeit für die Fehlerbehebung beschreibt. Da keine Verteilungsfunktion für F angegeben wurde, kann eine Verteilungsfunktion gewählt werden. Die einfachste Art der Verteilung in diesem Fall ist die Gleichverteilung. Somit ist F nach U10,30 verteilt. Wir suchen nun die Wahrscheinlichkeit dafür, dass die Fehlerbehebung länger als 24 Stunden dauert, d.h. gesucht ist P(F>24) = 1 P(F=24). Der Wert P(F>24) kann durch Integration der Dichtefunktion der Gleichverteilung berechnet werden. Die Dichtefunktion ist in unserem Fall gegeben durch: In 30 % der Fälle muss eine Zahlung in der Höhe von 10.000 erfolgen! 10 Fehlerbehebungen? Wir nehmen an, dass der Wahrscheinlichkeit für n Fehlerbehebungen (0=n=10) durch die stochastische Variable B gegeben ist. Die Variable B ist Binominalverteilung. Wir haben eine Auswahl von 0 bis 10 Einzelbehebungen, die jeweils Alternativverteilungen entsprechen. n = 10 k = 2,... k = 1 und k = 0 p = 0,3 (= Lösung der 1. Teilfrage!)
Wir berechnen die Wahrscheinlichkeit P(B<3) dafür, dass 0,1 bzw. 2 Fehlerbehebungen durchgeführt werden müssen. Da wir uns für P(B>2) interessieren, berechnen wir nachher P(B>2)=1-P(B<3). Die Wahrscheinlichkeit für P(B=k) ist bei einer Binomialverteilung gegeben durch: Durch einsetzen erhalten wir: P(B=0)=0,02825 P(B=1)=0,12106 P(B=2)=0,23347 Und somit P(B<3)=0,38278. Die Wahrscheinlichkeit, dass mehr als 20.000 gezahlt werden muss, ist 61,7 %. Beispiel 3) Der Programmabsturz ist binominalverteilt. Das Programm muss mindestens 230 mal aufgerufen werden, damit die Wahrscheinlichkeite, dass es mindestens einmal abstürzt größer als 0,9 ist.
Beispiel 4) Kosten für 2 Programme: 25 000 Wartungskosten für Programm A 21 000 Wartungskosten für Programm B ---------- 46 000 Gesamtwartungskosten für getrennte Lösung Kosten für Kombination: 83 000 Neuentwicklungskosten 38 000 Wartungskosten x Anzahl der Jahre Jahre Getrennte Programme Kombination 5 46 000 * 5 = 230 000 83 000 + 38 000 * 5 = 273 000 10 46 000 * 10 = 460 000 83 000 + 38 000 * 10 = 463 000 15 46 000 * 15 = 690 000 83 000 + 38 000 * 15 = 653 000 Nach wie vielen Jahren zahlt sich eine Neuentwicklung aus? 46 000 * x = 83 000 + 38 000 * x 8 000 * x = 83 000 x = 10,375 Nach 10 Jahren und 4,5 Monaten zahlt sich eine Neuentwicklung aus. Beispiel 5) Sie bekommen von ihrem Vorgesetzten ein Anforderungsprotokoll. Der Vorgesetzte will das Programm inklusive Tests und Dokumentation in 2 Wochen. LÖSUNG: Wasserfallmodell Sie sind Projektleiter von einem Team von 5 Programmieren. Sie werden angestellt für einen Kunden ein Programm zu schreiben. Dieses Programm behandelt ein Problem, dass nur schwer erfassbar ist. LÖSUNG: Spiralmodell Ein Freund und sie möchten eine kleine Datenbank zum Verwalten ihrer Musik programmieren. LÖSUNG: Code and Fix Beispiel 6) Das Programm dient dazu die Firmennutzung und die Steuer von Autos einer Firma zu berechnen. Probleme: Details von Autos sind nicht erweiterbar bzw. leicht veränderbar. Der Rückgabewert von berechnefirmennutzung ist ein float und wird einem int zugewiesen. Cast von float auf int beim Aufruf von berechnesteuer. Alle Daten der Autos sind nicht gegliedert
Verbesserung des Programms: ; int main() float private_nutzung = 0,3; struct Auto auto1; struct Auto auto2; struct Auto auto3; struct Auto auto4; auto1.marke = "Ford"; auto1.typ = "Galaxy"; auto2.marke = "Seat"; auto2.typ = "Alhambra"; auto3.marke = "Audi"; auto3.typ = "A4"; auto4.marke = "Audi"; auto4.typ = "A6" float firmen_nutzung = berechnefirmennutzung(privat_nutzung,auto1); berechnesteuer(auto2, 0,2); float berechnefirmennutzung(float privat, auto) if (auto.marke == "Ford") return (1-privat)*25000; if (auto.marke == "Seat") return (1-privat)*20000; if (auto.marke == "Audi") return (1-privat)*50000; return -1; float berechnesteuer(struct Auto auto, float s) if (auto.marke == "Ford") return s*25000; if (auto.marke == "Seat") return s*20000; if (auto.marke == "Audi") return s*50000; return -1;
Erweiterung des Autos um Name und Kennzeichen String name; String kennzeichen; ; Änderung: Privatnutzung der Audis fällt auf 20% String name; String kennzeichen; float privatnutzung; ; int main() //variable privat_nutzung wird nicht mehr gebraucht //anlegen der Autos mit allen Details inklusive der //Privatnutzung für jedes Auto extra float firmen_nutzung = berechnefirmennutzung(auto1); berechnesteuer(auto2, 0,2); float berechnefirmennutzung( auto) if (auto.marke == "Ford") return (1-auto.privatnutzung)*25000; if (auto.marke == "Seat") return (1- auto.privatnutzung)*20000; if (auto.marke == "Audi") return (1- auto.privatnutzung)*50000; return -1;
Aufspaltung der Werte auf die Typen und nicht die Marken String name; String kennzeichen; float privatnutzung; int wert; ; float berechnefirmennutzung( auto) return (1-auto.privatnutzung)*auto.wert; float berechnesteuer(struct Auto auto, float steuer) return steuer*auto.wert;