/* A not quite correct vote counting program. By Fredrik �hrstr�m fredrik.ohrstrom@seamless.se */ #include #include struct PresidentCandidate { char name[80]; unsigned long votes; }; enum Candidates { BUSH=0, KERRY=1, NADER=2, OTHER=3 }; struct PresidentCandidate candidates[OTHER+1]; #define BUSH(v) (v=='b' || v=='B') #define KERRY(v) (v=='k' || v=='K') #define NADER(v) (v=='n' || v=='N') #define OTHER(v) !BUSH(v) && !KERRY(v) && !NADER(v) struct PresidentCandidate* lookupCandidate (int input) { if (isspace(input)) return NULL; if (!OTHER(input)) { if (BUSH(input)) return &candidates[BUSH]; if (KERRY(input)) return &candidates[KERRY]; if (NADER(input)) return &candidates[NADER]; } return &candidates[OTHER]; } int main () { int input, i; strcpy (candidates[BUSH].name, "Bush"); strcpy (candidates[KERRY].name, "Kerry"); strcpy (candidates[NADER].name, "Nader"); strcpy (candidates[OTHER].name, "Other"); while ((input=getchar())!=EOF) { struct PresidentCandidate *pc = lookupCandidate (input); if (pc!=NULL) pc->votes++; } for (i=0; i<=OTHER; ++i) { printf("%s %d\n",candidates[i].name, candidates[i].votes); } return 0; }