\begin{slide}{Aufzählungstypen}

können einer Teilmenge ganzer Zahlen zugeordnet werden
\begin{itemize}
\item vorgegeben: int, char, boolean
\item nutzerdefiniert (enum)
\begin{verbatim}
typedef enum { 
  Mon, Tue, Wed, Thu, Fri, Sat, Sun 
} day;
\end{verbatim}
\end{itemize}

Designfragen:
\begin{itemize} \itemsep 2pt
\item automatisch nach \verb|int| umgewandelt?
\item automatisch von \verb|int| umgewandelt?
\item eine Konstante in mehreren Aufzählungen möglich?
\end{itemize}


\end{slide}

\begin{slide}{Keine Aufzählungstypen}

das ist nett gemeint, aber vergeblich:
\begin{verbatim}
#define Mon 0
#define Tue 1
...
#define Sun 6

typedef int day;

int main () {
    day x = Sat;
    day y = x * x;
}
\end{verbatim}
\end{slide}

\begin{slide}{Aufzählungstypen in C}

im wesentlichen genauso nutzlos:
\begin{verbatim}
typedef enum { 
   Mon, Tue, Wed, Thu, Fri, Sat, Sun 
} day;

int main () {
    day x = Sat;
    day y = x * x;
}
\end{verbatim}

Übung: was ist in C++ besser?

\end{slide}

\begin{slide}{Aufzählungstypen in Java}

\begin{verbatim}
enum Day {
    Mon, Tue, Wed, Thu, Fri, Sat, Sun;

    public static void main (String [] argv) {
        for (Day d : Day.values ()) {
            System.out.println (d);
        }
    }
}
\end{verbatim}

verhält sich wie Klasse

(genauer: Schnittstelle mit 7 Implementierungen)

siehe Übung (jetzt oder bei Objekten) 
\end{slide}

\begin{slide}{Teilbereichstypen in Ada}

\begin{small}
\begin{verbatim}
with Ada.Text_Io;
procedure Day is
   type Day is ( Mon, Tue, Thu, Fri, Sat, Sun );
   subtype Weekday is Day range Mon .. Fri;
   X, Y : Day;
begin
   X := Fri;     Ada.Text_Io.Put (Day'Image(X));
   Y := Day'Succ(X); Ada.Text_Io.Put (Day'Image(Y));
end Day;
\end{verbatim}
\end{small}

mit Bereichsprüfung bei jeder Zuweisung.

einige Tests können aber vom Compiler
statisch ausgeführt werden!

\end{slide}


\begin{slide}{Abgeleitete Typen in Ada}

\begin{verbatim}
procedure Fruit is
   subtype Natural is 
       Integer range 0 .. Integer'Last;
   type Apples  is new Natural;
   type Oranges is new Natural;
   A : Apples; O : Oranges; I : Integer;
begin -- nicht alles korrekt:
   A := 4; O := A + 1; I := A * A;
end Fruit;
\end{verbatim}
Natural, Äpfel und Orangen sind isomorph,
aber nicht zuweisungskompatibel.
  
Sonderfall: Zahlenkonstanten gehören
zu jedem abgeleiteten Typ.

\end{slide}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
