Top Banner
1 Estudis d’Informàtica, Multimèdia i Telecomunicació Programació Pràctica 1 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 en llenguatge algorísmic han de resoldre’s en aquest mateix document 2. Els exercicis PHP es lliuraran en fitxers php a part, però el codi s’inclourà també en els espais reservats en aquest document. 3. Cal lliurar la solució d’aquesta pràctica en un fitxer comprimit en format zip o rar nomenat CognomsNom_PRACT1 adreçat a la bústia “Registre d'avaluació continua” 4. El fitxer comprimit contindrà aquest fitxer amb les respostes als exercicis 1 a 3 i els arxius php corresponents als exercicis 4 i 5. No s'ha d'adjuntar els fitxers d'imatges ni de dades. Respecteu els noms dels exercicis en PHP 5. Data límit per lliurar la solució: dilluns, 25 d’abril de 2012 (a les 23:59 hores). És imprescindible respectar el format i data d’entrega. La no adequació a aquestes especificacions pot suposar la no avaluació de la Pràctica.
17

| Programacion | Practica 1 - Madel Ortiz (Comentada)

Oct 24, 2014

Download

Documents

Practica 1 2011/12-2 de Madel Ortiz comentada por el consultor Jaume Gil. Calificación: A
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: | Programacion | Practica 1 - Madel Ortiz (Comentada)

1

Estudis d’Informàtica, Multimèdia i Telecomunicació

Programació Pràctica 1

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 en llenguatge algorísmic han de resoldre’s en aquest mateix document

2. Els exercicis PHP es lliuraran en fitxers php a part, però el codi s’inclourà també en els espais reservats en aquest document.

3. Cal lliurar la solució d’aquesta pràctica en un fitxer comprimit en format zip o rar nomenat CognomsNom_PRACT1 adreçat a la bústia “Registre d'avaluació continua”

4. El fitxer comprimit contindrà aquest fitxer amb les respostes als exercicis 1 a 3 i els arxius php corresponents als exercicis 4 i 5. No s'ha d'adjuntar els fitxers d'imatges ni de dades. Respecteu els noms dels exercicis en PHP

5. Data límit per lliurar la solució: dilluns, 25 d’abril de 2012 (a les 23:59 hores).

És imprescindible respectar el format i data d’entrega. La no adequació a aquestes especificacions pot suposar la no avaluació de la Pràctica.

Page 2: | Programacion | Practica 1 - Madel Ortiz (Comentada)

2

Exercici 1: Treball amb seqüències [10 %]

Objectius: Donada una seqüència de dades, aplicar l’esquema adequat per construir un algorisme que solucioni un determinat problema.

Materials: Mòdul 3: Tractament seqüencial.

De tots és conegut que els romans empraven un sistema de numeració propi i, per què no dir-ho, bastant incòmode. La numeració romana va evolucionar, però en un principi constava només de 7 símbols amb valor additiu: Simbol M D C L X V I valor 1000 500 100 50 10 5 1

Els símbols s’escrivien per ordre de més gran a més petit i, com a màxim podien posar-se 4 símbols del mateix tipus si es tractava de M,C, X o I i només un símbol en el cas D, L o V. El número més gran que es podia escriure era MMMMDCCCCLXXXXVIIII i el seu valor era 4999. Més tard es va modificar el sistema de numeració tenint en compte la posició dels símbols, de manera que, per exemple el valor 9 va passar a representar-se de VIIII a IX. Però no ens interessa aquesta modificació moderna. Tasca: Crear mòdul (acció o funció, el més apropiat) toRomans que rebi un número entre 1 i 4999 i escrigui el valor en el sistema de numeració rom`pa antic. P.e. si el número es el 2923, s’escriuria MMDCCCCXXIII. accio (ent num:enter) var unitats, decenes, centenes, millars: enter; fvar si (num ≤ 4999) llavors // validar entrada num := llegirEnter( ); unitats := num mod 10; decenes := (num div 10) mod 10; centenes := (num div 100) mod 10; millars := (num div 1000) mod 10; i := 1; // condicio inicial mentre (i ≤ millars); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“M”); fmentre si (centenars > 4) llavors escriureCaracter(“D”);

i := 1; // condicio inicial

Page 3: | Programacion | Practica 1 - Madel Ortiz (Comentada)

3

mentre (i ≤ (centenars – 5)); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“C”); fmentre fsi // centenars > 4 si (centenars ≤ 4) llavors

i := 1; // condicio inicial mentre (i ≤ centenars); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“C”); fmentre fsi // centenars ≤ 4 si (decenes > 4) llavors escriureCaracter(“L”);

i := 1; // condicio inicial mentre (i ≤ (decenes – 5)); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“X”); fmentre fsi // decenes > 4 si (decenes ≤ 4) llavors

i := 1; // condicio inicial mentre (i ≤ decenes); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“X”); fmentre fsi // decenes ≤ 4 si (unitats > 4) llavors escriureCaracter(“V”);

i := 1; // condicio inicial mentre (i ≤ (unitats – 5)); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“I”); fmentre fsi // unitats > 4 si (unitats ≤ 4) llavors

i := 1; // condicio inicial mentre (i ≤ unitats); // fi seqüencia i:= i + 1; // avançar seqüencia escriureCaracter(“I”); fmentre fsi // unitats ≤ 4 sino escriureText(“ERROR: El nombre ha de estar entre 0 i 4999”); fsi // validar entrada faccio fet amb bucles del tipus per és més simple i requereixes menys instruccions Nota: Un altra manera de obtindre cada digit es:

Page 4: | Programacion | Practica 1 - Madel Ortiz (Comentada)

4

long = longitudString(num); //amb strlen si (num ≤ 4999) llavors num := llegirEnter( ); unitats := num[long -1]; decenes := num[long -2]; centenes := num[long -3]; millars := num[long -4]; això funcionari en PHP perquè li és igual número que cadena de caracters i pots fer servir les variables com et vagi millor, però en llenguatge algoriosmic, hauries de crear una funció que et convertís un número en una cadena de caràcters, i no es simple. Adjunte fitxer “ToRomans.php” amb el programa.

Page 5: | Programacion | Practica 1 - Madel Ortiz (Comentada)

5

Exercici 2: Treball amb seqüències [15 %]

Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat per construir un algorisme que solucioni un determinat problema.

Materials: Mòdul 3: Tractament seqüencial.

Tasca: A l’entrada estàndard hi ha una llista de números més grans que zero i que finalitza amb un número negatiu. Es demana que creeu el mòdul (acció o funció, el més adequat) withEvenInList que escrigui els números de la llista que el producte dels seus dígits és parell i retorni la quantitat de números que tenen aquesta propietat. P.e. si la llista de números fora {15 27 341 357 12 9 -1} el mòdul escriuria en la sortida estàndard 27 341 12 i retornaria 3. funcio withEvenInList(n:enter):enter; l'¡enunciat diu que és a l'entrada estandard var producte, digit: enter; fvar n:= llegirEnter(); contadorParell := 0; mentre no ( n < 0) fer n:= llegirEnter(); si comences el bucle llegint, no has tractat el número llegit abans d'entra al bucle digit := 0; producte := 1; mentre ( n > 0) fer digit := n mod 10; producte := producte * digit; si (producte mod 2 = 0) llavors escriureEnter(n); aquesta instrucció es repetira per cada xifra després que hagi entrat una xifra parell contadorParell := contadorParell + 1; fsi n := n div 10; fmentre fmentre retorna (contadorParell); ffuncio

Page 6: | Programacion | Practica 1 - Madel Ortiz (Comentada)

6

Exercici 3: Treball amb seqüències [15 %]

Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat per construir un algorisme que solucioni un determinat problema.

Materials: Mòdul 3: Tractament seqüencial.

Tasca: a l’ajuntament de Sant Ot de Malastruga cada cop que reben una factura, les dades s’enregistren en una seqüència anual del tipus:

<t1 d1 i1 e1 t2 d2 i2 e12 … tm dm im em X> on ti és un caràcter que indica el tipus d’adjudicació de la factura i, el valor del qual pot ser C per Concurs D adjudicació Directa di és la data de la factura i, una cadena de text de format dd-mm-aaaa ii és l’import en € de la factura i ei és nom de l’empresa que emet la factura i, un text X és la lletra 'X' i indica el final de la seqüència

Heu de crear un mòdul (acció o funció, el més apropiat) expensiveBill que llegeixi de l'entrada estàndard una seqüència i escrigui data, import i empresa per aquelles factures que han estat adjudicades directament i l’import és de 3000.00€ o superior i, a més, retorni l'import acumulat total d’aquestes factures [recordeu que podeu emprar el tipus text que conté una cadena de caràcters i els mòduls readText i writeText que ja hem emprat en exercicis d’avaluació anteriors] funcio expensiveBill(t:caracter, d:text, i:real, e:text):real; var t: caracter; d: text; i: real; e: text; fvar total:= 0.0; t:= llegirCaracter(); mentre (t ≠ “X”) fer d:= llegirText(); i:= llegirReal(); e:= llegirText(); si (t = “D”) i (i ≥ 3000.0) llavors total:= total + i; escriureText(d); escriureText(e); escriureReal(i); fsi fmentre retorna (total); ffuncio correcte

Page 7: | Programacion | Practica 1 - Madel Ortiz (Comentada)

7

Exercici 4: Treball amb seqüències [30 %]

Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat per construir un programa en PHP que solucioni un determinat problema.

Materials: Mòdul 3: Tractament seqüencial.

Guia Bàsica de PHP: mòduls 1 a 4 i mòdul 7.

Tasca: A una cooperativa vitivinícola tenen 7 associats que en temps de verema porten el raïm collit per premsar-lo. A la bàscula d’entrada enregistren, cada cop que arriba un tractor, la lletra que identifica l’associat (de la A a la G) i el pes de raïm que deixen, creant una seqüència del tipus:

B 2345 G 1567 A 2333 A 1207 C 3300 ...

Es demana que es creï un programa en PHP que llegeixi les dades d’una seqüència i escrigui el total de raïm que ha portat cada associat.

Indicacions

• El fitxer php rebrà el nom pract1_exer04.php

• La crida al programa serà del tipus

pract1_exer04.php?filename=nom_arxiu_dades

per la qual cosa s'haurà d'emprar la instrucció $filename=$_GET["filename"]; per carregar el nom del fitxer que incorpora la instrucció que assigna valor a la variable $cadena. Un cop carregat aquest nom, es pot incorporar la instrucció al programa mitjançant l'ordre include($filename)1; ambdues instruccions ja formen part de la plantilla i són les primeres del programa principal. El fitxer example.php adjunt carrega un d'aquests fitxers i n'imprimeix el contingut. La crida ha de ser del tipus example.php?filename=data45

• Podeu comprovar el funcionament del programa que se us demana que escriviu amb la crida: http://comoras.uoc.edu/~jgilm/pract1/pract1_exer04.php?filename=data40 o canviant les fitxers de dades fins data45

• Es faciliten diversos arxius de dades amb els noms data40 a data45. Són fitxers de text i podeu obrir-los per comprovar el contingut: una instrucció php.

• Per a recollir caràcters i números un a un de la seqüència s'aconsella fer servir la combinació d'instruccions explode2 i array_shift3.

Per tal d'obtenir de la cadena $string un a un els elements que la formen, on s'ha fet servir com separador el caracter $c, podeu emprar consecutivament:

1 http://www.php.net/manual/es/function.include.php 2 http://es.php.net/manual/es/function.explode.php 3 http://es.php.net/manual/es/function.array-shift.php

Page 8: | Programacion | Practica 1 - Madel Ortiz (Comentada)

8

• $var1 = explode ($c, $string); • $var2 = array_shift($var1);

Podeu observar i veure com funciona l'arxiu example1.php que s'adjunta a l'enunciat. La crida és del tipus example1.php?cadena=A,6,B,8,12,D,2111 i fa servir com separador una coma. Si modifiqueu el programa de manera que en la instrucció explode en lloc de posar $var1 = explode(',', $cadena); posi $var1 = explode(' ', $cadena); llavors funcionarà per a una crida del tipus example1.php?cadena=A 6 B 8 12 D 2111 perquè ara el separador que fa servir és un espai en blanc

• Per conèixer la longitud d'un array podeu fer servir la funció count($nom_variable);4

• S'haurà d'implementar una acció collectData(entsor var1, ...) que servirà per recollir de la seqüència les dades d’un tractor. Rebrà com a primer paràmetre la variable sobre la que es fa l'array_shift i després les variables on s’ha de deixar el nom de l’associat i el pes que porta. La instrucció array_shift treu les dades de la variable i, per tant, la variable es modifica cosa que heu de tenir en compte.

Avaluació Es valorarà especialment l'aplicació correcta dels esquemes de cerca, recorregut i/o tractament adequats al problema. També es tindrà present el disseny i l'aprofitament adequat de funcions i accions, tant les preceptives per enunciat com aquelles altres que resultin útils i que l'estudiant vulgui desenvolupar voluntàriament.

4 http://www.php.net/manual/es/function.count.php

Page 9: | Programacion | Practica 1 - Madel Ortiz (Comentada)

9

//Aquí heu de posar el vostre codi <!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>Practica 1 - Exercici 4</title> </head> <body> <h3>Practica 1 - Exercici 4</h3> <h3>Maria del Mar Ortiz Valor</h3> <!-- No olvidéis el nombre --> <div> <?php /* Carga en la variable filename el nombre de un fichero de text que conté una instrucció que crea i dóna valor a la variable $cadena. El contingut de la variable cadena es una seqüència en què s'alternen un caracter (codi d'associat) i un número (pes de raïm aportat en el viatge) El programa, ha de llegir les dades i escriure al final la llista d'associats i el pes de raïm total aportat, com ara: A - 12354 B - .... ... G - 985 PRACTICA 1 - septiembre 2011 - enero 2012 autor: */ /************ FUNCTIONS *************/ function NL() { print "<br />"; } function collectData(&$var1, &$tractor, &$pes) { $tractor = array_shift($var1); $pes = array_shift($var1);

Page 10: | Programacion | Practica 1 - Madel Ortiz (Comentada)

10

} function desaTractor($tractor, $pes, &$sumaA, &$sumaB, &$sumaC, &$sumaD, &$sumaE, &$sumaF, &$sumaG) { if ($tractor == "A") { $sumaA = $sumaA + $pes; } if ($tractor == "B") { $sumaB = $sumaB + $pes; } if ($tractor == "C") { $sumaC = $sumaC + $pes; } if ($tractor == "D") { $sumaD = $sumaD + $pes; } if ($tractor == "E") { $sumaE = $sumaE + $pes; } if ($tractor == "F") { $sumaF = $sumaF + $pes; } if ($tractor == "G") { $sumaG = $sumaG + $pes; } } /*********** PROGRAMA PRINCIPAL ************/ $filename=$_GET["filename"]; include($filename); $var1 = explode(' ', $cadena); $long = count($var1);

Page 11: | Programacion | Practica 1 - Madel Ortiz (Comentada)

11

for ($i = 0; $i<($long/2); $i++) { collectData($var1, $tractor, $pes); desaTractor($tractor, $pes, $sumaA, $sumaB, $sumaC, $sumaD, $sumaE, $sumaF, $sumaG); } print "<h2> Collita del dia</h2>"; print "<strong>Soci - Pes </strong><br />"; print "A - $sumaA <br />B - $sumaB <br />C - $sumaC <br />D - $sumaD <br />E - $sumaE <br />F - $sumaF <br />G - $sumaG <br />"; NL(); ?> </div> </body> </html> Correcte

Page 12: | Programacion | Practica 1 - Madel Ortiz (Comentada)

12

Exercici 5: Codificació en PHP [30 %]

Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat per construir un programa en PHP que solucioni un determinat problema.

Materials: Mòdul 3: Tractament seqüencial.

Guia Bàsica de PHP: mòduls 1 a 4 i mòdul 7.

Tasca: Disposem de dues imatges que representen dos animals poc avinguts, gat i gos, en format png i el nom de les quals són cat i dog.

La tasca plantejada és investigar en una cadena de text l'aparició de les paraules cat i dog, per tal de fer aparèixer a una pàgina web tantes imatges com cops apareix cadascuna de les paraules. A, més, com que sabem que gat i gos no es porten bé, correm el risc que hagi baralles sempre que apareguin juntes les imatges de dos animals diferents. Al final direm quantes baralles ha hagut, és a dir, quants de cops ha aparegut un gos darrera un gat o a l’inrevés.

cat.png dog.png f.png Pàgina corresponent a la cadena

14doggfj00dogtuiccatdshdogubocatdadjf inclosa la ampliació

A la crida del programa es rep, en el paràmetre filename, el nom d'un fitxer que conté una instrucció php del tipus

<?php $cadena="14doggfj00dogtuiccatdshdogubocatdadjf"; ?>

la variable $cadena conté la cadena de text on s'ha de localitzar els noms dels personatges.

Indicacions

• El fitxer php rebrà el nom pract1_exer5.php

• La crida al programa serà del tipus

pract1_exer5.php?filename=nom_arxiu_dades

per tant, s'haurà d'emprar la sentència $filename=$_GET["filename"]; per carregar el nom del fitxer que incorpora la instrucció que dóna valor a la variable

Page 13: | Programacion | Practica 1 - Madel Ortiz (Comentada)

13

$cadena. Un cop carregat aquest nom, es pot incorporar la instrucció al programa mitjançant l'ordre include($filename)5; ambdues instruccions ja formen part de la plantilla i són les primeres del programa principal. El fitxer example.php adjunt carrega un d'aquests fitxers i n'imprimeix el contingut. la crida ha de ser del tipus example.php?filename=data54

• Podeu comprovar el funcionament del programa que se us demana que escriviu amb la crida: http://comoras.uoc.edu/~jgilm/pract1/pract1_exer05.php?filename=data50 o canviant les fitxers de dades fins data55

• Es faciliten diversos arxius de dades amb els noms data50 a data55. Són fitxers de text i podeu obrir-los per comprovar el contingut: una instrucció php.

• A les cadenes de text es pot accedir a cadascun dels caràcters individuals que la formen mitjançant el nom de la variable i un número que indica la posició del caràcter dins de la cadena. Si el contingut de $v és "Hola", llavors $v[0] és 'H', $v[1] és 'o', $v[2] és 'l' i $v[3] és 'a'. Dins de les claus es pot emprar una variable entera p.e: for ($i=0; $i<4; $i ++) print $v[$i]."<br />"; S'ha de tenir present que al primer caràcter se li assigna l'índex 0.

• PHP facilita la funció strlen($cadena)6; que retorna la longitud en caràcters de la cadena de text $cadena

• S'haurà d'implementar el mòdul putImg($image_file) que ha de rebre com a paràmetre el nom d'un fitxer en format png i el posarà a la pantalla. P.e. Si rep com paràmetre oasis, posaria en la pàgina web el fitxer d'imatge osasis.png.

• Per tal de localitzar les paraules cat i dog, s'haurà de crear el mòdul detectPet que rebrà la variable que conté la cadena de text y un número (posició) i retornarà

o un 1 si a la posició de la cadena comença la subcadena cat.

o un -1 si a la posició de la cadena comença la subcadena dog.

o un 0 en els altres casos.

• PHP facilita la funció substr_compare7($main_str, $str , $offset ,$length) que retorna un 0 si a partir de la posició $offset de la cadena $main_str, coincideixen $length caràcters amb la cadena $str. P.e. substr_compare ("caleidoscopio", "idoia", 4, 3 ) retornaria 0 perquè a partir de la quarta posició de caleidoscopio (recordeu que el primer caràcter està a la posició zero) trobem 3 lletres iguals a les tres primeres de "idoia".

AMPLIACIÓ OPCIONAL

Disposem també de la imatge f.png. L’ampliació consisteix en posar la imatge f.png entre gos i gat cada cop que apareixen junts. Així evitem les baralles.

5 http://www.php.net/manual/es/function.include.php 6 http://es.php.net/manual/es/function.strlen.php 7 http://php.net/manual/es/function.substr-compare.php

Page 14: | Programacion | Practica 1 - Madel Ortiz (Comentada)

14

Avaluació Es valorarà especialment l'aplicació correcta dels esquemes de cerca, recorregut i/o tractament adequats al problema. També es tindrà present el disseny i l'aprofitament adequat de funcions i accions, tant les preceptives per enunciat com aquelles altres que resultin útils i que l'estudiant vulgui desenvolupar voluntàriament.

Page 15: | Programacion | Practica 1 - Madel Ortiz (Comentada)

15

//Aquí heu de posar el vostre codi <!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>Practica 1 - Exercici 5</title> </head> <body> <h3>Practica 1 - Exercici 5</h3> <h3>Maria del Mar Ortiz Valor</h3> <!-- No oblideu posar el nom --> <div> <?php /* Carrega a la variable filename el nom d'un arxiu de text que conté una instrucció que carrega les dades a la variable $cadena. El contingut de la variable cadena és una cadena de text en la qual pot aparèixer les subcadenes "cat" i "dog". El programa ha de revisar el contingut de la cadena i mostrar una imatge ("cat.png" o "dog.png") cada cop que troba en la cadena la subcadena corresponent. En acabar de posar las imatges, en una línia a part, es dirà quants veinatges gat-gos o gos-gat hi ha en les imatges Com ampliació es proposa intercalar la imatge "f.png" cada cop que hi ha veinatge entre dos animals diferents. PRACTICA 1 - febrer - juny 2012 autor: */ /*********** PROGRAMA PRINCIPAL ************/ // load data file $filename=$_GET["filename"]; include($filename);

Page 16: | Programacion | Practica 1 - Madel Ortiz (Comentada)

16

$long = strlen($cadena); //determinar longitud de la cadena // bucle per a llegir cadena $i = 0; $aux = "null"; NULL és un valor vàlid per posar a una variable i les comparacions amb un valor sempre són més curtes que amb una cadena while ($i < $long-1) { if (detectPet($cadena, $i) == 1) { $image_file = "cat"; if ($aux != "null" && $image_file != $aux) { print "<img src=\"f.png\">"; $baralla = $baralla + 1; } putImg($image_file); $aux = $image_file; } if (detectPet($cadena, $i) == -1) { $image_file = "dog"; if ($aux != "null" && $image_file != $aux) { print "<img src=\"f.png\">"; $baralla = $baralla + 1; } putImg($image_file); $aux = $image_file; } $i++; } print "<h3>Ha hagut $baralla baralles</h3>"; /************ FUNCTION *************/ function NL() { print "<br />"; }

Page 17: | Programacion | Practica 1 - Madel Ortiz (Comentada)

17

function putImg($image_file) { print "<img src=\"$image_file.png\">"; } function detectPet($cadena, $i) { if (substr_compare($cadena, "cat", $i, 3) == 0) { return 1; } if (substr_compare($cadena, "dog", $i, 3) == 0) { return -1; } else { return 0; } } ?> </div> </body> </html> QUALIFICACIÓ A