Programeer opdrachtenOpdracht : opdr1_raio.txt

Terug naar de inzendingen
Opdracht 1, Wouter de Boer
17 Jan 2005
 Beter te laat dan te vroeg zegt m'n vriendin altijd Very Happy (En ik moest nog een spelletje Triviant van je winnen)
 
 Hier mijn kindje:
 http://wdeboer.nl/snoepautomaat.html
 
 Wat heb ik deze opdracht onderschat, niet normaal.
 
 Niet super gedocumenteerd en mijn excuses voor diegenen die m'n wisselgeld functie een beetje abracadabra vinden maar hier alsnog een beetje uitleg.
 
 Ik heb de sensoren uit de opdracht geprobeerd zo goed mogelijk over te nemen in de code, als de automaat wil nagaan wat de status is van een muntbuis dan kan hij 3 antwoorden terugkrijgen, de default is geen sensor, wat vertaalt als Bijna Op, er zijn namelijk 5..10 munten over bij geen sensor. Bij meer dan 10 is er wel een sensor en geeft hij Veel als antwoord, bij minder dan 5 is het Op want dat is de beste indicatie die de automaat heeft dat er niks van die munt kan worden teruggegeven.
 
 Bij het teruggeven van wisselgeld wordt er indien mogelijk de hoogste munt teruggegeven, zo veel als dat kan. Als er wordt begonnen een munt terug te geven dan kijkt hij indien het niet om de 2 euro munt (altijd teruggeven want die zijn ingegooid door de koper) of de 5 cent (geen lagere munt mogelijk) of er niet Veel meer over is van die munt, als de daarop volgende munt wel Veel is geeft hij daarvan terug, indien niet, en de huidige munt is niet Op, dan geeft hij die alsnog.
 
 Programmeertechnisch lukte het mij niet meer om deze routine van naar de volgende munt kijken te laten gelden voor elke keer dat er een munt wordt gegeven, vandaar dat bij 5 euro wisselgeld, als aan het begin van de check van de 1 euro munt, er nog Veel 1 euro munten zijn, deze allemaal worden teruggegeven, zijn er echter maar 5..10 munten over dan probeert hij, indien er nog Veel 50 centen zijn deze eerst te geven en indien dat niet zo is dan geeft hij alsnog de 1 euro munt (zo lang die niet op is).
 
 Ik heb hiervoor gekozen omdat de verschillende muntsoorten dan meer gelijk opraken en je minder snel uitkomt bij Gepast Inwerpen.
 
 Er moet bij mijn automaat gepast worden ingeworpen als 1 van de 20, 10 of 5 centen Op zijn omdat dan niet meer het maximale wisselgeld (hoogste munt 2 euro - laagste prijs produkt 0,75 = 1,25) kan worden teruggegeven.
 
 Maar goed, ik ga slapen, is de hoogste tijd want er moet morgen weer gewerkt worden. Deze opdracht heb ik vreselijk onderschat en ik had het allemaal nog wat beter kunnen coden/ documenteren als ik er nog meer tijd in had gestoken. Wijnand heeft gelijk dat het beter leesbaar om meer commentaar tijdens de functies te plaatsen waarom iets gebeurd, maar dat voor de volgende keer.
 
 Good night.
 1 
*****snoepautomaat.html*****
  
 2Snoepautomaat
 3
 4
 5
 33
 34
 35
 36
 37
 38
 39// **************************************
 40// SS NN OO EE PP AA UU TT OO MM AA AA TT
 41// **************************************
 42// Snoepautomaat.html in javascript
 43// by Wouter de Boer met denkwerk
 44// en tijd van Wijnand Wiersma
 45// Done op 1:12 17-01-2005
 46// lekker te laat :-)
 47// *******************************
 48
 49// *******************************
 50// Globale Variabelen
 51// *******************************
 52
 53var SnoepDesc       = new Array( "Rolletje Drop", "Zakje Katjesdrop", "Zakje Engelse Drop", "Rolletje Pepermunt", "Reep Chocolade" );
 54var SnoepPrijs      = new Array( 0.75, 1.25, 1.50, 0.75, 1.00 );
 55var SnoepPrijsLong  = new Array( "E.0,75", "E.1,25", "E.1,50", "E.0,75", "E.1,00" );
 56var SnoepVoorraad   = new Array( 0, 0, 0, 0, 0 );
 57
 58var SnoepAantal     = new Array( 10, 10, 10, 10, 10 );
 59
 60var Munten     = new Array( "Euro2", "Euro1", "Cent50", "Cent20", "Cent10", "Cent5" );
 61var MuntenDesc      = new Array( "2 Euro", "1 Euro", "50 Cent", "20 Cent", "10 Cent", "5 Cent" );
 62var MuntWaarde      = new Array( 2, 1, 0.5, 0.2, 0.1, .05 );
 63var MuntAantal      = new Array( 0, 0, 0, 0, 0, 0 );
 64
 65var MuntRol     = 15;
 66var DisplayTimeout  = 2500;
 67var Ingeworpen      = 0;
 68
 69var TekstGenoeg     = " - Voer geld in en maak uw keuze...";
 70var TekstOp     = " - Gepast inwerpen aub...";
 71
 72var y,keuze,tekst,buis,munt,iLen,myTimeout,aantal,teruggegeven,wisselgeld,StatusTekst;
 73
 74// *******************************
 75
 76
 77// *******************************
 78// Functies
 79// *******************************
 80
 81
 82// *******************************
 83function getClockTime() 
 84// Returns current time
 85// *******************************
 86
 87 var now = new Date(); 
 88 var hour = now.getHours(); 
 89 var minute = now.getMinutes(); 
 90 var second = now.getSeconds(); 
 91 var ap = "AM"; 
 92 if (hour > 11) { ap = "PM"; } 
 93 if (hour > 12) { hour = hour - 12; } 
 94 if (hour == 0) { hour = 12; } 
 95 if (hour < 10) { hour = "0" + hour; } 
 96 if (minute < 10) { minute = "0" + minute; } 
 97 if (second < 10) { second = "0" + second; } 
 98 var timeString = hour + ':' + minute + ':' + second + " " + ap; 
 99 return timeString; 
 100}
 101
 102// *******************************
 103function VullenGeld()
 104// Munten behalve 2 worden
 105// bijgevuld met een
 106// rolletje van 10 munten
 107// *******************************
 108{
 109 for( y=1; y < Munten.length; y++ )
 110 {
 111  VulBuis( y, MuntRol );
 112 }
 113
 114 Debug( "Muntbuizen behalve 2 euro bijgevuld met " + MuntRol + " munten." );
 115}
 116
 117// *******************************
 118function VullenSnoep()
 119// Snoep wordt bijgevuld met 10
 120// *******************************
 121{
 122 for( y=0; y < SnoepVoorraad.length; y++ )
 123 {
 124  VulSnoep( y, 10 );
 125 }
 126
 127 Debug( "Snoep wordt bijgevuld met 10 van elk snoepje" );
 128}
 129// *******************************
 130
 131// *******************************
 132// Buis geld worden bijgevuld
 133// met x aantal munten
 134function VulBuis( buis, aantal )
 135// *******************************
 136
 137{
 138 switch( buis )
 139 {
 140  case 0:
 141   MuntAantal[ 0 ] += aantal;
 142   document.Automaat.Euro2.value = MuntAantal[ 0 ];
 143   break;
 144  case 1:
 145   MuntAantal[ 1 ] += aantal;
 146   document.Automaat.Euro1.value = MuntAantal[ 1 ];
 147   break;
 148  case 2:
 149   MuntAantal[ 2 ] += aantal;
 150   document.Automaat.Cent50.value = MuntAantal[ 2 ];
 151   break;
 152  case 3:
 153   MuntAantal[ 3 ] += aantal;
 154   document.Automaat.Cent20.value = MuntAantal[ 3 ];
 155   break;
 156  case 4:
 157   MuntAantal[ 4 ] += aantal;
 158   document.Automaat.Cent10.value = MuntAantal[ 4 ];
 159   break;
 160  case 5:
 161   MuntAantal[ 5 ] += aantal;
 162   document.Automaat.Cent5.value = MuntAantal[ 5 ];
 163   break;
 164 }
 165}
 166
 167// *******************************
 168// Snoep wordt bijgevuld met x
 169// aantal
 170function VulSnoep( buis, aantal )
 171// *******************************
 172
 173{
 174 switch( buis )
 175 {
 176  case 0:
 177   SnoepVoorraad[ 0 ] += aantal;
 178   document.Automaat.Voorraad0.value = SnoepVoorraad[ 0 ];
 179   break;
 180  case 1:
 181   SnoepVoorraad[ 1 ] += aantal;
 182   document.Automaat.Voorraad1.value = SnoepVoorraad[ 1 ];
 183   break;
 184  case 2:
 185   SnoepVoorraad[ 2 ] += aantal;
 186   document.Automaat.Voorraad2.value = SnoepVoorraad[ 2 ];
 187   break;
 188  case 3:
 189   SnoepVoorraad[ 3 ] += aantal;
 190   document.Automaat.Voorraad3.value = SnoepVoorraad[ 3 ];
 191   break;
 192  case 4:
 193   SnoepVoorraad[ 4 ] += aantal;
 194   document.Automaat.Voorraad4.value = SnoepVoorraad[ 4 ];
 195   break;
 196 }
 197}
 198
 199// *******************************
 200// Snoep wordt gekozen, display
 201// van de automaat geeft aan
 202// indien snoep op is, anders
 203// wordt het snoep gekocht
 204// en de wisselgeld routine
 205// aangeroepen indien er
 206// genoeg geld is ingeworpen
 207function Kies( keuze )
 208// *******************************
 209{
 210 if( SnoepVoorraad[ keuze ] > 0 )
 211 {
 212  if ( Ingeworpen < SnoepPrijs[ keuze ] )
 213  {
 214   SetDisplay( SnoepDesc[ keuze ] + " " + SnoepPrijsLong[ keuze ] );
 215   TempTekst();
 216  }
 217 
 218  else
 219  {
 220   Ingeworpen -= SnoepPrijs [ keuze ];
 221   Debug( "Gekocht: " + SnoepDesc[ keuze ] + " Ingegooid: " + naarEuro( Ingeworpen ) );
 222   
 223   VulSnoep( keuze, -1 );
 224   WisselGeld();
 225  }
 226 }
 227
 228 else
 229 {
 230  SetDisplay( SnoepDesc[ keuze ] + " is op, maak een andere keuze" );
 231  TempTekst();
 232 }  
 233}
 234
 235
 236// *******************************
 237// Wisselgeld routine, geld wordt
 238// teruggegeven met hoogst
 239// mogelijke munt eerst, zoveel
 240// als mogelijk is is
 241// indien er bij het begin van het
 242// uitgeven van een munt niet Veel
 243// (sensor status wordt gevraagd)
 244// van een munt is wordt gekeken
 245// of de eerst volgende munt
 246// uitgegeven kan worden, dit
 247// wordt dan gedaan en anders
 248// als de huidige munt die
 249// mogelijk is niet Op is
 250// (sensor wordt weer aangeropen)
 251// wordt deze alsnog gegeven)
 252// indien wisselgeld op is blijft
 253// er geld over in de automaat
 254// en kan dit gebruikt worden 
 255// voor de volgende aankoop
 256function WisselGeld()
 257// *******************************
 258
 259{
 260 wisselgeld = Getal( Ingeworpen );
 261
 262 while( wisselgeld > 0 )
 263 {
 264  for( y=0; y
 265  {
 266    if( (y==0) || (y==5) )
 267    {
 268     if ( Sensor( y ) != "Op" ) { GeefTerug( y ); }
 269
 270     if ( y==5 && Sensor( y ) == "Op" )
 271     {
 272      Debug( "Wisselgeld op, er blijft " + naarEuro( wisselgeld ) + " over in de automaat." );
 273      WisselenMogelijk();
 274      wisselgeld = 0;
 275     }
 276    }
 277 
 278    else
 279    {
 280     if ( Sensor( y ) != "Op" )
 281     {
 282      if ( Sensor( y ) == "Veel" ) { GeefTerug( y ); }
 283
 284      else
 285      {
 286       if( Sensor( y+1 ) == "Veel" ) { GeefTerug( y+1 ); }
 287       else { GeefTerug( y ); }
 288      }
 289     } 
 290    }
 291  }
 292 }
 293
 294 Debug( "Klaar met wisselen!" );
 295}
 296
 297// *******************************
 298// Een munt wordt teruggegeven
 299function GeefTerug( buis )
 300// *******************************
 301{
 302 if( Ingeworpen - MuntWaarde[ buis ] >= 0 )
 303 {
 304  while( Ingeworpen - MuntWaarde[ buis ] >= 0 && Sensor( buis ) != "Op" )
 305  {
 306   Ingeworpen -= MuntWaarde[ buis ];
 307   Ingeworpen = Getal( Ingeworpen );
 308   wisselgeld = Ingeworpen;
 309 
 310   VulBuis( buis, -1 );
 311 
 312   Debug( "1 munt van " + MuntenDesc[ buis ] + " teruggegeven, nog " + naarEuro( Ingeworpen )+ " wisselgeld over." );
 313 
 314   WisselenMogelijk();
 315  }
 316 }
 317
 318
 319// *******************************
 320// Er wordt gekeken of wisselgeld
 321// teruggegeven mogelijk is door
 322// de status van sensors wordt
 323// aangeroepen
 324function WisselenMogelijk()
 325// *******************************
 326{
 327 if( (Sensor(5) == "Op") || (Sensor(4) == "Op") || (Sensor(3) == "Op") )
 328 {
 329  StatusTekst = naarEuro( Ingeworpen ) + TekstOp;
 330  SetDisplay( StatusTekst );
 331  return 0;
 332 }
 333
 334 else
 335 {
 336  StatusTekst = naarEuro( Ingeworpen ) + TekstGenoeg;
 337  SetDisplay( StatusTekst );
 338  return 1;
 339 }
 340}
 341
 342
 343// *******************************
 344// Returned de status van de
 345// sensoren. Ik heb ervoor gekozen
 346// om de status Op te laten return
 347// nen als er minder dan 5 over is
 348// van een munt, in theme zijn er
 349// maar 2 sensoren net zoals in de
 350// opdracht, de default is tussen
 351// de 5 en 10 munten over bij
 352// geen sensor
 353function Sensor( buis )
 354// *******************************
 355{
 356 aantal = MuntAantal[ buis ];
 357
 358 if( aantal < 5 )  { return "Op"; }
 359
 360 if( aantal > 10 ) { return "Veel"; }
 361
 362 return "BijnaOp";
 363}
 364
 365
 366// *******************************
 367// Rond het getal mooi af, geen
 368// vreemde getallen omdat je geen
 369// onderscheid kan maken tussen
 370// ints en floats
 371function Getal( aantal )
 372// *******************************
 373{
 374 return ( Math.floor(aantal*100+0.50000000001)/100 );
 375}
 376
 377// *******************************
 378function werpIn( munt )
 379// handelt het inwerpen van een
 380// munt af
 381// *******************************
 382{
 383 Ingeworpen += MuntWaarde[ munt ];
 384 Ingeworpen  = Getal( Ingeworpen );
 385
 386 WisselenMogelijk();
 387
 388 VulBuis( munt, 1 );
 389}
 390
 391// *******************************
 392// Functie om getal->euro netjes
 393// weer te geven
 394function naarEuro( num )
 395// *******************************
 396
 397{
 398 var sign,num,cents;
 399
 400 num = num.toString().replace(/\$|\,/g,'');
 401 if( isNaN(num) ) { num = "0"; }
 402 sign = (num == (num = Math.abs(num)));
 403 num = Math.floor(num*100+0.50000000001);
 404 cents = num%100;
 405 num = Math.floor(num/100).toString();
 406 if(cents<10)
 407 cents = "0" + cents;
 408 for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
 409 num = num.substring(0,num.length-(4*i+3))+','+
 410 num.substring(num.length-(4*i+3));
 411 return (((sign)?'':'-') + 'E.' + num + ',' + cents);
 412}
 413
 414// *******************************
 415// Wijzigt de tekst van de display
 416function SetDisplay( tekst )
 417// *******************************
 418
 419{
 420 document.Automaat.Display.value = tekst;
 421}
 422
 423// *******************************
 424// Wijzigt de tekst van het Debug
 425// window, nieuwe tekst komt boven
 426// aan te staan
 427function Debug( tekst )
 428// *******************************
 429
 430{
 431 document.Automaat.debug.value = getClockTime() +": " + tekst + "\n" + document.Automaat.debug.value;
 432}
 433
 434// *******************************
 435// Hiermee wordt de display
 436// herstelt na de timeout naar de
 437// default tekst, handig
 438// om tijdelijke tekst weer te
 439// geven
 440function TempTekst()
 441// *******************************
 442
 443{
 444 clearTimeout(myTimeout);
 445 myTimeout = window.setTimeout( "ResetDisplay()",DisplayTimeout );
 446}
 447
 448// *******************************
 449// Deze functie herstelt de 
 450// display gelijk naar default
 451// tekst
 452function ResetDisplay()
 453// *******************************
 454
 455{
 456 SetDisplay( StatusTekst );
 457}
 458
 459// *******************************
 460// Herstelt het Debug scherm naar
 461// default tekst
 462function ResetDebug()
 463// *******************************
 464{
 465 document.Automaat.debug.value = "";
 466}
 467
 468// *******************************
 469// Reset het Debug scherm
 470// Vult geldbuis 2 euro voor test
 471// doeleinden, normaal wordt dit
 472// door gebruikers ingeworpen
 473// Vult de andere buizen met
 474// de inhoud (var) van eenmuntrol
 475// Vult de snoepvoorraad, 10 van
 476// elk snoepje
 477// Kijkt of wisselen mogelijk is
 478// met huidige voorraad munten
 479// Reset de display
 480function Laad()
 481{
 482 ResetDebug();
 483 Debug( "Snoepautomaat geladen" );
 484
 485 VulBuis( 0,5 );
 486
 487 for( y=1; y
 488
 489 for( y=0; y
 490
 491 WisselenMogelijk();
 492 ResetDisplay();
 493
 494
 495
 496
 497 
 498
 499 
 500 
 501 
 502 
 Display van de automaat:
 503 
  
 504
 505 
 
 506  
 507  
 508  
 509  
 510  
 511
 512  
 513
 514
 515 

 516   in voorraad
 517
 518 
 
 519   in voorraad
 520
 521 
 
 522   in voorraad
 523
 524 
 
 525   in voorraad
 526
 527 
 
 528   in voorraad
 529
 530 

Voorraad munten:
 531
 532 
  x 2 Euro
 533 
  x 1 Euro
 534 
  x 50 Cent
 535 
  x 20 Cent
 536 
  x 10 Cent
 537 
  x 5 Cent
 538
 539 

Snoepjes kopen!
 540
 541 
 
 542  
 543  
 544 
 545
 546
 
 
Mijn commentaar
 
 Wouter,
 Je code ziet er m.i. erg netjes en onderhoudbaar uit.
 Je toont hiermee aan dat er met javascript ook nuttige toepassingen zijn te verzinnen.
 Je programeer technisch probleem om op het aantal munten vooruit proberen te kjiken, is door Dirk heel slim middels recursie opgelost.
 Helemaal save is dat ook niet omdat ook dan niet precies bekend is waneer
 de voorraad op is.
 Volgende keer gaarne wel op tijd inleveren.
 Hoop dat je dan weer meedoet.