SlideShare uma empresa Scribd logo
1 de 19
Baixar para ler offline
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
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
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
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
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
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&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



                                                                                            6
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
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
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
•   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
<!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
$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
$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>




                                                                             13
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
• 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
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
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
<!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 />";
              }
          }



                                                                                         18
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

Mais conteúdo relacionado

Mais procurados

Problemas resueltos de matrices
Problemas resueltos de matricesProblemas resueltos de matrices
Problemas resueltos de matrices
Melanie Nogué
 
Potencies i arrels 2 n
Potencies i arrels 2 nPotencies i arrels 2 n
Potencies i arrels 2 n
cpnapenyal
 

Mais procurados (20)

Programació - Pràctica 1 correcció - Multimedia (UOC) - Paquita Ribas
Programació - Pràctica 1 correcció - Multimedia (UOC) - Paquita RibasProgramació - Pràctica 1 correcció - Multimedia (UOC) - Paquita Ribas
Programació - Pràctica 1 correcció - Multimedia (UOC) - Paquita Ribas
 
Programació - Pràctica 2 - Multimedia (UOC) - Paquita Ribas
Programació - Pràctica 2 - Multimedia (UOC) - Paquita RibasProgramació - Pràctica 2 - Multimedia (UOC) - Paquita Ribas
Programació - Pràctica 2 - Multimedia (UOC) - Paquita Ribas
 
Programació - PAC 2 - Multimedia (UOC) - Paquita Ribas
Programació - PAC 2 - Multimedia (UOC) - Paquita RibasProgramació - PAC 2 - Multimedia (UOC) - Paquita Ribas
Programació - PAC 2 - Multimedia (UOC) - Paquita Ribas
 
Programació - PAC 2 correcció - Multimèdia (UOC) - Paquita Ribas
Programació - PAC 2 correcció - Multimèdia (UOC) - Paquita RibasProgramació - PAC 2 correcció - Multimèdia (UOC) - Paquita Ribas
Programació - PAC 2 correcció - Multimèdia (UOC) - Paquita Ribas
 
Prog_pac2
Prog_pac2Prog_pac2
Prog_pac2
 
Programació - PAC 1 - Multimedia (UOC) - Paquita Ribas
Programació - PAC 1 - Multimedia (UOC) - Paquita RibasProgramació - PAC 1 - Multimedia (UOC) - Paquita Ribas
Programació - PAC 1 - Multimedia (UOC) - Paquita Ribas
 
Programació - PAC 1 correcció - Multimèdia (UOC) - Paquita Ribas
Programació - PAC 1 correcció - Multimèdia (UOC) - Paquita RibasProgramació - PAC 1 correcció - Multimèdia (UOC) - Paquita Ribas
Programació - PAC 1 correcció - Multimèdia (UOC) - Paquita Ribas
 
Programació - Pac3 - Solució - Lídia Bria
Programació - Pac3 - Solució - Lídia BriaProgramació - Pac3 - Solució - Lídia Bria
Programació - Pac3 - Solució - Lídia Bria
 
Programació - Pac1 - Solució - Lídia Bria
Programació - Pac1 - Solució - Lídia BriaProgramació - Pac1 - Solució - Lídia Bria
Programació - Pac1 - Solució - Lídia Bria
 
4 potències i arrels 2n eso
4 potències i arrels 2n eso4 potències i arrels 2n eso
4 potències i arrels 2n eso
 
Programació - Pràctica 2 - Lidia Bria
Programació - Pràctica 2 - Lidia BriaProgramació - Pràctica 2 - Lidia Bria
Programació - Pràctica 2 - Lidia Bria
 
Programació - Pràctica1 - Lidia Bria
Programació - Pràctica1 - Lidia BriaProgramació - Pràctica1 - Lidia Bria
Programació - Pràctica1 - Lidia Bria
 
Matemàtiques per a la Multimèdia II - PAC 1 - Multimedia (UOC) - Paquita Ribas
Matemàtiques per a la Multimèdia II - PAC 1 - Multimedia (UOC) - Paquita RibasMatemàtiques per a la Multimèdia II - PAC 1 - Multimedia (UOC) - Paquita Ribas
Matemàtiques per a la Multimèdia II - PAC 1 - Multimedia (UOC) - Paquita Ribas
 
Estadística
EstadísticaEstadística
Estadística
 
Programació - Pràctica2 - Solució - Lídia Bria
Programació - Pràctica2 - Solució - Lídia BriaProgramació - Pràctica2 - Solució - Lídia Bria
Programació - Pràctica2 - Solució - Lídia Bria
 
Problemas resueltos de matrices
Problemas resueltos de matricesProblemas resueltos de matrices
Problemas resueltos de matrices
 
Potencies i arrels 2 n
Potencies i arrels 2 nPotencies i arrels 2 n
Potencies i arrels 2 n
 
Funcions
Funcions Funcions
Funcions
 
Matemàtiques 3r i 4t eso
Matemàtiques 3r i 4t esoMatemàtiques 3r i 4t eso
Matemàtiques 3r i 4t eso
 
04 Monomis i Polinomis 3r ESO
04 Monomis i Polinomis 3r ESO04 Monomis i Polinomis 3r ESO
04 Monomis i Polinomis 3r ESO
 

Semelhante a | PROGRAMACIO | Pract2 solucio

Àlgebra i Equacions de 1r Grau 2n ESO
Àlgebra i Equacions de 1r Grau 2n ESOÀlgebra i Equacions de 1r Grau 2n ESO
Àlgebra i Equacions de 1r Grau 2n ESO
Albert Sola
 
Estadística i probabilitat
Estadística i probabilitatEstadística i probabilitat
Estadística i probabilitat
cpnapenyal
 

Semelhante a | PROGRAMACIO | Pract2 solucio (18)

Programació - Pac1 - Lidia Bria
Programació - Pac1 - Lidia BriaProgramació - Pac1 - Lidia Bria
Programació - Pac1 - Lidia Bria
 
Pw p tema 1 nombres racionals
Pw p tema 1 nombres racionalsPw p tema 1 nombres racionals
Pw p tema 1 nombres racionals
 
Unitat 1 6è
Unitat 1   6èUnitat 1   6è
Unitat 1 6è
 
Divisibilitat 1r eso
Divisibilitat 1r esoDivisibilitat 1r eso
Divisibilitat 1r eso
 
PW_pac1
PW_pac1PW_pac1
PW_pac1
 
Fraccions
FraccionsFraccions
Fraccions
 
Fraccions
FraccionsFraccions
Fraccions
 
Operacions combinades
Operacions combinadesOperacions combinades
Operacions combinades
 
Els nombres naturals
Els nombres naturalsEls nombres naturals
Els nombres naturals
 
Electrònica Digital
Electrònica DigitalElectrònica Digital
Electrònica Digital
 
YDC_pract1
YDC_pract1YDC_pract1
YDC_pract1
 
Proporcionalitat i percentatges
Proporcionalitat i percentatgesProporcionalitat i percentatges
Proporcionalitat i percentatges
 
Àlgebra i Equacions de 1r Grau 2n ESO
Àlgebra i Equacions de 1r Grau 2n ESOÀlgebra i Equacions de 1r Grau 2n ESO
Àlgebra i Equacions de 1r Grau 2n ESO
 
Tema 6
Tema 6Tema 6
Tema 6
 
Fraccions 1r ESO
Fraccions 1r ESOFraccions 1r ESO
Fraccions 1r ESO
 
Estadística i probabilitat
Estadística i probabilitatEstadística i probabilitat
Estadística i probabilitat
 
Tema 6
Tema 6Tema 6
Tema 6
 
Tema 1
Tema 1Tema 1
Tema 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. 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&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 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&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> 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&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 />"; } } 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