Programeer opdrachtenOpdracht : opdr2_knopper.txt

Terug naar de inzendingen
Opdracht 2,Sander Knopper
20-Jan-2005
 Hier dan mijn bijdrage, ook te bekijken met syntax hightlighting op: http://www.knopper.tk/scripts/hotelkamer.phps
 Het had hier en daar misschien iets korter gekund, maar daar ben ik te lui voor om dat nog te verbeteren.
 1 
*****hotelkamer.phps*****
  
 2#!/usr/bin/php
 3
 4
 5
 6/****************************************************************
 7* Author: Sander Knopper             *
 8* Program name: Hotelkamer                    *
 9* License: GPLv2 or later                    *
 10*                                *
 11* Required: PHP 4.3.0 or higher                    *
 12****************************************************************/
 13
 14//
 15// Een check om zeker te zijn dat men dit niet probeert te draaien als script op een webserver.
 16//
 17
 18if (php_sapi_name () != "cli") {
 19
 20    echo    "Dit script is bedoeld om te draaien in een CLI omgeving, niet als extentie voor een webserver.\n\nProgramma wordt afgesloten.\n";
 21
 22    exit;
 23}
 24
 25// De array "kamers" heeft als index het kamernummer en als waarde de status v.d. lampen in die kamer
 26
 27$kamers = array ();    // Array met kamernummers (nu nog leeg)
 28
 29//
 30// Mogelijke acties voor de schakelaars zijn:
 31//
 32// 1: schakelaar voor centrale lamp bij bed
 33// 2: schakelaar voor schemerlamp bij bed
 34// 3: beide schakelaars bij bed
 35// 4: schakelaar bij deur
 36// 5: schakelaar bij de balie
 37//
 38
 39// Behorende teksten bij een integer waarde voor de status van de lampen in een kamer
 40
 41$text_status = array (0 => "Alle lampen zijn uit", 1 => "Alleen de centrale lamp is aan", 2 => "Alleen de schemerlamp is aan", 3 => "Beide lampen zijn aan");
 42
 43// Uhm, grote schermschoonmaak...;)
 44function clear_screen () {
 45
 46    system ("clear");
 47}
 48
 49
 50// Hoofdmenu
 51function main_menu () {
 52
 53    echo    "Maak een keuze uit de onderstaande opties...\n\n";
 54    echo    "\t1) Ik zit in een hotelkamer\n";
 55    echo    "\t2) Ik zit aan de balie\n";
 56    echo    "\t0) Exit\n";
 57    echo    "\n\tKeuze: ";
 58
 59    $keuze = trim (fgets (STDIN));
 60
 61    // Een check, php gaat onderuit als er een string wordt gegeven, de "default" optie in de switch-loop werkt dan niet.
 62    // Deze wordt ook regelmatig in andere functies gebruikt.
 63    if (is_numeric ($keuze)) {
 64
 65        // Een switch-loop om actie te ondernemen bij een keuze.
 66        // Deze methode van invoer verwerken wordt ook veel in andere functies gebruikt.
 67        switch ($keuze) {
 68
 69            case 1:
 70                echo    "\n\tIn welke kamer zit je?\n\n\tGeef nummer: ";
 71
 72                $nummer = trim (fgets (STDIN));
 73
 74                if (is_numeric ($nummer)) {
 75
 76                    clear_screen ();
 77           
 78                    guest_menu ($nummer);
 79                    break;
 80                }
 81
 82                else {
 83               
 84                    echo    "\n\tGeef een nummer op.\n";
 85
 86                    sleep (2);
 87                    clear_screen ();
 88
 89                    main_menu ();
 90                    break;
 91                }
 92
 93            case 2:
 94                echo    "\n\tMet welke kamer wil je werken?\n\n\tGeef nummer: ";
 95
 96                $nummer = trim (fgets (STDIN));
 97
 98                if (is_numeric ($nummer)) {
 99
 100                    clear_screen ();
 101
 102                    room_menu ($nummer);
 103                }
 104
 105                else {
 106
 107                    echo    "\n\tGeef een nummer op.\n";
 108
 109                    sleep (2);
 110                    clear_screen ();
 111
 112                    main_menu ();
 113                }
 114
 115                break;
 116
 117            case 0:
 118                exit;
 119                break;
 120
 121            default:
 122                echo    "\nOngeldige optie! Maak een keuze uit de gegeven opties.\n\n";
 123
 124                sleep (1);
 125
 126                clear_screen ();
 127
 128                main_menu ();
 129                break;
 130        }
 131
 132    }
 133
 134    else {
 135
 136        echo    "\nGeef een cijfer op.\n";
 137
 138        sleep (2);
 139
 140        clear_screen ();
 141
 142        main_menu ();
 143    }
 144}
 145
 146// Gastmenu (menu voor in de hotelkamer)
 147function guest_menu ($kamernummer) {
 148
 149        global $kamers;
 150
 151    // Kijk of het kamernummer al reeds bestaat, maak er anders een aan.
 152        if (!array_key_exists ($kamernummer, $kamers)) {
 153
 154        $kamers[$kamernummer] = 0;      // Standaard branden er geen lampen
 155        }                   
 156
 157    echo    "\nJe bevindt je in kamer ".$kamernummer."\n\n";
 158    echo    "\t1) Vraag status op\n";
 159    echo    "\t2) Druk op centrale lamp schakelaar bij de deur\n";
 160    echo    "\t3) Druk op centrale lamp schakelaar bij het bed\n";
 161    echo    "\t4) Druk op schemerlamp schakelaar bij het bed\n";
 162    echo    "\t5) Druk op beide schakelaars bij het bed\n";
 163    echo    "\t0) Terug  naar het hoofdmenu\n";
 164    echo    "\n\tGeef een keuze: ";
 165
 166    $keuze = trim (fgets (STDIN));
 167
 168    if (is_numeric ($keuze)) {
 169
 170        switch ($keuze) {
 171
 172            case 1:
 173                room_status ($kamernummer, "guest_menu");
 174                break;
 175
 176            case 2:
 177                $actie = 4;
 178                room_set_status ($kamernummer, $actie, "guest_menu");
 179                break;
 180
 181            case 3:
 182                $actie = 1;
 183                room_set_status ($kamernummer, $actie, "guest_menu");
 184                break;
 185
 186            case 4:
 187                $actie = 2;
 188                room_set_status ($kamernummer, $actie, "guest_menu");
 189                break;
 190
 191            case 5:
 192                $actie = 3;
 193                room_set_status ($kamernummer, $actie, "guest_menu");
 194                break;
 195
 196            case 0:
 197                clear_screen ();
 198                main_menu ();
 199                break;
 200
 201            default:
 202
 203                echo    "\n\nOngeldige keuze! Kies uit de gegeven opties.\n";
 204               
 205                clear_screen ();
 206                guest_menu ($kamernummer);
 207        }
 208    }
 209
 210    else {
 211
 212        echo    "\n\nGeef een nummer op.\n";
 213
 214        sleep (2);
 215        clear_screen ();
 216
 217        guest_menu ($kamernummer);
 218    }
 219
 220}
 221
 222// Kamermenu (menu voor aan de balie)
 223function room_menu ($kamernummer) {
 224
 225    global $kamers;
 226
 227    if (!array_key_exists ($kamernummer, $kamers)) {
 228
 229        $kamers[$kamernummer] = 0;
 230    }
 231
 232    echo    "\nJe zit nu in het menu voor kamernummer ".$kamernummer."\n\n";
 233    echo    "\t1) Vraag status op\n";
 234    echo    "\t2) Zet alle lampen uit\n";
 235    echo    "\t0) Terug naar hoofdmenu.\n";
 236    echo    "\n\tGeef optie: ";
 237
 238    $keuze = trim (fgets (STDIN));
 239
 240    if (is_numeric ($keuze)) {
 241
 242        switch ($keuze) {
 243
 244            case 1:
 245                clear_screen ();
 246                room_status ($kamernummer, "room_menu");
 247                break;
 248
 249            case 2:
 250                clear_screen ();
 251                room_set_status ($kamernummer, 5, "room_menu");
 252                break;
 253
 254            case 0:
 255                clear_screen ();
 256                main_menu ();
 257                break;
 258           
 259            default:
 260                echo    "\nOngeldige optie! Maak een keuzen uit de gegeven opties.\n\n";
 261
 262                sleep (2);
 263
 264                clear_screen ();
 265
 266                room_menu ($kamernummer);
 267                break;
 268        }
 269    }
 270
 271        else {
 272
 273                echo    "\nGeef een cijfer op.\n";
 274
 275                sleep (2);
 276
 277                clear_screen ();
 278
 279                room_menu ($kamernummer);
 280        }
 281
 282}
 283
 284// Huidige status van een kamer
 285function room_status ($kamernummer, $referer) {
 286
 287    global $kamers;
 288    global $text_status;
 289
 290    $status = $kamers[$kamernummer];
 291
 292    echo    "\n\tKamer ".$kamernummer.": ".$text_status[$status]."\n\n";
 293
 294    echo    "Maak een keuze uit de onderstaande opties...\n\n";
 295    echo    "\t1) Terug naar vorige menu\n";
 296    echo    "\n\tKeuze: ";
 297
 298    $keuze = trim (fgets (STDIN));
 299
 300    if (is_numeric ($keuze)) {
 301
 302        if ($keuze == 1) {
 303
 304            clear_screen ();
 305            $referer ($kamernummer);
 306        }
 307
 308        else {
 309       
 310            echo    "\n\nOngeldige keuze! Maak een keuze uit het menu.\n";
 311
 312            sleep (1);
 313
 314            clear_screen ();
 315
 316            room_status ($kamernummer);
 317        }
 318    }
 319
 320        else {
 321
 322                echo    "\nGeef een cijfer op.\n";
 323
 324                sleep (2);
 325
 326                clear_screen ();
 327
 328                room_status ($kamernummer, $referer);
 329        }
 330
 331}
 332
 333// Wijzig de status van een kamer
 334function room_set_status ($kamernummer, $actie, $referer) {
 335
 336    global $kamers;
 337    global $text_status;
 338
 339    $huidigestatus = $kamers[$kamernummer];
 340
 341    // De eerste switch-loop bepaalt wat er moet gebeuren afhankelijk v.d. schakelaars die zijn gebruikt.
 342    // De switch-loops binnen een case van de eerste switch-loop bepalen welke nieuwe status er wordt gegeven,
 343    // dit is afhankelijk van de huidige status (welke lampen er op dat moment branden).
 344   
 345    switch ($actie) {
 346
 347        case 1:
 348            switch ($huidigestatus) {
 349
 350                case 0:
 351                    $nieuwestatus = 1;
 352                    break;
 353
 354                case 1:
 355                    $nieuwestatus = 0;
 356                    break;
 357
 358                case 2:
 359                    $nieuwestatus = 3;
 360                    break;
 361
 362                case 3:
 363                    $nieuwestatus = 2;
 364                    break;
 365            }
 366           
 367            break;
 368
 369        case 2:
 370            switch ($huidigestatus) {
 371
 372                case 0:
 373                    $nieuwestatus = 2;
 374                    break;
 375                   
 376                case 1:
 377                    $nieuwestatus = 3;
 378                    break;
 379
 380                case 2:
 381                    $nieuwestatus = 0;
 382                    break;
 383
 384                case 3:
 385                    $nieuwestatus = 1;
 386                    break;
 387            }
 388           
 389            break;
 390
 391        case 3:
 392            switch ($huidigestatus) {
 393
 394                case 0:
 395                    $nieuwestatus = 3;
 396                    break;
 397
 398                case 1:
 399                    $nieuwestatus = 2;
 400                    break;
 401
 402                case 2:
 403                    $nieuwestatus = 1;
 404                    break;
 405
 406                case 3:
 407                    $nieuwestatus = 0;
 408                    break;
 409            }
 410           
 411            break;
 412
 413        case 4:
 414            switch ($huidigestatus) {
 415
 416                case 0:
 417                    $nieuwestatus = 3;
 418                    break;
 419
 420                case 1:
 421                    $nieuwestatus = 0;
 422                    break;
 423
 424                case 2:
 425                    $nieuwestatus = 3;
 426                    break;
 427
 428                case 3:
 429                    $nieuwestatus = 0;
 430                    break;
 431            }
 432           
 433            break;
 434           
 435        case 5:
 436            $nieuwestatus = 0;
 437            break;
 438    }
 439
 440    $kamers[$kamernummer] = $nieuwestatus;
 441
 442    echo    "\n\tHuidige status voor kamer ".$kamernummer.": ".$text_status[$nieuwestatus].".\n\n";
 443   
 444    sleep (2);
 445
 446    clear_screen ();
 447
 448    $referer ($kamernummer);
 449}
 450
 451// Start het hoofdmenu op
 452
 453main_menu ();
 454
 455?>
 
 
Mijn commentaar
 
 Sander,
 Al in regel 14-23 maar ook in 61-63 laat je zien dat je begrijpt wat mijn bedoeling is.
 Je probeert keurig ervoor te zorgen dat mogelijke maar niet zo voor de hand liggende foutconditie's worden afgehandeld.
 
 Je oplossing in regel 151-155 ben ik niet zo kapot van.
 Immers ook al zijn er geen gasten, de hotelkamer bestaat desondanks toch
 en de hardware dus ook.
 Ik denk dat je alle hotelkamers bij he topstarten van het programma had moeten initializeren.
 Zelfde geld dus in regels 227-230
 Je oplossing voor het schakelprobleem in de functie [I]room_set_status[/I] is wel apart te noemen.
 Al met al een leuke bijdrage, ECHTER !!!
 
 [QUOTE]Het had hier en daar misschien iets korter gekund,
 maar daar ben ik te lui voor om dat nog te verbeteren.[/QUOTE]
 Dit is voor mij als klant uiteraard onacceptabel !
 Je had tenslote nog twee weken de tijd !