enum
Problembezogene Konstanten
14.11.2002 Prof. Zavodnik 2
Verdeckte int s mit sinnvollen Namen
Sie können verwendet werden, wo int s verwendet werden können, z.B. in for –Schleifen
Sie werden gewöhnlicherweise mit
dem Typ enum erklärt
enum Wochentyp {Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag};
enum Wochentyp Tag;
14.11.2002 Prof. Zavodnik 4
Schlüsselwort enum bei
Deklaration von Tag erforderlich Wochentyp ist der Typ der
Variablen
Die Werte für Tag sind Montag, Dienstag, usw.
Man kann aufsteigende Werte für
Aufzählungstypen definieren
enum Wochentyp {Montag = 3, Dienstag, Mittwoch, Donnerstag = 10, Freitag,
Samstag = 100, Sonntag}
14.11.2002 Prof. Zavodnik 6
cpp
Mittels #define Sind zu meiden
Alte C-Sprache-Eigenschaft
#define Montag 1
#define Dienstag 2
#define Mittwoch 3
#define Donnerstag 4
#define Freitag 5
#define Samstag 6
#define Sonntag 7
14.11.2002 Prof. Zavodnik 8
#include <stdio.h>
int main(void) {
float Stunden, Lohn, Stundenlohn;
int i;
Lohn = 0.0;
printf("Bitte Stundenlohn eingeben: ");
scanf("%f“, &Stundenlohn);
for (i=1; i < 8; i++){
printf("Bitte Anzahl Stunden fuer Tag %d eingeben: ",i);
scanf("%f", &Stunden); printf("\n");
if ((i==1)||(i==2)||(i==3)||(i==4)||(i==5)) Lohn = Lohn + Stunden*Stundenlohn;
else if (i == 6) Lohn = Lohn + 1.5*Stunden*Stundenlohn;
else if (i == 7) Lohn = Lohn + 2.0*Stunden*Stundenlohn;
else printf("Unmoeglich"); } /*for*/
printf("Lohn fuer die Woche ist %8.2f\n", Lohn);
return 0;
}
Programm ist schwer zu lesen
Aufzählungen hier nicht verwendet
Was ist die Rolle von i ?
14.11.2002 Prof. Zavodnik 10
#include <stdio.h>
#define Montag 1
#define Dienstag 2
#define Mittwoch 3
#define Donnerstag 4
#define Freitag 5
#define Samstag 6
#define Sonntag 7 int main(void)
{
float Stunden, Lohn, Stundenlohn;
int Tag;
Lohn = 0.0;
printf("Bitte Stundenlohn eingeben: ");
scanf("%f“, &Stundenlohn);
for (Tag = Montag; Tag <= Sonntag; Tag++)
{
printf("Bitte Anzahl Stunden fuer ");
switch (Tag){
case Montag : printf("Montag");
break;
case Dienstag : printf("Dienstag");
break;
case Mittwoch : printf("Mittwoch");
break;
case Donnerstag : printf("Donnersatg");
break;
case Freitag : printf("Freitag");
break;
case Samstag : printf("Samstag");
break;
case Sonntag : printf("Sonntag");
break;
}
printf(" eingeben: ");
14.11.2002 Prof. Zavodnik 12
scanf("%f", &Stunden); printf("\n");
switch (Tag){
case Montag: case Dienstag: case Mittwoch: case Donnerstag:
case Freitag:
Lohn = Lohn + Stunden*Stundenlohn;
break;
case Samstag:
Lohn = Lohn + 1.5*Stunden*Stundenlohn;
break;
case Sonntag:
Lohn = Lohn + 2.0*Stunden*Stundenlohn;
break;
} /*switch*/
} /*for*/
printf("Lohn fuer die Woche ist %8.2f\n", Lohn);
return 0;
}
Umständlich, mit vielen Aufzählungen zu arbeiten
Programm ist immer noch schwer zu lesen
Besser: mit enum in einem sog.
typedef zu arbeiten
14.11.2002 Prof. Zavodnik 14
typedef
typedef <vorhanden_Typ> <neuer_Name>
#include <stdio.h>
typedef enum {Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag} WochentagTyp;
int main(void) {
float Stunden, Lohn, Stundenlohn;
WochentagTyp Tag;
Lohn = 0.0;
printf("Bitte Stundenlohn eingeben: ");
scanf("%f“, &Stundenlohn);
for (Tag = Montag; Tag <= Sonntag; Tag++)
14.11.2002 Prof. Zavodnik 16
{
printf("BitteAnzahl Stunden fuer ");
switch (Tag){
case Montag : printf("Montag");
break;
case Dienstag : printf("Dienstag");
break;
case Mittwoch : printf("Mittwoch");
break;
case Donnerstag : printf("Donnersatg");
break;
case Freitag : printf("Freitag");
break;
case Samstag : printf("Samstag");
break;
case Sonntag : printf("Sonntag");
break;
}
printf(" eingeben: ");
scanf("%f", &Stunden); printf("\n");
switch (Tag){
case Montag: case Dienstag: case Mittwoch: case Donnerstag:
case Freitag:
Lohn = Lohn + Stunden*Stundenlohn;
break;
case Samstag:
Lohn = Lohn + 1.5*Stunden*Stundenlohn;
break;
case Sonntag:
Lohn = Lohn + 2.0*Stunden*Stundenlohn;
break;
} /*switch*/
} /*for*/
printf("Lohn fuer die Woche ist %8.2f\n", Lohn);
return 0;
14.11.2002 Prof. Zavodnik 18
! " #
$ % &
Autoinkrement: Effekt vom #
Operator a += 1 ; aber
geschrieben a++ oder ++a.
Autodekrement: Effekt vom Operator a -= 1; aber
geschrieben a-– oder --a.
++ und – können vor (Präfix) und
nach (Postfix) einer Variablen
14.11.2002 Prof. Zavodnik 20
'( ) %
a++ heißt: Der Wert ist der aktuelle Wert von a . Nach Verwendung
wird a um 1 erhöht.
++a heißt: Aktueller Wert von a wird inkrementiert. Bei
Verwendung gilt dieser Wert Autodekrement ähnlich
Aufpassen: Seiteneffekte!
* # ?:
Syntax: <Ausdr1>?<Ausdr2>:<Ausdr3>
Vorgehensweise
<Ausdr1> wird ausgewertet
Falls Wert ≠ 0 ist, wird Wert von
<Ausdr2> zurückgegeben
Sonst wird Wert von <Ausdr3> zurück-
gegeben
14.11.2002 Prof. Zavodnik 22
int a,b,c;
a = …;
b = …;
c = (a>b)?a:b;
weist der Variable c den maximalen Wert von a und b
…
int i,j,k;
i = 0;
j = i++;
k = ++j;
printf("%d %d %d\n", i,j,k);
…
14.11.2002 Prof. Zavodnik 24
$ * &#
Besteht aus einer Folge von
Ausdrücken, die voneinander mit ',' getrennt sind
Wird von links nach rechts ausgewertet
Wert des Ausdrucks ist der Wert des letzten Ausdrucks
…
int sum, i;
for (sum = 0, i = 1; i <= n; sum +=i, i++)
…