ESCOLA MEDITERRÀNIA revista Sant Jordi 2024__MOSTRA (1).pdf
| programacion | PRACTICA 2 - Madel Ortiz
1. Estudis d’ Informàtica, Multimèdia i Telecomunicació
Pro
gra
ma
ció
Prá
ctic
a2
Cognoms: Ortiz Valor
Nom: Maria del Mar
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
inde 0 1 2 3 4 5 6 7 8 9 10 …
x
valor tru tru fals fals fals fals tru fals tru fals fals …
e e e e e e e e e e e
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.
funcio sonTriangles(petit: taula [100] de reals, mitja: taula [100]
de reals, gran: taula [100] de reals): taula [100] de booleà
{rep 3 arrays de 100 numeros i retorna un array de 100 booleans en
que es diu si els numeros de la mateixa posició de cada array poden
formar un triangle}
var
i: enter;
triangle: booleà;
taulaTriangles: taula [100] de booleà
fvar
per i:= 1 fins 100 fer
llegirReal(petit[i]);
llegirReal(mitja[i]);
llegirReal(gran[i]);
si (petit[i] + mitja[i] > gran[i]) llavors
taulaTriangle[i] := cert
fsi
2
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
2
http://php.net/manual/es/function.sort.php
6
7. <!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_Card_dealer</title>
</head>
<body>
<h3>Cartró de bingo</h3>
<h3>Maria del Mar Ortiz Valor</h3>
<div>
<?php
/* Reparteix, de manera aleatòria, les 40 cartes
del joc de póquer, sense repetir-ne niguna
l'ordre d'aparició de les cartes es desa a la
taula $cards
el control per evitar repeticions es fa amb l'array $not_used
*/
//AQUI VA EL VOSTRE CODI
/***********definició de constants***********/
/***********declaració de funcions***********/
function NL() { print "<br />"; }
function putImg($image_file) {
print "<img src="$image_file.png">";
}
function numberDraw($number) {
$unitats = $number % 10;
$imgUnitats = "_".$unitats;
$decenes = ($number /10 )% 10;
$imgDecenes = $decenes."_";
putImg($imgDecenes);
putImg($imgUnitats);
}
function initArray(&$vector, $long, $valor) {
$i = 0;
while ($i<$long) {
$vector[$i] = $valor;
$i++;
}
}
function createLine(&$lines, &$free, $minvalue, $maxvalue) {
/* Aquesta no es la manera més optima de que els nombres sortejats s'enmagatzenen
en l'array $lines sense maxacar els anteriors, però de moment tots les proves m'han fallat*/
if ($minvalue == 1) {
for ($i = 1; $i <= 5; $i++) {
$sortejat = rand($minvalue,$maxvalue);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == $maxvalue) {
$sortejat = $minvalue;
}
}
$free[$sortejat] = false;
$lines[$i] = $sortejat;
}
7
8. }
if ($minvalue == 21) {
for ($i = 6; $i <= 10; $i++) {
$sortejat = rand($minvalue,$maxvalue);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == $maxvalue) {
$sortejat = $minvalue;
}
}
$free[$sortejat] = false;
$lines[$i] = $sortejat;
}
}
if ($minvalue == 41) {
for ($i = 11; $i <= 15; $i++) {
$sortejat = rand($minvalue,$maxvalue);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == $maxvalue) {
$sortejat = $minvalue;
}
}
$free[$sortejat] = false;
$lines[$i] = $sortejat;
}
}
if ($minvalue == 61) {
for ($i = 16; $i <= 20; $i++) {
$sortejat = rand($minvalue,$maxvalue);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == $maxvalue) {
$sortejat = $minvalue;
}
}
$free[$sortejat] = false;
$lines[$i] = $sortejat;
}
}
}
function escriureCartro($lines) {
for ($i = 1; $i <= 5; $i++) {
numberDraw($lines[$i]);
}
NL();
for ($i = 6; $i <= 10; $i++) {
numberDraw($lines[$i]);
}
NL();
for ($i = 11; $i <= 15; $i++) {
numberDraw($lines[$i]);
}
NL();
8
10. 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.
10
11. 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 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.
• 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.
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]00$matriu[1]02$matriu[2]04$matriu[3]08de manera que en
$matriu[2][1] hi ha emmagatzemat un 4 i en $matriu[1][0] hi ha un 0
11
12. 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)
12
13. <!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_Exer3</title>
</head>
<body>
<h3>Joc en linia</h3>
<h3>Maria del Mar Ortiz Valor</h3>
<div>
<?php
//AQUI VA EL VOSTRE CODI
/***********definició de constants***********/
/***********declaració de funcions***********/
function NL() { print "<br />"; }
function putImg($image_file) {
print "<img src="$image_file.png">";
}
function numberDraw($number) {
$unitats = $number % 10;
$imgUnitats = "_".$unitats;
$decenes = ($number /10 )% 10;
$imgDecenes = $decenes."_";
putImg($imgDecenes);
putImg($imgUnitats);
}
function initArray(&$vector, $long, $valor) {
$i = 0;
while ($i<$long) {
$vector[$i] = $valor;
13
14. $i++;
}
}
function createLine(&$lines, $free) {
initArray($free, 81, true);
for ($a = 1; $a <= 8; $a++) { //deixa la posicio 0 lliure per fer de comptador
$sortejat = rand(1,80);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == 80) {
$sortejat = 1;
}
}
$free[$sortejat] = false;
$lines[$a] = $sortejat;
}
}
function escriureCartro($lines) {
for ($i = 1; $i <= 8; $i++) { //deixa la posicio 0 lliure per fer de comptador
numberDraw($lines[$i]);
}
}
function draw(&$free, &$sortejat) {
$sortejat = rand(1,80);
while (!$free[$sortejat]) {
$sortejat++;
if ($sortejat == 80) {
$sortejat = 1;
}
}
$free[$sortejat] = false;
return $sortejat;
}
14
15. function lineCheck($sortejat, $gamer) {
if (array_search("$sortejat", $gamer)) {
return 1;
}
else {
return 0;
}
}
/***********Programa principal*************/
if ($gamers = $_GET["gamers"]) {
}
else {
$gamers = 2;
}
print "$gamers JUGADORS";
NL();
initArray($lines, 8, 0);
//iniciar la matriu amb una posicio inicial 0
for ($i = 1; $i <= $gamers; $i++) {
$gamer[$i]= array(0);
}
//sortejar 8 nombres per a cada jugador
for ($i = 1; $i <= $gamers; $i++) {
createLine($gamer[$i], $free);
}
for ($i = 1; $i <= $gamers; $i++) {
print "<h3>JUGADOR $i</h3>";
sort($gamer[$i]);
foreach ($lines as $key => $val) {
}
15
17. 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
pais: text;
unitat: text;
valoN: real;
any: enter;
aliatge: text;
dataAdq: tData;
autentificacio: booleà;
valorT: real;
ftupla
• Definir el tipus tData que permeti emmagatzemat en format numèric una data
tData = tupla
dia: enter;
mes: enter;
any: 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;
17
18. fvar
• 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].aliatge = “or” i
collection.item[collection.qtty].valorT > 500
• 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(dia: enter, mes: enter, any: enter, collection:
tCollect): real
var
i, j: enter;
valorTotal: real;
fvar
per i: = 1 fins collection.qtty fer
si(collection.item[i].dataAdq.any = any)
i (collection.item[i].dataAdq.mes = mes) i
(collection.item[i].dataAdq.dia ≥ dia)(1) llavors
j: = i;
fper
valorTotal := 0;
per collection.item[j] fins collection.item[collection.qtty] fer
escriureText(collection.item[j].pais);
escriureText(collection.item[j].unitat);
escriureReal(collection.item[j].valorN);
escriureEnter(collection.item[j].any);
valorTotal := valorTotal + (collection.item[j].valorT)
fper
retorna valorTotal;
ffuncio
(1) Suposant que les entrades estan ordenades per data, si no troba una data exacta a la data entrada agafará la
següent data trobada posterior.
18
19. 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.
19
20. 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 strcmp4 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
20
21. <!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>Maria del Mar Ortiz Valor</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
sex => booleà que indica el sexe true-> dona i false->home
age => enter que conté l'edat de l'estudiant
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 */
//AQUÍ VA EL VOSTRE CODI
print "<h3>Estudiants que començen per $letter</h3>";
$long = count($list);
$i = 0;
do {
$find = substr_compare($list[$i]['name'], $letter, 0, strlen($letter));
$i++;
21
22. }
while (($find != 0) && ($i < $long));
if ($find == 0) {
}
for ($i = 0; $i < $long; $i++) {
if (substr_compare($list[$i]['name'], $letter, 0, strlen($letter)) == 0) {
print $list[$i]['name'];
NL();
}
}
}// 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
*/
//AQUÍ VA EL VOSTRE CODI
$comptadorEstudiant = 0;
$long = count($list);
print "<h3>Assigantura i qualificació maxima de $name</h3>";
for ($i = 0; $i < $long; $i++) {
if (strcmp($name, $list[$i]['name']) == 0) {
$comptadorEstudiant++;
asort($list[$i]['grade']); //ordene les notes per tindre la nota major al final
foreach ($list[$i]['grade'] as $key => $val) {
}
$notaF = end($list[$i]['grade']); // em situe en la darrera posicio y guarde la nota a una variable
$key = key($list[$i]['grade']); //guarde la key de la darrera posicio a una variable
22
23. print "<p>Edat: ".$list[$i]['age'].", ";
print ($list[$i]['matter'][$key]).": ".($list[$i]['grade'][$key]); // com que la key de la nota es la mateixa que la del nom de
l'assignatura la faig servir ara per obtindre el nom corresponent de la nota mes alta
if (prev($list[$i]['grade']) == $notaF) { // compare la nota anterior amb la darrera per si es igual
$key2 = key($list[$i]['grade']);
print ", ".($list[$i]['matter'][$key2]).": ".($list[$i]['grade'][$key2]);
}
print "</p>";
} // del if
} // del bucle inicial
if ($comptadorEstudiant == 0) {
print "No hi ha estudiants de nom $name";
NL();
}
}// de matterOf
function gradeAverage($list)
{ /* mostra per pantalla la qualificació mitjana de
les mitjanes dels estudiants
*/
//AQUÍ VA EL VOSTRE CODI
print "<h3>Mitjanes de notes dels estudiants</h3>";
$long = count($list);
$sumaMitjanes = 0;
for ($i = 0; $i < $long; $i++) {
$comptadorMateria = count($list[$i]['matter']);
$sumaNotes = 0;
for ($j = 0; $j <= ($comptadorMateria-1); $j++) {
$aux = $list[$i]['grade'][$j];
$sumaNotes = $sumaNotes + $aux;
23
24. // print "sumatori notes $sumaNotes"; // sumatori de notes de cada estudiant
// NL();
}
// print "suma notes estudiant $sumaNotes"; //suma total de cada estudiant
// NL();
$mitjanaEstudiant = $sumaNotes / $comptadorMateria;
// print "mitjana estudiant $mitjanaEstudiant"; // nota mitjana de cada estudiant
// NL();
$sumaMitjanes = $sumaMitjanes + $mitjanaEstudiant;
}
// print "suma mitjanes $sumaMitjanes"; // suma de totes les mitjanes
// NL();
$mitjanaGen = $sumaMitjanes / $long;
printf ("<b> %.2f</b>",$mitjanaGen);
}// de gradeAverage
function NL() { print "<br />"; }
/***********************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>
24