Programeer opdrachtenOpdracht : opdr2_aapopfiets.txt

Terug naar de inzendingen
Opdracht 2,Tim Cooijmans
25-Jan-2005
 Wat een simpele opdracht Razz Mijn tarball staat op http://aapopfiets.nl/hotelkamer.tar.gz. Hier de lap code die het is geworden:
 
 In de tarball zit ook een README met instructies voor compilen en gebruiken, en
 de nodige flauwe woordgrappen. Veel plezier ermee Smile
 1 
*****hotel.c*****
  
 2/*
 3 * ----------------------------------------------------------------------------
 4 * "THE BEER-WARE LICENSE" (Revision 42):                                       
 5 *  wrote this file.  As long as you retain this notice you 
 6 * can do whatever you want with this stuff. If we meet some day, and you think
 7 * this stuff is worth it, you can buy me a beer in return.       Tim Cooijmans
 8 * ----------------------------------------------------------------------------
 9*/
 10
 11#include 
 12
 13enum {
 14   S_GEEN,
 15   S_BED_CENTRAAL,
 16   S_BED_SCHEMER,
 17   S_BED_BEIDEN,
 18   S_DEUR,
 19   S_BALIE
 20} e_switches;
 21
 22enum {
 23   L_GEEN,
 24   L_CENTRAAL,
 25   L_SCHEMER,
 26   L_BEIDEN
 27} e_status;
 28
 29int lcentraal = 0, lschemer = 0;
 30
 31int toggle (int s) {
 32   switch (s) {
 33      case S_BED_CENTRAAL:
 34         lcentraal = !lcentraal;
 35         break;
 36      case S_BED_SCHEMER:
 37         lschemer = !lschemer;
 38         break;
 39      case S_BED_BEIDEN:
 40         lcentraal = !lcentraal;
 41         lschemer = !lschemer;
 42         break;
 43      case S_DEUR:
 44         // beiden uit dan beiden aan
 45         if (!lcentraal && !lschemer) lcentraal = lschemer = 1;
 46         
 47         // centraal aan dan beiden uit
 48         else if (lcentraal) lcentraal = lschemer = 0;
 49         
 50         // schemer aan dan centraal ook aan
 51         // nog een keer drukken dan uit wordt afgehandeld door statement
 52         // hierboven
 53         else if (lschemer) lcentraal = 1;
 54         
 55         break;
 56      case S_BALIE:
 57         lcentraal = lschemer = 0;
 58         break;
 59   }
 60   
 61   // lschemer maal 2 omdat deze 2x meetelt in het resultaat, zie e_status
 62   return lcentraal + lschemer * 2;
 63}
 64
 65void uitvoer (int i) {
 66   // so sue me
 67   system ("clear");
 68   
 69   // spuit ASCII zooi in de rondte
 70   printf ("       _             _      \n");
 71   printf ("      (");
 72   
 73   // Centrale lamp status
 74   switch (i) {
 75      // aan
 76      case L_BEIDEN: case L_CENTRAAL:
 77         printf ("*");
 78         break;
 79      
 80      // uit of ongeldige status, doe maar alsof het zaakje uit is
 81      default:
 82         printf (" ");
 83         break;
 84   }
 85   
 86   printf (")           (");
 87   
 88   // Schemerlamp status
 89   switch (i) {
 90      // aan
 91      case L_BEIDEN: case L_SCHEMER:
 92         printf ("*");
 93         break;
 94      
 95      // uit of ongeldige status, doe maar alsof het zaakje uit is
 96      default:
 97         printf (" ");
 98         break;
 99   }
 100   
 101   // en sluit de ASCII zooi maar af
 102   printf (")     \n"
 103   "       U             U      \n"
 104   " centrale lamp  schemerlamp \n");
 105}
 106
 107int invoer (void) {
 108   int i = 0;
 109   
 110   printf ("schakelaar> ");
 111   fflush (stdout);
 112   
 113   scanf ("%i", &i);
 114   
 115   return i;
 116}
 117
 118int main (void) {
 119   uitvoer (L_GEEN);
 120   
 121   // de onleesbare code award gaat dit jaar naar Tim!
 122   while (1) uitvoer (toggle (invoer ()));
 123   
 124   return 0;
 125}
 
 
Mijn commentaar
 
 Tim,
 Mijn belangrijkste kritiek is ide nogal magere documentatie !
 Ik heb je zelf al eens laten vaststellen dat documentatie erg belangrijk is,
 zeker als je een programma voor een klant (in dit geval ik dus) schrijft.
 Op die manier kunnen colega's je software beter onderhouden.
 Technisch heb ik de volgende opmerkingen.
 
 - Het gebruik van enum definietie in regel 12 en 21, is heel netjes !
 echter, je voldoet niet aan de opdracht omdat de codes die eruit rollen noet voldoen aan de technische specificaties.
 Je had dat gemakelijk kunnen oplossen door deze b.v. als volgt te declareren:
 [I]
 #13 S_GEEN=0,
 #14 S_BED_CENTRAALi=1,
 #15 S_BED_SCHEMER=2,
 #16 S_BED_BEIDEN=3,
 #17 S_DEUR=4,
 #18 S_BALIE=8
 [/I]
 
 Het gebruik van globale variabelen (regel 28) valt (zeker voor zo'n project) af te raden.
 Als je deze variabele ook als parameter had meegegeven (zie uitleg van Dirk Gerritsi op het forum) dan had je opdracht ook nog eens voldaan aan het criterium dat de code gemakelijk voor gebruik in meerdere hotelkamers is toe te passen.
 
 Je code ziet er overigens wel erg netjes en doordacht uit.
 Het gebruik van de enumtypes maakt de zaak als goed leesbaar.