Programeer opdrachtenOpdracht : opdr1_pascal.txt

Terug naar de inzendingen
Opdracht 1,Pascal Schiks
Dec2004
 1 
*****snoepautomaat.pl*****
  
 2#!/usr/bin/perl -wT
 3# Title   : snoepautomaat.pl
 4# Functie : Simulatie van een snoep automaat, volgens opdracht 1 van Pascal
 5# Author  : Pascal Schiks (C) 2005 GNU/GPL
 6#
 7#
 8# Variabelen, niet de meest elegante manier van declareren
 9# maar het voldoet.
 10#
 11my @prijzen;
 12$prijzen[1]=75;
 13$prijzen[2]=125;
 14$prijzen[3]=150;
 15$prijzen[4]=75;
 16$prijzen[5]=100;
 17
 18my @produktlijst;
 19$produktlijst[1]="rolletje drop";
 20$produktlijst[2]="katjesdrop   ";
 21$produktlijst[3]="engelse drop ";
 22$produktlijst[4]="pepermunt    ";
 23$produktlijst[5]="chocolade    ";
 24
 25my @voorraad;
 26$voorraad[1]=10;
 27$voorraad[2]=10;
 28$voorraad[3]=10;
 29$voorraad[4]=10;
 30$voorraad[5]=10;
 31
 32# Geldbuizen vullen met initieele waarden
 33my $Sbuis_200=15;
 34my $Sbuis_100=15;
 35my $Sbuis_50=15;
 36my $Sbuis_20=15;
 37my $Sbuis_10=15;
 38my $Sbuis_5=15;
 39
 40# het bedrag dat door elke klant gestort wordt
 41# dit is een globale variabele voor gemakelijke communicatie
 42# voor puristen een doodzonde, maar we praten hier nu niet echt over hitech !
 43my $bedrag=0;
 44my $produkt;
 45################## Hardware Simulatie ##########################
 46# Alle functies die tot het hardware simulatie deel behoren
 47# beginnen met S
 48
 49# Geldbuizen
 50# Omdat elke buis zijn eigen mechaniek heeft, heb ik elke buis apart
 51# gesimuleert
 52# De buizen hebben n.l. geen enkele relatie tot elkaar.
 53# het gebruik van een array is programeer technisch wel beter,
 54# maar minder representatief voor het imiteren van een echte automaat.
 55sub Sbetaal_200
 56{
 57  print "200c\n";
 58  $Sbuis_200--;
 59}
 60
 61sub Sbetaal_100
 62{
 63  print "100c\n";
 64  $Sbuis_100--;
 65}
 66
 67sub Sbetaal_50
 68{
 69  print "50c\n";
 70  $Sbuis_50--;
 71}
 72
 73sub Sbetaal_20
 74{
 75  print "20c\n";
 76  $Sbuis_20--;
 77}
 78
 79sub Sbetaal_10
 80{
 81  print "10c\n";
 82  $Sbuis_10--;
 83}
 84
 85sub Sbetaal_5
 86{
 87  print "5c\n";
 88  $Sbuis_5--;
 89}
 90# Sensors die minder dan 5 munten detecteren
 91
 92sub Ssensorlow_200
 93{
 94  return $Sbuis_200<=5;
 95}
 96
 97sub Ssensorlow_100
 98{
 99  return $Sbuis_100<=5;
 100}
 101
 102sub Ssensorlow_50
 103{
 104  return $Sbuis_50<=5;
 105}
 106
 107sub Ssensorlow_20
 108{
 109  return $Sbuis_20<=5;
 110}
 111
 112sub Ssensorlow_10
 113{
 114  return $Sbuis_10<=5;
 115}
 116
 117sub Ssensorlow_5
 118{
 119  return $Sbuis_5<=5;
 120}
 121
 122# sensors die meer dan 10 munten detecteren
 123sub Ssensorhigh_200
 124{
 125  return $Sbuis_200>=10;
 126}
 127
 128sub Ssensorhigh_100
 129{
 130  return $Sbuis_100>=10;
 131}
 132
 133sub Ssensorhigh_50
 134{
 135  return $Sbuis_50>=10;
 136}
 137
 138sub Ssensorhigh_20
 139{
 140  return $Sbuis_20>=10;
 141}
 142
 143sub Ssensorhigh_10
 144{
 145  return $Sbuis_10>=10;
 146}
 147
 148sub Ssensorhigh_5
 149{
 150  return $Sbuis_5>=10;
 151}
 152
 153#
 154# Probeer op een beetje leuke manier de automaat te presenteren
 155# Ik scroll steeds het scherm door, omdat ASCII control karakters niet
 156# op elke xterminal goed werken
 157# Het gebruik van ncurses lost dit welliswaar op, maar levert veel extra werk
 158# dat niet in verhouding staat tot de eigenlijke opdrachlost dit welliswaar op,
 159# maar levert veel extra werk.
 160# dat niet in verhouding staat tot de eigenlijke opdracht.
 161# De uitvoering is niet echt geweldig, zo ontbreken de prijzen en de nummers
 162# maar ja, ik heb ook maar 80*25 karakters ter beschikking
 163# heb daarom al een hoop moeten weglaten
 164#
 165sub Stoonvoorraad
 166{
 167  my $i;
 168  my $p;
 169  my $regel="|---------------------------------------------------------------------------|\n";
 170  print "\n\n";
 171  print $regel;
 172  printf("| Pascal's Snoepautomaat                     Inworp:%4i                    |\n",$bedrag);
 173  print $regel;
 174  for($i=10;$i>=1;$i--)
 175  {
 176    print "|";
 177    for($p=1;$p<=5;$p++)
 178    {
 179      if($voorraad[$p]>=$i)
 180      {
 181        print "$produktlijst[$p]"; 
 182      }
 183      else
 184      {
 185        print "             ";
 186      }
 187      print "  ";
 188    }
 189    print "|\n";
 190  }
 191  print "$regel\n";
 192}
 193#
 194# Simuleer de inworp van een munt
 195# Tel het ingeworpen aantal  bij het bedrag op en stop de munten in de buizen
 196#
 197sub inworpmunt
 198{
 199  my $munt;
 200  print "Geef waarde muntstuk (5,10,20,50,100,200) of enter >";
 201  $munt=<>;
 202  chomp $munt;
 203  if($munt eq "200") # Ik werk met strings ipv integers om
 204  {                  # foutmeldingen bij lege of foutieve invoer te voorkomen
 205    $bedrag+=200;
 206    $Sbuis_200++;
 207    return 200;
 208  }
 209  if($munt eq "100")
 210  {
 211    $bedrag+=100;
 212    $Sbuis_100++;
 213    return 100;
 214  }
 215  if($munt eq "50")
 216  {
 217    $bedrag+=50;
 218    $Sbuis_50++;
 219    return 50;
 220  }
 221  if($munt eq "20")
 222  {
 223    $bedrag+=20;
 224    $Sbuis_20++;
 225    return 20;
 226  }
 227  if($munt eq "10")
 228  {
 229    $bedrag+=10;
 230    $Sbuis_10++;
 231    return 10;
 232  }
 233  if($munt eq "5")
 234  {
 235    $bedrag+=5;
 236    $Sbuis_5++;
 237    return 5;
 238  }
 239  if($munt ne "")
 240  {
 241    print "Munt niet geacepteerd\n";
 242    return -1;
 243  }
 244  return 0;
 245}
 246
 247#
 248# Hiermee kun je zoveel munten inwerpen als je wilt,
 249# totdat je een lege regel invoert
 250#
 251sub Sinworp
 252{
 253  while(inworpmunt())
 254  {
 255    Stoonvoorraad();
 256  }
 257}
 258
 259#
 260# Dit simuleert het mechaniek dat de keuze in de bak deponeert.
 261# Ook wordt hier de voorraad verlaagt.
 262# Dit laatste stond echter niet in de opdracht
 263#
 264sub Sleverprodukt
 265{
 266  $voorraad[$_[0]]--;
 267  Stoonvoorraad();
 268  print "$produktlijst[$_[0]]\n";
 269}
 270
 271#
 272# De bedoelde automaten hebben een toetsenbordje waarop je het nr van je 
 273# keuze kunt aangeven
 274#
 275sub Smaakkeuze
 276{
 277   print "Kies produkt of 0 voor geld teruggave (geen lege vakken kiezen !)\n";    $produkt=<>;
 278   chomp $produkt;
 279}
 280
 281
 282################ Besturing van de automaat ############################ 
 283
 284# uitbetaal functie
 285# Uitbetalen, slechts 1 munt per aanroep
 286# Om de uitbetaal strategie gemakelijk aan te kunnen passen,
 287# behandel ik elke munt apart ipv in een loop
 288# Het bedenken van een goede strategie is waarschijnlijk het lastigste deel
 289# van de opdracht.
 290# Ik het het volgende overwogen
 291# Mijn functie betaalt slechts 1 munt en heroverweegt bij elke munt
 292# de betaal strategie
 293# Door deze herhaaldelijk aan te roepen wordt er slim terugbetaald
 294# Ik gebruik de 5 munten sensor als minimum, er staat in de opdracht tenslote
 295# niet vermeld dat zonodig ook de laatste 5 munten uitgekeerd moeten worden.
 296# Is er van een bepaalde munt niet meer voorradig, dan wordt geprobeerd
 297# deze met kleinere munten aan te vullen.
 298# klantvriendelijk zou zijn dit enkel te doen als er voldoende wisselgeld
 299# aanwezig is.
 300# hiervoor is de >10munten sensor bedoelt
 301# Ik maak hier echter geen gebruik van omdat ik mijn strategie al flexibel
 302# genoeg vind. (de opdracht vermeld niet het verplichte gebruik
 303# van alle onderdelen).
 304# Bovendien mag je van de eigenaar van de machiene verwachten dat hij het
 305# Apparaat juist gebruikt. daaronder valt ook het bijvullen van wisselgeld.
 306sub betaalmunt
 307{
 308  if(($bedrag>=200)&! Ssensorlow_200())
 309  {
 310    Sbetaal_200();
 311    $bedrag-=200;
 312    return 200;
 313  }
 314  if(($bedrag>=100)&! Ssensorlow_100())
 315  {
 316    Sbetaal_100();
 317    $bedrag-=100;
 318    return 100;
 319  }
 320  if(($bedrag>=50)&&($bedrag<200)&!Ssensorlow_50())
 321  {
 322    Sbetaal_50();
 323    $bedrag-=50;
 324    return 50;
 325  }
 326  if(($bedrag>=20)&&($bedrag<80)&!Ssensorlow_20())
 327  {
 328    Sbetaal_20();
 329    $bedrag-=20;
 330    return 20;
 331  }
 332  if(($bedrag>=10)&&($bedrag<40)&!Ssensorlow_10())
 333  {
 334    Sbetaal_10();
 335    $bedrag-=10;
 336    return 10;
 337  }
 338
 339  if(($bedrag>=5)&&($bedrag<20)&!Ssensorlow_5())
 340  {
 341    Sbetaal_5();
 342    $bedrag-=5;
 343    return 5;
 344  }
 345  return 0;
 346}
 347#
 348# Deze functie probeert zo goed mogelijk het teveel betaalde terug te geven.
 349#
 350sub betaaluit
 351{
 352  print "Geld teruggave\n";
 353  while(betaalmunt())
 354  {
 355    # dummy,
 356    # kenlijk lust perl de constructie while(betaalmunt()); niet
 357  }
 358}
 359
 360#
 361# Nadat een keuze is gemaakt kan het produkt hier verkocht worden
 362#
 363sub verkoop
 364{
 365  my $kostprijs;
 366  $kostprijs = $prijzen[$_[0]]; 
 367  if($bedrag>=$kostprijs)
 368  {
 369    $bedrag-=$kostprijs;
 370    Sleverprodukt($_[0]);
 371    print "Prijs $kostprijs\n";
 372  }
 373  else
 374  {
 375    print "Bedrag niet voldoende\n";
 376  }
 377}
 378#
 379# Hoofdprogramma
 380#
 381while(1)
 382{
 383  $produkt="";
 384  $bedrag=0;
 385  
 386  Stoonvoorraad();
 387  Sinworp();
 388  Stoonvoorraad();
 389  # Als er een voldoende geld bedrag over is kan er verkocht worden
 390  while((($produkt ne "0")&&($bedrag>=75))||($bedrag>=150))
 391  { 
 392    Smaakkeuze();
 393    if(($produkt gt "0")&&($produkt lt "6"))
 394    {
 395      verkoop($produkt);
 396    }
 397  }
 398  # Op dit punt zijn we uitgehandeld
 399  # indien er nog een bedrag uit staat, betaal dat dan terug.
 400  if($bedrag>=5)
 401  {
 402    betaaluit;
 403  }  
 404}
 405#
 406The End
 
 
Mijn commentaar
 
 Zelf doe ik uiteraard buiten enige mededinging mee.