Professional Documents
Culture Documents
PRÀCTICA. Semestre 20222.: Fonaments de Programació
PRÀCTICA. Semestre 20222.: Fonaments de Programació
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:
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:
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).
● EUROGAME
● AMERITRASH
● CARDS
● DICE
● PARTY
● TRIVIA
price Preu del joc de taula (cada Real. Ha de ser ser >= 0.0.
còpia).
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:
Cada botiga té el seu propi inventari, representat amb una variable tInventory, que
consta dels següents camps:
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.
L'entitat que representa la compra de jocs en una botiga és la tupla tPurchase. Els
camps són:
date Data en què s'ha dut a De tipus tDate, que és una tupla amb
terme la compra. tres elements (day, month, year).
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.
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.
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.
10
retorneu OK. Si el joc ja existia, simplement ha d'incrementar-se el nombre de
còpies disponibles del mateix (camp available).
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.
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
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.
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:
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.
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.
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