Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

Fonaments de Programació

PRÀCTICA. Semestre 20222.


UOCJocs
Format i data de lliurament
S’ha de lliurar la pràctica (PR) abans del dia 31 de maig a les 23:59 h. Per fer-ho,
caldrà que lliureu un fitxer en format ZIP de nom logincampus_pr en minúscules (on
logincampus és el nom d’usuari amb el qual entreu al campus). El ZIP ha de contenir:
● El workspace CodeLite sencer, amb tots els fitxers que es demanen.
Per reduir la mida dels fitxers i evitar problemes d’enviament que es poden donar en
incloure executables, cal eliminar el que genera el compilador tal com s’explica a la
xWiki. Podeu utilitzar l’opció “Clean” del workspace o eliminar-los directament (les
subcarpetes Menu i Test són les que contenen tots els fitxers binaris que genera el
compilador).
Cal fer el lliurament al Registre d'Avaluació Contínua (RAC) de l’aula de teoria.

Presentació
En aquesta pràctica es presenta un cas que hem treballat durant algunes de les PAC
d’aquest semestre, en concret, en les PAC 4, 6 i 8. El context, doncs, serà el mateix,
però ampliant-ho amb la gestió de jocs de taula, botigues i les compres que es fan per
part dels clients.
Es vol, també, que comenceu a posar en joc una competència bàsica per a un
programador: la capacitat d’entendre un codi ja donat i saber-lo adaptar a les
necessitats del nostre problema. Amb aquesta finalitat, se us facilita gran part del codi,
en el qual hi ha accions i funcions molt similars a les que es demanen. Es tracta
d’aprendre mitjançant exemples, una habilitat molt important que cal que
desenvolupeu.

Competències
Transversals
● Capacitat de comunicació en llengua estrangera.
Específiques
● Capacitat de dissenyar i construir aplicacions informàtiques mitjançant
tècniques de desenvolupament, integració i reutilització.
● Coneixements bàsics sobre l’ús i la programació dels ordinadors, sistemes
operatius, i programes informàtics amb aplicació a l’enginyeria.

1
Objectius
● Analitzar un enunciat i extreure’n els requisits tant de tipus de dades com
funcionals (algorismes).
● Posar en pràctica de manera integrada els conceptes fonamentals
d'algorísmica i programació en C estudiats a l’assignatura:
o Aplicar correctament les estructures alternatives quan calgui.
o Aplicar correctament les estructures iteratives quan calgui.
o Utilitzar correctament tipus de dades estructurats (Tuples).
o Fer servir correctament el tipus de dades Taula.
o Aplicar correctament el concepte de Modularitat.
o Aplicar correctament els algorismes de cerca i recorregut.
● Analitzar, entendre i modificar adequadament codi existent.
● Aprofundir en l’ús d’un IDE, en aquest cas CodeLite.
● Fer proves dels algorismes implementats en llenguatge C.

Recursos
Per fer aquesta activitat teniu a la vostra disposició els següents recursos:
● Materials en format web de l’assignatura.
o xWiki
o FAQ de Fonaments de Programació
o Exercicis resolts de semestres anteriors
● Fòrums de l’assignatura (laboratori i teoria).

Criteris de valoració
Cada exercici té associada la puntuació percentual sobre el total de l’activitat. Es
valorarà tant la correctesa de les solucions com la seva completesa.
● Els exercicis en llenguatge C, han de compilar per ser avaluats. En tal
cas, es valorarà:
○ Que funcionin correctament.
○ Que passin els jocs de prova
○ Que es respectin els criteris d’estil (vegeu la Guia d’estil de
programació en C que teniu a la Wiki).
○ Que el codi estigui comentat. En cas que sigui necessari (quan el
codi no sigui trivial) es valorarà la presència de comentaris
explicatius.
○ Que les estructures utilitzades siguin les més adequades en el
llenguatge C.

2
Descripció del projecte
Aquest semestre ens han demanat crear una aplicació per a UOCJocs, una franquícia
de botigues de jocs de taula que necessita gestionar les seves botigues, així com les
vendes i stock de jocs de taula disponible en elles. En les PAC 4, 6 i 8 heu anat definint
unes certes variables i programant petits algorismes relacionats amb aquesta
aplicació. En el codi que us proporcionem com a base per a la realització d'aquesta
pràctica podreu trobar aquestes variables ja conegudes de les PAC i alguns dels
algorismes.
Les accions que voldrem tenir programades seran les següents:
● Llegir, mitjançant un menú, les dades corresponents a un joc de taula, botiga i
compra.
● Carregar les dades des d'arxius i també emmagatzemar-los.
● Realitzar cerques, aplicar filtres i obtenir dades estadístiques.
● Gestionar les compres de jocs de taula (tiquets).

A més a més, tot i que aquesta primera versió serà una aplicació en línia de
comandes, volem que totes aquestes funcionalitats quedin recollides en una API
(Application Programming Interface), el que ens permetrà en un futur poder utilitzar
aquesta aplicació en diferents dispositius (interfícies gràfiques, telèfons mòbils,
tauletes, web...).

3
Estructuració del codi
Juntament amb l’enunciat se us facilita un projecte CodeLite que serà l’esquelet de la
solució de la vostra pràctica. En la pràctica heu de treballar amb aquest codi, al que no
caldrà afegir cap fitxer més. Únicament completarem els tipus, funcions i/o accions que
se’ns vagi indicant a l’enunciat. A continuació es donen algunes indicacions del codi
proporcionat:

main.c
Conté l’inici del programa. Està preparat per funcionar en dos modes diferents, en
mode Menu i en mode Test. Per a gestionar quin mode ha d’executar l’aplicació es fan
servir els paràmetres passats al programa des de l’entorn d’execució. Aquests
paràmetres es corresponen amb els paràmetres definits a la funció principal:

Perquè funcioni en mode Menu no cal passar cap paràmetre a l’aplicació i, perquè
funcioni en mode Test, cal passar el paràmetre “-t” a l’aplicació.
Aquest funcionament ja està implementat i el projecte de CodeLite s’ha configurat amb
dos modes de configuració Menu i Test. Podeu canviar el mode d’execució fent servir
el desplegable Configuration Manager de l’editor CodeLite:

● L'aplicació, en mode Menu, ens mostra pel canal de sortida estàndard un


menú que permet a l'usuari interactuar amb l'aplicació: fer canvis en inventaris,
jocs de taula, botigues, etc. També obtenir informació, dades estadístiques i
altres funcionalitats relacionades amb les dades de l'aplicació.

4
● L'aplicació en mode Test executa un conjunt de proves sobre el codi per a
assegurar que tot funciona correctament. El resultat d'aquestes proves es
mostrarà una vegada finalitzada l'execució pel canal de sortida estàndard.
Inicialment, moltes d'aquestes proves fallaran, però, una vegada realitzats tots
els exercicis, totes haurien de passar correctament. És important que us
assegureu que el vostre programa, una vegada completats tots els
exercicis, passa la totalitat de les proves incloses en el projecte.

data.h
S’hi defineixen els tipus de dades que s’utilitzen a l’aplicació. Tot i que es podrien
haver separat en els diferents fitxers de capçalera, s’han agrupat tots per facilitar la
lectura del codi.
store.h / store.c
Contenen tot el codi que gestiona les botigues de jocs de taula.
bgame.h / bgame.c
Contenen el codi que gestiona els jocs de taula.
purchase.h / purchase.c
Contenen el codi que gestiona les compres de jocs de taula que els clients fan.
menu.h / menu.c
Contenen tot el codi per gestionar el menú d’opcions que apareix quan s’executa en
mode Menu.
api.h / api.c
Contenen els mètodes (accions i funcions) públics de l’aplicació, el que seria l’API de
la nostra aplicació. Aquests mètodes són els que es criden des del menú d’opcions i
els que faria servir qualsevol altra aplicació que volgués utilitzar el codi.
test.h / test.c
Contenen totes les proves que es passen al codi quan s’executa en mode Test.

5
Enunciat
Hem fet una presa de requisits amb l'empresa UOCJocs i hem identificat els camps
necessaris en l'estructura de dades dels jocs de taula. El conjunt de camps de la
tupla tBGame queda resumida en la següent taula:

Camp Descripció Tipus / validació

bgameId Identificador del joc de De tipus tBGameId.


taula.

bgName Nom del joc de taula. Cadena de, com a màxim, 100 caràcters
alfanumèrics i sense espais. Si hi ha
necessitat de guardar un nom compost,
utilitzarem el guió baix ('_') com a
separador de les paraules.

age Edat mínima recomanada per a Enter. Ha de ser major que zero.
jugar al joc de taula.

duration Temps mitjà de joc per Enter. Ha de ser major que zero.
partida (en minuts).

category Categoría/tipus de joc de Enumerat tGameCategory amb els següents


taula. valors possibles:

● EUROGAME
● AMERITRASH
● CARDS
● DICE
● PARTY
● TRIVIA

launchDate Any de llançament del joc de


taula, en format YYYY Enter. Ha d’estar entre 1900 i 2023
(quatre dígits). (ambdós inclosos).

price Preu del joc de taula (cada Real. Ha de ser ser >= 0.0.
còpia).

discount Descompte aplicat sobre el Real. Ha d’estar entre 0.0 i 100.0


preu del joc de taula. (ambdós inclosos).

availability Quantitat de còpies d'aquest Enter. Ha de ser major o igual que zero.
joc de taula disponibles.

6
Respecte a l'estructura de dades de les botigues de jocs de taula, aquesta és la
relació de camps de la tupla tStore:

Camp Descripció Tipus / validació

storeId Identificador de la botiga de jocs De tipus tStoreId.


de taula.

name Nom de la botiga. Cadena de, com a màxim, 100


caràcters alfanumèrics i sense
espais. Si hi ha necessitat de
guardar un nom compost,
utilitzarem el guió baix ('_')
com a separador de les
paraules.

city Ciudad on està la botiga. Cadena de, com a màxim, 100


caràcters alfanumèrics i sense
espais. Si hi ha necessitat de
guardar un nom compost,
utilitzarem el guió baix ('_')
com a separador de les
paraules.

maxStorage Capacitat màxima de la botiga, és a Enter. Ha d’estar entre 0 i 50.


dir, unitats màximes de jocs de
taula que pot tenir en el seu
magatzem.

inventory Inventari de la botiga. De tipus tInventory.

specialDiscount Descompte per promocions especials Real. Ha d’estar entre 0.0 i


aplicat a totes les compres 100.0 (ambdós inclosos).
realitzades en aquesta botiga.

Cada botiga té el seu propi inventari, representat amb una variable tInventory, que
consta dels següents camps:

Camp Descripció Tipus / validació

storeId Identificador de la botiga a la De tipus tStoreId.


que correspón l’inventari.

nBGames Quantitat de jocs de taula Enter. Ha de ser >= 0.


(diferents, sense importar si hi
ha o no existències) inventariats
per a aquesta botiga.

7
nStoredBGames Quantitat total de jocs en stock Enter. Ha de ser >= 0.
en el magatzem de la botiga .
(iguals o diferents). És a dir,
nombre de còpies disponibles en
el magatzem per a la totalitat de
jocs.

games Relació dels jocs de taula És una taula de jocs (tBGame).


inventariats de la botiga (hi
hagi actualment existències o
no).

L'entitat que representa la compra de jocs en una botiga és la tupla tPurchase. Els
camps són:

Camp Descripció Tipus / validació

purchaseId Identificador de la De tipus tPurchaseId.


compra.

storeId Identificador de la De tipus tStoreId.


botiga.

orders Detall dels jocs comprats Llista d’elements de tipus tOrder.


en una determinada compra
(incloent nom, quantitat i
preu per còpia de cada
joc).

nOrders Quantitat de jocs Enter. Tindrà com a valor la


diferents comprats en una quantitat d'elements de la taula
compra concreta orders.
(independentment del
nombre de còpies de
cadascun. És a dir, conté
el nombre d'elements de la
llista orders.

date Data en què s'ha dut a De tipus tDate, que és una tupla amb
terme la compra. tres elements (day, month, year).

price Conté el preu total en Real. Ha de ser >= 0.0.


euros d'aquesta compra.

L'entitat que representa un joc comprat en una determinada compra en una botiga és
la tupla tOrder. Els camps són:

8
Camp Descripció Tipus / validació

bgame Nom del joc comprat. Cadena de, com a màxim, 100
caràcters alfanumèrics i sense
espais. Si hi ha necessitat de
guardar un nom compost, utilitzarem
el guió baix ('_') com a separador
de les paraules.

nPurchased Unitats del joc comprades. Enter. Ha de ser >= 0.

price Preu de venta d’una unitat Real. Ha de ser >= 0.0.


del joc comprat.

A més dels tipus estructurats, reviseu la definició de constants existents en el codi.


Serà necessari utilitzar algunes d'elles per a resoldre els exercicis.

9
L'empresa UOCJocs ja ens ha donat el vistiplau a l'anàlisi lliurada, i podem començar
a fer els canvis. Per a implementar aquests canvis, tal com ja hem comentat, partirem
del codi font que ens han proporcionat, i anirem afegint el codi necessari.

Exercici 1: Definició de tipus [5%]


Es demana que completeu el tipus de dades tBGame, provisionalment definit en l'arxiu
data.h. Completeu la definició que hi ha en el codi enunciat com convingui. Per a això,
fixar-vos en la descripció i el nom exacte del nom dels camps que s'han especificat
anteriorment en l'enunciat.

IMPORTANT
Una vegada fet això, descomenteu la definició de la variable
TYPEDEF_COMPLETED que trobareu al principi de l'arxiu data.h
abans de continuar amb la resta d'exercicis.

Exercici 2: Funcions de còpia i comparació [10%]


Un problema que ens trobem amb els tipus estructurats és que molts dels operadors
que tenim definits amb els tipus bàsics de dades, com els de comparació (==, !=, <, >,
...) o el d'assignació (=), no funcionen per als nous tipus que ens creguem.
Per això, sovint es fa necessari definir accions o funcions que ens donin aquestes
funcionalitats. Per exemple, ja hem vist que per a assignar una cadena de caràcters no
ho fem amb l'operador d'assignació normal (=), sinó que hem de recórrer a la funció
strcpy. El mateix ocorre en les comparacions, on en comptes d'utilitzar els operadors
normals (==, !=, <, >, ...) utilitzem strcmp.
Es demana:
a) [5%] Completeu, en l'arxiu bgame.c, l'acció bgameCpy que permet copiar
totes les dades d'una estructura tBGame a una altra.

b) [5%] Completeu, en l'arxiu bgame.c, les funcions bgameTableFindId i


bgameTableFindName que, respectivament donats l'identificador d'un joc
de taula o el seu nom, retorna l'índex que ocupa aquest joc en la taula de
jocs de taula proporcionada, o bé -1 si no existeix.

Exercici 3: Operacions bàsiques amb taules [10%]


Responeu els següents apartats:

a) [5%] Es demana que completeu, en l'arxiu bgame.c, l'acció bgameTableAdd


que, donada una taula tipus tBGameTable i un joc de taula de tipus tBGame,
afegeixi el joc dins de la taula. Si no hi ha espai en la taula per a afegir el joc,
haureu de retornar el codi ERR_MEMORY en la variable retVal; en cas contrari,

10
retorneu OK. Si el joc ja existia, simplement ha d'incrementar-se el nombre de
còpies disponibles del mateix (camp available).

b) [5%] Es demana que completeu, en l'arxiu bgame.c, l'acció bgameTableDel


que, donada una taula de tipus tBgameTable i un joc de taula de tipus tBGame,
esborri el joc de la taula. Tingueu present que haureu d'evitar deixar forats en la
taula, desplaçant, si és necessari, els elements de la taula per a ocupar l'espai
que ocupava el joc de taula eliminat. En el cas que el joc no estigui en la taula,
retVal ha de retornar-se amb el valor ERR_NO_BGAME; en cas contrari amb
OK.

Exercici 4: Entrada interactiva de dades [10%]


Completeu l'acció readBGame (menu.c) perquè llegeixi per teclat les dades
associades a un joc de taula. En l'entrada de dades heu de validar que els valors que
vagin prenent els camps estiguin dins del rang permès per cadascun d'ells, segons
s'ha descrit anteriorment.

NOTA: Per a provar aquest exercici podeu afegir una nova botiga amb l'opció de Menu
Manage stores > Add stores (indicant que la botiga té almenys un joc en el seu
inventari) i, a continuació, mostrant el seu inventari mitjançant Manage stores > List
stores’ inventories. Noti's que això només funcionarà per complet quan es completi
també l'exercici 5.

NOTA: Fixeu-vos en la lectura del tipus tStore, que fa una lectura de camps molt
similar a la que es demana en aquest exercici.

Exercici 5: Actualització de l’inventari d’una botiga [15%]


Per al normal desenvolupament d'una botiga de jocs de taula, aquesta ha de disposar
d'una o diverses unitats de diferents jocs. Per a poder disposar d'un joc de taula a la
venda, és necessari que es donin unes determinades condicions. Per exemple, la
botiga ha de tenir espai per a emmagatzemar-ho. Això és el que fa, precisament,
l'acció que demanem que completeu a continuació:

a) [10%] Completeu el codi que falta en l'acció addBGame (api.c). En aquest punt
del codi disposeu d'aquestes variables:
● tStore, la botiga on s'afegirà el joc
● tBGame, el joc a afegir a la botiga

El codi ha d'afegir un joc de taula en l'inventari de la botiga, sempre que sigui


possible afegir-lo.

11
● En el cas que un joc no es pugui afegir perquè l'inventari està ple, haurà
de retornar-se ERR_MEMORY en retVal.
● En el cas que es pugui afegir el joc a la llista de jocs registrat en
l'inventari però no es pugui emmagatzemar cap còpia d'aquest joc
perquè el magatzem està ple, haurà de retornar-se
ERR_FULL_WAREHOUSE en retVal, però sí que afegir-se el joc a
l'inventari, amb la quantitat disponible (availability) fixada a zero. Aquest
cas es dóna quan la quantitat de jocs emmagatzemats és igual al
maxStorage definit per a aquesta botiga.
● En qualsevol altre cas, cal verificar si hi ha capacitat per a albergar les
unitats que es proposen d'aquest. Si no fos així, s'afegirà el joc de taula
emmagatzemant-se el nombre màxim d'unitats possible i actualitzant-se
degudament el camp availability del tBGame dau. En aquest cas (és a
dir, quan almenys s'emmagatzemi una còpia del joc), es retornarà retVal
amb el valor OK.

A més, ha de tenir-se en compte que si un joc existeix s'han d'afegir tantes


unitats de les proporcionades del mateix com sigui possible al registre ja
existent d'aquest joc, sense ocupar una nova posició en la taula games de
l'inventari.

Per a aquesta acció poden utilitzar-se les accions/funcions definides en els


exercicis anteriors.

NOTA: Per a provar aquest exercici podeu afegir una nova botiga amb l'opció
de Menu Manage stores > Add stores (indicant que la botiga té almenys un joc
en el seu inventari) i, a continuació, mostrant el seu inventari mitjançant
Manage stores > List stores’ inventories.

A vegades, el magatzem d'una determinada botiga de jocs de taula està massa ple (és
igual o superior al 80% de la seva capacitat) i és necessari fer ofertes especials per a
buidar stock. Per a això, es disposarà de la funció detallada a continuació, la qual
permetrà oferir descomptes addicionals per a atreure compradors i reduir així l'stock:

b) [5%] Completeu el codi de l'acció checkStoreCapacity (api.c) que, a partir


d'una botiga tStore, comprova si està massa plena (la seva quantitat de jocs de
taula en l'inventari és igual o superior al 80% de la seva capacitat màxima) i, si
és així, actualitza el camp specialDiscount per a aplicar un descompte
addicional del 20% a qualsevol joc disponible en el seu inventari en el moment
de vendre'l. En el cas que la botiga no estigui massa plena, si specialDiscount
tingués un valor diferent de zero, ha de posar-se a zero.

12
La funció rep un valor booleà com a paràmetre de sortida que ha d'actualitzar
posant-lo a cert si s'aplicarà un descompte especial (la botiga està massa
plena) i a fals en cas contrari.
Cal tenir en compte que, si es vol aplicar un descompte de, per exemple, el
20%, en el camp specialDiscount ha d'emmagatzemar-se el valor real 20.0 .
Aquesta funció es pot provar en manera Menu, utilitzant l'opció Manage Stores
> Check Capacity.

Exercici 6: Compra de jocs de taula a una botiga [15%]


El sentit d'una botiga de jocs de taula no és un altre que vendre jocs. Aquest procés és
el que es fa en l'acció newPurchase (purchase.c), la lògica de la qual, es recolza en
dues accions que es demana que treballeu a continuació.

a) [5%] Completeu l'acció checkAvailability (store.c) que, a partir d'una botiga


donada, el nom del joc de taula i el nombre d'unitats desitjades (enter positiu),
actualitza el paràmetre de sortida toSell amb la quantitat que pot comprar-se
realment d'aquest joc de taula. El resultat serà igual o inferior al nombre
d'unitats sol·licitades d'aquest joc de taula. Si no pot comprar-se cap unitat,
retorna zero. A més, en retVal s'indica OK si aquest joc està disponible a la
botiga i hi ha almenys una unitat, ERR_NO_STOCK si no hi ha unitats
disponibles (encara que està llistat en l'inventari de la botiga) i
ERR_NO_BGAME si aquest joc no està en l'inventari de la botiga.

b) [5%] Completeu l'acció calculatePrice (store.c) que, per a una determinada


botiga, donat el nom del joc de taula a comprar i el nombre d'unitats desitjades
(enter positiu), retorna el preu associat a aquesta compra actualitzant el
paràmetre de sortida pvp, considerant tant el descompte que pugui estar
aplicant-se al joc en concret com l'especial que pot estar habilitat a la botiga.
Els descomptes han de sumar-se abans d'aplicar-se (no aplicar-se per separat
consecutivament). És a dir, si s'ha d'aplicar un descompte del 10% i un del
20%, llavors s'aplicarà directament un descompte del 30% sobre l'import total.
Es retornarà el valor -1 en el cas de no haver-hi existències.

c) [5%] Completeu l'acció updateBGames (store.c) que, per a una determinada


botiga i el seu inventari, donat el nom d'un joc de taula i la quantitat d'unitats del
mateix a comprar, redueix en aquest número les unitats disponibles en
l'inventari.

Exercici 7: Escriptura de dades per pantalla [5%]


Cada vegada que es realitza una compra, s'imprimeix un rebut amb la relació de jocs
de taula i unitats dels mateixos que s'han comprat. A aquest efecte, es demana que
implementeu l'acció printTickets (api.c) que, a partir d'una compra en una

13
determinada botiga mostri: nom de la botiga, import total de la compra i, per a cada joc
de taula comprat, el seu nom i les unitats comprades.

NOTA: Per a provar aquest exercici podeu utilitzar l'opció de Menu Manage purchases
> Print purchase tiquets.

Exercici 8: Filtres sobre col·leccions d’elements [15%]


Entenem per filtre una acció que, sobre un conjunt d'elements, selecciona alguns que
compleixin una determinada condició.
En aquest cas, es vol que implementeu tres filtres:
a) [5%] Implementeu, en bgame.c l’acció bgameTableFilterByCategory que, a
partir d'una taula de jocs de taula i una categoria de jocs, retorni (en una
segona taula anomenada tabBGames2 que és paràmetre de sortida) els jocs
de taula que compleixin que són de la categoria indicada.
b) [5%] Implementeu, en purchase.c l'acció
purchaseTableFilterByYearAndStore que, a partir d'una taula de compres, un
determinat any i l'identificador d'una botiga, actualitzi en el paràmetre de sortida
benefit el benefici total de les compres realitzades en aquesta botiga durant
aquest any (és a dir, la suma de tots els preus de totes les vendes). Si no hi ha
cap compra en eixa tenda durant eixe any, retVal tornarà el valor ERROR; OK
en cas contrari.
c) [5%] Implementeu l’acció storeTableFilterByWarehouse en store.c que, a
partir d'una taula de botigues i un percentatge d'ocupació del magatzem, retorni
(en una segona taula anomenada tabStores2 que és un paràmetre de sortida)
les botigues l'ocupació de les quals del magatzem sigui superior o igual a la
donada. Noti's que, si es vol comprovar si l'ocupació és superior al 80%, el
valor real proporcionat per a representar aquest percentatge serà 80.0. En el
cas que no hi hagi cap botiga, o cap compleixi les condicions, es retornarà una
taula buida.

Exercici 9: Estadístiques [15%]


Com a part important de la gestió de la companyia i, com a eines de suport a la presa
de decisions, es volen implementar una sèrie d'accions i funcions amb finalitats
estadístics.
En concret, es demana:
a) [5%] Implementeu l'acció mostProfitableStore en store.c. Aquesta, donada
una taula de compres i un any, ha de calcular el benefici total durant aquest any
en totes les botigues de la franquícia i actualitzar el paràmetre de sortida
profStore amb el nom de la botiga que ha estat la més rendible, és a dir,
aquella l'import total de la qual de vendes és el màxim. En cas d'empat, es

14
mostrarà la primera trobada. En el cas que no hi hagi cap botiga en la taula
donada, retVal prendrà el valor ERR_NO_STORE; OK en cas contrari.
b) [10%] Implementeu l'acció lessPopularCategory (purchase.c) que, donat
l'identificador d'una botiga i una taula de compres, actualitzi el paràmetre de
sortida cat amb la categoria de jocs dels quals s'han venut menys unitats en
aquesta botiga. En el cas d'haver-hi diverses empatades a nombre de vendes,
les mostrarà en ordre d'aparició en la definició de la categoria, és a dir {
EUROGAME, AMERITRASH, CARDS, DIU, PARTY, TRIVIA }. A més, en retVal
es retornarà ERROR si la taula de compres donada no conté cap compra o si
la taula de botigues no conté cap botiga; OK en cas contrari.

15

You might also like