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
Acció perquè no retorna res, escriu en la sortida estàndard
acció writeSorted(ent c1:cadena, ent c2:cadena, ent c3:cadena)
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
Acció perquè ha de retornar dos números
acció maxMin(sor max:real, sor min:real)
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
Funció perquè ha de retornar un sol valor: la quantitat de píxels
funció countColorPixel(fileName:cadena, colorCode:enter): enter
d) Que llegeixi de l’entrada estàndard una llista de números i digui si la llista conté
algun 0.
i
ii
Funció perquè ha de retornar un sol valor: l’existència o no de zeros
funció zero( ):booleà
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);
Correcte.
b) b := function1(k, k, y) > integerToReal(i*i) + x / 2
Incorrecte. S’intenta fer la divisió d’un real per un enter (x/2). A més, a l’esquerra de la
comparació hi ha un booleà (function1) mentre a la dreta hi ha nombres.
c) i := action2( ‘x’, 3.1416, k * j);
Incorrecte. Les accions no es poden fer servir com valor en assignacions. D’altra banda
el tercer paràmetre de action2 és d’entrada i sortida i hauria de ser obligatòriament una
variable i no una expressió.
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 := readReal();
workedHours :=
readReal();
;
;
grossSalary := fixedHourPrice * workedHours;
si
grossSalary > SALARY_THRESHOLD_LOW
llavors
si grossSalary > SALARY_THRESHOLD_HIGH llavors
retention := calcRetention( grossSalary, IRPF high );
sino
retention :=
fsi
sino retention := 0;
fsi
takeHomePay :=
si
;
calcRetention( grossSalary, IRPF_low );
calcTakeHomePay( grossSalary, retention);
takeHomePay >= SALARY_THRESHOLD_LOW
;
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
justifiqueu
el
motiu
de
la
tria.
escala
(escala
de
sortida)
i
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.
Faria servir una funció perquè ha de retornar només un nombre real, la temperatura de sortida
funcio temperatureConverter( inputType: character, outputType: character, tempIn: real) :real
var
tempOut: real;
fvar
si inputType = outputType llavors
tempOut := tempIn;
sino
si inputType = 'C' llavors
tempOut := tempIn * 1.8 + 32;
sino
tempOut := (tempIn - 32) / 1.8;
fsi
fsi
return tempOut;
ffuncio
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 20 a
0.6554 i els restants 25 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:
o 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.
•
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
de litres consumits en el trimestre.
7
8. 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 m3 (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
9. Copieu aquí el codi de la vostra solució
<?php
/************* FUNCTION *************/
//Aquí va el codi de les function
function literToM3($liters)
{
return (int)($liters/1000);
}// de literToM3
function consumption($vol, &$block1, &$block2, &$block3)
{//returns contents of each block according consumption classification
if ($vol <= consumptionVol1) $block1 = $vol;
else
{
$block1 = consumptionVol1;
$vol -= consumptionVol1;
if ($vol <= consumptionVol2) $block2 = $vol;
else
{
$block2 = consumptionVol2;
$block3 = $vol - consumptionVol2;
}
}
}// de consumption
function canon($vol, &$block1, &$block2, &$block3)
{ //returns contents of each block according canon classification
if ($vol <= canonVol1) $block1 = $vol;
else
{
$block1 = canonVol1;
$vol -= canonVol1;
if ($vol <= canonVol2) $block2 = $vol;
else
{
$block2 = canonVol2;
$block3 = $vol - canonVol2;
9
10. }
}
}// de canon
function IVA ($base, $type)
{
//returns total tax according to type
//type 0 --> exemption
//type 1 --> normal
//type 2 --> reduced
//type 3 --> super reduced
switch ($type)
{
case 0: $percent = nullIVA;
break;
case 1: $percent = normalIVA;
break;
case 2: $percent = reducedIVA;
break;
case 3: $percent = superReducedIVA;
}
return ($base * $percent);
}// de IVA
// ********** Named Constants **************
//IVA tax
define("nullIVA", 0);
define("normalIVA", 0.21);
define("reducedIVA", 0.1);
define("superReducedIVA", 0.04);
//Volumes of consumption blocks
define("consumptionVol1", 20);
define("consumptionVol2", 20);
//percent of sewer tax on consumption
define("sewerTax", 0.25);
//Volumes of canon blocks
define("canonVol1", 18);
10
11. define("canonVol2", 12);
//rate of consumption blocks
define("consumptionRate1", 0.437);
define("consumptionRate2", 0.6554);
define("consumptionRate3", 0.824);
//rate of canon blocks
define("canonRate1", 0.4469);
define("canonRate2", 1.0294);
define("canonRate3", 2.57);
//watermeter rent
define("waterMeterRent", 1.92);
/************* MAIN *************/
//Aquí va el codi del programa principal
//get data & converts to cubic meters
$vol = $_GET["vol"];
$M3 = litertoM3($vol);
//Init print form
print "<h2>WATER SERVICES BILL</h2>";
//Consumption
print "<h3>Consumption</h3>";
print "<table>";
print "<tr><td>Block </td><td>Volume</td><td>Unit price</td><td> </td></tr>";
consumption($M3, $block1, $block2, $block3);
$b1=$block1 * consumptionRate1;
$b2=$block2 * consumptionRate2;
$b3=$block3 * consumptionRate3;
print "<tr><td>(0-20 m<sup>3</sup>)</td><td>$block1</td><td>".consumptionRate1."</td><td>$b1</td></tr>";
print "<tr><td>(20-40 m<sup>3</sup>)</td><td>$block2</td><td>".consumptionRate2."</td><td>$b2</td></tr>";
print "<tr><td>(> 40 m<sup>3</sup>)</td><td>$block3</td><td>".consumptionRate3."</td><td>$b3</td></tr>";
$consumption=$b1+$b2+$b3;
print "<tr><td colspan='3'></td><td><b><font color='red'>$consumption</font></b></td></tr>";
print "</table>";
//Sewer
11
14. 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 n o N si es vol mostrar cartes napolitanes
o 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ó.
14
15. •
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 isset 2. 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
15
16. 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.
16
17. Copieu aquí el codi de la vostra solució
<?php
/************* FUNCTION *************/
//Aquí va el codi de les funcions
//data input
function getData(&$prefix, &$gamers, &$cards)
{
$error = 0;
if (isset($_GET["type"]))
{
$prefix = $_GET["type"];
$prefix = strtolower($prefix); //converts type in lowercase
if (($prefix != "n")&&($prefix != "N")) $prefix = "e";
}
else $prefix = "e";
if (isset($_GET["gamers"]))
{
$gamers = $_GET["gamers"];
if (($gamers < 2)||($gamers > 5)) $gamers = 3;
}
else $gamers = 3;
if (isset($_GET["qtty"]))
{
$cards = $_GET["qtty"];
if (($cards < 1)||($cards > 5)) $cards = 5;
}
else $cards = 5;
}//de dataInput
function putCard($pref, $num)
{
print "<img src='".$pref.$num.".png'>";
}
17
18. function cardValue($card)
{
$value = $card % 10 + 1;
if ($value > 7) $value = 10;
return ($value);
}// de cardValue
function playerGame($player, $pref, $cards)
{
$valMax = -1;
print "<h4> Player $player</h4>";
for ($i=0; $i<$cards; $i++)
{
$actualCard = rand(0,39);
putCard($pref, $actualCard);
$actualValue = cardValue($actualCard);
$valMax = max($valMax, $actualValue);
}
print "<b>Score: $valMax</b>";
return ($valMax);
}//de playerGame
function printResult($winnerQtty, $bestScore, $message)
{
if ($winnerQtty == 1)
print "<h4> The winner is Player $message: $bestScore points </h4>";
else
print "<h4> Players $message are winners: $bestScore points </h4>";
}//printResult
// *********************MAIN**********************
// init scores
$winnerQtty = 0;
$bestScore = 0;
$message = "";
//get Data
18