Estudis d’Informàtica, Multimèdia i Telecomunicació
Programació PAC2 — Document d’exercicis
Estudiant Cognoms: Villarreal Quintana Nom: Jaume
1
Exercici 1: Declaració d'accions i funcions [15%] Tasca: Per a cada apartat, decidiu si és millor una acció o una funció i definiu-ne la capçalera (només es demana la capçalera, no cal que dissenyeu cap algorisme). Es demana la capçalera d'un mòdul (acció o funció) que: a) Que rebi un número de telèfon i digui si està assignat o no a algun usuari i el nom del propietari: acció phone (ent tlfn: enter, sor name: cadena, sor msg: boolea)
b) Que reculli de l'entrada estàndard 10 paraules una rera l’altre i digui si les han entrat per ordre alfabètic funció alphabeticOrder (): booleà
c) Donades dues cadenes digui si la segona està continguda en la primera i quants de cops apareix acció repeatString (ent string1: cadena, ent string2: cadena, sor repeat: enter, sor: msg: booleà)
d) Que rebi l’import d’un lloguer a actualitzar i l’IPC i actualitzi el preu del lloguer. acció setup (ent amount: real, ent IPC: real)
2
Exercici 2: Crides a mòduls i modificadors d'entrada i sortida [15%] Tasca: Donats l’algorisme i les capçaleres de les següents accions i funcions: funcio function1( x: enter, y: enter, z: enter) : boolea; funcio function2( x: enter, c: caracter, b: boolea) :enter; accio action1( sor x: enter, ent z: enter) ; accio action2( ent c: caracter, ent x: enter, entsor y: enter); algorisme algorithm var i, j, k: enter; x, y, z : real; d : caracter; b: boolea; fvar ...
... falgorisme
Responeu a cada apartat si és correcte o no substituir el requadre gris de l’algorisme algorithm per la instrucció que es dóna i, si no ho és, indiqueu-ne les causes a) action1 (k, function2( 7, ‘x’, function1(x, y, z )); INCORRECTA. Els paràmetres que es passen a function1 corresponen a variables de tipus real, quan els paràmetres formals de la funció declarada són de tipus enter.
b) k := action2( d, function2 ( i, ‘A’, cert), j); INCORRECTA. La invocació d'una acció sempre es fa fora d'una expressió. Seria correcte: action2( d, function2 ( i, ‘A’, cert), j);
c) b := function1( j, function2( k, d, function1(5, 7, 12)), 3*k); CORRECTA.
3
Exercici 3: Ús de mòduls i paràmetres segons el seu significat i [15%] Tasca: Després d’uns anys d’haver construït un aeroport i no posar-lo en funcionament, la companyia Escocesa AllInAir ha decidit comprar-lo com a seu exclusiva dels seus avions i des d’on fa un vol diari d’anada i tornada a cadascuna de les seves 22 destinacions. Per als mostradors de l’aeroport (únic lloc on es venen bitllets) ha creat el programa que facilita l’emissió de bitllets que s’han de pagar al moment amb targeta. Ompliu les caixes, amb una única instrucció o expressió a cada una, per aconseguir el comportament que us hem descrit. L’algorisme resultant ha d’utilitzar obligatòriament les següents accions i funcions, que no heu d’implementar:
Acció que llegeix del canal d’entrada la destinació, la data de viatge (dd-mm-aaaa) i el nom del viatger: accio getFlightInfo (sor destination: cadena, sor date:cadena, sor traveller: cadena); Acció que llegeix del TPV el número de targeta de crèdit i el PIN i diu si el PIN correspon a la targeta: accio getCreditCardInfo (sor number: enter, sor PIN: enter, sor OK: boolea); Funció que rep la destinació i retorna el codi del vol funcio getFlightCode ( location: cadena): cadena Funció que rep un import i les dades d’una targeta i retorna cert si s’ha pogut carregar l’import a la targeta: funcio payOK (amount: real, creditCarNumber: enter, PIN: enter): boolea; Acció que rep el codi del vol i la data i diu si hi ha o no places i el preu de la plaça vacant acció vacancyCost ( ent code: cadena, ent date: cadena, sor vacancy: boolea, sor amount: real); Acció que donades les dades del bitllet (codi del vol,data, nom del viatger i preu) escriu la targeta d’embarcament i el bitllet: accio writeBoardingPass (ent code: cadena, ent date:cadena, ent traveller:cadena, ent amount: real );
4
algorisme AllInAirAirport var cityTo, date, travellerData, fligthCode: cadena; creditCardNum, PIN : enter; travelAmount: real; OKSeat, OKCredit, OKPay: boolea; fvar {llegeix del canal estàndard la informació de fitxer de vol i viatger}
getFlightInfo (cityTo, date, travellerData) ;
{obté el codi del vol}
fligthCode:=
;
getFlightCode (cityTo):string {mira si hi ha vacants a la data de vol i el preu en qüestió} ;
vacancyCost (flightCode, date, OKSeat, travelAmount) si OKSeat llavors {obté les dades de la targeta de crèdit de l’usuari} ;
getCreditCardInfo (creditCardNum, PIN, OKCredit) si OKCredit llavors {intenta fer el cobrament del bitllet} OKPay :=
;
payOK (travelAmount, creditCardNum, PIN) si OKPay llavors { genera bitllet i targeta
writeBoarding (flightCode, date, travellerData, travelAmount) sino writeString (“Pagament no acceptat”), fsi sino writeString (“PIN incorrecte”); fsi sino writeString (“No hi ha vacants per aquest vol”); fsi
5
;
falgorisme
6
Exercici 4: Disseny de mòduls [15%] Tasca: Una empresa es dedica a pintar dipòsits rectangulars per encàrrec i vol una aplicació que li digui quanta pintura ha de fer servir per a un dipòsit determinat. Crear un mòdul (acció o funció, el més adequat) que rebi les mides del dipòsit (en metres), si s’ha de pintar només per fora o també per dins i el rendiment de la pintura (en metres quadrats per kilo de pintura) i digui quants pots de pintura (els pots són de 1 kg) necessita.
funció tankPainting (ent h: real, ent: w: real, ent d: real, ent efficiency: real, ent fullPainting: booleà) var tankArea: real totalPaint: real totalPaintCan:enter fvar tankArea := (2*h*w)+(2*h*d)+(2*w*d); si fullPainting := SÍ llavors tankArea := tankArea*2; totalPaint := tankArea / efficiency; sino totalPaint := tankArea / efficiency; fsi totalPaint := totalPaint + 1; totalPaintCan := realaEnter (totalPaint); retorna (totalPaintCan); ffunció
7
Exercici 5: Traducció d’un algorisme amb mòduls a PHP [20%] Tasca: L’ algorisme inferior calculà àrees de determinats polígons regulars (polígons amb tots els costats igual de llargs): triangles, quadrats, pentàgons i hexagons. Li demana a l'usuari que entri el nombre de costats i la mida del costat. En aquest algorisme suposarem que disposem de la funció sqrt(x:real):real que retorna l'arrel quadrada de x. algorisme area const FORPENTA: real = 0.344; fconst var sidesNumber: enter; side, area: real; fvar {ACCIONS I FUNCIONS} accio getData (sor n: enter, sor long: real) n := readInteger(); long := readReal(); faccio funcio cub (n: real): real retorna n * n * n; ffuncio funcio triangle (long: real): real var s: real; fvar s := long * 1.5; return sqrt1( s * cub(s-long)); ffuncio funcio quadrat (long: real): real return long * long; ffuncio funcio pentagon (long: real): real return 5.0 * quadrat(long) * FORPENTA; ffuncio funcio hexagon (long: real): real return 6.0 * triangle (long); ffuncio {PROGRAMA PRINCIPAL} getData (sidesNumber, side); si sidesNumber<3 o sidesNumber>6 llavors 1
en PHP existeix la function sqrt($arg) que retorna l'arrel quadrada de $arg
8
writeString("El Nombre de costats ha d'estar entre 3 i 6"); sino si sidesNumber = 3 llavors area := triangle (side); sino si sidesNumber = 4 llavors area := quadrat (side); sino si sidesNumber = 5 llavors area := pentagon (side); sino area := hexagon (side); fsi fsi fsi fsi writeString ("L'àrea és "); writeReal (area); falgorisme
Cal que ompliu la plantilla PAC2_exer5_plantilla.php amb la traducció de l’algorisme a PHP i li canvieu el nom a PAC2_exer5.php Indicacions per a PHP Les dades s’entraran pel mètode $_GET en dos paràmetres de noms sidesNumber, side. La crida ha de ser del tipus: http://localhost/PAC2_exer5.php?sidesNumber=4&side=27.3 Per a comprovar el funcionament podeu fer servir http://phppract.comlu.com/pac2/PAC2_exer5.php?sidesNumber=4&side=27.3 Advertiments 1. En PHP existeix la function sqrt($arg) que retorna l'arrel quadrada de $arg 2. Si voleu que els números reals resultats dels càlculs es mostrin amb 2 decimals com a l’exemple, l’escriptura s’ha de fer amb l’ordre printf
9
Copieu aquí el codi de la vostra solució AreaCalculator'; print '
Jaume Villarreal Quintana
'; if ($n<3||$n>6){ print "
El nombre de costats ha d'estar entre 3 i 6.
"; } else{ printf ("
L'`àrea és %9.2f
", $area); } ?>
10
Exercici 6: Problema, algorisme i programa modular en PHP [20%] Tasca: Simular un joc simple del 7 i ½. El programa rep la dada players: un enter que indica la quantitat de jugadors que participen Cada jugador va tirant cartes fins que es planta o es passa. A la mateixa línia es mostra la puntuació resultant de cada jugador i la paraula Pass en el cas que passi. Guanya el jugador que s'apropa més al 7 i ½ sense passar-s'hi. La darrera línea que s’escriu diu quin és el jugador guanyador o guanyadors i la puntuació obtinguda. Si tots passen apareixerà un missatge que així ho indiqui.
El programa s'escriurà a la plantilla PAC2_exer6_plantilla.php que es canviarà el nom a PAC2_exer6.php pel lliurament Indicacions:
Es faciliten les imatges per mostrar les cartes
0.jpg, 1.jpg, …,9.jpg amb els anversos de les cartes 1-7 i les figures de diamants
10.jpg, …, 19.jpg amb els anversos de les cartes 1-7 i les figures de piques
20.jpg, …, 29.jpg amb els anversos de les cartes 1-7 i les figures de cors
30.jpg, …, 39.jpg amb els anversos de les cartes 1-7 i les figures de trèvols
Per a l'execució, totes les imatges se situaran a la mateixa carpeta de localhost que el fitxer php
11
L'entrada de dades s'haurà de realitzar pel mètode $_GET de manera que funcioni amb una crida del tipus: PAC2_exer6.php?players=3.
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.
Es pot comprovar el funcionament a http://phppract.comlu.com/pac2/PAC2_exer6.php?players=2
En el programa s’haurà de crear la function value que rebrà un número entre 0 i 39 (el nom d'una carta) i retornarà el valor associat a la carta. P.e. si rep el 22
retornarà el 3,
si rep el 38
retornarà un 0.5
si rep el 15
retornarà un 6
En el programa s’haurà de crear la function putCard que no rebrà paràmetres i simula la tirada d’una carta, la posa en la pantalla i retorna el valor obtingut. Aquesta function s’emprarà sempre que s’hagi de tirar una carta i invocarà value per saber el valor de la carta.
En el programa s’haurà de crear la function onePlay que no rebrà cap paràmetre i tirarà les cartes d'un jugador, escriurà la seva puntuació final i la paraula Pass si cal. Retornarà la puntuació total del jugador. Aquesta function ha d'incorporar una certa intel·ligència. És a dir, cada cop que posa una carta ha de decidir si es planta o no. Una manera simple de simular aquesta intel·ligència és treure una altra carta si la puntuació acumulada fins el moment és menor a un determinat valor (p.e. 5). Així, si tenim una puntuació menor a 5, tirem una altra carta. Si ja tenim un 5 el risc de passar-nos és gran i ja no es treu cap altre carta.
2
Si l’estudiant ho creu convenient pot crear més function en el programa.
http://php.net/manual/es/function.rand.php
12
Copieu aquí el codi de la vostra solució
//
ADJUDICA VALOR A LES CARTES function value($card){ $mod=$card % 10; if($mod<7||$mod>10){ $value=$mod+1; } else{ $value=0.5; } return $value; }
//
IMPRIMEIX LA CARTA function putCard(){ $carta=rand(0,39); print "

"; $carta=value($carta); return $carta; }
//
GESTIONA LA TIRADA D'UN JUGADOR function onePlay(){ $score=0; while($score<=5){ $deal=putCard(); $score+=$deal; } print ' Score: '. $score; if($score>7.5){ print '
>> Pass'; } return $score; } function getData (&$players){ $players=$_GET["players"]; }
13
/**************MAIN*****************/ getData($players);
$finalScore=0.5; $winner=0; for($i=1; $i<=$players; $i++){ print "
Player $i
"; $deal=onePlay(); $score=$deal; if($score>=$finalScore && $score<=7.5){ if($score==$finalScore){ $winner=$winner." and ".$i; } else{ $winner=$i; } $finalScore=$score; } } print '
'; if($winner>=1){ print "
The winner is Player $winner.
Score: $finalScore points.
"; } else{ print "
Everyone pass.
"; } ?>
14