Estudis d’Informàtica, Multimèdia i Telecomunicació
Programació PAC2 — Document d’exercicis
Cognoms Espinoza Nazar Nom Núria
1
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 les quantitats en grams d’àcid clorhídric i de plata de què es disposa i retorni la quantitat de clorur de plata que es pot fabricar: i ii
Function, perquè ha de retornar una dada (return ....) Function quantitatclorur (clorh:enter, plata: enter): enter
b) Que reculli de l'entrada estàndard una llista de noms de persona i escrigui el nom de la primera en ordre alfabètic. i ii
Function, ha de consultar una dada Function ordre (lista: string): string
c) Que rebi la velocitat d’un automòbil al seu pas per un radar i digui si se l’ha de multar i ii
Function, ens interessa un retorn booleà Function multa (velocitat: enter, idradar: enter): boolean
d) Que generi una llista de 1000 números enters aleatoris, els escrigui a la sortida estàndard i retorni el major i el menor de la llista i també la mitjana i ii
Acció, té més d’un retorn de dades Accio print_lista (ent aleatorio: enter, sor major: enter, sor menor: enter, sor mitjana: enter)
Valoració -
Cada apartat val 0’375 punts. L’elecció del tipus de mòdul d’acord amb el problema es puntuarà amb 50% de la nota. L’adequació correcta dels paràmetres d’acord amb el tipus de mòdul escollit es puntuarà amb el 50% de la nota.
2
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) : caracter; 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) d := codeToCharacter(function2 (k, d, b) > integerToReal(i) + x / 2.0) No, porque el resultado daría un enter > real, lo cual daría FALSE
b) action2 ( ‘5’, integerToReal(k * j) / 3.1416, y); No, porque y es real y la action especifica que sea enter. Action 2 ( character, real, real) False
c) action1 (function2(i div k, function1(j, j, z), x=y), k,j); Sí, devolvería correctamente los valores reflejados en action1 (enter, enter, enter) Action1 (function2(enter, caràcter, boolean), k, j); Action1 (enter, enter, enter); true
Valoració -
Cada apartat val 0’5 punts. Si el resultat o l’explicació és incorrecta, no es puntuarà. Si la resposta és "Incorrecte", l’explicació del resultat ha de l'adequada per obtenir el 100%
3
-
de la nota. Si es respon encertadament "Incorrecte" i no es dóna explicació, es puntuarà només el 10%.
4
Exercici 3: Ús de mòduls i paràmetres segons el seu significat i [15%] En un hotel de platja estan ja bastant farts que els hostes, quan marxen s’enduguin les tovalloles, els barnús o els llençols. Des de fa uns anys, han anat anotant quins clients habituals s’han endut algun cop part de l’aixovar de l’habitació. Amb aquest motiu han decidit penalitzar el preu de l’habitació amb un 5% si s’enduen tovalloles, un 8% si s’enduen els barnús i un 10% si s’enduen llençols, els tres percentatges són compatibles entre ells de manera que a clients que s’enduen tota mena d’aixovar, són penalitzats amb un 23% (5% + 8% + 10%). A l’algorisme se li ha d’entrar en número de l’habitació i la quantitat de nits passades Tasca:. 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 el DNI de l’hoste i retorna el tcode, un valor numèric que diu què es va emportar en estades anteriors (0 no es va endur res, 1 tovalloles, 2 barnús, 3 tovalloles i barnús, 4 llençols, 5 tovalloles i llençols, 6 barnús i llençols, 7 les tres coses). funcio isThieve ( DNI: cadena) : enter acció que rep el número d’habitació i retorna si és individual o doble i el DNI del client accio typeGestRoom ( ent number: enter, sor type: roomType, sor DNI: cadena) funció que rep el tipus d’habitació i el tcode del client i retorna l’import de cada nit de l’estada funcio oneNigthRoomFare (type: roomType, tcode: enter) : real; funció que rep l’import d’una nit d’estada i la quantitat de nits i retorna l’import total amb impostos inclosos funcio totalRoomFare (roomFare: real, nigths: enter) : real; acció que rep el DNI del client, les nits d'estada, l'import d'una nit i l'import total amb impostos inclosos i imprimeix la factura. acció printBill (client:cadena, room: enter, nigths: enter, fare: real, total: real);
5
algorisme makeBill ( ) tipus roomType = { SINGLE, DOUBLE}; ftipus const TOWEL: enter = 1; BATHROBE: enter = 2; SHEET: enter = 4; IVA : real = 10; fconst var roomNumber, clientCode, days: enter; DNI: cadena; oneNightFare, totalBill: real; typeRoom : roomType; fvar {es recullen les dades de l’entrada estàndard} roomNumber :=
$_GET["id_room"];
days :=
; $_GET["days"];
{cerquem el tipus d’habitació i el DNI del client} typeGestRoom(roomNumber, typeRoom, DNI); { es cerca el tcode del client} clientCode :=
isThieve(DNI);
;
{ es calcula el cost d’una nit d’habitació oneNightFare:= oneNigthRoomFare(typeRoom, clientCode); { es calcula el preu total} totalBill :=
;
totalRoomFare(roomNumber, days);
{ s’imprimeix la factura} printbill(DNI, roomNumber, days, oneNightFare, totalBill);
falgorisme Valoració -
L’assignació de cada mòdul de l’enunciat puntua 0’25. Les funcions de lectura de l’entrada estàndard puntuen ambdues 0’25 . Per a cada mòdul de l’enunciat la puntuació s’assignarà així: * Identificació correcta del mòdul, 0’05 punts. * Identificació correcta dels paràmetres de cada mòdul, 0’2.
6
Exercici 4: Disseny de mòduls [15%] En una pastisseria industrial han obert una línia que fa pastís de iogurt. Per a fer cada pastís es necessita: • • • • •
1 iogurt 150 g de sucre 200 g de farina 3 ous 10 g de llevat
Tasca: Crear un mòdul (acció o funció, el més adequat) al que se li passi la quantitat de iogurts, kg de sucre, kg de farina, quantitat d’ous i kg de llevat i ens digui quants pastissos es poden fer com a màxim. Se haría una función, ya que en este caso necesitamos que solo nos devuelva un valor único y los datos que tenemos son solo de entrada. { Function pastissos ($Qiogurt:real, $Qsucre:real, $Qfarina:real, $Qous:real, $Qllevat:real): enter Var Div_iogurt: enter; Div_sucre:enter; Div_farina:enter; Div_ous:enter; Div_llevat:enter; Fvar Cons Iogurt: real =1.0; Sucre: real= 0.15; Farina: real= 0.20; Ous: real= 3.0; Llevat: real=0,01; FCons Div_iogurt := RealtoInteger($Qiogurt/$Iogurt); Div_sucre := RealtoInteger($Qsucre/$Sucre); Div_farina := RealtoInteger($Qfarina/$farina); Div_ous := RealtoInteger($Qous /$Ous); Div_llevat := RealtoInteger($Qllevat/$Llevat); Minus:= Div_iogurt; Si Div_sucre < minus llavors { minus := Div_sucre; } Si Div_farina < minus llavors { minus :=Div_farina; } Si Div_ous < minus llavors { Minus:=Div_ous; } Si Div_llevat < minus llavors { Minus := Div_llevat }
7
Return minus; Ffunction }
Valoració -
Capçalera: tipus de mòdul, 0’1; paràmetres, 0,1. Declaració variables: 0’1. Cos de l’algorisme: 1’125. Sortida: 0’075.
8
Exercici 5: Creación de un programa amb mòduls en PHP [20%] El programa a construir com exercici 5 té com objectiu treballar amb accions i funcions de diversos tipus. Es tracta d'entrar al programa dos números enters i positius i el programa llistarà per ordre creixent i a mida gran (p.e <h3>) tots els números enters compresos entre el dos entrats i complint determinades condicions: • Si un número llistat és divisible per 4, llavors s'escriurà en la línia següent una llista integrada per tants números consecutius com indiqui la part de les unitats, iniciada pel número llistat i, finalment, la suma dels mateixos. Per exemple, si el número és el 44 se sumaran 4 números: 44, 45, 46 i 47 Si el número és el 48, la llista seria de 8 : 48, 49, 50, 51, 52, 53, 54 i 55 Si el número és el 40, la llista seria de 0 números, és a dir no hi ha llista i la suma és 0. •
Si el número llistat és divisible per 5, llavors s'escriurà en la línia següent una llista integrada per tants números anteriors com indiqui la part de les unitats, iniciada pel número llistat i, finalment, el producte dels mateixos. Per exemple, si el número és el 45 es multiplicaran 5 números: 45, 44, 43, 42, 41 Si el número és el 40, igual que abans la llista seria de 0 números i el producte és 0.
•
Si el número és divisible per 4 i per 5 tindrà ambdós comportaments descrits amb anterioritat
La crida tindrà la forma http://localhost/pac2_exer5.php?n1=40&n2=45 on n1 i n2 han de ser dos nombres enters
9
El programa haurà de permetre que els números entrats estiguin en ordre creixent o decreixent donant exactament el mateix resultat: La crida http://localhost/pac2_exer5.php?n1=40&n2=45 haurà de mostrar exactament els mateixos resultats que http://localhost/pac2_exer5.php?n1=45&n2=40 Tasca: Construir el programa amb el comportament descrit construint obligatòriament les següents function •
S'ha de crear la function sort2 , que rebrá com paràmetres dos números en ordre creixent o no i els retornarà en ordre creixent. Per exemple: Si les variables $a i $b contenen dos valors diferents, després de la crida sort2($a, $b) la variable $a contindrá el número més petit i la variable $b el número més gran.
•
S'ha de crear la function divisible que rebrà dos paràmetres numèrics i retornarà el valor true 1 si el primer número és divisible pel segon o el valor false en cas contrari. Per exemple, divisible (44, 11) retornaria true mentre que divisible (121, 13) retornaria false
•
Heu de crear la function adds que rebrá com paràmetre un número n, obtindrà la seva darrera xifra m i crearà una llista de m elements consecutius creixents separats per un espai en què el primer serà el número n. Un cop finalitzada la llista escriurà "Addition =" i la suma dels números de la llista.
•
Heu de crear la function prods que rebrá com paràmetre un número n, obtindrà la seva darrera xifra m i crearà una llista de m elements consecutius decreixents separats per un espai en què el primer serà el número n. Un cop finalitzada la llista escriurà "Product =" i el producte dels números de la llista.
•
Si ho creieu convenient podeu crear més function en el programa.
Per comprovar el funcionament podeu fer servir http://prog.uoc.edu/pac2/pac2_exer5.php?n1=45&n2=40 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. Valoració -
-
MAIN: Es puntuarà amb 0’75, d’acord amb els criteris següents: * Crides a les funcions 80%. * Estructura de l’algorisme principal: 20%. Funcions add i prod: 0’5 cadascuna. Funció sort: 0’2. Funció divisible: 0’05. De cada funció es valorarà el 25% per a la capçalera i el 75% per al cos de l’algorisme.
1
Heu de diferenciar el valor true de la cadena "true". En el primer cas es tracta d'un boolean i en el segon cas d'un string (cadena de text). El mateix per a false i "false".
10
Copieu aquí el còdi de la vostra solució <?php
function sort2($s1, $s2) { if ($s2 > $s1) { $aux=$s2; $s2=$s1; $s1=$aux; } } function divisible($d1, $d2) { if ($d1%$d2 == 0) { return true; } else { return false; } } function adds($a1) { $m=($a1 % 10); $total = 0; $string_m= ''; for ($x=$a1; $x<>$a1+$m; $x++) { $string_m =$string_m.strval($x)." "; $total = $total+$x; } return $string_m."Addition =".$total."<br>";
11
} function prods($p1) { $m=($p1 % 10); $total = 1; $string_m= ''; if ($m==0) $total=$m;
for ($x=$p1; $x<>$p1-$m; $x--) { $string_m =$string_m.strval($x)." "; $total = $total*$x; } return $string_m."Product =".$total."<br>"; } $n1=$_GET["n1"]; $n2=$_GET["n2"]; $x=$n1; do { print "<h3>".$x."</h3>"; if (($x % 4)==0) { print adds($x); } if (($x % 5)==0) { print prods($x); } if ($n1>$n2) { $x--; } else {
12
$x++; } } while (($x<>$n2+1) && ($x<>$n1-1)); print 'END OF PROGRAM'; ?>
13
Exercici 6: Implementar les function d'un programa en PHP [20%] Tasca: Amb la lògica de moviments de l’exercici 5 de la PAC 1, heu de construir un programa que simuli el moviment de dues boles de diferents color (vermell i groc) per un tauler fins que xoquin entre elles o bé s’arribi a fer un nombre màxim predeterminat de moviments.
En l’exemple de la imatge el quadre té dimensions 4 * 6, i inicialment, la bola vermella està a la posició 3,3 i la groga a la posició 2,5, la velocitat de la bola vermella és 1, -1 i la groga 0,1. En la iteració número 9 (no es mostren totes les iteracions) hi ha una col·lisió de les boles en la posició 2, 4. la crida haurà de ser del tipus http://localhost/pac2_exer6.php?cadena=4 6 3 3 2 5 1 -1 0 1 on cadena és una cadena de text integrada per 10 valors numèrics • Alçada i amplada del tauler (en quadres) • Coordenades inicials de la bola vermella.(fila, columna) • Coordenades inicials de la bola groga (fila, columna) • Velocitat de la bola vermella (vertical i horitzontal) • Velocitat de la bola groga (vertical i horitzontal) separats per un espai en blanc cadascun del següent.
14
Podeu comprovar el funcionament a http://prog.uoc.edu/pac2/pac2_exer6.php?cadena=4 6 3 3 2 5 1 -1 0 1 o canviant les dades de la cadena
Indicacions: • L’entrada de totes les dades es farà en un únic argument de nom cadena que contindrá els 10 valors necessaris: o 1r i 2n Quantitat de files i amplada de les files del tauler o 3r i 4rt Fila i columna en què es troba inicialment la bola vermella o 5é i 6é Fila i columna en què es troba inicialment la bola groga o 7é i 8é Components vertical i horitzontal de la velocitat de la bola vermella o 9é i 10é Components vertical i horitzontal de la velocitat de la bola groga Entre cada número i el següent hi haurà un espai en blanc (i només un). Abans del primer n no ha d’haver cap espai en blanc. •
Per tal de recollir els elements un a un de la seqüència que conté la cadena, s'aconsella emprar la combinació de les instruccions explode i array_shift. Per tal d'obtenir de la cadena $string un a un els números que la formen, on s'ha fet servir com separador el caracter $c, podeu emprar consecutivament: • $var1 = explode ($c, $string); 2 // crea una llista amb els valors de $string • $var2 = array_shift($var1); 3 // extrau el primer element de la llista Podeu observar el codi i veure com funciona l'arxiu example.php que s'adjunta a l'enunciat. La crida és del tipus example.php?cadena=5,6,7,8,91,2,3,4,5,5,676767,78,8,89 i fa servir com separador una coma. Si modifiqueu la instrucció $var1 = explode(',', $cadena); a $var1 = explode(' ', $cadena); llavors haureu de fer servir com separador l'espai en blanc en lloc de la coma.
• Per saber quants elements té una llista com les que s’han creat amb explode, php facilita la function count($llista) 4 que rep com paràmetre la llista i retorna la quantitat d’elements que conté. • Per tal que el programa sigui fàcilment actualitzable, es definirà la constant MAX_ITERATION que determinarà quantes iteracions s’ha de fer si no hi ha col·lisió amb anterioritat. El valor que ha de tenir aquesta constant en el fitxer de lliurament ha de ser 100. Per declarar una constant amb nom, en php es fa servir la funció define($name, $value) 5. Per exemple define(“PI”, 3.14); crea la constant PI a la qual se li associa el valor 3.14 • Es faciliten les 4 imatges necessàries per a la construcció dels possibles taulers.
2
http://es2.php.net/manual/es/function.explode.php http://es2.php.net/manual/es/function.array-shift.php 4 http://www.php.net/manual/es/function.count.php 5 http://www.php.net/manual/es/function.define.php 3
15
Per dibuixar el requadre s’aniran posant quadres buits (E.png) un quadre amb la bola vermella (R.png) allà on estigui la bola vermella, un quadre amb la bola groga (Y.png) allà on hagi la bola groga o bé un quadre bicolor (RY.png) en el quadre que ha hagut col·lisió. • S'haurà de crear la function getData és la funció que recollirà el paràmetre cadena de la crida i extraurà d’ell els deu valors que depositarà en deu paràmetres de sortida. També retornarà, en un return, un valor enter (un codi d’error) segons aquesta descripció. o 0 si totes les dades són correctes o 1 si alguna de les coordenades d’alguna bola queden fora el tauler o 2 si alguna de les velocitats són diferents a -1, 0 o 1 o 4 si el nombre de dades és incorrecte • S'haurà de crear la function showError que rebrà el codi d’error i, en funció del seu valor, escriurà el missatge adequat. • S'haurà de crear la function drawBoard que rebrà sis paràmetres que seran: o quantitat de files del tauler o quantitat de quadrets de cada fila o fila en què està la bola vermella o columna en què està la bola vermella o fila en què està la bola groga o columna en què està la bola groga i posarà les imatges corresponents per mostrar el tauler. Aquesta mateixa funció, segons les coordenades de les boles decidirà si posa una bola vermella i una groga o bé la bola dels dos colors. • S'haurà de crear la function updatePositionAndSpeed que rebrà les dimensions del tauler (files i columnes) les coordenades d’una bola (fila i columna) i les velocitats de la bola (vertical i horitzontal) i actualitzarà la posició i la velocitat per a la iteració següent.
Les function s'escriuran en el fitxer pac2_exer6_plantilla.php que es canviarà de nom a pac2_exer6.php pel lliurament La plantilla ja conté el programa principal que no ha de modificar-se i que realitza les crides a les functions que heu de programar. 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.
Valoració -
-
Funció showError: 0’2. Resta de funcions: 0’6 cadascuna. De cada funció es valorarà el 25% per a la capçalera i el 75% per al cos de l’algorisme
16
Copieu aquí el codi de la vostra solució <?php /**********************FUNCTION**************************/ function LF() { //line feed print "<br />"; } function getData(&$long, &$wide, &$x1, &$y1, &$x2, &$y2, &$sx1, &$sy1, &$sx2, &$sy2) { $cadena=$_GET["cadena"]; $data=explode(' ',$cadena); if (count($data)<10) { return 4; } $long=array_shift($data); $wide=array_shift($data); $y1=array_shift($data); $x1=array_shift($data); $y2=array_shift($data); $x2=array_shift($data); if ((($x1>$wide) || ($y1>$long)) || (($x2>$wide) || ($y2>$long))) { return 1; } $sy1=array_shift($data); $sx1=array_shift($data); $sy2=array_shift($data); $sx2=array_shift($data); if ((($sx1<-1 || $sx1>1) || ($sy1<-1 || $sy1>1)) || (($sx2<-1 || $sx2>1) || ($sy2<-1 || $sy2>1))) {
17
return 2; } return 0; } function showError($error) { switch ($error) { case 1: echo "las coordenadas de alguna de las bolas quedan fuera del tablero"; break; case 2: echo "alguna de las velocidades introducidas es diferente a -1, 0 o 1"; break; case 4: echo "el nĂşmero de datos introducidos es incorrecto"; break; } } function drawBoard ($long, $wide, $x1, $y1, $x2, $y2) { $idy=1; $idx=1; for ($idy=1; $idy<=$long; $idy++) { LF(); for ($idx=1; $idx<=$wide; $idx++) { if ((($idx==$x1) && ($idy==$y1)) && (($idx==$x2) && ($idy==$y2))) { echo "<img src=RY.png>"; } elseif (($idx==$x1) && ($idy==$y1))
18
{ echo "<img src=R.png>"; } elseif (($idx==$x2) && ($idy==$y2)) { echo "<img src=Y.png>"; } else { echo "<img src=E.png>"; } } } LF(); }
function updatePositionAndSpeed($long, $wide, &$x, &$y, &$sx, &$sy) { if ($x>=$wide) {$sx=-1;} if ($y>=$long) {$sy=-1;} if ($x<=1) {$sx=1;} if ($y<=1) {$sy=1;} $x=$x+$sx; $y=$y+$sy; }
/*****************************MAIN***********************/ //constants define("MAX_ITERATION", 100); $long=0; $wide=0; $x1=0; $y1=0; $x2=0; $y2=0; $sx1=0;
19
$sy1=0; $sx2=0; $sy2=0; $error = getData($long, $wide, $x1, $y1, $x2, $y2, $sx1, $sy1, $sx2, $sy2); if ($error != 0) showError($error); else { $end = false; $iteration = 0; print "iteration: $iteration"; drawBoard($long, $wide, $x1, $y1, $x2, $y2); while (!$end) { $iteration++; updatePositionAndSpeed($long, $wide, $x1, $y1, $sx1, $sy1); updatePositionAndSpeed($long, $wide, $x2, $y2, $sx2, $sy2); $end = ((($x1 == $x2) && ($y1 == $y2)) || $iteration == MAX_ITERATION); if (!$end) print "iteration: $iteration"; else if (($x1 == $x2) && ($y1 == $y2)) print "last iteration: <b>collision</b>"; else print "Last iteration : No Collision"; drawBoard($long, $wide, $x1, $y1, $x2, $y2); } }
?>
20