1. Estudis d’ Informàtica, Multimèdia i Telecomunicació
Programació
Práctica 2
Cognoms: SOLUCIÓ
Indicacions generals:
Llegiu amb detall les tasques encomanades a cada exercici i també les indicacions i
suggeriments de resolució.
Per a dubtes i aclariments sobre l’enunciat, adreceu-vos al consultor responsable de la
vostra aula.
Lliurament:
1. Els exercicis 1 i 4, en llenguatge algorísmic, han de resoldre’s en aquest mateix document
2. Cal lliurar la solució d’aquesta pràctica en un fitxer comprimit en format zip o rar nomenat
CognomsNom_P_PRACT2 adreçat a la bústia “Lliurament d’activitats”
3. El fitxer comprimit contindrà aquest mateix arxiu amb les respostes a les preguntes 1 i 4 i
els arxius php corresponents als exercicis 2, 3 i 5. No s’han d’adjuntar els fitxers d’imatge
ni de dades.
4. Data límit per lliurar la solució: dilluns, 16 de maig de 2012 (a les 23:59 hores).
És imprescindible respectar el format, el nom dels fitxers php i data de lliurament. La
no adequació a aquestes especificacions pot suposar la no avaluació de la Pràctica.
1
2. Exercici 1: Treball amb taules [15%]
Objectius: Donat un conjunt de dades organitzat en una taula, aplicar l’esquema
adequat per construir un algorisme que solucioni un determinat problema el resultat
del qual té forma de taula
Materials: Mòdul 4: Tipus estructurats de dades
Tasca: Dissenyar el mòdul (acció o funció, el més adequat) sonTriangles que rebi tres
taules petit, mitja i gran de 100 nombres reals cadascuna i retorni una taula de 100
booleans; en les posicions figurarà true o false segons si els números que ocupen la posició
en petit, mitja i gran poden constituir un triangle o no.
.
(Per exemple si els valors de les primeres posicions de petit, mitja i gran fossin
index 0 1 2 3 4 5 6 7 8 9 10 …
petit 2.0 2.0 2.8 3.1 3.2 3.5 4.3 4.6 1.6 2.1 1.1 …
mitja 2.0 3.1 5.3 3.3 4.2 4.1 4.5 5.3 4.6 7.0 1.1 …
gran 2.0 4.0 14.0 7.1 7.4 8.0 6.1 10.0 5.9 10.1 11.1
els valors retornats serien
index 0 1 2 3 4 5 6 7 8 9 10 …
valor true true false false false false true false true false false …
Perquè es pot construir un triangle de costats 2.0, o amb els costats(2.0, 3.1 i 4.0) però no
amb els costats 2.8, 5.3 i 14.0)
Indicacions:
• Disposem del tipus tReal definit com una taula [100] de real
• Disposem del tipus tBool definit com una taula [100] de booleà
• Tres números poden constituir un triangle si la suma dels dos més petits és mes gran
que el número major.
2
3. La solució a l'exercici s'ha estructurat amb dues funcions, una que determina si tres números
poden constituir les longituds dels costats d'un triangle (esTriangle) i l'altre, sonTriangles,
sol·licitada en l'enunciat, que treballa amb les taules i fa crides a esTriangle.
funcio esTriangle(short :real, medium: real, long: real):booleà
{retorna cert si els tres números poden constituir un triangle i fals en
cas contrari}
retorna (long > short + medium);
ffuncio
funcio sonTriangles(petit: tReal, mitja: tReal, gran: tReal ): tBool
{rep tres arrays de 100 números i retorna un array de 100 booleans en què
es diu si cada conjunt de tres números petit, mitjà i gran poden constituït
un triangle. Fa servir la funció esTriangle}
var
hoSon:tBool;
i: enter;
fvar
per i := 1 fins 100 fer
hoSon[i] := esTriangle(petit[i], mitja[i], gran[i]);
fper
retorna hoSon;
ffuncio
3
4. Exercici 2: Treball amb taules en PHP [20%]
Objectius: Construir un algorisme que solucioni un determinat problema amb l’ús de
taules.
Materials: Mòdul 4: Tipus estructurats de dades
Guia bàsica de PHP: Mòdul 5 Tipus estructurats de dades en PHP
Tasca: Crear el programa Cartró del bingo que crea, aleatòriament un cartró de bingo
segons les normes establertes:
• Els números que poden sortir al cartró van del 01 al 80.
• El cartró té 4 fileres de 5 números cadascuna
o la primera filera conté 5 números entre 01 i 20
o la segona filera conté 5 números entre 21 i 40
o la tercera filera conté 5 números entre 41 i 60
o la quarta filera conté 5 números entre 61 i 80
• En cada filera els números es mostraran ordenats de petit a gran.
Pe: si la crida és http://localhost/pract2_exer02.php la pantalla pot mostrar
Recursos: Per a la realització de l’exercici es faciliten 19 imatges en format png
• 0_.png a 8_.png amb les parts esquerre dels cercles numerats
• _0.png a _9.png amb les parts dretes dels cercles numerats
Si es volgués mostrar la bola amb el número 38, s’hauria de format amb la imatge
3_.png immediatament seguida de la imatge _8.png
4
5. Consells
Sortejar 20 números entre 1 i 80 no és un problema complicat, es tracta de fer 20 sortejos,
ara bé, tenim certes limitacions:
• No pot sortir cap número repetit
• Cada fila conté 5 números que provenen d’una vintena determinada (1 a 20 a la
primera, 21 a 40 a la segona, 41 a 60 a la tercera i 61 a 80 a la quarta)
La segona limitació se supera fent 5 sortejos independents per als números de cada filera.
La primera es pot solucionar mitjançant un array que indiqui si el número es pot emprar o no
es pot emprar perquè ja ha sortit anteriorment i no pot tornar a sortir. Aquest array, que
nomenarem $free ha de tenir una posició de tipus booleà per cada número 1 a 80. Si el
contingut és true es pot emprar el número. Si és false, no es pot agafar perquè ja ha sortit.
Caldrà mantenir aquest array: quan s'agafi un número (perquè la seva posició està en true)
caldrà posar la posició en false.
Indicacions i requisits d’implementació
• El fitxer php rebrà el nom pract2_exer02.php i la crida serà del tipus
pract2_exer2.php, sense paràmetres.
• Els fitxers d’imatge .png se situaran a la mateixa carpeta que el fitxer .php.
• Una estructura de dades bàsica serà la taula $free de 81 posicions de tipus boolean.
Cadascuna de les posicions de l’array de la 1 a la 80 correspondran a un número
dels que poden aparèixer en el cartró. Si el contingut d’una posició de l’array és true
significa que el número encara no s'ha agafat i el valor false voldrà dir que el número
ja ha sortit.
• Una altra serà la taula $lines que representarà les quatre línies de 5 posicions que
constitueixen el cartró de 20 números. Podeu optar lliurement per fer un únic array de
20 posicions o un array bidimensional ([4][5]). En funció d’aquesta decisió la resta de
funcions podrà tenir lleus diferencies d’implementació.
• S’ha de construir la function initArray(&$vector, $long, $valor) que rep com
paràmetres un array ($vector), la seva longitud ($long) i un valor ($valor) i omple amb
aquest valor totes les posicions de l’array. Aquesta funció es farà servir per inicialitzar
tots els arrays que convingui.
• S’ha de construir la function numberDraw($number) que rep un número enter entre
1 i 80 ($number) i dibuixa en la pantalla la bola que conté aquest número a base de
posar consecutivament les imatges que constitueixen la bola corresponent. P.e. si rep
el número 38, ha de posar la imatge 3_.png immediatament seguida de la imatge
_8.png
• S’ha de crear la funció createLine que rebrà el vector $free, l’array $lines (o en el
cas de ser bidimensional l’array que representa una línia) i els valors $minvalue i
$maxvalue que representen els números mínim i màxim que poden aparèixer a la
línia. Si ho creieu convenient podeu posar més paràmetres.
Aquesta funció calcularà aleatòriament els 5 números que formaran la línia y els
emmagatzemarà a l’array. Per decidir quin número s'agafa pot usar-se rand (a, b) 1
que retorna un nombre enter entre a i b (ambdós inclosos). La casella de la taula
$free corresponent a cada número seleccionat, s’ha de posar a false.
1
http://php.net/manual/es/function.rand.php
5
6. Com que els array $free i $lines (o el que representa la línia si es decideix per l’array
bidimensional) es modificaran, han de ser paràmetres d’entrada i sortida.
Heu de treballar amb compte perquè és possible que el nombre aleatori que
s’obtingui en un sorteig ja s’hagi obtingut amb anterioritat. En aquest cas s’haurà de
seguir alguna estratègia per evitar l’efecte d’aquestes repeticions. Entre les
estratègies alternatives possibles tenim:
o Tornar a sortejar tantes vegades com sigui necessari fins que s’obtingui un
número que no hagi sortit amb anterioritat (es corre el risc d’haver de fer molt
sortejos perquè van sortint números repetits).
o Si surt un número ja obtingut amb anterioritat, recórrer la taula $free en un
sentit fins a trobar una posició a true i donar aquesta posició com a obtinguda
pel sorteig.
Si s’implementa aquest mètode, penseu que si estem sortejant números de 21
al 40 i hem decidit recórrer l’array en sentit ascendent, i surt el 39 que ja està
usat, mirarem el 40 i, si està ocupat, s’hauria de passar a mirar el 21.
Altrament miraríem el 41 que no pot sortir en la línia que s’està construint.
Aquest mètode assegura fer només un sorteig per cada número encara que al
recórrer en un sentit determinat tendeix a fer aparèixer números contigus.
• Abans d’escriure el cartó en la pantalla haureu d’ordenar els números de manera que
s’escriguin de menor a major. PHP facilita la function sort($taula) 2 que rep una taula
i la retorna amb els seus elements ordenats de menor a major.
Podeu comprovar el funcionament a
comoras.uoc.edu/~jgilm/pract2/pract2_exer02.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="ES" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PR2_Exer2_Bingo_card</title>
</head>
<body>
<h3>Cartró de bingo</h3>
<h3>SOLUCIÓ</h3>
<div>
<?php
/**************** FUNCTION **************/
function NL()
{ //new line
print "<br />";
} //de NL
function initArray(&$token, $long $valor)
{//inicialitza l'array amb $valor en totes les posicions
for($i=0; $i<$long; $i++) $token[$i]=$valor;
}//de init_array
function numberDraw($num)
{//construeix un número del cartró a partir de dues semiimatges
$low = $num % 10;
$high = floor($num/10);
print"<img src='".$high."_.png'><img src='_".$low.".png'>";
}// de numberDraw
2
http://php.net/manual/es/function.sort.php
6
7. function lineDraw($line)
{ //posa en pantalla tots els números d'una línia
$long = count($line);
for ($i=0; $i<$long; $i++) numberDraw($line[$i]);
NL();
}
function createLine (&$free, &$line, $minvalue, $maxvalue)
{//omple un array
$long = count($line);
for ($i=0; $i<$long; $i++)
{
$num = rand ($minvalue, $maxvalue);
while (!$free[$num])
{ //bucle per evitar que surti dos cops el mateix número
$num++;
if ($num>$maxvalue) $num = $minvalue;
}
$free[$num] = false;
$line[$i] = $num;
}
sort($line); //s'ordenen els números que han sortit
}// de createLine
/**************** MAIN **************/
//inicialitza els arrays, s'inicialitzen per dotar-los de dimensió
initArray($free, 81, true)//inicialitza free a true perquè encara no ha sortit
//cap número, la longitud és 81 per
//representar els números 1 a 80
$lines = array(array(), array(), array(), array()); //crea array del cartró
for ($i=0; $i<4; $i++) initArray($lines[$i], 5, 0); //inicialitza les linies a 0
//es creen les 4 línies i es dibuixen
for ($i=0; $i<4; $i++)
{
createLine($free, $lines[$i], 20*$i+1, 20*($i+1));
lineDraw($lines[$i]);
}
?>
</div>
</body>
</html>
7
8. Exercici 3: Treball amb taules en PHP [20%]
Objectius: Donades sèries de dades, organitzar-les en taules i aplicar l’esquema
adequat per resoldre el problema donat.
Materials: Mòdul 4: Tipus estructurats de dades
Guia bàsica de PHP: Mòdul 5 Tipus estructurats de dades en PHP
Tasca: Simular que un conjunt de jugadors juguen a guanyar una línia en un Bingo. Cada
Jugador té una línia que consta de 8 números diferents (però dos jugadors poden tenir
números coincidents).
El programa rep un paràmetre gamers que indica el nombre de jugadors (si no se escriu el
paràmetre gamers s'ha de considerar dos jugadors) i mostra tres blocs d'informació en
pantalla:
• 1r Bloc: els noms dels jugadors (JUGADOR 1, JUGADOR 2,...) i la línia de cada
jugador (que genera el programa)
• 2n Bloc: el conjunt de números sortejats. Va sortejant números fins que un jugador
guanya
• 3r Bloc: el nom del jugador o jugadors guanyadors
P.e. a la crida: http://localhost/pract2_exer03.php?gamers=2, un resultat seria
El programa que es demana aprofita mòduls de l'exercici 2 i també els fitxers d'imatge.
Recursos: Disposeu dels mateixos fitxers d'imatge que per l'exercici anterior.
8
9. Indicacions i requisits d’implementació
• La crida al programa serà del tipus pract2_exer03.php o
pract2_exer03.php?gamers=X on X és un número enter. Si no es posa paràmetre la
simulació es farà per dos jugadors.
• Es farà servir l'array $free amb el mateix significat que en l'exercici anterior. S'ha de
tenir en compte que l'array s'haurà d'inicialitzar a true en totes les seves posicions
cada cop que s'hagi de generar un línia i abans de començar a sortejar.
• Els jugadors quedaran representats per la matriu bidimensional $gamer, de manera
que cada filera representa un jugador i les cel·les d'una filera representen els
números de la seva línia.
La matriu $gamer corresponent a la captura de pantalla de l'exemple tindria aquest
aspecte
$gamer $gamer $gamer $gamer $gamer $gamer $gamer $gamer $gamer
[ ][0] [ ][1] [ ][2] [ ][3] [ ][4] [ ][5] [ ][6] [ ][7]
$gamer [0] 10 23 27 29 44 47 73 77
$gamer [1] 3 7 26 41 47 48 71 75
Recordeu que no cal declarar les matrius especialment, es poden crear mitjançant un
bucle i en qualsevol moment se'ls pot afegir caselles 3.
• Podeu emprar les funcions function init_array, numberDraw i createLine amb el
mateix significat que en l'exercici anterior.
• S'ha de crear la funció draw que rep per modificar l'array $free, sorteja un número i el
retorna. [En PHP una function pot retornar valors en paràmetres i simultàniament en
una instrucció return comportant-se d'una manera mixta d'acció i funció].
• S'ha de crear la function lineCheck que rep un número sortejat i la línia d'un jugador i
retorna 1 si el número està a la línia o 0 si no hi és.
Consells
• Hi ha diverses maneres de comprovar si un jugador ha guanyat amb la seva línia:
o Cada cop que s’hagi de fer una comprovació, es mira si les posicions de $free
que corresponen als números del jugador estan en false. Si això passa, aquest
jugador ha completat la seva línia.
o Dur un comptador per a cada jugador inicialitzat a 0 i, cada cop que surt un
número mirem si és igual a un dels del jugador. Si ho és, incrementem el
comptador. Si el comptador arriba a 8, el jugador te plena la línia. Aquest
mecanisme comporta comparar un sol número per jugador cada cop que se’n
sorteja un de nou, mentre que l’anterior comporta comparar els 8 números.
3
El codi
for ($i=0; $i<4; $i++){
$matriu[$i] = array (0,$i*2);}
genera un array bidimensional $matriu[4][2] amb el següent contingut
$matriu $matriu[ ][0] $matriu[ ][1]
$matriu[0] 0 0
$matriu[1] 0 2
$matriu[2] 0 4
$matriu[3] 0 8
de manera que en $matriu[2][1] hi ha emmagatzemat un 4 i en $matriu[1][0] hi ha un 0
9
10. • Heu de tenir present que tot i que amb línies diferents, pot ser que guanyin dos o més
jugadors a l’hora. El programa els ha de detectar tots.
• No intenteu posar directament una posició d'un array dins d'una cadena de text de la
instrucció print.
print "el preu és $vector[$i] euros";
no treurà en la pantalla el que desitgem. Heu de fer servir l'operador de concatenació:
print "el preu és ".$vector[$i]." euros";
Podeu comprovar el funcionament a
comoras.uoc.edu/~jgilm/pract2/pract2_exer03.php o
Podeu comprovar el funcionament a
comoras.uoc.edu/~jgilm/pract2/pract2_exer02.php?gamers=X (X és un número enter)
10
11. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="ES" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PR2_Exer2 LineGame</title>
</head>
<body>
<h3>Joc de línia: SOLUCIÓ</h3>
<div>
<?php
function NL()
{ //new line
print "<br />";
} //de NL
function initArray(&$token, $long $valor)
{//inicialitza l'array amb $valor en totes les posicions
for($i=0; $i<$long; $i++) $token[$i]=$valor;
}//de init_array
function numberDraw($num)
{//construeix un número del cartró a partir de dues semiimatges
$low = $num % 10;
$high = floor($num/10);
print"<img src='".$high."_.png'><img src='_".$low.".png'>";
}// de numberDraw
function lineDraw($line)
{ //posa en pantalla tots els números d'una línia
$long = count($line);
for ($i=0; $i<$long; $i++) numberDraw($line[$i]);
NL();
}
function createLine (&$free, &$line, $minvalue, $maxvalue)
{//omple un array
$long = count($line);
for ($i=0; $i<$long; $i++)
{
$num = rand ($minvalue, $maxvalue);
while (!$free[$num])
{ //bucle per evitar que surti dos cops el mateix número
11
12. $num++;
if ($num>$maxvalue) $num = $minvalue;
}
$free[$num] = false;
$line[$i] = $num;
}
sort($line); //s'ordenen els números que han sortit
}// de createLine
function draw (&$free)
{
$num = rand (1, 80);
while (!$free[$num])
{ //bucle per evitar que surti dos cops el mateix número
$num++;
if ($num>80) $num = 1;
}
$free[$num] = false;
return $num;
}
function lineCheck ($num, $gamer)
{
$i=0;
while (($gamer[$i]<$num) && $i<8)
{ //com que els números estan ordenats, quan el número del jugador
//és superior al sortejat, és que el sortejat no hi és
$i++;
}
if ($gamer[$i]==$num) return 1;
else return 0;
}
/******************MAIN******************/
//es comproven els jugadors o s'assignen 2 jugadors per defecte
$ngamers = $_GET["gamers"];
if (!isset($ngamers) ) $ngamers = 2;
//inicialitza els arrays, sinicialitzen per dotar-los de dimensió
$free = array(); //indica els números que no han sortit
$target = array(); //indica els encerts de cada jugador
for ($i = 0; $i < $ngamers; $i++)
{
12
13. $gamer[$i]= array();
initArray($free, 81, true); //inicialitza free a true perquè encara no ha sortit cap número
//la longitud és 81 per representar els números 1 a 80. Com que
//es poden repetir els números en els diferents jugadors, cada cop
//s'inicialitza $free
initArray($gamer[$i], 8, 0); //inicialitza els jugadors a 0
$target[$i] = 0; //inicialitza el seu comptador d'encerts
createLine($free, $gamer[$i], 1, 80); //crea una línia
print "<h3>JUGADOR ".($i+1)."</h3>";
lineDraw($gamer[$i]); //la dibuixa
}
//s'inicia el joc
initArray($free, 81, true); //inicialitzem $free per a les boles que sortiran
$win = false; //inicialitzem senyal de finalitzar el sorteig
NL();
print "<h3>NÚMEROS SORTEJATS</H3>";
while (!$win)
{
$num = draw($free); //se sorteja un número
for ($i = 0; $i < $ngamers; $i++)
{
$target[$i] += lineCheck($num, $gamer[$i]); //si el número el tenia un jugador
//s'incrementa el seu marcador
if ($target[$i] == 8) $win = true; //si ha arribat a 8 ha guanyat
}
print "$num ";
}
print "<h3>Ha guanyat</h3>";
for ($i = 0; $i < $ngamers; $i++) //pot haver guanyat més d'un alhora
{
if ($target[$i] == 8)
{
print "jugador ".($i+1);
NL();
}
}
?>
</div>
</body>
</html>
13
14. Exercici 4: Treball amb Tuples [25%]
Objectius: Donada una família de dades relacionades, dissenyar les estructures de
dades adients per al seu emmagatzematge i crear expressions i mòduls de programa
per al seu tractament
Materials: Mòdul 4: Tipus estructurats de dades
Tasca: Un col·leccionista de monedes vol informatitzar les seves peces per a un millor
control.
Per a cada moneda de la col·lecció vol emmagatzemar: país (text), unitat (text), el valor
nominal (real), l'any d’emisió (enter), l’aliatge (text), la data d’adquisició (tData), si té
certificat d’atenticació o no i el valor de tasació (real)..
• Definir el tipus tCoin adequat per emmagatzemar aquest tipus de dades.
tCoin = tupla
nation, unit, alloy: text;
nominal, rating: real;
year: enter;
acquisition: tData;
certificate: boolea;
ftupla
• Definir el tipus tData que permeti emmagatzemat en format numèric una data
tData = tupla
day: enter;
month: enter;
year: enter;
ftupla
Es preveu que la col·lecció pugui tenir fins 10.000 monedes, tot i que en aquest moment
només en té 4312, per aquest motiu l'informàtic ha creat el tipus de data tCollect. En el
primer camp s'emmagatzemarà la quantitat d'elements actual (ara 4312) i al segon les dades
de cadascuna de les peces a partir de la posició 1 i consecutivament.
tCollect = tupla
qtty: enter;
item: Taula[10000] de tCoin;
ftupla
i, per acabar, ha creat una variable que contindrà els valors
var
collection: tCollect;
fvar
14
15. • Escriure l’expressió que ens permet saber si la última moneda entrada a la base de dades
és d’or i val actualment més de 500 €. [Suposeu que els elements de tipus text es poden
comparar amb l’operador = com es fa amb els altres tipus simples]
collection.item[collection.qtty].alloy = “gold” &&
collection.item[collection.qtty].rating > 500.00
• Escriu la funció valorDate que rep una data (tres paràmetres: dia, mes i any) i la variable
collection, escriu per pantalla país, any d’emisió, valor nominal i unitat de cada moneda i
retorna el valor total de tasació de les monedes adquirides amb posterioritat a la data
entrada..
funcio valorDate (day: enter, month: enter, year: enter, collection: tCollection): real
var
i,cDay, cMonth, cYear: enter;
total: real;
fvar
total := 0;
per i := 1 fins collection.qtty fer
cDay := collection[i].acquisition.day ;
cMonth := collection[i].acquisition.month ;
cYear := collection[i].acquisition.year ;
si (cYear>year) o (cYear=year i cMonth>month) o (cYear=year i cMonth=month i cDay>day) llavors
writeText(collection[i].nation) ;
writeInteger(collection[i].year) ;
writeReal(collection[i].nominal) ;
writeText(collection[i].unit) ;
total := total + collection[i].rating
fper
retorna total
ffuncio
15
16. Exercici 5: Treball amb tuples en PHP [20%]
Objectius: Localitzar i treballar amb informació emmagatzemada en un esquema
combinat de taules i tuples en PHP.
Materials: Mòdul 4: Tipus estructurats de dades
Guia bàsica de PHP: Mòdul 5 Tipus estructurats de dades en PHP
Tasca: Donat un conjunt de dades emmagatzemat en un esquema combinat de
taules i tuples, localitzar, seleccionar i calcular amb aquestes dades.
En una escola tenen les dades d’alumne emmagatzemades en una taula de tuples de nom
$student. Cada tupla consta dels següents camps:
• name que emmagatzema el nom de pila de l’estudiant
• sex que pren el valor true per les dones i false pels homes
• age que emmagatzema la seva edat
• matter, una taula on s’emmagatzemen els noms de les assignatures que cursa
l’estudiant
• grade, una taula, de la mateixa longitud que l’anterior, que emmagatzema les
qualificacions obtingudes en les assignatures
Es demana que es construeixin 3 accions:
• withFirstLetter que rep com a paràmetre la taula d’estudiants i un caràcter x i escriu:
o El títol "Estudiants que comencen per x" on x és el caràcter rebut
o Els noms de tots els estudiants el nom dels quals comenci pel caràcter
• matterOf que rep com a paràmetre la taula d’estudiants i una cadena de text que
significarà un nom i escriu en pantalla:
o Un títol que indiqui "Assignatura i qualificació màxima de SS" on SS és el nom
rebut.
o Si hi ha estudiants de nom SS, en una línia per estudiant
l’edat de l’estudiant
l’assignatura millor puntuada i la qualificació obtinguda en ella
o Si no hi ha estudiants amb el nom, el missatge "No hi ha estudiants de nom SS".
• gradeAverage que rep com a paràmetre la taula d’estudiants i escriu en pantalla:
o Un títol que indiqui "Mitjanes de notes dels estudiants"
o La mitjana, amb dos decimals, obtinguda d'amitjanar les qualificacions mitjanes dels
estudiants. És a dir, heu de calcular les mitjanes de cada estudiant i després fer la
mitjana d’aquests valors.
16
17. Indicacions i requisits d’implementació
• Es facilita la plantilla pract2_exer05_pla.php que ha de renomenar-se per lliurar com
pract2_exer05.php, i que conté parts programades que no s’han de modificar i altres
que heu d’escriure vosaltres:
• Capçaleres de les 3 function que heu de programar vosaltres. Les capçaleres no
s’han de modificar..
• Programa principal, format per
o unes instruccions d’escriptura. Heu de canviar les paraules NOM_ESTUDIANT
pel vostre nom de manera que es mostri en pantalla en les execucions.
o una sentència que carrega les dades de l’arxiu extern data (l’arxiu es facilita amb
l’enunciat i ha de copiar a la mateixa carpeta que el programa). No s’ha de
modificar.
o una sèrie de crides a les function que comproven el seu funcionament en
diversos casos i que no s’han de modificar.
• El fitxer data es crida en el programa mitjançant la instrucció include ("data"); i
incorpora al programa la variable $student que conté totes les dades de 50
estudiants. Aquest fitxer servirà per a les proves i s’haurà d’ubicar a la mateixa
carpeta que el fitxer php de la pràctica. Per a la correcció de la pràctica es farà servir
un altre fitxer amb el mateix nom i estructura, però amb altres continguts.
Característiques de les accions
• function withFirstLetter($list, $letter)
El parámetre $list serà la llista d’estudiants rebuda
El paràmetre $letter serà la lletra inicial dels noms a mostrar
[Recordeu que la primera lletra de una cadena de text $cadena es pot obtenir amb
$cadena[0]]
• function matterOf($list, $name)
El parámetre $list serà la llista d’estudiants rebuda
El parámetre $name el nom dels estudiants a buscar.
[Recordeu que les cadenes de text de més d’un caràcter no s’han de comparar amb
l’operador ==. Pot usar-se la funció interna del PHP strcmp 4 que retorna un 0 si les
dues cadenes que rep són iguals].
• function gradeAverage($list)
El parámetre $list serà la llista d’estudiants rebuda
[Recordeu que per mostrar una quantitat exacta de decimals heu de fer servir printf
amb l’especificador d’amplada de camp %.xf on x és el nombre de decimals a
mostrar]
4
http://es2.php.net/manual/es/function.strcmp.php
17
18. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="ES" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> Schola </title>
</head>
<body>
<!-- Comentari -->
<h1>Schola </h1>
<h3>Solució</h3>
<div>
<?php
/* incorpora l'arxiu de dades "data.php" que defineix l'array $student
i mostra seleccions de dades de l'arxiu en diferents function.
L'array $student està formats per tuples (arrays associatius) amb la següent
definició:
name => string que tconté el nom de l'estudiant
age => enter que conté l'edat de l'estudiant
sex => booleà que indica el sexe true-> dona i false->home
matter => array que conté els noms de les assignatures de l'estudiant
grade => array que conté les qualificacions numériques de les assignatures de
l'estudiant
febrer - juny 2012
*/
/***********************FUNCTION**********************************/
function withFirstLetter($list, $letter)
{ /* escriu els noms dels estudiants el nom dels quals comença per $letter */
$long = sizeof($list);
print "<h3>Estudiants que comencen per $letter</h3><p>";
for ($i=0; $i<$long; $i++)
{
if ($list[$i]['name'][0] == $letter)
{
print "<br />".$list[$i]['name'];
}
}
}// de withFirstLetter
function matterOf($list, $name)
{ /* mostra per pantalla edat, l'assignatura millor qualificada
i la qualificació obtinguda en ella de tots estudiants
que s'anomenen com el segon paràmetre
Si no hi ha cap estudiant amb el nom s'escriu una frase
que així ho indica
*/
$numStudent = 0;
$long = count($list);
print "<h3>Assignatures i qualificació màxima de $name</h3><p>";
for ($i=0; $i<$long; $i++)
{
if (strcmp($name, $list[$i]['name'])==0)
{
$numStudent++;
print $list[$i]['age'];
$numMatter = sizeof($list[$i]['matter']);
$maxGrade=$list[$i]['grade'][0];
$maxMatter=$list[$i]['matter'][0];
for($j=1; $j<$numMatter; $j++)
{
if ($list[$i]['grade'][$j]>$maxGrade)
{
$maxGrade=$list[$i]['grade'][$j];
$maxMatter=$list[$i]['matter'][$j];
}
}
print "; assignatura millor puntuada = $maxMatter ; qualificació = $maxGrade";
print "<br />";
}
}
18
19. if ($numStudent == 0) print "No hi ha estudiants de nom $name";
print"</p>";
}// de matterOf }// de matterOf
function gradeAverage($list)
{ /* mostra per pantalla la qualificació mitjana de
les mitjanes dels estudiants */
$long = sizeof($list);
print "<h3>Mitjana de les notes dels estudiants</h3><p>";
$average=0;
for ($i=0; $i<$long; $i++)
{
$numMatter = sizeof($list[$i]['matter']);
$averageStudent=0;
for($j=0; $j<$numMatter; $j++)
{
$averageStudent += $list[$i]['grade'][$j];
}
$averageStudent /= $numMatter;
$average += $averageStudent;
}
$average /= $long;
printf("<b> %.2f</b>",$average);
print "<br />";
print"</p>";
}// de gradeAverage
/***********************Programa Principal**********************************/
// s'incorporen les dades dels estudiants
include ("data");
//ja es disposa de la variable $student, l'array de
// tuples que conté totes les dades
// es criden les accions
withFirstLetter($student, 'J');
withFirstLetter($student, 'W');
withFirstLetter($student, 'B');
matterOf($student, "Joan");
matterOf($student, "Manolo");
matterOf($student, "Anne");
matterOf($student, "Ludving");
gradeAverage($student);
?>
</div>
</body>
</html>
19