Programació - PAC 1

Page 1

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

Programació PAC1 — Document d’enunciats

Estudiant Cognoms ESPINOZA NAZAR Nom NÚRIA

1


Exercici 1: Tipus i expressions [20%] Tasca: Donades les següents definicions de tipus, constants i variables const ICONSTA : enter = 10; RCONSTA : real = 3.33; fconst var i, j, k: enter; x, y, z: real; a, b, c: caràcter; t, u: cadena; b1, b2: booleà; fvar a) Avalueu les següents expressions amb potencials conflictes de tipus. Si l’expressió és correcta digueu quin seria el tipus resultant d’avaluar-la. Si l’expressió és incorrecta indiqueu l’error detectat. (recordeu que l'operador = és de relació):

i) x * RCONSTA div j Seria com dir: real * 3.33 div enter No seria possible ja que són dos tipus diferents: el resultat de la multiplicació x * 3.33 seria real, i no podríem dividir-ho per un enter.

ii) t = "cert" o cert No seria possible ja que no podem comparar un string amb un booleà (cert).

iii) b1 ≠ b2 i j div ICONSTA No seria possible ja que estem relacionant un booleà amb un enter, no es podria obtenir resultat.

iv) realToInteger(x / 12.2) mod charToCode(b) Seria correcte ja que la funció realToInteger ens donaria un Enter. Per altre banda, el chartocode de un caràcter ens donaria un valor ascii Enter i l’operador seria un mod d’Enter.

b) Creeu les següents expressions v) Expressió que digui si tant la variable i com la variable k tenen un valor superior al de la variable x (i i k) > x

2


vi) Expressiรณ que doni, sense decimals, quin percentatge de x representa y realtointeger ((x*100) div y)

3


Exercici 2: Avaluació d’expressions [10%] Tasca: Donades les definicions de constants, tipus i variables de l’exercici 1 i suposant que les variables tenen els valors següents: i:=8, j:=4, k:=2, x:=1.5, y:=0.75, z:=3.0 a:=’A’, c:=’c’, t:=”PHP”, u:=”html”, b1:=cert, b2:=fals

b:=’B’,

Avalueu el resultat de les expressions següents: a) RCONSTA * z = integerToReal(ICONSTA) Real * real = integertoreal (10) 3.33 * 3.0 = 10.0 9.99 = 10.0 Daría un resultado booleano, false b) k mod j > i o t < u ((enter mod enter) > enter) o (cadena < cadena) (2 mod 4) > 8) o (“PHP” < “html”) (2 > 8) o (“PHP” < “html”) False o false False “PHP” es superior a “html” ya que “P” està posterior a “h” en el orden lexicográfico. c) ICONSTA = k 10 = ( 2 div 10 = ( 0.5 ) 10 = (0.5) – Fals L’Ordre -

div j - i mod realToInteger (z + x / y ) 4 ) – ( 8 mod realtointeger (3.0 + 1.5/0.75)) – ( 8 mod 6 ) 2

que he seguit es: Primer div i mod Després la parèntesi i el realtointeger Després la resta Finalment la relació =

d) b > ‘a’ = b1 ≠ (k * j * i > realToInteger (x)) “B” > “a” = cert ≠ ( 2 * 4 * 8 > realtointeger (1,5)) Cert = cert ≠ (64 > 1) Cert = cert ≠ cert Cert = fals fals e) integerToReal(ICONSTA) * RCONSTA / z + integerToReal (k) (integertoreal (10)* 3.33) / (3.0 + integertoreal (2))) 10.0 * 3.33 / 3.0 + 2.0 6.66

4


Exercici 3: Declaració de variables i especificació [10%] Tasca: Declareu les variables necessàries i doneu les especificacions d’un algorisme que resolgui els problemes següents (no s'ha d'escriure l'algorisme): 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ó.

a) Que donat el diàmetre i l'alçada d'un dipòsit cilíndric ens digui quina és la seva capacitat. {Pre: Tenemos un depósito diámetro y altura}

cilíndrico

del

cual

conocemos

Const PI: real = 3.14159265359 fconst

Var Diámetro : real Altura: real Radio: real Volumen: real Fvar {Post: conocemos la capacidad volumètrica del depósito además de su diámetro, radio y altura.}

b) Que donats els noms de tres països digui si pertanyen a la mateixa banda horària. {Pre: disponemos de p1, p2 y p3 y h1, h2 y h3 respectivos, no sabem si al compararlos pertanyen a la mateixa banda horária } tipus País = {p1:cadena, p2:cadena, p3:cadena, p4:cadena....} Hora = {h1:enter, h2:enter, h3:enter, h4:enter...} Ftipus Var Intropais: País; Comparativa: booleà; 5


fvar {Post: donats p1,p2 y p3, obtindrem true o false depenent de si pertanyen o no a la mateixa banda horaria} c) Que donades dues dates correctes en format dd-mm-aaaa (tres números cada data) digui si estan ordenades d'antiga a moderna {Pre: tenim D1 y D2, correctes e incorrectes, en format dd-mm-aaaa (Tres números cada data) i que no segueixen ordre d’antic a modern} Tipus Fecha1= {any1: enter; mes1: enter; dia1: enter} Fecha2= {any2: enter; mes2: enter; dia2: enter} ftipus

Var D1: Fecha1; D2: Fecha2; Dadacorrecta: booleà; Ordre: booleà; Fvar {Post: introduïdes D1 y D2, sabem si son correctes sabem si es troben ordenades mitjançant true / false}

i

6


Exercici 4: Comprensió i seguiment d’algorismes [20%] Tasca: Donat el següent algorisme, algorisme circ const CHILD: real = 5.9; YOUNG: real = 7.9; ADULT: real = 10.0; fconst var tarifa: cadena; qtty: enter; fare, total : real; fvar tarifa := readString(); qtty := readInteger(); si tarifa = "Child" llavors fare := CHILD; sino si tarifa = "Young" o tarifa = "Old" llavors fare := YOUNG; sino fare := ADULT; fsi fsi total := integerToReal(qtty) * fare * 1.21; si total ≥ 50 llavors total := 0.90 * total; fsi writeReal(total); falgorisme digueu què escriurà en el cas de les següents entrades

Entrada Child, 2 Old, 3 Jennie, 5

Escriptura 14.278 36.3 -

7


Exercici 5: Problema, algorisme i programa en PHP [20%] En una urbanització respectuosa amb el medi ambient, al soterrani de cada casa hi ha un dipòsit de recollida de les aigües pluvials per aprofitar-les per regar.

El dipòsit té un volum que depèn del model d'habitatge i l'usuari ha de tenir cura del volum d'aigua que conté, no sigui que amb l'aigua que reculli en una pluja desbordi i empantani el garatge del xalet. Es considera que el dipòsit, després de la pluja pot estar en un dels 4 potencials estats: • SEGUR, si conté menys del 80% de la seva capacitat nominal • ALERTA, si conté entre el 80 i 90 % de la seva capacitat nominal • PERILL, si conté entre el 90 i el 100% de la seva capacitat nominal • DANYS EXTREMS, si arriba a contenir més del 100% de la capacitat nominal Tasca: Ens encomanen crear un programa que rebi com a dades la previsió de pluja (en litres/m2) i què tan ple està el dipòsit (en percentatge) i ens informi de: • • • •

La quantitat d'aigua que hi ha al dipòsit abans de ploure La quantitat total de litres que cauran a la teulada La quantitat de litres totals que podria haver al dipòsit després de ploure L'estat en què quedarà el dipòsit. En el cas que quedi en estat segur s'indicarà que s'està en zona segura. En qualsevol dels altres estats s'indicarà l'estat i quina és la quantitat d'aigua a desaiguar prèviament per quedar en estat segur.

Exemple: El dipòsit té una capacitat nominal de 12000 litres, la teulada de la casa una superfície de 125 m2, es preveu una pluja de 15 litres/m2 i el dipòsit està al 75% de la seva capacitat nominal el resultat seria:

8


Perquè el dipòsit conté inicialment 9000 litres (el 75% de 12000) Plourà sobre la teulada 1875 litres ( 125 m2 * 15 l/m2) La quantitat total d'aigua per al dipòsit serà 10875 litres (9000 + 1875) La qual cosa porta a un estat de Perill (per damunt de 10800 litres, el 90% de 12000) I s'haurà de desaiguar 1275 litres per quedar en situació segura (9600 litres, el 80% de 12000). La crida tindrà la forma http://localhost/pac1_exer5.php?rain=15&filled=75 on • •

rain : és un número que indica la pluja prevista en litres per metre quadrat filled : indica què tan ple està el dipòsit (en percentatge) .

Podeu comprovar el funcionament a: http://prog.uoc.edu/pac1/pac1_exer5.php?rain=15&filled=75 emprant aquests arguments o d'altres. Cal que feu servir la plantilla pac1_exer5_plantilla.php per construir el programa en PHP i li canvieu el nom al fitxer a pac1_exer5.php Indicacions preceptives •

En aquests moments, en la urbanització, tots els xalets tenen dipòsits de 12000 litres i teulades de 125 m2 de superfície. No obstant es preveu que el programa sigui d'aplicació a futures urbanitzacions amb dipòsits i teulades de mides diferents. A més, els nivells que determinen l'estat (80, 90 i 100% de la capacitat nominal del dipòsit) poden passar a altres valors si es canvia el volum del dipòsit, per la qual cosa es faran servir constants de noms MAX_CAPACITY, ROOF_AREA, SAFE_LIMIT, ALERT_LIMIT i DANGER_LIMIT amb els valors 12000, 125, 80, 90 i 100 respectivament. Sempre que en un còmput del programa s'hagi d'emprar qualsevol d'aquestes dades, es farà referència a les constants. No oblideu posar el nom de l'estudiant en l'espai indicat de la plantilla.

A tenir en compte • Per declarar una variable amb nom, en PHP es fa servir la funció define($name,$value) 1. Per exemple define(“PI”, 3.14); crea la constant PI a la qual se li associa el valor 3.14

1

http://www.php.net/manual/es/function.define.php

9


Copieu aquí el codi de la vostra solució <?php error_reporting(E_ALL ^ E_NOTICE); $rain=$_GET["rain"]; $filled=$_GET["filled"]; define("ROOF_AREA",125); define("MAX_CAPACITY",12000); define("SAFE_LIMIT",9600); define("ALERT_LIMIT",10800); define("DANGER_LIMIT",12000); $deposit_initial=MAX_CAPACITY*$filled/100; $rain_roof=ROOF_AREA*$rain; $rain_total=$rain_roof + $deposit_initial; $rain_drain=$rain_total - SAFE_LIMIT;

if($filled) { print "El dipòsit conté inicialment $deposit_initial litres<br/>"; } else { print "El dipòsit conté inicialment 0 litres <br/>"; } if($rain) { print "Plourà sobre la teulada $rain_roof litres <br/>"; print "La quantitat total d'aigua per al dipòsit serà de $rain_total litres <br/>"; } else { print "La quantitat total d'aigua per al dipòsit serà 0 litres<br/>"; print "Plourà sobre la teulada 0 litres<br/>"; }

if($rain_total<=SAFE_LIMIT) { print "Estàs a zona segura"; } else if ($rain_total>=SAFE_LIMIT && $rain_total<=ALERT_LIMIT) { print "<h1>ALERTA</h1>"; print "S'haurà de desaiguar $rain_drain litres per quedar en situació segura"; } else if ($rain_total>=ALERT_LIMIT && $rain_total<=DANGER_LIMIT) { print "<h1>PERILL</h1>"; print "S'haurà de desaiguar $rain_drain litres per quedar en situació segura"; } else if ($rain_total>=DANGER_LIMIT) { print "<h1>DANYS EXTREMS</h1>"; print "S'haurà de desaiguar $rain_drain litres per quedar en situació segura"; }

?>

10


Exercici 6: Problema, algorisme i programa en PHP [20%] El problema proposat és simular el desplaçament d'un objecte esfèric dins d'un tauler quadriculat amb moviments rectilinis i rebotant quan s'arriba a qualsevol marge. El desplaçament de la bola seguint un determinat itinerari

s'ha de mostrar com una seqüència d'imatges amb les posicions consecutives de la bola

Tasca: A partir de les coordenades inicials (initx, inity) de la bola i de la velocitat inicial (xspeed, yspeed), mostrar la seqüència d'imatges de tauler des de la posició inicial fins que es torna a repetir aquesta posició inicial. La crida al programa ha de ser del tipus http://localhost/pac1_exer6.php?initx=2&inity=3&xspeed=1&yspeed=1 Es pot comprovar el funcionament a: http://prog.uoc.edu/pac1/pac1_exer6.php?initx=2&inity=3&xspeed=1&yspeed=1 El programa s'escriurà a la plantilla pac1_exer6_plantilla.php que es canviarà de nom a pac1_exer6.php pel lliurament Indicacions: •

El tauler té unes dimensions de 6 * 5 caselles. Cada casella ve determinada per les seves coordenades (x, y) segons la imatge. La coordenada x correspon a les posicions horitzontals i la coordenada y a les verticals

. Es faciliten les 30 imatges corresponents a totes les possibles posicions de la bola. El nom de cada fitxer correspon a les coordenades xy d'on es troba l'esfera

11


Els fitxers d’imatge s’han d’ubicar a la mateixa carpeta on estigui el fitxer php i no es poden canviar de nom.

La bola tindrà la velocitat inicial xspeed, yspeed. xspeed correspon a la velocitat horitzontal (el sentit positiu és cap a la dreta) i yspeed correspon a la velocitat vertical (el sentit positiu és cap avall)

Tant les velocitats vertical com horitzontal poden tenir només tres valors, -1, 0 i 1. Exemples: 1. Si la bola està en la posició 3,3 i xspeed té el valor 1 i yspeed el valor -1, es desplaçarà a la dreta i cap amunt passant a la posició 4,2. 2. Si xspeed té el valor 0 la bola es desplaça només verticalment 3. Si yspeed té el valor 0 la bola es desplaça només horitzontalment •

Quan en el seu desplaçament la bola arriba a un dels costats (laterals, superior o inferior), rebota, de manera que es modifica el seu moviment: 1. Si xspeed té el valor 1 i xoca al costat dret, xspeed passa a valer -1 2. Si xspeed té el valor -1 i xoca al costat esquerre, xspeed passa a valer 1

12


3. Si yspeed té el valor 1 i xoca al costat inferior, yspeed passa a valer -1 4. Si yspeed té el valor -1 i xoca al costat superior, yspeed passa a valer 1 5. Evidentment, si xoca contra un racó, canvien de sentit les dues velocitats •

La solució a aquest exercici passa per construir una composició iterativa en que a cada volta es calcula la posició de la bola en el tauler, es calcula si cal canviar les velocitats i es mostra la imatge corresponent. Aquesta composició iterativa finalitzarà quan les coordenades acabades de calcular en una iteració, són les mateixes que les inicials.

Cada cop que es calcula una nova iteració, al costat del tauler amb la bola, s'escriuran les coordenades de la bola i les velocitats prèvies del moviment (amb que s'arriba a la posició).

Un cop mostrat el tauler final (amb les mateixes coordenades que l'inicial), s'escriurà un missatge que indiqui haver assolit la fita.

La sortida estàndard de PHP és l’escriptura d’un fitxer de text (html). Es pot construir el nom d’un fitxer d’imatge, a base de concatenar les seves parts. Per exemple, els codis equivalents donen com sortida 12.png $a = 1; $b = 2; print “$a$b.png”;

$a = 1; $b = 2; print $a.$b.”.png”; 2

2

Cal diferenciar l’operador punt (.) de concatenació, del caràcter punt a l’interior d’una cadena. Recordeu que les cadenes han d’estar delimitades entre cometes o apòstrofs. En la instrucció print $a.$b.”.png”; els dos primers punts són operadors de concatenació mentre que el tercer és el caràcter punt que formarà part del nom del fitxer per separar nom d’extensió

13


Copieu aquí el codi de la vostra solució <?php define("INITX",2); define("INITY",3); $xspeed=1; $yspeed=1; $x=INITX; $y=INITY; print "<img src=$x$y.png> Init position ($x, $y); Init speed($xspeed,$yspeed)<br/>"; do

{ $x=$x+$xspeed; $y=$y+$yspeed; print "<img src=$x$y.png> Actual position ($x, $y); Actual speed ($xspeed,$yspeed)<br/>"; if ($x>=6) {$xspeed=-1;} if ($y>=5) {$yspeed=-1;} if ($x<=1) {$xspeed=1;} if ($y<=1) {$yspeed=1;}

} while ($x<>INITX or $y<>INITY); print "initial position again";

?>

14


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.