2. Exercici 1: Declaració d'accions i funcions [15%]
Tasca: Per a cada apartat
i.
decidiu si és millor una acció o una funció i expliqueu el motiu.
ii.
definiu-ne la capçalera (només es demana la capçalera, no cal que dissenyeu cap
algorisme).
Es demana la capçalera d'un mòdul (acció o funció) que:
a) Que rebi tres paraules i les escrigui a la sortida estàndard ordenades per ordre
alfabètic:
i
ii
b) Que reculli de l'entrada estàndard una llista de números amb decimals i digui quin és
el major i el menor que havia a la llista.
i
ii
c) Que rebi el nom d’un fitxer d’imatge i el codi numèric d’un color i retorni la quantitat
de píxels del dit color que conté el fitxer d’imatge
i
ii
d) Que llegeixi de l’entrada estàndard una llista de números i digui si la llista conté
algun 0.
i
ii
2
3. Exercici 2: Crides a mòduls i modificadors d'entrada i sortida [15%]
Tasca: Donats l’algorisme i les capçaleres de les següents accions i funcions:
funcio function1( x: enter, y: enter, z: real) : boolea;
funcio function2( x: enter, c: caracter, b: boolea) :enter;
accio action1( ent i: enter, ent j: enter, sor k: enter) ;
accio action2( ent c: caracter, ent x: real, entsor y: enter);
algorisme algorithm
var
i, j, k: enter;
x, y, z : real;
d : caracter;
b: boolea;
fvar
...
...
falgorisme
Responeu a cada apartat si és correcte o no substituir el requadre gris de
l’algorisme algorithm per la instrucció que es dóna i, si no ho és, indiqueu-ne les
causes
a) action1 (function2(i, d, (x>y)), k,j);
b) b := function1(k, k, y) > integerToReal(i*i) + x / 2
c)
i := action2( ‘x’, 3.1416, k * j);
3
4. Exercici 3: Ús de mòduls i paràmetres segons el seu significat i [15%]
Tasca: Amb motiu de la introducció de minijobs, una multinacional demana un algorisme
per calcular la nòmina en els següents termes. El treballador cobra un preu fix per hora i li
retenen un percentatge en concepte de IRPF que depèn de la quantitat que ha de cobrar
al mes. L'algorisme ha de llegir el número d'hores treballades i el preu per hora que cobra
des de l'entrada estàndard (teclat) i ha d'escriure al canal de sortida estàndard (pantalla)
el sou brut, la retenció de IRPF i el sou net. Si el sou brut mensual no supera els 300€ no
hi ha retenció i s'escriurà directament el sou net. Si el sou brut supera els 300€ i no
supera els 600€ la retenció d'IRPF és del 5%. Si supera els 600€ la retenció és del 8%.
En ambdós casos s'escriurà salari brut, retenció i salari net.
Ompliu les caixes, amb una única instrucció o expressió a cada una, per aconseguir el
comportament que us hem descrit. L’algorisme resultant ha d’utilitzar obligatòriament
totes les següents funcions, que no heu d’implementar:
funció que rep es salari brut i el tipus a aplicar d'IRPF i calcula l'import de la
retenció.
funcio calcRetention ( grossSalary: real, irpf: real) : real
funció que rep el salari brut i l'import de la retenció i calcula el salari net
funcio calcTakeHomePay ( grossSalary: real, retention: real) : real
4
5. algorisme payroll ( )
const
IRPF_low: real = 5.0;
IRPF_high: real = 8.0;
SALARY_THRESHOLD_LOW: real = 300.0;
SALARY_THRESHOLD_HIGH: real = 600.0;
fconst
var
fixedHourPrice, workedHours: real;
grossSalary, retention, takeHomePay: real;
fvar
fixedHourPrice :=
workedHours :=
;
;
grossSalary := fixedHourPrice * workedHours;
si
llavors
si grossSalary > SALARY_THRESHOLD_HIGH llavors
retention :=
;
sino
retention :=
fsi
sino retention := 0;
fsi
takeHomePay :=
si
llavors
writeReal (grossSalary);
writeReal (retention);
writeReal (takeHomePay);
sino
writeReal (takeHomePay);
fsi
falgorisme
5
;
6. Exercici 4: Disseny de mòduls [15%]
Un alpinista viatja sovint amb companys de cultura anglosaxona que estan acostumats a
mesurar les temperatures en graus Fahrenheit, mentre d'altres companys estan
acostumats als centígrads. Existeixen fórmules simples per fer les conversions que es
poden veure a http://ca.wikipedia.org/wiki/Grau_Celsius
Tasca: Crear un mòdul (acció o funció, el més adequat) que serveixi per entrar la
temperatura en una donada escala (escala d'entrada) i obtenir-la en una altra
escala (escala de sortida) i justifiqueu el motiu de la tria.
El mòdul ha de rebre tres paràmetres, que correspondran a:
Escala d'entrada de dades (un caràcter: C o F).
Escala de sortida de dades (un caràcter: C o F).
Valor de la temperatura d'entrada
S'ha de preveure la possibilitat que les dues escales (entrada i sortida) siguin la
mateixa.
6
7. Exercici 5: Creació d'un programa amb mòduls a PHP [20%]
Tasca: Heu de crear un programa que calculi i escrigui en pantalla una factura detallada
de la companyia de subministrament d'aigua a partir dels litres de consum trimestral.
La factura del subministrament d'aigua inclou diferents conceptes:
Consum pròpiament dit (consumption)
Taxa de clavegueram (sewer)
Lloguer del comptador d'aigua (watermeter rent)
Canon d'obres hidràuliques (canon)
cadascun dels qual ve gravat amb l'IVA corresponent
Per tal d'afavorir el consum responsable, s'ha creat una tarificació per blocs, de
manera que quant més gran sigui el consum, major és el preu unitari del metre cúbic
d'aigua. La tarificacio per blocs afecta de manera diferen els conceptes de consum i el
de canon.
El mecanisme de tarificació és com
segueix:
Consum:
o
1r bloc (0-20m3) : 0.437 €/ m3
o
2n bloc (20-40m3) : 0.6554 €/ m3
o
3n bloc (>40m3) : 0.824 €/ m3
Si un usuari consumeix 65 m3, en
pagaria 20 a 0.437, uns altres 25 a
0.6554 i els restants 14 a 0.824.
Clavegueram
Amb aquest concepte es paga el 25%
del que es paga per Consum.
Lloguer del comptador
Es paga la quantitat fixa de 1.92€
cada trimestre
Canon:
1r bloc (0-18m3) : 0.4469 €/ m3
o
2n bloc (18-30m3) : 1.0294 €/ m3
o
3n bloc (>30m3) : 2.57 €/ m3
Si un usuari consumeix 65 m3, en
pagaria 18 a 0.4469, uns altres 12 a
1.0294 i els restants 35 a 2.57.
o
IVA:
Existeix tres tipus d'IVA a aplicar als
diferents conceptes:
o
Clavegueram: exempt d'IVA (0%)
o
Consum i Canon : tipus reduït
(10%)
o
lloguer del comptador: tipus
normal (21%)
la crida haurà de ser del tipus http://localhost/pac2_exer5?vol=x on x és la quantitat
7
8. de litres consumits en el trimestre.
Indicacions:
Per tal que el programa sigui fàcilment actualitzable, es definiran tantes constants
amb nom com sigui necessari, de manera que si canvien els preus per m 3 (de consum
o canon), els volums de cada bloc (de consum o canon), el percentatge que significa la
taxa de clavegueram o els tipus d'IVA, n'hagués prou en modificar les definicions de
les constants perquè el programa quedés actualitzat a la nova situació. Per a la
definició de constants s’ha d’emprar define($name, $value)1
S'haurà de crear la function literToM3 que rebrà un volum en litres i retornarà la
quantitat entera de metres cúbics a què equival (per truncament). Per exemple, si es
rep 65789 es retornarà 65.
S'haurà de crear la function consumption que rebrà la quantitat de m3 consumits
i retornarà, en tres paràmetres, la quantitat de m3 corresponents a cada bloc de
consum. Per exemple, si rep 26, retornaria 20, 6 i 0. Si rebés 65, els retorns serien 20,
20 i 25.
S'haurà de crear la function canon que rebrà la quantitat de m3 consumits i
retornarà, en tres paràmetres, la quantitat de m3 corresponents a cada bloc de canon.
Per exemple, si rep 26, retornaria 18, 8 i 0. Si rebés 65, els retorns serien 18, 12 i 35.
S'haurà de crear la function IVA que rebrà la base a cotitzar i el codi tipus a
aplicar (0→ exempció, 1→ normal, 2→ reduït). Per exemple, per a una base de 50, si
el tipus és 0, es retornaria 0 (el 0%), si el tipus fos 1 es retornaria 10.5 (el 21%) i si el
tipus fos 2 retornaria 5 (10%).
El programa s'escriurà en el fitxer pac2_exer5_plantilla.php que es canviarà de nom a
pac2_exer5.php pel lliurament
Indicacions per a PHP
Les dades s’entraran pel mètode $_GET en el paràmetre de nom vol. La crida ha de ser
del tipus:
http:// localhost/pac2_exer5.php?vol=65789
Per a comprovar el funcionament podeu fer servir
http://prog.uoc.edu/pac2/pac2_exer5.php?vol=65789
podeu provar el comportament del programa per a diferents valors de l'argument. A la
solució d'exemple, les dades escrites formen part de taules. No és imprescindible que a
les vostres solucions les dades estiguin tabulades sempre que la seva lectura sigui clara i
es respecti el contingut de les línies
Advertiment
La comunicació entre el programa principal i els mòduls o bé entre mòduls, ha de
realitzar-se obligatòriament mitjançant les paràmetres de les crides i de retorn. No es
poden emprar variables de tipus global.
1
http://www.php.net/manual/es/function.define.php
8
10. Exercici 6: Implementar les function d'un programa en PHP [20%]
El programa a construir com exercici 6 haurà és una modificació del programa de la
carta més alta adaptat per a que juguin entre 2 i 5 jugadors cadascun dels quals trïi
una determinada quantitat de cartes (entre 1 i 5). La puntuació que s'assigna a cada
jugador és el valor de la de la carta més alta que ha tret segons la següent puntuació
de les cartes:
Cartes
1a7
Sota, Cavall i Rei
Valor
La puntuació nominal de la carta
10 punts
La crida tindrà la forma
http://localhost/pac2_exer6.php?type=E&gamers=x&qtty=n on
type : és un caràcter que indicarà quin tipus de carta es vol mostrar:
o
o
n o N si es vol mostrar cartes napolitanes
e o E si es vol mostrar cartes espanyoles
gamers és la quantitat de jugadors, un número entre 2 i 5.
qtty : la quantitat de cartes que tirarà cada jugador, un número entre 1 i 5.
El programa haurà de complir els següents requisits:
En el cas que type tingui un valor diferent als previstos, es mostrarà la
baralla espanyola.
En el cas que gamers tingui un valor fora de l'interval marcat pels números
2 i 5, es mostrarà el joc per a 3 jugadors..
En el cas que qtty tingui un valor fora de l'interval marcat pels números 1 i 5,
es tiraran 5 cartes per jugador.
Si les dades són correctes mostrarà, per a cada jugador, les cartes que ha
tirat i la puntuació obtinguda i al final un missatge resum que digui quins
jugadors han obtingut la puntuació més alta.
Tasca: Construir les function del programa per a que que sigui capaç de desenvolupar
el joc previst seguint les següents
Indicacions:
En les següents indicacions es descriuen les function que s'han de programar
indicant el nom dels paràmetres i l'ordre en què han d'anar a la capçalera. No s'indica,
en canvi, si són paràmetres d'entrada o entrada/sortida. Tampoc s'explicita si el
comportament de les function correspon al d'acció o funció. Correspon a l'estudiant,
a partir de la descripció que es fa de cada mòdul, decidir quins paràmetres han de tenir
el nom precedit per & per ser de sortida en un mòdul que actua com a acció, i quan no
hi ha paràmetre per a una sortida perquè el mòdul utilitza com a funció.
10
11.
S'ha de crear la function getAllData ($prefix, $gamers, $cards) que llegirà els
arguments, en farà el control de valors i retornarà els valors correctes en els
paràmetres.
La funció, a més de corregir els possibles valors erronis que poden contenir els
arguments rebuts, ha de preveure que l'usuari pot haver oblidat de posar algun o
tots els arguments. Si manca un o més arguments, la funció retornarà els valors per
defecte de dits arguments.
Per conèixer si una variable està definida (o un argument ha rebut valor) es pot
emprar
la function isset2. Per exemple, per comprovar que ha la crida s'ha
posat l'argument type=E caldria fer servir l'expressió isset($_GET["type"]) que
prendria el valor true si existeix l'argument en la crida o bé false si ens hem
descuidat de posar l'argument o no li hem donat valor.
La forma habitual d'aplicar-ho a un programa és una composició del tipus:
if (!isset($_GET["type"]){
accions a fer si no està posat el paràmetre o no se li ha donat valor;
}
S'ha de crear la function putCard($pref, $num) que rebrà com paràmetres
d'entrada una caràcter 'e' o 'n' i el número corresponent a la imatge d'una carta i
mostrarà la carta en pantalla
S’ha de crear la function cardValue ($card) que rep el número corresponent a la
imatge d'una carta (només el número) i retorna el seu valor en el joc. Per exemple
si rep 32 (3 de bastos) retornaria 3, i si rebés 18 (cavall de copes) retornaria 10.
S’ha de crear la function playerGame($player, $pref, $cards) que executa el joc
per a un jugador. Rebrà el número del jugador, el prefix del tipus de baralla i el
nombre de cartes a jugar.
Aquesta function en una línia identifica el jugador (Player 1, Player 2,...) i a la
2
http://php.net/manual/es/function.isset.php
11
12. següent mostra les cartes que ha tirat i la seva puntuació.
S’ha de construir la function printResult($winnerQtty, $bestScore, $message)
que rep la quantitat de guanyadors que hi ha, la puntuació obtinguda i un missatge
(quins són els jugadors guanyadors) i escriu el missatge final adequat als
guanyadors.
Si hi ha un sol guanyador
o
Si hi ha més d'un
guanyador.
El programa principal inicialitza comptadors, recull les dades i engega un bucle en
el qual es fa jugar a un jugador cada cop i s'actualitzen els comptadors i el text que
ha de tenir el missatge final. El codi del programa principal ja forma part de la
plantilla i no s'ha de modificar.
Si l’estudiant ho creu convenient pot crear més function en el programa.
Per comprovar el funcionament podeu fer servir
http://prog.uoc.edu/pac2/pac2_exer6.php?type=n&gamers=3&qtty=3
Advertiment
La comunicació entre el programa principal i els mòduls o bé entre mòduls, ha de
realitzar-se obligatòriament mitjançant les paràmetres de les crides i de retorn. No es
poden emprar variables de tipus global.
12