Kurs 793 Software Engineering I Seite: 5 Aufgabe (2 Punkte) Dienstverträge Problembeschreibung An einem Informatik-Lehrstuhl der FernUni werden studentische Hilfskräfte beschäftigt. Die Hilfskräfte können die Einsendeaufgaben eines Kurses korrigieren, Verwaltungstätigkeiten für einen bestimmten Kurs ausführen oder bei einem Forschungsprojekt mitarbeiten. Der Arbeitsort hängt vom Tätigkeitsbereich ab: Korrekturkräfte arbeiten normalerweise zu Hause, während die Kursverwaltung z.b. immer eine Präsenzaufgabe ist. Jede Hilfskraft bekommt jeweils einen auf einen bestimmten Zeitraum befristeten Dienstvertrag, in dem die wöchentliche Arbeitszeit und die Tätigkeitsbereiche (Korrektur, Kursverwaltung oder Forschungsprojekt) festgehalten sind. Beim Tätigkeitsbereich Korrektur muß die Kursnummer und die wöchentliche Anzahl der zu korrigierenden Einsendeaufgaben festgehalten werden, bei der Kursverwaltung wird nur die Kursnummer gespeichert und beim Forschungsprojekt wird ein Projektname und der Name eines verantwortlichen Mitarbeiters gespeichert. Manche Hilfskräfte haben mehrere Tätigkeitsbereiche gleichzeitig und arbeiten für mehrere Kurse und Projekte, bekommen aber trotzdem nur einen Dienstvertrag, in dem die jeweiligen Tätigkeitsbereiche aufgelistet sind. Ausgehend von der Problembeschreibung ist es Ihre Aufgabe, die Daten des Systems durch ein ER-Diagramm so zu modellieren, daß ein daraus entworfenes Programm die folgenden Anfragen beantworten kann:. Welche Hilfskräfte waren am.4.999 am Lehrstuhl beschäftigt? 2. Welche Aufgaben hatte die Hilfskraft X in den Verträgen von 996-998? 3. Welche Hilfskräfte waren am.4.999 für die Verwaltung des Kurses 793 verantwortlich? 4. Welche Hilfskräfte haben sowohl in der Kursverwaltung als auch in der Korrektur von Einsendeaufgaben Erfahrung? 5. Wie heißt der verantwortliche Mitarbeiter für das Projekt P? 6. Welche Hilfskräfte arbeiten zu Hause (an Korrekturen oder Forschungsprojekten)? (b.w.)
Seite: 6 Kurs 793 Software Engineering I Aufgabenstellung Stellen Sie das ER-Diagramm graphisch dar und geben Sie zu jedem Entitätstyp durchschnittlich zwei Attribute an. Anhand der obigen Anfragen können Sie überprüfen, ob Ihr Modell ausreicht.
Kurs 793 Software Engineering I Seite: 7
Seite: 8 Kurs 793 Software Engineering I Aufgabe 2: (2 + 4 = 6 Punkte) Mini-Taschenrechner In dieser Aufgabe sollen Sie das Ereignismodell eines einstelligen boolschen Taschenrechners (vgl. Abb. 2.) weiterentwickeln: mini + = Abb. 2.: Mini-Taschenrechner Der Taschenrechner rechnet nach folgenden Regeln: + = + = + = + = und basierte bisher auf dem Ereignismodell in Abb. 2.2 (s.u.). Die Anwender des Rechners wünschen sich für die nächste Generation von Minitaschenrechnern die Möglichkeit, auch mehr als zwei Summanden addieren zu können. Nach jedem Betätigen der Plustaste soll das aktuelle Zwischenergebnis angezeigt werden: Beispiel: + + + = gedrückte Taste + + + = anschließend angezeigte Zahl Außerdem soll man eine falsch eingetippte Zahl korrigieren können, indem man nach der falschen Zahl direkt die richtige Zahl eintippt. Es wird immer die zuletzt eingegebene Zahl (bzw. Ziffer, da alle Zahlen einstellig sind) gewertet:
Kurs 793 Software Engineering I Seite: 9 Beispiel: + + = gedrückte Taste + + = anschließend angezeigte Zahl Aufgabenstellung: a) Ergänzen Sie in dem Ereignisdiagramm in Abb. 2.2 zusätzliche Zustandsübergänge und/oder Zustände, so daß die zwei Wünsche der Anwender erfüllt werden. b) Überlegen Sie sich einen Ansatz, wie man die Zustände und Zustandsübergänge des Ereignisdiagramms in einen Implementationsentwurf (z.b. eine Prozedur) umsetzen könnte und skizzieren Sie Ihre Idee kurz (z.b. in strukturierter Sprache). gedrückte Taste angezeigte Zahl + + + + = = Start + + + = + = Abb. 2.2: Ereignisdiagramm des Mini-Taschenrechners
Seite: Kurs 793 Software Engineering I Aufgabe 3 (9 + 4 + 5 + 4 = 22 Punkte) Hierarchischer Modulgraph Für das Software-Praktikum an der FernUni soll ein graphischer Editor entworfen werden, mit dem man die graphische Darstellung einer modularen Architektur (bestehend aus Modulen und Teilsystemen sowie Benutzungsbeziehungen, die die Module und Teilsysteme miteinander verbinden) erstellen und editieren kann. Das ER-Diagramm in Abb. 3. beschreibt einen Ausschnitt der von dem graphischen Editor zu verwaltenden Daten: Benutzungsbez. n Objekt n verbindet 2 Modul Knoten enthält Teilsystem Abb. 3.: ER-Diagramm für einen graphischen Editor In dieser Aufgabe soll das ER-Diagramm aus Abb. 3. in einen datenstrukturorientierten Grobentwurf übertragen werden.
Kurs 793 Software Engineering I Seite: Aufgabenstellung: a) Übertragen Sie die Entitätstypen Objekt, Benutzungsbeziehung, Knoten, Teilsystem und Modul, indem Sie die resultierenden Moduln und Teilsysteme (aus der Sicht des Entwerfers) graphisch darstellen. Ignorieren Sie zunächst die Beziehungen verbindet und enthält. Hinweis: Die IDs sollen automatisch vom System vergeben werden. b) Beschreiben Sie, wie die (,n)-beziehungen enthält und und die (2,n)-Beziehung verbindet übertragen werden, indem Sie die folgenden Fragen beantworten:. In welchen ADTs müssen jetzt zusätzlich Fremdschlüssel gespeichert werden? 2. Aus welchem Modul werden die Schlüssel jeweils importiert? c) Skizzieren Sie die Architektur des Gesamtsystems (aus der Sicht des Verwenders). d) In Ihrem Entwurf sollte ein Behälter-ADO vorkommen. Von welchem Typ sind die in diesem Behälter gespeicherten Elemente? Sehen Sie Probleme bei der Umsetzung des Entwurfs in Modula-2?
Seite: 2 Kurs 793 Software Engineering I
Kurs 793 Software Engineering I Seite: 3
Seite: 4 Kurs 793 Software Engineering I Aufgabe 4 (3 + 7 + 8 = 28 Punkte) Generische ID-Verwaltung Im Kap. 6.2 des Kurstextes (S. 272) wurde am Beispiel des Teilsystems Daueraufträge demonstriert, wie man durch Verwendung von generischen Komponenten Redundanz vermeiden kann. In dieser Aufgabe soll das Prinzip auf das Teilsystem Kunden übertragen werden: Kunden TS KundenOrdner ADO Jeder Kunde wird durch eine KundenID eindeutig identifiziert. Die Vergabe von KundenIDs geschieht im ADT KundenIDVerwaltung, der aus dem generischen ADT ID- Verwaltung abgeleitet ist. Zur Speicherung der zurückgegebenen IDs verwendet die IDVerwaltung den GADT SortierteObjektliste (vgl. Kurstext S. 29). Die Module Kundenordnerschablone und Kundenordner werden in dieser Aufgabe nicht weiter betrachtet. KundenOrdnerschablone ADT KundenID- Verwaltung ADT Kunde ADT KundenID ADT IDVerwaltung GADT Sortierte- Objektliste GADT Abb. 4.:: Das Teilsystem Kunden
Kurs 793 Software Engineering I Seite: 5 a) Ergänzen Sie in der folgenden Modulspezifikation des ADT-Moduls KundenID die Prozeßspezifikationen für die Operationen Create, Duplicate, und Equalize. Als Berechnungsvorschrift für die Schlüssel können Sie die Identitätsfunktion verwenden (d.h. der Schlüssel ist gleich der SeqNr): MODULSPEZIFIKATION ADT KundenID ENTHALTEN IN Kunden; SCHNITTSTELLENSPEZIFIKATION EXPORTE DATENTYPEN TKundenID; OPERATIONEN Create (IN SeqNr : CARDINAL) : TKundenID, Dispose (INOUT ID : TKundenID), Duplicate (IN QuellID : TKundenID) : TKundenID, IsEqual (IN ID, ID2 : TKundenID) : BOOLEAN, Equalize (INOUT ZielID : TKundenID; IN QuellID : TKundenID), SameSeqNr (IN ID, ID2 : TKundenID) : BOOLEAN, SmallerSeqNr (IN ID, ID2 : TKundenID) : BOOLEAN; SEMANTIK (* -- Dispose, Duplicate, IsEqual, Equalize mit üblicher Semantik *) Create : Vorbed.: keine Berechnet aus SeqNr den entsprechenden Identifikator der IDFolge Nachbed.:RückgabeADO ID existiert; Duplicate : Vorbed.: keine Erzeugt eine exakte Kopie (neueid) der QuellID Nachbed.: (neueid existiert) und (IsEqual(QuellID, neueid)) und (neueid ist nicht identisch mit QuellID) Equalize : Vorbed.: keine Gleicht die Attribute der ZielID an die QuellID an, wobei die Identität der ADOs nicht verändert wird. Nachbed.: (QuellID alt = QuellID neu ) und (ZielID alt = ZielID neu ) und IsEqual(QuellID alt, ZielID neu ) SameSeqNr : Vorbed.: keine Prüft, ob ID und ID2 aus dem gleichen Folgeglied generiert wurden Bezeichne same den booleschen Rückgabeparamenter, dann gilt: Nachbed.:same ID und ID2 haben die gleiche SeqNr SmallerSeqNr :Vorbed.: keine Prüft, ob ID aus einem kleineren Folgeglied generiert wurden als ID2 Bezeichne smaller den booleschen Rückgabeparamenter, dann gilt: Nachbed.:smaller ID hat eine kleinere SeqNr als ID2 (***************************************************************************************************)
Seite: 6 Kurs 793 Software Engineering I RUMPFSPEZIFIKATION TKundenID = RECORD SeqNr, Schluessel : CARDINAL END; Prozeßspezifikation Create END Create; Prozeßspezifikation Duplicate END Duplicate; Prozeßspezifikation Equalize END Equalize; SPEZIFIKATIONSENDE MODUL KundenID. Abb. 4.2: Der Modul KundenID
Kurs 793 Software Engineering I Seite: 7 b) Ergänzen Sie die Rumpfspezifikation des ADT KundenIDVerwaltung: MODULSPEZIFIKATION ADT KundenIDVerwaltung ENTHALTEN IN Daueraufträge; SCHNITTSTELLENSPEZIFIKATION IMPORTE AUS KundenID IMPORTIERE TKundenID; EXPORTE DATENTYPEN TKundenIDVerwaltung, TKundenID; OPERATIONEN Create : TKundenIDVerwaltung, Dispose (INOUT DIV: TKundenIDVerwaltung), HoleNeueID (INOUT DIV : TKundenIDVerwaltung) : TKundenID, ÜberlasseAlteID (INOUT DIV : TKundenIDVerwaltung; IN ID : TKundenID); SEMANTIK Die Semantik der Operationen bleibt gegenüber der IDVerwaltung (s. folgende Seite) unverändert. (****************************************************************************************************) RUMPFSPEZIFIKATION SPEZIFIKATIONSENDE MODUL KundenIDVerwaltung. Abb. 4.3: Der Modul KundenIDVerwaltung
Seite: 8 Kurs 793 Software Engineering I c) Ergänzen Sie die Prozeßspezifikation für die Operationen Dispose und UeberlasseAlteID in der folgenden Modulspezifikation des GADT-Moduls IDVerwaltung: GENERISCHE MODULSPEZIFIKATION GADT IDVerwaltung; FORMALE GENERISCHE PARAMETER GENERISCHE DATENTYPEN TID; (* -- Identifikatortyp*) GENERISCHE OPERATIONEN SameSeqNr (IN Id, Id2 : TID) : BOOLEAN, SmallerSeqNr (IN Id, Id2 : TID) : BOOLEAN; (******************************************************************************************************) SCHNITTSTELLENSPEZIFIKATION EXPORTE DATENTYPEN TIDVerwaltung [TID], TID; OPERATIONEN Create : TIDVerwaltung [TID], Dispose (INOUT IV: TIDVerwaltung [TID]), HoleNeueID (INOUT IV : TIDVerwaltung [TID]) : TID, ÜberlasseAlteID (INOUT IV : TIDVerwaltung [TID]; IN ID : TID); SEMANTIK (* -- Create, Dispose mit üblicher Semantik *) HoleNeueID : Vorbed.: keine Liefert eine z.z. unbenutzte ID. Sei aktid der Rückgabeparameter, dann gilt: Nachbed.:(aktID existiert) AND (aktid NOT IN inoutiv); ÜberlasseAlteID : Vorbed.: (ID NOT IN IV) Übergibt eine z.z. unbenutzte ID an die ID-Verwaltung. Sie wird bis zur nächsten Verwendung intern gespeichert. Nachbed.:(inID IN inoutiv); (*****************************************************************************************************) RUMPFSPEZIFIKATION IMPORTE IMPORTIERE SortierteObjektliste; TIDVerwaltung [TID] =RECORD IDFolge : CARDINAL; FreieIDs [TID] : SortierteObjektliste.TSortierteObjektliste[TID]; END;...
Kurs 793 Software Engineering I Seite: 9 Prozeßspezifikation Dispose END Dispose;... Prozeßspezifikation UeberlasseAlteID END UeberlasseAlteID; SPEZIFIKATIONSENDE GENERISCHER MODUL IDVerwaltung. Abb. 4.4: Der Modul IDVerwaltung
Seite: 2 Kurs 793 Software Engineering I Aufgabe 5 ( + + 2 = 22 Punkte) Umkodierung Die in Modula-2 geschriebene Prozedur ZahlUmwandeln (Abb. 5.) wandelt eine deutsche Fließkommazahl in eine englische um und umgekehrt, indem Punkte in Kommata und Kommata in Punkte verwandelt werden. Beispiel: 2.,2 wird zu 2,.2 2,.2 wird zu 2.,2 Hinweis: Wenn ein ARRAY OF CHAR länger ist als der darin gespeicherte String, so wird das Ende des Strings durch das Zeichen CHR() markiert. PROCEDURE ZahlUmwandeln(inZahl:ARRAY OF CHAR; 2 VAR outzahl:array OF CHAR); 3 (* -- Vorbed.: HIGH(outZahl) >= HIGH(inZahl) *) 4 5 VAR 6 Index : CARDINAL; 7 8 BEGIN 9 Index := ; WHILE Index <= HIGH(inZahl) DO IF inzahl[index] =. THEN 2 outzahl[index] :=, 3 ELSIF inzahl[index] =, THEN 4 outzahl[index] :=. 5 ELSE 6 outzahl[index] := inzahl[index]; 7 END; 8 Index := Index + ; 9 END; 2 (* -- Nachbed.: Length(outZahl) = Length(inZahl) AND 2 -- in outzahl sind Punkte durch Kommata 22 -- und Kommata durch Punkte ersetzt. *) 23 END ZahlUmwandeln; Abb. 5.: Die Modula-2-Prozedur ZahlUmwandeln.
Kurs 793 Software Engineering I Seite: 2 Aufgabenstellung: a) Erstellen Sie für die Prozedur ZahlUmwandeln einen kompaktifizierten Kontrollflußgraphen. Geben Sie dabei zu jedem Knoten bzw. Block an, welche Programmzeilen von diesem Knoten bzw. Block repräsentiert werden. Dies kann z.b. in der folgenden Form geschehen: n block 57-63 Numerieren Sie die Knoten anschließend von oben nach unten durch.
Seite: 22 Kurs 793 Software Engineering I b) Testen Sie die Prozedur ZahlUmwandeln mit Hilfe des Boundary interior-pfadtests, indem Sie für jeden Testfall eine Eingabe und die erwartete Ausgabe angeben. Geben Sie zu mindestens vier Testfällen auch den Pfad (als Folge von Knotennummern) an: Eingabe Ausgabe Pfad c) Arbeitet die Prozedur ZahlUmwandeln immer fehlerfrei?