\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}
