\documentclass{bschlangaul-aufgabe} \bLadePakete{uml} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 3}, Thematik = {Verhaltens-Modellierung mit Zustandsdiagrammen. Digitaluhr}, Referenz = 46116-2018-H.T1-TA1-A3, RelativerPfad = Examen/46116/2018/09/Thema-1/Teilaufgabe-1/Aufgabe-3.tex, ZitatSchluessel = examen:46116:2018:09, ZitatBeschreibung = {Thema 1 Teilaufgabe 1}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Zustandsdiagramm zeichnen}, EinzelpruefungsNr = 46116, Jahr = 2018, Monat = 09, ThemaNr = 1, TeilaufgabeNr = 1, AufgabeNr = 3, } \def\TmpRekursiv#1#2{ \umltrans[recursive=-10|10|0.5cm,recursive direction=right to right,name=#1-trans]{#1}{#1} \node[anchor=west,text width=2cm,font=\scriptsize] at (#1-trans-3){#2}; } Eine Digitaluhr kann alternativ entweder die Zeit (Stunden und Minuten) oder das Datum (Tag, Monat und Jahr) anzeigen. Zu Beginn zeigt die Uhr die Zeit an. Sie besitzt drei Druckknöpfe \textbf{A}, \textbf{B} und \textbf{C}. Mit Knopf \textbf{A} kann zwischen Zeit- und Datumsanzeige hin und her gewechselt werden.\index{Zustandsdiagramm zeichnen} \footcite[Thema 1 Teilaufgabe 1]{examen:46116:2018:09} Wird die Zeit angezeigt, dann kann mit Knopf \textbf{B} der Reihe nach erst in einen Stundenmodus, dann in einen Minutenmodus und schließlich zurück zur Zeitanzeige gewechselt werden. Im Stundenmodus blinkt die Stundenanzeige. Mit Drücken des Knopfes \textbf{C} können dann die Stunden schrittweise inkrementiert werden. Im Minutenmodus blinkt die Minutenanzeige und es können mit Hilfe des Knopfes \textbf{C} die Minuten schrittweise inkrementiert werden. Die Datumsfunktionen sind analog. Wird das Datum angezeigt, dann kann mit Knopf \textbf{B} der Reihe nach in einen Tagesmodus, Monatsmodus, Jahresmodus und schließlich zurück zur Datumsanzeige gewechselt werden. Im Tagesmodus blinkt die Tagesanzeige. Mit Drücken des Knopfes \textbf{C} können dann die Tage schrittweise inkrementiert werden. Analog blinken mit Eintritt in den entsprechenden Einstellmodus der Monat oder das Jahr, die dann mit Knopf \textbf{C} schrittweise inkrementiert werden können. Wenn sich die Uhr in einem Einstellmodus befindet, hat das Betätigen des Knopfes \textbf{A} keine Wirkung. Ebenso wirkungslos ist Knopf \textbf{C}, wenn gerade Zeit oder Datum angezeigt wird. Beschreiben Sie das Verhalten der Digitaluhr durch ein UML-Zustandsdiagramm. Dabei muss - gemäß der UML-Notation - unterscheidbar sein, was Ereignisse und was Aktionen sind. Deren Bedeutung soll durch die Verwendung von sprechenden Namen klar sein. Für die Inkrementierung von Stunden, Minuten, Tagen etc. brauchen keine konkreten Berechnungen angegeben werden. Der kontinuierliche Zeitfortschritt des Uhrwerks ist nicht zu modellieren. Zustände sind, wie in der UML üblich, durch abgerundete Rechtecke darzustellen. Sie können unterteilt werden in eine obere und eine untere Hälfte, wobei der Name des Zustands in den oberen Teil und eine in dem Zustand auszuführende Aktivität in den unteren Teil einzutragen ist. \footcite{oomup:pu:2} \begin{bAntwort} \begin{tikzpicture}[font=\scriptsize] %% % Zeit %% \begin{umlstate}{Zeitanzeige} \end{umlstate} \begin{umlstate}[y=-3,do={Stundenanzeige blinkt}]{Stundenmodus} \end{umlstate} \begin{umlstate}[y=-6,do={Minutenanzeige blinkt}]{Minutenmodus} \end{umlstate} \umltrans[arg={drücke Knopf B},pos=0.5]{Zeitanzeige}{Stundenmodus} \TmpRekursiv{Stundenmodus}{drücke Knopf C / Stunden um eins erhöhen} \umltrans[arg={drücke Knopf B},pos=0.5]{Stundenmodus}{Minutenmodus} \TmpRekursiv{Minutenmodus}{drücke Knopf C / Minuten um eins erhöhen} \umlHVHtrans[arm1=-3cm,arg={drücke Knopf B},pos=1.75,swap]{Minutenmodus}{Zeitanzeige} %% % Datum %% \begin{umlstate}[x=7,y=0]{Datumsanzeige} \end{umlstate} \begin{umlstate}[x=7,y=-3,do={Tagesanzeige blinkt}]{Tagesmodus} \end{umlstate} \TmpRekursiv{Tagesmodus}{drücke Knopf C / Tag um eins erhöhen} \begin{umlstate}[x=7,y=-6,do={Monatsanzeige blinkt}]{Monatsmodus} \end{umlstate} \TmpRekursiv{Monatsmodus}{drücke Knopf C / Monat um eins erhöhen} \begin{umlstate}[x=7,y=-9,do={Jahresanzeige blinkt}]{Jahresmodus} \end{umlstate} % \TmpRekursiv{Jahresmodus}{drücke Knopf C / Jahr um eins erhöhen} \umltrans[recursive=170|190|0.5cm,recursive direction=left to left,name=Jahresmodus-trans]{Jahresmodus}{Jahresmodus} \node[anchor=east,text width=2cm,font=\scriptsize] at (Jahresmodus-trans-3){drücke Knopf C / Jahr um eins erhöhen}; \umltrans[arg={drücke Knopf C},pos=0.5]{Datumsanzeige}{Tagesmodus} \umltrans[arg={drücke Knopf C},pos=0.5]{Tagesmodus}{Monatsmodus} \umltrans[arg={drücke Knopf C},pos=0.5]{Monatsmodus}{Jahresmodus} \umlHVHtrans[arm1=5cm,arg={drücke Knopf C},pos=1.5]{Jahresmodus}{Datumsanzeige} \umlVHVtrans[arm1=1.5cm,arg={drücke Knopf A},pos=1.5]{Zeitanzeige}{Datumsanzeige} \umltrans[arg={drücke Knopf B},pos=0.5]{Datumsanzeige}{Zeitanzeige} \end{tikzpicture} \end{bAntwort} \end{document}