L'assignatura de programació tracta de l'aprenentatge al disseny bàsic d'algoritmes.
La resolució d'algoritmes per cada problema es basa a aplicar una sèrie d'instruccions i càlculs que depenent del problema aquest tindrà més instruccions o menys. Aquesta tasca és bàsica, per poder després entendre qualsevol llenguatge de programació és una assignatura que si no es té coneixements previs és molt abstracta.
A part de la confecció d'algoritmes amb pseudocodi també es practica la resolució d'algoritmes utilitzant el llenguatge de programació PHP.
2. Exercici 1: Treball bàsic amb taules en PHP [50%]
Les taules de dades és un del mecanismes més habituals de representar les dades i
és freqüent haver d’operar amb dades provinents de taules diverses. En aquest
exercici es pretén crear taules, omplir-les, recorrer-les i operar amb dades provinents
de taules per obtenir noves taules.
Tasca: Consistirà en crear un conjunt de mòduls que rebin, treballin i retornin taules de
nombres enters.
S'haurà de crear els mòduls:
Mòdul getData
Aquest mòdul no ha de rebre cap paràmetre.
La crida al programa haurà de ser del tipus:
localhost/pac3_exer1.php?filename=data10
el fitxer de dades consta d’una única instrucció de php en què la variable
$cadena rep com valor una cadena de text integrada per una sèrie de números
que estan separats per un espai en blanc, com ara
$cadena=" 10 9 8 7 6 5 4 3 2 1 0";
El mòdul recollirà de la URL el nom del fitxer de dades, l’inclourà (include 1
), i
extraurà les dades a una array (explode2
) que retornarà.
Per exemple, si s’havia rebut la cadena mostrada com exemple, retornarà una
taula:
10 9 8 7 6 5 4 3 2 1 0
1
http://es2.php.net/manual/es/function.include.php
2
http://es2.php.net/manual/es/function.explode.php
3. Mòdul printArray
Rep dos paràmetres, el primer és una cadena de text i el segon un array i escriu:
En una primera línia i de manera destacada, la cadena de text rebuda. I en una
línia nova tots els elements de la taula segons la seva posició i separats per
comes.
P.e. Si la crida hagués estat printArray("Received", $data) i l'array $data
correspongués a la cadena posada com exemple, aquesta function
escriuria a la pantalla:
Received
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
Mòdul createsBrotherVector
Rep tres paràmetres, un array i dos números enters (min i max). El mòdul crea i
retorna un array igual de llarg que l’array rebut i l’omple de nombres enters
aleatoris compresos entre min i max. Per obtenir la dimensió de l’array rebut farà
servir la function count3
i per crear el nombres aleatoris la ja coneguda rand.
Per exemple si la crida és createsBrotherVector($data, 2, 4) i $data té els
valors
10 9 8 7 6 5 4 3 2 1 0
El vector retornat podria ser
3 3 2 3 4 4 2 3 2 4 3
De la mateixa longitud que l’array rebut i ple de nombres aleatoris entre 2 i 4
Mòdul minValuesVector
Ha de rebre tres paràmetres, els tres arrays de la mateixa longitud i retorna un
array de la mateixa longitud on en cada posició té el menor dels tres nombres
ubicats a la posició equivalent als tres arrays. Per exemple si els arrays rebuts
són:
10 9 8 7 6 5 4 3 2 1 0
4 5 7 5 9 12 7 5 7 0 4
5 1 6 3 11 6 5 2 1 1 7
l’array retornat seria:
4 1 6 3 6 5 4 2 1 0 0
Mòdul sumVectorValues
Ha de rebre com paràmetre un vector i retorna la suma de tots els seus
elements. P.e. si rep la taula
10 9 8 7 6 5 4 3 2 1 0
retornaria un 55 (10+9+8+7+6+5+4+3+2+1+0)
Mòdul inverseVector
Ha de rebre com paràmetre un vector i retorna un altre vector amb els mateixos
elements però posats en ordre invers P.e. si rep la taula
10 9 8 7 6 5 4 3 2 1 0
l’array retornat seria:
0 1 2 3 4 5 6 7 8 9 10
Mòdul sumVectors
Ha de rebre dos paràmetres, dos arrays d'enters de la mateixa longitud i retorna
3
http://php.net/manual/es/function.count.php
4. un array de la mateixa longitud on en cada posició té la suma dels dos nombres
ubicats a la posició equivalent als arrays rebuts. Per exemple si els arrays rebuts
són:
10 9 8 7 6 5 4 3 2 1 0
3 3 3 3 3 3 3 3 3 3 3
l’array retornat seria:
13 12 11 10 9 8 7 6 5 4 3
No haureu de crear el programa principal perquè ja forma part de la plantilla i no
s’ha de modificar. És important que mireu el programa principal, amb les crides als
mòduls per saber com han de ser les capçaleres de les function.
Podeu comprovar el funcionament del programa amb la crida.
http://prog.uoc.edu/pac3/pac3_exer1.php?filename=data10
També podeu provar-lo canviant el nom del fitxer de dades per qualsevol altre (fins
data15)
Indicacions preceptives
1. No es pot fer ús de variables globals.
2. En PHP existeix la function count($arg)4
que rep com argument un array i
retorna la quantitat d'elements que té l'array $arg. És força útil per saber els
límits dels recorreguts per l'array.
Per exemple si la taula és (89, 7, 3, 4, 5, 9) retornaria un 6.
3. A diferencia del llenguatge algorísmic, el primer element de les taules en PHP
és l'element 0.
Per exemple en la taula (1, 4, 8, 12, 16, 20) el número 8 està en la posició 2.
4. PHP porta integrades moltes functions per treballar amb arrays, com ara
array_shift que ja hem fet servir amb anterioritat. Una altra és count que es
comenta en la indicació 2. En aquest exercici de la PAC, queda especialment
prohibit fer ús de les function d'arrays de php llevat de l’esmentada count.
5. Es faciliten 6 fitxers de dades data10 a data15.
6. L’exercici es construirà sobre la plantilla pac3_exer1_plantilla.php que es
canviarà de nom a pac3_exer1.php per al seu lliurament. Aixi mateix, en el
present document es copiarà el codi del programa.
Consells
1. Podeu reutilitzar mòduls d'exercicis anteriors, directament o adaptats, be sigui
de les vostres respostes o de la solució publicada.
4
http://php.net/manual/es/function.count.php
5. Valoració
- Function getData: 0.25
- Function printArray: 0.25
- Function createsBrotherVector: 1
- Function minValuesVector:1.25
- Function sumVectorValues:0.25
- Function inverseVector: 0.75
- Function sumVectors:0.75
- Concisió en l'ús de composicions i estalvi de variables: 0.50
6. Copieu aquí el codi de la vostra solució
<?php
/************* FUNCTION *************/
//AquÌ va el codi de les funcions
function LF()
{ //line feed
print "<br />";
}// de LF
//put here your code
function getData()
{
$filename = $_GET["filename"];
include($filename);
$data = explode(" ",$cadena);
return $data;
}
function printArray($text, $data)
{
// imprimir $text
echo $text;
// posicionar array --> $i=0;
$i=0;
// mentre no fi --> $i<count($data)
while($i<count($data))
{
// llegir valor posició $i
$n=$data[$i];
// imprimir valor
echo $n;
// imprimir ,
if($i<count($data)-1)
{
7. echo ",";
}else
{
echo "<br>";
}
// avançar i++
$i++;
//fmentre
}
}
function createsBrotherVector($data, $minim, $maxim)
{
// posicionar array --> $i=0;
$i=0;
// mentre no fi --> $i<count($data)
while($i<count($data))
{
// $v[$i]= generar aleatori entre minim i maxim rand array_rand
$v[$i]=rand($minim,$maxim);
// avançar i++
$i++;
//fmentre
}
return $v;
}
function minValuesVector ($data1, $data2, $data3)
{
// posicionar
//mentre no fi
// llegir valor de $data1
// llegir valor de $data2
// llegir valor de $data3
// cercar el minim --> $dataMinim
//fmentre
10. Exercici 2: Treball bàsic amb taules en PHP [50%]
En les pacs anteriors i en la pràctica vam treballar amb les butxaques plenes de
monedes. En les pacs, a mida que es generava una moneda el programa perdia la
constància de quines havia generat abans (coneixia la suma però no quines monedes i
en quin ordre les havia generat). En la pràctica, com que es tractava de seqüències a
l’entrada, a mida que recollíem les dades una a una de l’entrada les anàvem perdent.
Una solució és emmagatzemar les dades en una taula en què en cada posició
emmagatzemem el codi d’una moneda. Podem accedir a cada posició de la taula per
saber quina moneda es va generar en cada moment, podem veure la butxaca sense
perdre-la i podem també modificar-la.
Al present exercici se us proposa treballar amb arrays que representen una butxaca de
monedes i bitllets.
Tasca: L'exercici consistirà en la creació d'una sèrie de mòduls en php que
desenvolupin, cadascun, una determinada feina segons el detall que se'n farà a
continuació.
No caldrà fer el programa principal perquè aquest forma part de la plantilla i consta
11. de les crides a les accions i funcions que haureu de desenvolupar com exercici. El
programa principal no ha de modificar-se
Mòdul getData
Aquest mòdul no ha de rebre cap paràmetre.
La crida al programa haurà de ser del tipus:
localhost/pac3_exer2.php?n=15
el mòdul recollirà el valor de n passat com paràmetre i el retornarà. Si a la URL
no s’ha posat el paràmetre n, es retornarà el valor 50.
Mòdul getCoinValue
que rep com paràmetre el codi d’una moneda o bitllet i retorna el seu valor. El
codi consisteix en un número entre 1 i 12 que es correspon amb una moneda o
un bitllet segons la següent codificació.
codi 1 2 3 4 5 6 7 8 9 10 11 12
valor 0.01 0.02 0.05 0.10 0.20 0.50 1 2 5 10 20 50
Dins de la function, la correspondència entre el codi i el valor s’ha de fer
mitjançant un array.
Mòdul putImage
que rep com paràmetre el codi d’una moneda o bitllet i posa la imatge en
pantalla.
Dins de la function, la correspondència entre el codi i el nom del fitxer d’imatge
s’ha de fer mitjançant un array.
Mòdul initialize
aquest mòdul rep dos paràmetres i retorna un array amb totes les seves
posicions emplenades al mateix valor. El primer dels paràmetres indica la
longitud de l’array i el segon el valor que es posarà a les posicions. P.e. si la
crida és $a = initialize( 5, 12), el vector retornat serà
$a 12 12 12 12 12
Mòdul createPocket
aquest mòdul rep un paràmetre (size) i retorna un array de longitud size que en
les seves posicions té els codis de monedes i bitllets generats aleatòriament.
P.e. si la crida és $pocket = createPocket (12), el vector retornat podria ser
$pocket 3 12 5 2 2 3 10 1 8 4 5 5
Mòdul group
aquest mòdul rep com paràmetre un array que en les seves posicions conté
números entre 1 i 12 i que representa una butxaca amb monedes i bitllets. El
mòdul retorna un array de longitud 12 en que indica en les seves posicions
quantes monedes o bitllets hi ha de cada valor. P.e. si el array rebut fora
$pocket 3 12 5 2 2 3 10 1 8 4 5 11 7 5
l’array a retornar seria
$group 1 2 2 1 3 0 1 1 0 1 1 1
Perquè en l’array rebut hi ha un 1, dos 2, dos 3, un 4, tres 5, cap 6, un 7, un 8,
cap 9, un 10, un 11 i un 12.
Mòdul showVector
aquest mòdul rep com paràmetre un array que en les seves posicions conté
números entre 1 i 12 i que representa una butxaca amb monedes i bitllets i
mostra el contingut en la pantalla. Per mostrar cada moneda o bitllet realitza una
12. crida a putImage.
Mòdul countPocket
aquest mòdul rep com paràmetre un array que en les seves posicions conté
números entre 1 i 12 i que representa una butxaca amb monedes i bitllets i
retorna el valor total de les monedes i bitllets que representa. Per a obtenir el
valorde cada moneda o bitllet farà una crida a getCoinValue.
Mòdul inChange
aquest mòdul rep com paràmetre un array que en les seves posicions conté
números entre 1 i 12 i que representa una butxaca amb monedes i bitllets i el
modifica de manera que les posicions que abans representaven cèntims passin a
representar euros i el que abans representava euros passi representar cèntims.
P.e. si la butxaca rebuda tenia només:
2 monedes de 1 cèntim, una de 2 euros i un bitllet de 20 euros, es modificarà a
2 monedes de 1 euro, una de 2 cèntims i una altra de 20 cèntims.
Recordeu, però que l’array ha de contenir sempre codis de monedes o bitllets,
s'ha de canviar un codi per un altre.
Podeu comprovar el funcionament del programa amb la crida:
http://prog.uoc.edu/pac3/pac3_exer2.php?n=15
o bé amb qualsevol altre valor o sense argument a la crida
Indicacions preceptives
1. No es pot fer ús de variables globals
2. En PHP existeix la function count($arg)5
que rep com argument un array i
retorna la quantitat d'elements que té l'array $arg. És força útil per saber els
límits dels recorreguts per l'array.
Per exemple si la taula és (89, 7, 3, 4, 5, 9) retornaria un 6.
Queda especialment prohibit l’ús de les functions d’array de php llevat de
l’esmentada count.
3. A diferencia del llenguatge algorísmic el primer element de les taules en PHP
és l'element 0.
Per exemple en la taula (1, 4, 8, 12, 16, 20) el número 8 està en la posició 2.
4. L’exercici es construirà sobre la plantilla pac3_exer2_plantilla.php que es
canviarà de nom a pac3_exer2.php per al seu lliurament. Tanmateix, en el
present document es copiarà el codi del programa.
5. Es faciliten les imatges de monedes i bitllets
1c.png 2c.png 5c.png 10c.png 20c.png 50c.png 1e.png 2e.png
5
http://php.net/manual/es/function.count.php
13. 5e.png 10e.png 20e.png 50e.png
6. Els fitxers d’imatge s’hauran d’ubicar a la mateixa carpeta que el fitxer php.
7. El programa principal que forma part de la plantilla no s’ha de modificar.
8. Si ho creieu convenient podeu reutilitzar functions d’exercicis anteriors o de les
solucions dels exercicis sempre que segueixin les especificacions escrites en
aquest enunciat..
Valoració
- Function getData: 0.25
- Function getCoinValue: 0.5
- Function putImage: 0.5
- Function initialize: 0.25
- Function createPocket: 0.5
- Function group: 1
- Function showVector: 0.25
- Function countPocket: 0.25
- Function inchange: 1
- Concisió en l'ús de composicions i estalvi de variables: 0.5
14. Copieu aquí el codi de la vostra solució
<?php
/************* FUNCTION *************/
//functions code
function LF()
{ //line feed
print "<br />";
}// de LF
//put here your code
function getData()
{
if(!is_null($_GET["n"]))
{
$n=$_GET["n"];
}else
{
$n=50;
}
return $n;
}
function getCoinValue($c)
{
$valueCoins=array(0.01, 0.02, 0.05, 0.10, 0.20,0.50,1,2,5,10,20,50);
return $valueCoins[$c];
}
function putImage($c)
{
$table_coins=array('1c','2c','5c','10c','20c','50c','1e','2e','5e','10e','20e','50e');
print "<img src='".$table_coins[$c].".png'>";
}
function initialize($posicions, $value)
{
$i=0;
14