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 amb taules de taules [20 %]
La colla d'amics que tants problemes ens han causat amb el contingut de les seves
butxaques han decidit ara fer un estudi informatitzat de com evoluciona el contingut de les
seves butxaques al llarg de l'any.
Ja estan acostumats a codificar el contingut en monedes de les seves butxaques
segons el següent mètode:
codi 1 2 3 4 5 6 7 8
valor 0.01 € 0.02 € 0.05 € 0.10 € 0.20 € 0.50 € 1 € 2 €
de manera que han decidit que el contingut d'una butxaca es pot emmagatzemar en una
taula de tipus pocket definit de la següent manera
tipus
pocket: taula [8] de enter;
ftipus
de manera que una taula amb el següent contingut
3 0 1 0 2 0 2 3
contindria 3 monedes d'una cèntim, 1 de 5 cèntims, 2 de 20 cèntims, 2 d'un euro i 3 de dos
euros, és a dir, cada posició es correspon amb el codi d'una moneda i el contingut de la
posició és la quantitat de monedes del tipus en qüestió.
Per acabar amb el disseny de dades han creat una taula que englobaria les dades d'un any
complet:
tipus
pocketYear: taula [365] de pocket;
ftipus
Cada posició de la taula de tipus pocketYear es correspondria al contingut de la butxaca un
dia determinat.
Tasca: Creeu el mòdul maxYear que rebi una taula de tipus pocketYear i
que escrigui en el canal estàndard el contingut la butxaca de cada dia a mode de
seqüència integrada pel número de dia i, per ordre, les quantitats de monedes de
cada tipus i finalitzada amb '#', com ara:
1* 0 2 3 0 0 4 2 2 2 1 3 2 4 0 1 1 1 ... 365 0 0 1 2 3 0 2 3 #
*en negreta està indicat el número del dia
i que retorni una taula de tipus pocket on estigui emmagatzemada la quantitat
màxima de monedes de cada tipus que ha arribat a portar al llarg de l'any. És a
dir una taula del tipus
5 8 4 9 9 12 8 9
significaria que el dia que va dur més monedes d'un cèntim a la butxaca, en va dur 5.
El dia que va dur més monedes de 2 cèntims en va dur 8, el que en va dur més de 5
cèntims van ser 4, ... i el dia que va dur més monedes de 2 € en van ser 9.
Valoració
- Determinació correcta del tipus de mòdul: 0.2
- Ús correcte dels paràmetres: 0.4
- Treball correcte amb índex de taules i taules de taules: 1
- Concisió en l'ús de composicions i estalvi de variables: 0.4
3.
4. //la variable i recorre el vector la variable p es el vector pocket
la variable guardara el datos de tots el pokets per allar el maxim
function maxYear(ent py: pocketYear) : pocket
var:
p: pocket;
i: enter;
j: enter;
py:pocketYear;
fvar
i:=0;
mentre(i<8) fer
p[i]:=0;
i++;
fmentre
i:=0;
mentre(i<365) fer
//imprimir (1 x x x x x..... 365 x x x x x #)
imprimir(i);
j:=0;
mentre(j<8) fer
imprimir(py[i][j]);
j++;
fmentre
//determinar el maxim
j:=0;
mentre (j<8) fer
si(p[j]<py[i][j]) llavors
p[j]=py[i][j];
fsi
j++;
fmentre
i++;
fmentre
imprimir("#");
5. Exercici 2: Treball taules de taules en PHP [30 %]
Les taules de taules s'empren per treballar amb col·leccions de dades homogènies
cadascuna de les quals és, alhora, una col·lecció de dades.
En aquest exercici treballarem amb una taula de taules (una matriu quadrada) de nombres
enters creada a partir d'una seqüència llegida d'un fitxer. En l'exercici es faran operacions
amb matrius, vectors i matrius i vectors entre ells
El fitxer de dades contindrà una cadena de text amb una seqüència de números el primer
dels quals indica la longitud de les taules i després venen les dades per omplir la taula. El
contingut dels fitxers de dades és una instrucció de PHP que carrega una cadena de text
com ara:
<?php
$cadena="3 3 -1 -1 3 0 0 -2 -1 0";
?>
Aquesta cadena d’exemple contindria les
dades per una matriu de 3x3 (la primera
dada és un 3) i ve seguida de 9 números,
de manera que el resultant seria.
Tasca: Crear un conjunt de functions en php que creïn i manipulin una taula de taules
quadrada de dimensions que determina l'usuari segons les indicacions. També s’haurà
6. de crear i gestionar una taula lineal per gestionar les dades llegides en el fitxer d’entrada
Algunes de les function hauran de treballar directament amb taules de taules i d'altres
amb taules simples. En general es treballarà sempre amb una sola taula de taules
($square) i algunes taules lineal ($data, $vector).
El programa principal ja forma part de la plantilla i no s’ha de modificar.
S'ha de crear les següents function
function getData
Aquest mòdul no ha de rebre cap paràmetre.
La crida al programa haurà de ser del tipus:
localhost/prac2_exer2.php?filename=data20
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 = "3 3 -1 -1 3 0 0 -2 -1 0"
El mòdul recollirà el nom del fitxer de dades del paràmetre filename, l’inclourà
(include1
), i extraurà les dades (explode2
) a un array ($data) que retornarà.
Per exemple, si s’havia rebut la cadena mostrada a dalt com exemple, retornarà la
taula $data:
3 3 -1 -1 3 0 0 -2 -1 0
function createSquare
Que rebrà com paràmetre l'array lineal de dades rebudes. El primer número (n1)
d'aquest array, serà considerat la dimensió de la taula de taules.
o Crearà un array de n1 files cadascuna de les quals serà un array de n1 posicions
enteres
o Omplirà les posicions de la taula de taules amb les dades que segueixen a n1 de
manera que omplirà, amb les n1 següents dades les posicions de la primera fila,
amb les n1 següents la segona fila, etc. fins omplir els n1 arrays
o Retornarà l'array d'arrays generat. Per exemple si l'array unidimensional rebut
hagués estat:
3 1 2 3 4 5 6 7 8 9
L'array retornat seria
1 2 3
4 5 6
7 8 9
function printSquare
Que rebrà com paràmetre l'array d'arrays i el mostrarà en pantalla en una taula HTML.
El codi CSS per tal que es mostri contrastat sobre el fons fosc de la pantalla ja forma
part de la plantilla. Per obtenir la dimensió de l’array PHP facilita la function count3
.
1
http://php.net/manual/es/function.include.php
2
http://php.net/manual/es/function.explode.php
3
http://php.net/manual/es/function.count.php
7. function printVector
Que rebrà com paràmetre un array lineal i mostrarà els seus elements en la pantalla
organitzats en una taula HTML. El codi CSS per tal que es mostri contrastat sobre el
fons fosc de la pantalla ja forma part de la plantilla. Per obtenir la dimensió de l’array
PHP facilita la function count4
.
function sumRows
Que rebrà com paràmetre l'array d'arrays i retornarà un array d’una dimensió que en
cada posició té la suma dels elements de la filera corresponent de la matriu. Per
exemple si la matriu té el contingut
1 2 3
4 5 6
7 8 9
l’array retornat seria
6 15 24
function sumCols
Que rebrà com paràmetre l'array d'arrays i retornarà un array d’una dimensió que en
cada posició té la suma dels elements de la columna corresponent de la matriu. Per
exemple si la matriu té el contingut
1 2 3
4 5 6
7 8 9
l’array retornat seria
12 15 18
function squareVectorProduct
Que rebrà una matriu d’entrada i un vector de la mateixa longitud i retornarà una
matriu on cada filera estarà composada pels productes de la filera equivalent de la
matriu d’entrada pels elements del vector. Per exemple, si matriu i vector tenen els
continguts
1 2 3
4 5 6 1 2 3
7 8 9
La matriu que es retornarà serà
1 4 9
4 10 18
7 16 27
Indicacions preceptives
La plantilla prac2_exer2_plantilla.php porta incorporat el programa principal que fa
les crides a les function. El codi que va escrit a la plantilla no s'ha de modificar. És
molt convenient que mireu el programa principal i veieu les crides que es fan a les
function per veure si es corresponen a funcions i retornen mitjançant return o bé són
accions que no retornen res o retornen els valors mitjançant els paràmetres de
sortida o entrada/sortida
Es faciliten també 6 fitxers de dades data20 a data25.
Els fitxers de dades s’han d’ubicar a la mateixa carpeta que el fitxer php.
No es poden emprar variables global. Tampoc es poden emprar functions d'array
incloses a php llevat de count i array_shift.
4
http://php.net/manual/es/function.count.php
8. Altres indicacions
Recordeu que, a diferencia de les taules en llenguatge algorísmic que comencen en
la posició 1, en PHP la primera posició dels arrays és la posició 0.
Podeu emprar functions confeccionades per a exercicis o provinents de solucions
anteriors, ja siguin completes o adaptades a les noves dades estructurades.
Podeu també crear quantes altres functions cregueu necessari.
Podeu comprovar el funcionament a:
http://prog.uoc.edu/prac2/prac2_exer2.php?filename=data20
o canviant el nom del fitxer de dades
Consells
Cal analitzar ben bé què s'ha de fer en cadascun dels mòduls que es demanen en aquest
programa i mirar quins mòduls de programes anteriors es poden emprar bé directament o bé
amb petites modificacions per adaptar-los a les noves necessitats.
Valoració
- Function getData: 0.5
- Function createSquare: 0.5
- Function printSquare: 0.5
- Function printVector: 0.5
- Function squareVectorProduct: 0.5
- Concisió en l'ús de composicions i estalvi de variables: 0.5
9. Copieu aquí el codi de la vostra solució
<?php
/************* FUNCTION *************/
function LF()
{ //line feed
print "<br />";
}// de LF
//put your code here
function getData()
{
$filename = $_GET["filename"];
include($filename);
$data = explode(" ",$cadena);
return $data;
}
function createSquare($data)
{
// Llegir dimensió --> primer valor es $recData --> dimensio
$files=0;
$recData=0;
$dimensio=$data[$recData];
$recData++;
while($files<$dimensio)
{
$columnes=0;
while($columnes<$dimensio)
{
$square[$files][$columnes]=$data[$recData];
$recData++;
$columnes++;
}
$files++;
}
10. return $square;
}
function printSquare($square)
{
echo "<table>";
//recorrer files
$files=0;
$dimensio=sqrt(count($square));
while($files<$dimensio)
{
echo "<tr>";
//recorrer columnes
$columnes=0;
while($columnes<$dimensio)
{
//imprimir valor
echo "<td>".$square[$files][$columnes]."</td>";
$columnes++;
}
echo "</tr>";
$files++;
}
echo "</table>";
}
function printVector($vector)
{
//crea taula
echo "<table>";
// crea la fila
echo "<tr>";
//recorrer el vector
$recData=0;
$dimensio=count($vector);
11. while($recData<$dimensio)
{
//imprimir valor
echo "<td>".$vector[$recData]."</td>";
$recData++;
}
echo "<tr>";
echo "</table>";
}
function sumRows($square)
{
//recorrer files de square --> i guardara el valor de la suma de la fila
$i=0;
$dimensio=sqrt(count($square));
while($i<$dimensio)
{
$vector[$i]=0;
$i++;
}
$files=0;
// per cada fila: recorrer per columnes
while($files<$dimensio) {
// sumar els valors i emmagatzemar-los a vector[i]
$columnes=0;
while($columnes<$dimensio)
{
$vector[$files]=$vector[$files]+$square[$files][$columnes];
$columnes++;
}
$files++;
}
return $vector;
}
12. function sumCols($square)
{
//recorrer files de square --> i guardara el valor de la suma de la fila
$i=0;
$dimensio=sqrt(count($square));
while($i<$dimensio)
{
$vector[$i]=0;
$i++;
}
$columnes=0;
// per cada fila: recorrer per columnes
while($columnes<$dimensio) {
// sumar els valors i emmagatzemar-los a vector[i]
$files=0;
while($files<$dimensio)
{
$vector[$columnes]=$vector[$columnes]+$square[$files][$columnes];
$files++;
}
$columnes++;
}
return $vector;
}
function squareVectorProduct($square, $vector)
{
$dimensio=count($vector);
$files=0;
while($files<$dimensio)
{
$columnes=0;
while($columnes<$dimensio)
{
$square2[$files][$columnes]=$square[$files][$columnes]*$vector[$columnes];
14. Exercici 3: Disseny i treball amb tuples [20 %]
Un estudiant d'informàtica ha decidit posar en valor els seus coneixements i
informatitzar la discoteca que va fer mentre era jovenet (ara només escolta música en
la seva tablet i no es compra CDs)
Tasca:
Dissenyeu el tipus de dada estructurada tSong per emmagatzemar les dades
d'una cançó (nom, durada en minuts centesimals [1'30" seria 1.50] , tipus de
música [Acid, Agropop, Ambient, ... Underground, Sarsuela], autor de la
música, autor de la lletra y si la gravació és d'estudi o en directe)
tsongs=tupla
nom:cadena;
durada:decimal;
tipus:cadena;
autor: cadena;
estudi:boolean;
ftupla;
Dissenyeu el tipus de dada estructurada tAlbum que ha de contenir el nom de
l'album, el nom de l'interpret, la quantitat de cançons, capacitat per
emmagatzemar les dades de fins 20 cançons, el nom de la discogràfica i l'any
d'edició del disc.
tAlbum=tupla
nomAlbum:cadena;
nomInterpret:cadena;
nCançons:enter;
cançons: taula[20] de tSongs;
nomDiscografia:cadena;
any:enter;
ftupla
Te recomptats 223 CDs, però creu que és possible que en tingui algunes desenes
més "despistats". Per mantenir tota la informació que disposa ara i la que tindrà
quan trobi els CDs que té perduts ha creat el tipus tDisco de la següent manera
tDisco = tupla
album: taula [300] de tAlbum; {fitxes dels CDs}
qtty : enter; {número que indica quants CDs ja ha informatitzat }
ftupla
i la variable myDisco del tipus tDisco, on s'ha entrat tota la informació de manera
que totes les fitxes d'àlbums plenes estan posades consecutivament des de la
primera posició (ocupa les primers 223 posicions).
Escriviu l'expressió que ens indiqui si la última cançó del primer disc introduït a
myDisco va ser gravada en directe
15. myDisco.album[1].cançons[myDisco.album[1].nCançons-
1].estudi=fals
Escriviu el mòdul shorter (acció o funció, el més adequat) que rebi myDisco, i
una durada en minuts centesimals, escrigui en la pantalla els títols de totes les
cançons la durada de les quals sigui igual o inferior a la durada rebuda i retorni
la quantitat de cançons que ha escrit.
funcio shorter(ent myDisco:tDisco, ent durada:decimal):enter
var:
i:enter;
j:enter;
n:enter;
fvar
n:=0;
i:=0;
mentre(i<myDisco.qtty) fer
j:=0;
mentre(j<myDisco.album[i].nCançons) fer
si(durada>=myDisco.album[i].cançons[j].durada) llavors
imprime(myDisco.album[i].cançons[j].nom);
n++;
fsi
j++;
fmentre
i++;
fmentre
retorna n;
ffuncio
Valoració
- Definició correcte dels camps de les tuples: 0.5
16. - Mòdul shorter: 0.5
- Ús correcte de la sintaxi de taules i de tuples: 0.8
- Concisió en l'ús de composicions i estalvi de variables: 0.2
17. Exercici 4: Treball amb tuples i taules de tuples en PHP [30 %]
Els nostres amics que ens han acompanyat amb les seves butxaques, han fet acte de
presència un altre cop en aquesta pràctica. Ara han decidit que les seves dades
s'emmagatzemin en un tuples que respondrien, en llenguatge algorísmic, a la següent
definició:
tipus
friend = tupla
name : cadena; {conté el nom de l'amic}
birthYear: enter; { conté el seu any de naixement}
pocket : taula [8] de enter; {conté el nombre de monedes que té de
cada tipus,a la manera descrita el
l'exercici 1 d'aquesta pràctica}
total: enter; {conté el valor total de les monedes que té l'amic a
la butxaca}
ftupla
ftipus
A cada amic li correspon una tupla i en el programa es mantenen les dades de tots els
amics en una taula de tuples
team : taula [N] de friend;
on N és la quantitat d'amics que formen el fitxer de dades.
el fitxer de dades conté una única instrucció en PHP, l'assignació a la variable $cadena
de totes les dades del conjunt d'amics.
$cadena és una cadena de text amb un contingut del tipus:
"Gandalf 1225 2 2 0 0 2 4 1 0 Bilbo 1657 3 2 1 0 2 1 1 1 Gollum 1602 0 0 0 0 0 0 3 5 #";
en què per a cada amic trobem la informació del seu nom, l'any de naixement i vuit
enters que signifiquen la quantitat de cadascun dels tipus de moneda des del cèntim
d'€ fins la peça de 2€.
La cadena finalitza amb el caràcter '#'.
La funció getData(), recull les dades i crea i retorna la taula de tuples. Ja forma part de
la plantilla i no l'heu de programar. La function posa un 0 en el camp total perquè
calcular el seu valor és una de les feines a desenvolupar.
Tasca: Recollides les dades en un array de tuples, crear un conjunt de functions en
php que manipulin tuples i taules de tuples segons les indicacions. El programa
principal ja forma part de la plantilla i no s’ha de modificar.
18. El programa s'escriurà a la plantilla prac2_exer4_plantilla.php que es canviarà
de nom a prac2_exer4.php pel lliurament.
Podeu provar el funcionament del programa a l'enllaç
http://prog.uoc.edu/prac2/prac2_exer4.php?filename=data41
Indicacions preceptives
Es faciliten les imatges per mostrar el contingut de les butxaques
1c.png 2c.png 5c.png 10c.png 20c.png 50c.png 1e.png 2e.png
19. Per a dur a terme aquesta tasca es facilita els fitxers de dades data40 i data41
que han d'esmentar-se a la URL
Els fitxers de dades i el d'imatge se situaran a la mateixa carpeta de localhost
que el fitxer php.
La plantilla porta incorporada la instrucció include(“data”) que carrega l’array
de tuples. La variable que conté les tuples té per nom $team, de manera que
per accedir al nom de la primera tupla, haurem de referir-nos a:
$team[0][“name”].
De la mateixa manera, per accedir a la quantitat de monedes de 5 cèntims de
les dades de l'amic que està en 2n lloc, la referència seria:
$team[1][“pocket”][2]5
Heu de crear la function showOneFriend que rep una tupla i la mostra
repartida en dues línies:
1. Camp “name” de l'amic i camp "birthYear"
2. Conjunt de monedes i el valor total de les monedes de l'amic.
Sempre que s’hagi d’escriure les dades d'un amic es farà servir aquesta
function.
Heu de crear la function showTeam que rep l’array de tuples i les mostra totes
per pantalla. Per escriure cada tupla farà una crida a showOneFriend.
Heu de crear la function computesTotal que rep i modifica la taula de tuples
omplint el camp “total” de cada tupla avaluant el valor nominal de totes les
monedes de la "pocket" de la mateixa tupla.
Heu de crear la function showOlderThan que rep la taula de tuples i un
número corresponent a un any de naixement i mostra en pantalla les dades de
tots aquells amics que van nèixer abans de l'any rebut.
Heu de crear la function showRichest que rep la taula de tuples i mostra les
dades de l'amic que té més diners. En el cas d'empat en el valor màxim, només
cal que es mostri un dels dos "rics".
Consells
No es dóna en cap lloc informació de la longitud de cap dels arrays, els haureu
de calcular emprant la function count6
que ja s’ha emprat anteriorment:
count($team) retornaria la quantitat de tuples que formen part de l’array i
count($team[$i][“pocket”]) retornaria la quantitat de dades numèriques
que conté el camp “pocket” de l'amic d’index $i
Podeu reutilitzar directament o modificant-les functions d'altres pràctiques o
PACs, be siguin vostres o de les solucions.
Valoració
- Function showOneFriend: 0.4
- Function showTeam: 0.4
5
recordeu que en PHP la primera posició dels arrays és la posició 0
6
http://php.net/manual/es/function.count.php
20. - Function computesTotal: 0.5
- Function showOlderThan: 0.4
- Function showRichest: 0.5
- Ús correcte de la indexació de taules i taules associatives: 0.5
- Concisió en l'ús de composicions i estalvi de variables: 0.3
21. //Aquí heu de posar el vostre codi
<?php
/*************FUNCTION PLANTILLA ****************/
function getData()
{ //get data File & returns associative data Array
$filename = $_GET["filename"];
include($filename);
$data = explode(" ", $cadena);
$name = array_shift($data); //init sequence
$i=0;
while ($name != '#')
{
$p[$i]["name"] = $name;
$p[$i]["birthYear"] = array_shift($data);
for ($j=0; $j<8; $j++)
$p[$i]["pocket"][$j] = array_shift($data);
$p[$i]["total"]=0; //init al 0 value
//prepare new loop
$name = array_shift($data);
$i++;
}
return $p;
}// de getData
function LF()
{ //line feed
print "<br />";
}
function title($text)
{
print "<h3>$text</h3>";