HernandezBaizanIsaac_PAC1

24
Estudis d’Informàtica, Multimèdia i Telecomunicació Programació PAC1 — Primera Prova d'Avaluació Continuada Cognoms: HERNÁNDEZ BAIZÁN Nom: ISAAC Indicacions generals: Raoneu i justifiqueu totes les respostes. Les respostes incorrectes no disminueixen la nota. Per a dubtes i aclariments sobre l’enunciat, adreceu-vos al consultor responsable de la vostra aula. Lliurament: 1. S'ha de respondre les preguntes al mateix document de l'enunciat que rebrà el nom CognomsNomP_PAC1.doc (o CognomsNomP_PAC1.odt) 2. S'ha d'enviar la codificació de les preguntes 8 i 9 mitjançant els arxius PAC1_Exer08.php PAC1_Exer09.php que es construiran sobre les plantilles adjunta. És especialment important respectar el nom d'aquests arxius php. 3. Els tres fitxers es comprimiran en un únic arxiu de format zip o rar de nom CognomsNomP_PAC1.zip (o CognomsNomP_PAC1.rar) que es lliurarà a la bústia de "Lliurament i registre d'AC" 4. Data límit per lliurar la solució: dia, XX de XXX 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 PAC. 1

Transcript of HernandezBaizanIsaac_PAC1

Page 1: HernandezBaizanIsaac_PAC1

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

ProgramacióPAC1 — Primera Prova d'Avaluació Continuada

Cognoms: HERNÁNDEZ BAIZÁN

Nom: ISAAC

Indicacions generals:

Raoneu i justifiqueu totes les respostes.

Les respostes incorrectes no disminueixen la nota.

Per a dubtes i aclariments sobre l’enunciat, adreceu-vos al consultor responsable de la vostra aula.

Lliurament:

1. S'ha de respondre les preguntes al mateix document de l'enunciat que rebrà el nom CognomsNomP_PAC1.doc (o CognomsNomP_PAC1.odt)

2. S'ha d'enviar la codificació de les preguntes 8 i 9 mitjançant els arxius PAC1_Exer08.php PAC1_Exer09.php que es construiran sobre les plantilles adjunta. És especialment important respectar el nom d'aquests arxius php.

3. Els tres fitxers es comprimiran en un únic arxiu de format zip o rar de nom CognomsNomP_PAC1.zip (o CognomsNomP_PAC1.rar) que es lliurarà a la bústia de "Lliurament i registre d'AC"

4. Data límit per lliurar la solució: dia, XX de XXX 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 PAC.

1

Page 2: HernandezBaizanIsaac_PAC1

Exercici 1: Identificació de tipus [10%]

Objectius: Mostrar coneixements elementals sobre els tipus, com manipular-los i identificar els tipus resultants d’efectuar operacions entre objectes elementals del llenguatge algorísmic.

Materials: M1 i M2 fins M2.1

Tasca: Donades les següents definicions de tipus, constants i variables

tipussize = {mm, cm, inch, foot, meter};

ftipus

constCONSTA: real = 10.0;

fconst

varc: caracter;imax: booleà;item: size;x, y, z: enter;r,s: real;

fvar

indiqueu quin es el tipus resultant d’avaluar les expressions següents (recordeu que l'operador = és de relació):

i) s / integerToReal(x* realToInteger(r*4.0) )

real / integerToReal(entero*(entero*entero))real / integerToReal(entero)real / realreal

El resultado es de tipo real

ii) imax = cert o c = 'Z' o item > foot

(booleano) o (booleano) o (booleano)

El resultado es de tipo booleano

2

Page 3: HernandezBaizanIsaac_PAC1

iii) (x mod charToInteger(c)) div realToInteger(CONSTA)

(entero mod entero) div realToInteger(real)entero div enteroentero

El resultado es de tipo entero

iv) c < ‘G’ o inch > cm

(booleano) o (booleano)booleano

El resultado es de tipo booleano

3

Page 4: HernandezBaizanIsaac_PAC1

Exercici 2: Sintaxi d’expressions [10%]

Objectius: Mostrar l’habilitat en la confecció d’expressions en llenguatge algorísmic. Utilització apropiada d’objectes elementals del llenguatge algorísmic per a la confecció de les expressions donades unes declaracions prèvies d’objectes elementals.

Materials: M1 i M2 fins M2.1

Tasca: Donades les definicions de tipus, constants i variables de l’exercici 1, escriviu, en llenguatge algorísmic, les expressions següents:

a) Expressió que calculi el quadrat del residu de dividir x i z.

(x mod z) * (x mod z)

b) Expressió que determini, amb decimals, quin percentatge representa y respecte z.

(y * 100.00) / z

c) Expressió que determini si el valor de item es foot o meter.

(item = foot) o (item = meter)

d) Expressió que determini si el valor de s no té decimals.

Si

4

Page 5: HernandezBaizanIsaac_PAC1

Exercici 3: Avaluació d’expressions [10%]

Objectius: Mostrar l’habilitat en la manipulació d’expressions en llenguatge algorísmic. Donades unes declaracions prèvies d’objectes elementals, saber explicar-ne com efectuar la seva avaluació i donar-ne el resultat correcte.

Materials: M1 i M2 fins M2.1

Tasca: Donades les definicions de tipus i variables de l’exercici 1 i suposant que les variables tenen els valors següents:

x:= 10; y:= 4; item:= inch; c := '5'; r := 30.5; s := 0.5

Calculeu el resultat de les expressions següents:

a) integerToReal (x) * r * CONSTA / s

10.0 * 30.5 * 10.0 / 0.5

3050 / 0.5

6100

b) charToCode1 (c) + 5 + (x div y) mod realToInteger (r/CONSTA)

53 + 5 + (10 div 4) mod (30 /10)

58 + 2 mod 3

60

c) no (item < foot i CONSTA < ( r / 3.0))

no ( (inch < foot) y 10.0 < (30.5 / 3.0))no( ( inch < foot) y (10.0 < 10.1))no (verdadero y verdadero)no (verdadero)

FALSO

d) 20 div ( realToInteger(s +2.5) * 8 div ((y * 5) div (x div y)))

20 div (realToInteger( 0.5 + 2.5) * 8 div ( 20 div 2))20 div (realToInteger(3.0) * 8 div 10)20 div ( 24 div 10)20 div 2

10

1 charToCode retorna un enter que es el codi ascii del caràcter

5

Page 6: HernandezBaizanIsaac_PAC1

Exercici 4: Correctesa d’expressions [10%]

Objectius: Mostrar l’habilitat en la manipulació d’expressions en llenguatge algorísmic. Donades unes declaracions prèvies d’objectes elementals, raonar la correctesa de l’expressió, argumentant els motius d’incorrecció si n’hi ha.

Materials: M1 i M2 fins M2.1

Tasca: Donades les definicions de tipus, constants i variables de l’exercici 1 i les assignacions proposades, digueu si són correctes o no les expressions següents, independentment del que pretenguin calcular. En cas que no ho siguin, especifiqueu-ne la raó o raons.

x:= 10; y:= 4; z := 0; imax:= false; item := inch; c := '5'; r := 30.5; s := 0.5

a) (item > foot) i ((c > '0') o (charToCode(c) + y = '9'))

Incorrecta, porque la expressión y = ‘9’ sería 4 = ‘9’, y se trata de una asignación de dos tipos de datos diferentes, enteros y caràcter.

b) (z * CONSTA) div realToInteger(r)

(0 * 10.0) div 30

Incorrecta, ya que (0 * 10.0) es una expresión con operandos de distinto tipo, enteros y reales.

c) 2.0 * s + r = 0.0 > imax

Correcta, porque se trata de una expresión que al final compara dos operandos de tipo booleano.

d) realToInteger(integerToReal(y*y/r)) mod 2

realToInteger(integerToReal(16 / 30.5) mod 2

Incorrecta, porque la expresión (16 / 30.5) maneja dos tipos de datos distintos, enteros y reales.

e) codeToChar(charToCode('2')+charToCode(c)) = '7'

codeToChar(50 + 99) = ‘7’

‘caracter’ = ‘7’

Correcta, ya que la comparación consta de dos operandos del mismo tipo, en este caso son caracteres.

6

Page 7: HernandezBaizanIsaac_PAC1

Exercici 5: Declaració de variables i especificació [10%]

Objectius: Donada la descripció d’un problema, declarar les variables necessàries i donar les especificacions (les precondicions i els postcondicions) de l’algorisme.

Materials: M1 i M2 fins M2.2

Tasca: Declareu les variables necessàries i doneu les especificacions d’un algorisme que resolgui el problema següent (no s'ha d'escriure l'algorisme):

“Donada una sèrie de caràcters a l'entrada estàndard que finalitza amb un caràcter '#' (i que no conté el caràcter '#' dins), comptar quantes vocals, quantes consonants, quants signes de puntuació i quants caràcters d'altra mena havia al text”

En concret, es demana que definiu les variables necessàries per representar les dades del problema (apartat var…fvar d’un algorisme) i que doneu la precondició i la postcondició.

varserieCaracteres: caracter;

numVocales, numConsonantes, numSignos, numCaracteres: entero;

fvar

Sabemos que al principio el usuario introducirá en la entrada una sèrie de caracteres que finalizará con el caràcter #, pero no cuenta como caràcter de entrada. Y también sabemos que el número de vocales, consonantes, signos y caracteres es 0.

{Pre: Dada una sèrie de caracteres en la entrada estandar y que finaliza con ‘#’ y numVocales = 0, numConsonantes = 0, numSignos = 0 y numCaracteres = 0}

Y al final tendremos que el número de vocales, consonates, signos y caracteres serà igual o mayor que 0.

{Post: numVocales ≥ 0, numConsonantes ≥ 0, numSignos ≥ 0 y numCaracteres ≥ 0}

7

Page 8: HernandezBaizanIsaac_PAC1

Exercici 6: Comprensió d’algorismes [10%]

Objectius: Avaluar coneixements bàsics d’algorísmica. Estructura general d’un algorisme i l’ús d’estructures algorísmiques bàsiques. Es plantegen preguntes d’interpretació donat un algorisme en llenguatge algorísmic.

Materials: M1 i M2 fins M2.3

Tasca: Donat el següent algorisme,

algorisme nameAlgorithm varmax, min, x : enter;fvar

{Pre: a l’entrada estàndard hi ha una sèrie llarga de números parells i senars entre 1 i 1000 i que finalitza amb un zero }

x :=readInteger();max := 0;min := 1000;

mentre fer

si llavors max := x;

sino si   llavors

min := x;

fsifsi

x :=readInteger();fmentre

writeInteger(max);writeInteger(min);{Post: Calcula i escriu per pantalla el nombre parell més gran (max) i el senar més petit (min)}falgorisme

Completeu les parts que falten

1r quadre (x ≠ 0) y (x > 0)2n quadre (x mod 2 = 0) y (x > max)3r quadre (x mod 2 ≠ 0) y (x < min)

8

Page 9: HernandezBaizanIsaac_PAC1

Exercici 7: Modificació del comportament d’un algorisme [10%]

Objectius: Avaluar coneixements bàsics d’algorísmica. L’avaluació va un pas més enllà de la interpretació bàsica en plantejar modificacions del mateix. Es demanen modificacions al comportament d’un algorisme ja donat per tal de que aquest pugui contemplar situacions diferents.

Materials: M1 i M2 fins M2.3

Tasca: Considerant l’algorisme de l’exercici 6, modifiqueu-lo per tal que cap expressió contingui una condició composta.

algoritmo nameAlgorithm varmax, min, x : enter;fvar

x :=readInteger();max := 0;min := 1000;

mientras (x ≠ 0) hacer

si (x mod 2 = 0) entonces

si ( x > max)

max := x;

fsi

fsi

sino si (x mod 2 ≠ 0) entonces

si ( x < min)

min := x;

fsi

fsi x :=readInteger();fmientras

writeInteger(max);writeInteger(min);falgoritmo

9

Page 10: HernandezBaizanIsaac_PAC1

Exercici 8: Codificació [15%]

Objectius: Donat un llistat en llenguatge algorísmic, traduir-lo a PHP. Treballar les assignacions, comparacions i iteracions, que en PHP requereixen utilitzar adientment el = i el ==. També treballar la recollida de dades obtingudes com paràmetres.

Materials: M1 i M2 fins M2.3

Tasca: L’algorisme següent implementa un simulador de plans d'estalvi a partir d'unes dades inicials:

Un capital inicial en € (cap) Un tipus d'interès en % (tin) Una previsió d'aportació anual en €(apo) Un increment previst en l'aportació anual en % (inc) Una durada en anys (year)

El simulador, amb les dades entrades fa tres simulacions:1. Simulació amb aportacions anuals incrementades. 2. Simulació amb aportacions anuals fixes3. Simulació sense aportacions anuals

En cadascuna de les simulacions es mostra, emprant un línia per cada any, l'any, el Capital a l'inici del període, l'aportació anual i el capital al final del període, com ara

SIMULACIÓ amb aportacions anuals incrementadesAny Inici període Aportació Final període

0 0.000 5200.000 5200.000

1 5200.000 10.000 5340.000

2 5340.000 10.300 5483.800

3 5483.800 10.609 5631.504

4 5631.504 10.927 5783.219

5 5783.219 11.255 5939.054

6 5939.054 11.593 6099.124

tot i que no es demana que els resultats es mostrin en forma de taula atès que en llenguatge algorísmic, evidentment, no existeix instruccions per donar format a la sortida.

Indicacions en llenguatge algorísmic De cara a la solució suposarem que està definit el tipus text que conté una

cadena de caràcters. Que existeix la funció readText que serveix per llegir una cadena de text sobre

una variable de tipus text i que s'empra com les equivalents per a números o caràcters: nom_var = readText();

Que existeix la acció writeText que serveix per enviar una cadena de caràcters a la sortida estàndard i que s'empra com les equivalents per a números o caràcters: writeText("Hola món"); o writeText(nom_var);

Que existeix la acció writeLR(); que escriu un salt de línia a la sortida estàndard.

10

Page 11: HernandezBaizanIsaac_PAC1

algorisme saveSimulation;

varyear, i: enter;cap, capSeg, tin, apo, aposeg, inc: real

fvar

{Pre: a l'entrada hi una sèrie de dades CAP, TIN, APO, INC, YEAR }cap := readReal();tin := readReal();apo := readReal();inc := readReal();year := readInteger;

writeText("Capital inicial:");writeReal(cap);writeLF();writeText("Tipus d'interès:");writeReal(tin);writeLF();writeText("Aportació anual inicial:");writeReal(apo); writeLF();writeText("Increment aportació:");writeReal(inc);writeLF();writeText("Durada del pla (anys):");writeIntegerl(year);writeLF();

capSeg := cap;apoSeg := apo; incSeg := inc;

tin := tin / 100.0;inc := inc / 100.0;

writeText("Simulació amb aportacions incrementades");writeLF();

writeInteger(0);writeReal(0.000);writeReal(cap);wrireReal(cap);writeLF();

per i := 1 fins year fercapFin := cap * (1 + tin) + apo;writeInteger(i);writeReal(cap);writeReal(apo);writeReal(capFin);apo := apo * (1 + inc); writeLF();cap := capFin

fperwriteText ("Capital acumulat");writeReal (cap);writeLF();

11

Page 12: HernandezBaizanIsaac_PAC1

writeText("Simulació amb aportacions fixes");writeLF();

cap := capSeg;apo := apoSeg;

writeInteger(0);writeReal(0.000);writeReal(cap);wrireReal(cap);writeLF();

per i := 1 fins year fercapFin := cap * (1 + tin) + apo;writeInteger(i);writeReal(cap);writeReal(apo);writeReal(capFin);writeLF();cap := capFin

fperwriteText ("Capital acumulat");writeReal (cap);writeLF();

writeText("Simulació sense aportacions anuals");writeLF();

cap := capSeg;apo := 0;

writeInteger(0);writeReal(0.000);writeReal(cap);wrireReal(cap);writeLF();

per i := 1 fins year fercapFin := cap * (1 + tin) + apo;writeInteger(i);writeReal(cap);writeReal(apo);writeReal(capFin);writeLF();cap := capFin;

fper

writeText ("Capital acumulat");writeReal (cap);

{Post: a la sortida estàndard es mostren els resultats de les simulacions } falgorisme

Indicacions per a PHPLa crida ha de ser del tipus: PAC1_exer08.php?CAP=5200&TIN=2.5&APO=10&INC=3.0&YEAR=6Per a comprovar el funcionament podeu fer servirhttp://comoras.uoc.edu/~jgilm/pac1/PAC1_exer08.php?CAP=5200&TIN=2.5&APO=10&INC=3.0&YEAR=6

12

Page 13: HernandezBaizanIsaac_PAC1

<?php

/* {Pre: en la entrada hay una serie de datos CAP, TIN, APO, INC, YEAR} */

$cap = $_GET["CAP"];$tin = $_GET["TIN"];$apo = $_GET["APO"];$inc = $_GET["INC"];$year = $_GET["YEAR"]; echo "Capital inicial: ";echo "$cap € </br>";echo "Tipo de interés: ";echo "$tin% </br>";echo "Aportación anual inicial: ";echo "$apo € </br>";echo "Incremento de la aportación: ";echo "$inc% </br>";echo "Duración del plan: ";echo "$year años </br>"; $capSeg = $cap; $apoSeg = $apo; $incSeg = $inc; $tin = $tin / 100.0; $inc = $inc / 100.0; echo "<h3> Simulación con aportaciones incrementadas </h3>"; echo "Año&nbsp &nbsp Inicio periodo &nbsp &nbsp Aportación &nbsp &nbsp Final Periodo </br>"; echo "···················································································· </br>"; echo "&nbsp 0 &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "0.000 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "&nbsp $cap &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "&nbsp $cap </br>"; for ($i=1; $i<=$year; $i++) { $capFin = $cap * (1+$tin) + $apo; echo "&nbsp $i &nbsp &nbsp &nbsp &nbsp &nbsp "; printf ("%4.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $cap); printf ("%4.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $apo); printf ("%4.3f", $capFin); $apo = $apo * (1+$inc); echo "</br>"; $cap = $capFin; } echo "···················································································· </br>"; print "<h4>Capital final acumulado</h4>"; printf ("%4.2f €", $cap); echo "</br>";

13

Page 14: HernandezBaizanIsaac_PAC1

echo "<h3>Simulación con aportaciones fijas</h3>"; $cap = $capSeg; $apo = $apoSeg; echo "Año &nbsp &nbsp Inicio Periodo &nbsp &nbsp Aportación &nbsp &nbsp Final Periodo <br>"; echo "···················································································· </br>"; echo "&nbsp 0 &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "0.000 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "&nbsp $cap &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "&nbsp $cap <br>"; for ($i=1; $i<=$year; $i++) { $capFin = $cap * (1+$tin) + $apo; echo "&nbsp $i &nbsp &nbsp &nbsp &nbsp &nbsp "; printf ("%5.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $cap); printf ("%5.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $apo); printf ("%5.3f", $capFin); echo "</br>"; $cap = $capFin; } echo "···················································································· </br>"; print "<h4>Capital final acumulado</h4>"; printf ("%4.2f €", $cap); echo "</br>"; echo "<h3>Simulación sin aportaciones anuales</h3>"; $cap = $capSeg; $apo = 0; echo "Año &nbsp &nbsp Inicio Periodo &nbsp &nbsp Aportación &nbsp &nbsp Final Periodo <br>"; echo "···················································································· </br>"; echo "&nbsp 0 &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "0.000 &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "&nbsp $cap &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp "; echo "$cap </br>"; for ($i=1; $i<=$year; $i++) { $capFin = $cap * (1+$tin) + $apo; echo "&nbsp $i &nbsp &nbsp &nbsp &nbsp &nbsp "; printf ("%4.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $cap); printf ("%4.3f &nbsp &nbsp &nbsp &nbsp &nbsp ", $apo); printf ("%4.3f", $capFin); echo "</br>"; $cap = $capFin; } echo "···················································································· </br>"; print "<h4>Capital final acumulado</h4>"; printf ("%4.2f €", $cap);

14

Page 15: HernandezBaizanIsaac_PAC1

/* {Post: en la salida estándar se muestran los resultados de las simulaciones */ ?>

15

Page 16: HernandezBaizanIsaac_PAC1

16

Page 17: HernandezBaizanIsaac_PAC1

Exercici 9: Problema, algorisme i programa en PHP [15%]

Objectius: Avaluar coneixements d’algorísmica creant un algorisme y implementant en PHP la solució a un programa plantejat a partir d'una descripció. El nucli de la solució conté composicions alternatives i iteratives.

Materials: M1 i M2 fins M2.3

Tasca: Simulador del sorteig de la ONCE en què se sorteja un número de 5 xifres (entre 00000 i 99999) i es pot sortejar cap, una o sis series (un número entre 1 i 120) segons el tipus de sorteig (0, 1 ó 6).

Indicacions:

Es faciliten les imatges per mostrar el número premiat (només el número, no les sèries)

0.png 1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png

Per simular el sorteig es farà servir la funció rand2(min, max) que rep dos nombres enters (min i max) i retorna un número enter entre ells, ambdós inclosos.

L'entrada de dades s'haurà de realitzar pel mètode $_GET de manera que funcioni amb una crida del tipus: PAC1_exer09.php?tipus=0 o PAC1_exer09.php?tipus=1 o PAC1_exer09.php?tipus=6

Es pot comprovar el funcionament a http://comoras.uoc.edu/~jgilm/pac1/PAC1_exer09.php?tipus=X on X pot ser la xifra 0, 1 o 6.

Ampliació: Es considerarà una ampliació opcional tenir cura que, en el cas que se sortegin 6 sèries, no hagi repeticions en el sorteig.

<?php $tipo = $_GET["tipo"]; print "<h1>NÚMERO PREMIADO</h1>"; // Calcula 5 números aleatorios $n1 = rand(0,9); $n2 = rand(0,9); $n3 = rand(0,9); $n4 = rand(0,9); $n5 = rand(0,9);

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

17

Page 18: HernandezBaizanIsaac_PAC1

// Carga en la página la imagen del número correspondiente print "<img src=\"$n1.png\">"; print "<img src=\"$n2.png\">"; print "<img src=\"$n3.png\">"; print "<img src=\"$n4.png\">"; print "<img src=\"$n5.png\">"; print "</br></br>"; // Utilizará el título en singular si se trata de una serie // y si se trata de seis series utilizará el título en plural if ($tipo == 6){ print "<h2>Series Premiadas</h2>"; }else if ($tipo == 1) { print "<h2>Serie Premiada</h2>"; } // Calculamos las series premiadas de forma aleatoria y la imprimimos en pantalla for ($i=1; $i<=$tipo; $i++) { if ($tipo!=1 ^ $tipo!=6 ^ $tipo!=0) { $tipo = 0; print "El tipo de sorteo es erróneo."; }else { $serie = rand(1,120); print "$serie </br>"; }} print "</br>"; print "<h2>Fin del sorteo</h2>"; ?>

18