Kortingen

Structuur van Computerprogramma’s II: Taak 3
Dries Harnie
Coen De Roover
Dit document beschrijft taak 3 voor het vak
“Structuur van Computerprogramma’s II”.
De deadline voor deze taak is 21 december 2014 om 23:59.
1
Inleiding
Als volgende stap van het “point of sale” (PoS) systeem zullen we ondersteuning toevoegen voor verschillende manieren om korting te geven. Dit heeft een invloed op zowel
de beheerders- als de verkoopsinterface.
Kortingen In deze taak voorzien we vier verschillende manieren om korting te verkrijgen1 :
1. Een klantenkaart. Deze geeft een vast percentage korting op alle artikelen in een
aankoop. Een klantenkaart moet gescand worden voor, tijdens, of na het scannen
van de artikelen. Er kan maar één klantenkaart per aankoop gebruikt worden.
2. Volumekorting. Deze korting wordt automatisch toegepast als een klant een voldoende aantal eenheden van een bepaald artikel koopt.
3. Een vaste korting. Er is een vaste korting op een bepaald artikel.
4. “N kopen M gratis”. Zoals de naam zegt krijgt de klant bij elke aankoop van
N artikelen er M gratis artikelen bij. Aankopen voorbij N + M artikelen komen
opnieuw in aanmerking voor dezelfde korting.
Elke korting — op de klantenkaart na — kan bovendien een start- en einddatum (inclusief) hebben. Een korting kan nooit eindigen voor ze begint, maar start- en einddatum
kunnen wel samenvallen.
1
Maak je design uitbreidbaar!
1
2
Functionele eisen
In deze taak bundelen we zowel de beheerders- als de verkoopsinterface in één programma. Het programma moet tussen deze twee interfaces kiezen aan de hand van de
argumenten:
#
$
#
$
Start de beheerdersinterface
pos beheer
Start de verkoopsinterface
pos verkoop
Om dit onderscheid te maken moet je programma kijken naar de parameters van de main
functie, waar argc het aantal argumenten plus één bevat en argv wijst naar een array
van de argumenten:
int main(int argc, char ** argv) { ... }
Beheerdersinterface De beheerdersinterface wordt uitgebreid met commando’s om
kortingen te beheren. Kortingen moeten net zoals de prijslijst persistent zijn, dat wil
zeggen dat aanpassingen bewaard moeten blijven tussen runs van je programma. Je mag
het formaat van de kortingenlijst zelf kiezen. De interface moet volgende bijkomende
commando’s aanvaarden:
• discount add <streepjescode> <soort>
Dit commando voegt een nieuwe korting toe.
Het <soort> argument is één uit de volgende lijst: VOLUME, VAST, EXTRA. Deze
soorten komen overeen met kortingen 2–4 uit de inleiding. De gebruiker moet
apart nog de parameters van de korting ingeven. Let erop dat er op elk moment
maar één korting mag lopen per artikel, maar er kunnen meerdere kortingen zijn
waarvan de begin- en einddata niet overlappen. Je programma moet een fout
geven als een nieuwe korting overlapt met een andere.
Voorbeeld:
> discount add 5449000000996 VAST
Startdatum? [25/09/2014]
Einddatum? 31/12/2014
Hoeveel percent korting? 5
Korting voor artikel 5449000000996 (Coca-Cola 33cl blik) toegevoegd.
> discount add 3662168005302 EXTRA
Startdatum? [25/09/2014]
Einddatum? 31/10/2014
Minimum aantal? 4
Gratis aantal? 1
Korting voor artikel 3662168005302 (Blauwe bordstift) toegevoegd.
2
> discount add 5449000000996 VAST
Startdatum? [25/09/2014] 30/12/2014
Einddatum? 01/04/2015
Korting niet toegevoegd: overlapt met eerdere korting.
• discount del <streepjescode>
Dit commando verwijdert de korting die momenteel van toepassing is op een
bepaald artikel. Kortingen die momenteel niet gelden worden niet verwijderd.
Voorbeeld:
discount del 5449000000996
Korting voor artikel 5449000000996 (Coca-Cola 33cl blik) verwijderd.
• discount list
Dit commando geeft een lijst terug van alle kortingen die niet verlopen zijn. Actieve kortingen worden met een sterretje (*) aangeduid.
Voorbeeld:
1) *5449000000996
1) 5449000000996
2) *3662168005302
3) *333465106205
(Coca-Cola 33cl blik): 5%
(Coca-Cola 33cl blik): 4%
(Blauwe bordstift): 4 + 1
(Zakdoekjes): 10% korting
vaste korting (einde 31/12/2014)
vaste korting (einde 31/12/2015)
gratis (einde 31/10/2014)
vanaf 20 stuks (einde 31/12/2020)
Verkoopsinterface De verkoopsinterface is — net zoals in de eerste taak — een programma dat haar standaard invoer uitleest. Elke lijn invoer kan ofwel een combinatie
van streepjescode en aantal zijn (gescheiden door een TAB-karakter), ofwel de letterlijke string klantenkaart gevolgd door een TAB-karakter en een getal dat het percentage korting aangeeft. In tegenstelling tot de eerste taak kan het deze keer wel gebeuren
dat er meerdere lijnen invoer zijn voor hetzelfde artikel.
De invoer wordt opnieuw afgesloten door een puntje op een lijn apart. Pas dan moet
je programma uitvoer geven, in de vorm van een overzicht van alle artikelen. Per artikel
moet je nu als uitvoer geven: 1. de streepjescode; 2. het aantal verkocht; 3. de naam van
het artikel; 4. de totaalprijs, zonder korting; 5. de korting die wordt toegepast; 6. een
opsomming van de korting die van toepassing is voor dat artikel.
Voorbeeld invoer en uitvoer (met de kortingen uit het discount list voorbeeld van
toepassing):
Merk op: De verkoopsinterface moet deze keer wél robuust zijn tegen artikelen die niet
in de database zitten. Tevens moet je programma een foutmelding geven indien men
twee klantenkaarten probeert te scannen.
3
333465106205
klantenkaart
333465106205
5549000000996
.
20
15
20
24
Listing 1: Voorbeeldinvoer
Streepjescode
333465106205
5549000000996
Aantal
40
24
Subtotaal:
Extra korting:
Te betalen:
33.60
-5.04
28.56
Naam
Zakdoekjes
Coca-Cola 33cl blik
Totaal
12.00
24.00
Korting
-1.20
korting vanaf 20 stuk
-1.20
5% vaste korting
Listing 2: Voorbeelduitvoer
3
Niet-functionele eisen
Maak je code overzichtelijk en probeer code-duplicatie te vermijden door middel van
functies, klassen en andere technieken die we in de les gezien hebben. Je moet je project
afgeven als een .tar.gz archief, met als naam taak3-<netid>.tar.gz . Dus voor mij
zou dit bestand bijvoorbeeld taak3-dharnie.tar.gz heten.
In dit archief moet de volgende directory-structuur zitten:
taak3-<netid>/
pos.cpp
(andere .cpp of .h bestanden)
Indienen kan je via email: [email protected].
Veel succes!
4