Estudis d’Informàtica, Multimèdia i Telecomunicació
Programació Pràctica 1
Cognoms Espinoza Nazar Nom Núria
1
Exercici 1: Treball amb una seqüència a l'entrada [20 %] Al bar d’un hotel, quan els hostes fan consumicions se'ls apunta a la seva habitació generant-se una seqüència diaria del tipus: <h 1 i 1 h 2 i 2 ..... h n i n 0> on h i és el número d'habitació i i és l'import de la consumició, impostos inclosos. 0 és el número 0 i indica el final de la seqüència
Tasca: Crear en llenguatge algorísmic el mòdul barBill (acció o funció, el més apropiat i justifiqueu la tria) que rebi el número d'una habitació, llegeixi de l'entrada estàndard la seqüència del dia i retorni la despesa que han fet al bar els hostes de dita habitació. Valoració - Determinació del tipus de mòdul, 0.1; justificació, 0.4. - Determinació de paràmetres: 0.25. - Determinació de variables: 0.25. - Tractament de la seqüència: 1.0. Sería una funció, ja que tenim tan sols un resultat de sortida i tenim paràmetres d’entrada. Algorisme barBill Var Seq:=cadena; hab:= enter; preu, preu_hab:=real; Fvar Inicializa(preu_hab); Hab=1; Preu=1; Mentre (hab<>0) i (preu<>0) fer {llegir els elements de la sequencia} hab= llegirenter(); preu=llegirreal(); {es suman les despeses per habitació} preu_hab [hab]=preu + preu_hab [hab]; fmentre Return print “l’usuari de la habitació.$hab.ha de pagar un total de.$preu_hab” FAlgorisme
2
Exercici 2: Treball amb generació de seqüències [20 %] Podem considerar els números enters com creats per una seqüència de xifres on una xifra agafa el valor en unitats, una altra en desenes, una tercera en centenes, etc. Vist d'aquesta manera, un número de n xifres vindria a ser una seqüència de la forma: x n x n-1 x n-2 ... x 3 x 2 x 1 on x i és la xifra que ocupa la posició i en el número (la primera posició és la de les unitats) Tasca: Creeu en llenguatge algorísmic el mòdul separaXifres (acció o funció, el més adequat i justifiqueu el motiu de la tria), que rebi un número i en retorni dos, un d'ells integrat per les xifres de posició senars i un altre integrat per les de posició parella. Per exemple, si es rep el número 82073, se'n retornarà un de valor 803 (xifres de posició senar) i un altre 27 (xifres de posició parella). Evidentment si algun dels números a retornar rebés un zero al davant, el zero no es mostraria com ara 10356 donaria 136 i 5. Indicacions: El valor que és rep és un número, per la qual cosa el tractament per seleccionar les seves xifres una a una, ha de ser un tractament aritmètic. En aquests sentit és ha de ser útil emprar els operadors div i mod. Valoració - Determinació del tipus de mòdul, 0’1; justificació, 0,4. - Determinació de paràmetres variables: 0’25. - Determinació de variables: 0.25. - Tractament de la seqüència: 1.0. Seria una acció, ja que tenim que extreure dos resultats. Algoritme separaXifres Var Par, Impar, Multi, N=enter; Fvar Multi=1; Par=1; Impar=1; {Si el resultat de la divisió és 0, el bucle finalitza, s’acaba el número} Mentres (n div 10 <>0) fer {Si el resto es 0, no farà res i continuarà el bucle} Si (N mod 10<>0) llavors Impar= ((n mod 10)* multi) + Impar; fsi N= n div 10; Par= ((n mod 10) * multi) + Par; N= n div 10; fmentres echo “Numeros senars $Impar” <br/> “Numeros parells $Par”
3
Falgoritme
4
Exercici 3: Treball amb seqüències en PHP [20 %] Disposem d'una seqüència de números positius cadascun d'ells separat del següent per un espai i que finalitza amb un zero
Tasca: Es demana un programa que sigui capaç de llegir un fitxer que contingui una cadena d'aquestes característiques i escrigui en pantalla, a un per línia, els números primers que formen part de la seqüència. Al final escriurà Zero found
Indicacions preceptives •
El fitxer php rebrà el nom prac1_exer3.php
•
La crida al programa serà del tipus prac1_exer4.php? filename=data30 per la qual cosa s'haurà d'emprar la instrucció $filename=$_GET["filename"]; per carregar el nom del fitxer que incorpora la instrucció que assigna valor a la variable $cadena. Un cop carregat aquest fitxer, es pot incorporar la instrucció al programa mitjançant l'ordre include($filename) 1; ambdues instruccions ja formen part de la plantilla i són les primeres del programa principal. El fitxer example1.php adjunt carrega un d'aquests fitxers i mostra en pantalla el contingut. La crida ha de ser del tipus example1.php?filename=data32
•
Els fitxers de dades consten d’una única instrucció de php en què la variable $cadena rep com valor una cadena de text integrada per sèries de números enters i positius que estan separats per un espai i finalitza en un 0 Per exemple el fitxer data30 té el següent contingut <?php $cadena = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 0"; ?>
Podeu comprovar el funcionament del programa que se us demana que escriviu amb la crida: http://prog.uoc.edu/prac1/prac1_exer3.php?filename=data30 Podeu provar canviant els noms dels fitxers de dades (data30 a data34). •
1
Les instruccions per carregar el fitxer amb la variable $cadena i crear la llista de números rebuts ($data) ja formen part de la plantilla.
http://es2.php.net/manual/es/function.include.php
5
•
Els fitxers de dades s'hauran d'ubicar a la mateixa carpeta que els php
Altres indicacions •
Recordeu que nombre primer 2 és aquell diferent a 1 i que només és divisible per 1 i per ell mateix.
•
Pot resultar útil construir una funció que permeti saber si un número és primer o no.
Valoració -
2
Tractament de la seqüència: 1.0 Determinacio de la primalitat del número: 0.5. Concisió en l'ús de composicions i estalvi de variables: 0.5
http://ca.wikipedia.org/wiki/Nombre_primer
6
//AquĂ heu de posar el vostre codi <?php /************* FUNCTION *************/ //AquĂ va el codi de les funcions function LF() { //line feed print "<br />"; } function primer($x) { $cont = 0; for($i = 1; $i <= $x; $i++) { if($x % $i == 0) { $cont++; } } if(($cont==2) or ($x==1)) { return true; } else { return false; } }
7
/************* MAIN *************/ //AquĂ va el codi del programa principal $filename = $_GET["filename"]; include($filename); $data = explode(" ",$cadena); do { $x=array_shift($data); $x=intval($x); if (primer($x)==true) { echo $x; LF(); } } while ($x<>0); if ($x==0) { echo "Zero found"; } ?>
8
Exercici 4: Treball amb seqüències en PHP [20 %] Disposem d'una sèrie d'imatges
i d'unes seqüències que s'inicien amb una xifra, es continuen amb lletres i finalitzen amb un punt com ara "8artfeubjhdttshgdyeggukjnfuigJHQWEUYEÑLJFHggvvvabc." i amb elles volem dibuixar uns taulers semblants als de l'exercici 6 de la PAC2 segons les següents normes: • La xifra inicial correspondrà a l'amplada del tauler en caselles • La resta dels caràcters (llevat del punt final) s'interpretarà com informació per posar les caselles de la següent manera: o Si un caràcter no està dins del conjunt {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } indicarà que s'ha de posar una cel·la grisa. o Si un caràcter està dins del conjunt {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } i el següent no, estarà codificant per una cel·la que conté una bola del color codificat. o Si un caràcter està dins del conjunt {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } i el següent també i corresponen a diferents colors, entre els dos codifiquen la cel·la amb bola bicolor dels dos colors (i en el mateix ordre que apareixen en la seqüència). o Si un caràcter està dins del conjunt {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' } i el següent és el mateix color, es tractaran els dos caràcters independenment. Tasca: Crear un programa que sigui capaç de mostrar en pantalla els taulers seguint dites normes a partir de la seqüència que es llegirà d'un arxiu de dades que el carrega a la variable $cadena.
9
Indicacions preceptives •
El fitxer php rebrà el nom prac1_exer4.php
•
La crida al programa serà del tipus prac1_exer4.php? filename=data40
•
Es crearà la function putImg que rebrà el codi d'una cel·la i posarà en pantalla la imatge que li correspon. Sempre que s'hagi de posar una imatge en pantalla es farà amb una crida a aquesta function.
•
Es crearà la function isImgCode que rebrà com paràmetre un caràcter i retornarà true en cas que correspongui al codi d'una imatge i false altrament.
•
Es faciliten els fitxers d'imatge en format png necessaris per al desenvolupament de l'exercici
•
Els fitxers d'imatge s'hauran d'ubicar a la mateixa carpeta que el php
•
Es faciliten arxius de text de prova amb noms data40, data41, ..., data43. Els arxius, que són arxius de text, s'hauran d'ubicar a la mateixa carpeta que el fitxer php.
•
Per si us és útil, PHP facilita la funció strlen($cadena) 3; que retorna la longitud en caràcters de la cadena de text $cadena
•
PHP facilita les funcions strtoupper 4 i strtolower 5 que reben una cadena i la retornen substituint minúscules per majúscules o bé majúscules per minúscules. Pot ser útil per simplificar el codi del programa.
•
Podeu comprovar el funcionament del programa que se us demana que escriviu amb la crida: http://prog.uoc.edu/prac1/prac1_exer4.php?filename=data40 o, si voleu, canviant el nom del fitxer de dades
Consells. •
El programa ha de fer un recorregut per la cadena cercant en cada posició si es tracta d'un caràcter del conjunt {'B', 'b', 'G', 'g', 'R', 'r', 'Y', 'y' }. En el cas que ho sigui, no s'ha de posar immediatament la imatge, abans s'ha de comprovar si aquest caràcter, juntament amb el següent, codifiquen per una bola de dos colors.
•
Tingueu present que quan poseu una bola de dos colors, les dues lletres de la cadena, ja han estat tractades i la segona no ha de tractar-se un altre cop.
Valoració -
Funcio putImage: 0.2 Funció isImgCode: 0.4 Tractament de la seqüència: 1.0 Concisió en l'ús de composicions i estalvi de variables: 0.4
3
http://es.php.net/manual/es/function.strlen.php http://www.php.net/manual/es/function.strtoupper.php 5 http://www.php.net/manual/es/function.strtolower.php 4
10
//AquĂ heu de posar el vostre codi
<?php
/************* FUNCTION *************/ //function code
function LF() { //line feed print "<br />"; }
function isImgCode ($char) {
if (($char=="B") ($char=="Y"))
||
($char=="G")
||
($char=="R")
||
{ return true; } else { return false; } }
function PutImg ($bola) {
if (strlen($bola)==2) { if ($bola[1]==$bola[0]) { echo "<img src=$bola[1].png>"; }
11
else { echo "<img src=$bola.png>"; } } else { echo "<img src=$bola.png>"; } }
/************* MAIN *************/ //main code $wide=0; $i_taula=0;
$filename = $_GET["filename"]; include($filename); $cadena= strtoupper($cadena);
$wide=$cadena[0]; $i_w=1; for ($i_taula=1; $i_taula<strlen($cadena); $i_taula++) { if ($i_w==$wide) { LF(); $i_w=1; } $i_w++; if (isImgCode($cadena[$i_taula])) {
12
if (isImgCode($cadena[$i_taula+1])) { PutImg($cadena[$i_taula].$cadena[$i_taula+1]); $i_taula++; } else { PutImg($cadena[$i_taula]); } } else { PutImg("E"); } }
?>
13
Exercici 5: Treball amb seqüències de seqüències a l'entrada en PHP [20 %]
El tresorer d'un partir polític ha trobat una manera de codificar els comptes de la caixa B a partir de codis de colors en què cada color d'una bola correspon a una xifra d'un número segons la traducció Codi valor Nom fitxer
0
1
2
3
4
5
6
7
8
9
B
R
G
Y
BG
RG
GY
GB
BY
YR
Separador E
La seqüència que crea està formada pels noms dels fitxers que codifiquen els colors i és del tipus {c 11 c 12 ... c 1n E c 21 c 22 ... c 2n E c 31 c 32 ... c 3n E ... E c m1 c m2 ... c mn .} on •
c ij : nom del fitxer de color corresponent a la xifra j de la quantitat i.
• •
E és el caràcter ‘E’ que indica que s'ha acabat les xifres d'un número . és el caràcter '.' que indica la fi de la seqüència
Aquesta imatge mostra la codificació de colors i els valors associats a la seqüència {R G BY Y B B B E YR RG B B E RG RG RG RG .} hem marcat els separadors amb color blau per veure que la seqüència conté tres números
Tasca: Crear un programa que rebi un fitxer amb la seqüència corresponent a una sèrie de quantitats i mostri en pantalla, a una línia per quantitat: • la codificació en boles de colors • la paraula Value i el valor de la quantitat codificada En acabar de mostrar les quantitats, en la línia següent, es mostrarà el total. Optativament, es pot mostrar sota, el codi de color corresponent al total. Per exemple:
14
Indicacions preceptives •
El fitxer php rebrà el nom prac1_exer5.php
•
La crida al programa serà del tipus prac1_exer5.php?filename=data50
•
Les instruccions per carregar el fitxer de dades i crear la llista $data a partir de la variable $cadena ja formen part del programa principal de la plantilla .
•
Amb els fitxers de l’enunciat, es faciliten 10 fitxers d’imatge que corresponen a cada xifra i que també es fan servir a l'exercici 4. B.png
R.png
G.png
Y.png
BG.png RG.png GY.png GB.png BY.png YR.png
•
Podeu comprovar el funcionament del programa que se us demana que escriviu amb la crida: http://prog.uoc.edu/prac1/prac1_exer5.php?filename=data50 o canviant el nom del fitxer de dades.
•
Es faciliten diversos arxius de dades amb els noms data50 a data53. Són fitxers de text i podeu obrir-los per comprovar el contingut: una instrucció php que assigna valor a $cadena.
•
Els fitxers de dades i d’imatge han se posar-se a la mateixa carpeta que el fitxer php
•
S'ha de crear la function putImg que, a partir del nom del codi mostrarà una cel·la de color a la pantalla.
•
S’ha de crear la function colorToValue que rep un text corresponent al al codi d'una xifra i retorna la xifra que li correspon segons la taula mostrada al principi. Per exemple, si rep "BY" retornaria un 8.
•
No es pot emprar variables globals.
15
Opcionalitat • De manera voluntària podeu fer que el programa, a més de calcular el total, sigui capaç de mostrar el número corresponent al total emprant el codi de colors. Aquesta opció, només serà valorada si el programa bàsic funciona correctament. Consells • Aquest problema s'ha de considerar com un problema de treball amb una seqüència (que nomenarem externa) en què cada element és també una seqüència (interna). Partint de l'exemple {R G BY Y B B B E YR RG B B E RG RG RG RG .}, la seqüència externa té tres elements que estan limitats per la lletra 'E' o bé el '.'. Així els elements de la seqüència externa són: • R G BY Y B B B • YR RG B B • RG RG RG RG cadascun d'ells una seqüència interna El tractament d'aquesta seqüència de seqüències es fa directament a partir de l’ús de array_shift sobre la llista $data i els elements que podem obtenir poden ser: • el '.' i això implica l'acabament d'una seqüencia interna (un número) i de la seqüència externa (acabem la seqüència de números). • la 'E' que indica l'acabament d'un número • qualsevol altre codi, que correspondrà a una bola Així, per tractar la seqüència de seqüències, haurem de treballar amb dos bucles, un de gran (extern) que contindrà un de més petit (intern). El bucle gran, evidentment, s'haurà d'executar fins que no s'agafi de la seqüència el '.', que indica el final de la seqüència total. El bucle intern s'haurà d'executar fins que es trobi una 'E' o el mateix '.' que indica el final d'una seqüència interna (un número). • Heu de tenir en compte, que quan es llegeix una 'E', per poder entrar al bucle intern, haureu de recollir un altre element de la llista. • Per calcular un número quan rebem les xifres per ordre des de la de més valor a la de menys valor el mecanisme iteratiu no és complex, tot i que no és directe. Per exemple: rebem les xifres 4, 8, 2 i volem obtenir el 482. o numero := 0 o numero := numero * 10 + 4 → 0 * 10 + 4 → 0 + 4 → 4 o numero := numero * 10 + 8 → 4 * 10 + 8 → 40 + 8 → 48 o numero := numero * 10 +2 → 48 * 10 + 2 → 480 + 2 → 482 Si us fixeu a cada iteració es fan les mateixes operacions tot i que amb una xifra nova i en el mateix ordre que les anem obtenint.
Valoració -
Funcio putImage: 0.1 Funció isImgCode: 0.3 Tractament de la seqüència: 1.2
16
-
ConcisiĂł en l'Ăşs de composicions i estalvi de variables: 0.4 Part opcional: si funciona correctament fins 0.3 sense poder ultrapassar els 2 punts a la totalitat de l'exercici.
17
//Aquí heu de posar el vostre codi <?php /************* FUNCTION *************/ //Aquí va el codi de les funcions function LF() { //line feed print "<br />"; } function PutImg ($bola) { echo "<img src=$bola.png>"; } function ColorToValue ($color_char) { $array = array( "B" => 0, "R" => 1, "G" => 2, "Y" => 3, "BG" => 4, "RG" => 5, "GY" => 6, "GB" => 7, "BY" => 8, "YR" => 9, );
18
return $array[$color_char];
}
function ValueToColor ($value_color) { $array = array( 0 1 2 3 4 5 6 7 8 9
=> => => => => => => => => =>
"B", "R", "G", "Y", "BG", "RG", "GY", "GB", "BY", "YR",
); return $array[$value_color];
}
/************* MAIN *************/ //AquĂ va el codi del programa principal $filename = $_GET["filename"];
19
include($filename); $data = explode(" ", $cadena); $total_value=0; $multi=1; $suma_total=0; $rdiv=0; do { do { $color_char=array_shift($data); if (($color_char<>"E") && ($color_char<>".")) { PutImg($color_char); $value=ColorToValue($color_char); $total_value=($value*$multi) + $total_value; $multi=$multi*10; } } while (($color_char<>"E") && ($color_char<>".")); echo "- Value $total_value"; LF(); $suma_total= $total_value + $suma_total; $total_value=0; $multi=1;
} while ($color_char<>"."); echo "Suma Total $suma_total"; LF();
20
do { $rdiv= ($suma_total % 10); PutImg(ValueToColor($rdiv)); $suma_total= ($suma_total / 10);
} while (intval($suma_total) <> 0);
?>
21