| PROGRAMACIO | Pract2 solucio

19
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.

description

Consultor: Jaume Gil

Transcript of | PROGRAMACIO | Pract2 solucio

Page 1: | PROGRAMACIO | Pract2 solucio

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.

Page 2: | PROGRAMACIO | Pract2 solucio

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.

Page 3: | PROGRAMACIO | Pract2 solucio

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

Page 4: | PROGRAMACIO | Pract2 solucio

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

Page 5: | PROGRAMACIO | Pract2 solucio

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

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.

http://php.net/manual/es/function.rand.php

Page 6: | PROGRAMACIO | Pract2 solucio

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

Podeu comprovar el funcionament a

que rep una taula i la retorna amb els seus elements ordenats de menor a major.

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&oacute; 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

Page 7: | PROGRAMACIO | Pract2 solucio

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>

Page 8: | PROGRAMACIO | Pract2 solucio

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.

Page 9: | PROGRAMACIO | Pract2 solucio

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 [ ][0]

$gamer [ ][1]

$gamer [ ][2]

$gamer [ ][3]

$gamer [ ][4]

$gamer [ ][5]

$gamer [ ][6]

$gamer [ ][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 caselles3

• 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

Page 10: | PROGRAMACIO | Pract2 solucio

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)

Page 11: | PROGRAMACIO | Pract2 solucio

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

Page 12: | PROGRAMACIO | Pract2 solucio

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++) {

Page 13: | PROGRAMACIO | Pract2 solucio

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&Uacute;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 &nbsp; "; } 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>

Page 14: | PROGRAMACIO | Pract2 solucio

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

Page 15: | PROGRAMACIO | Pract2 solucio

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

Page 16: | PROGRAMACIO | Pract2 solucio

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.

Page 17: | PROGRAMACIO | Pract2 solucio

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

• Capçaleres de les 3 function que heu de programar vosaltres.

i altres que heu d’escriure vosaltres:

Les capçaleres no s’han de modificar.

• Programa principal, format per

.

o unes instruccions d’escriptura. Heu de canviar les paraules

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).

NOM_ESTUDIANT pel vostre nom de manera que es mostri en pantalla en les execucions.

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.

• 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]]

Característiques de les accions

• 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 strcmp4

• 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

que retorna un 0 si les dues cadenes que rep són iguals].

%.xf

4

on x és el nombre de decimals a mostrar]

http://es2.php.net/manual/es/function.strcmp.php

Page 18: | PROGRAMACIO | Pract2 solucio

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&oacute; m&agrave;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 />"; } }

Page 19: | PROGRAMACIO | Pract2 solucio

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>