14
Estudis d’Informàtica, Multimèdia i Telecomunicació Programació PAC3 — Document d’exercicis Estudiant Cognoms: Escriu aquí els teus cognoms Nom: Escriu aquí el teu nom 1

PAC3_PA

Embed Size (px)

DESCRIPTION

PAC de l'assignatura de Programació Algorítmica [UOC - Grau en Multimèdia]

Citation preview

Page 1: PAC3_PA

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

ProgramacióPAC3 — Document d’exercicis

Estudiant

Cognoms: Escriu aquí els teus cognoms

Nom: Escriu aquí el teu nom

1

Page 2: PAC3_PA

Exercici 1: Treball bàsic amb taules [50%]

Tasca: Donat un conjunt de dades numèriques que es carreguen en una taula, crear diverses taules resultat del tractament de les dades originals.

L'exercici consistirà en la creació d'una sèrie de mòduls en php que desenvolupin, cadascun, una determinada feina segons el detall que se'n farà a continuació.

No caldrà fer el programa principal perquè aquest forma part de la plantilla i consta de les instruccions necessàries per carregar les dades en l'array $data i les crides a les accions i funcions que haureu de desenvolupar com exercici.

Mòdul printArrayAquest mòdul ha de rebre dos paràmetres:

o El primer serà una taula numèricao El segon serà una cadena de text

El mòdul escriurà en la pantalla, en una primera línia el text rebut a mena de títol i, a la línia següent, llistarà tots els elements de la taula rebuda com primer paràmetre. Cada element se separarà del següent per " # " (espai en blanc, coixinet, espai en blanc).

Per exemple, si la taula rebuda era (1, 2, 3, 4, 5, 6) i la cadena de text "Original" la sortida en pantalla seria:

Original1 # 2 # 3 # 4 # 5 # 6

Mòdul thresholdAquest mòdul ha de rebre quatre paràmetres:

o El primer serà una taula numèricao El segon serà el número discriminanto El tercer serà el número inferioro El quart serà el número superior

El mòdul crearà una nova taula de la mateixa longitud que la taula rebuda de manera que el número que posarà a cada posició de la taula de sortida dependrà del valor que hagi a la mateixa posició de la taula d'entrada i en funció dels altres tres paràmetres rebuts de manera que:

Si el valor a la taula d'entrada és inferior o igual al discriminant, a la posició de la taula de sortida es posarà el valor inferior

Si el valor a la taula d'entrada és superior al discriminant, a la posició de la taula de sortida es posarà el valor superior.

Per exemple, si la taula rebuda és (1, 6, 3, 4, 2, 5), el discriminant és 3.5, inferior és 0 i superior és 11, llavors el mòdul retornaria una taula amb el contingut (0, 11, 0, 11, 0, 11).

2

Page 3: PAC3_PA

Mòdul meanThresholdAquest mòdul rep com a únic paràmetre una taula i calcula la mitjana el valor mínim i el valor màxim dels continguts de la taula i crea una nova taula en què trobarem només els valors mínim o màxim segons si els valors corresponents de la taula d'origen són inferiors o superiors a la mitjana.

Per exemple, si la taula rebuda és (1, 6, 3, 4, 2, 5) la mitjana que resulta és 3.5, el mínim és 1 i el màxim és 6. Llavors la taula que retornaria el mòdul seria (1, 6, 1, 6, 1, 6)

Mòdul reverse.Aquest mòdul rep com a únic paràmetre una taula i retorna una altra taula de la mateixa dimensió que té els mateixos elements però en posició inversa a la de la taula original.

Per exemple, si la taula rebuda és (1, 6, 3, 4, 2, 5) retornaria la taula (5, 2, 4, 3, 6, 1)

Mòdul evenOddSeparatorAquest mòdul rep com a únic paràmetre una taula i en retorna una altra que té els mateixos valors però primer porta tots els parells i després tots els senars.

Per exemple, si la taula rebuda és (1, 6, 3, 4, 2, 5) retornaria la taula (6, 2, 4, 3, 5, 1) o (2, 6, 4, 1, 5, 3) o ... (qualsevol taula que tingui davant els tres parells i després els tres senars, no importa l'ordre que tinguin entre ells els parells ni els senars)

No haureu de crear el programa principal perquè ja forma part de la plantilla. És important que mireu el programa principal, amb les crides als mòduls per saber com han de ser les capçaleres de les function.

La crida al programa ha de ser del tipus

localhost/PAC3_exer1.php?filename=data15

Podeu comprovar el funcionament del programa amb la crida.

http://phppract.comlu.com/pac3/PAC3_exer1.php?filename=data15

Indicacions

1. En PHP existeix la function count($arg)1 que rep com argument un array i retorna la quantitat d'elements que té l'array $arg. És força útil per saber els límits dels recorreguts per l'array.Per exemple si la taula és (1, 2, 3, 4, 5, 9) retornaria un 6.

2. A diferencia del llenguatge algorísmic el primer element de les taules en PHP és l'element 0. Per exemple en la taula (1, 4, 8, 12, 16, 20) el número 8 està en la posició 2.

1 http://php.net/manual/es/function.count.php

3

Page 4: PAC3_PA

3. PHP porta integrades moltes functions per treballar amb arrays. Una d'elles és count que es comenta en la indicació 1. En aquest exercici de la PAC, queda especialment prohibit fer ús de les function d'arrays de php llevat de l'esmentada count.

4. Es faciliten 6 fitxers de dades data10 a data15. Aquest darrer, per la seva longitud i conjunt de valors, és força apropiat per les proves.

4

Page 5: PAC3_PA

Copieu aquí el codi de la vostra solució

<!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>PEC 3 Ejer1 Basic Array</title>

</head>

<body>

<h3>Basic Array</h3>

<h3>Jaume Villarreal Quintana</h3>

<div>

<?php

/******************FUNCTIONS*********************/function LF(){ echo '<br/>'; }

function printArray($array, $string){ echo '<h3>'.$string.'</h3>'; $i=0; $limit=count($array)-1; for($i=0; $i<$limit; $i++){ echo $array[$i]; echo ' # '; } echo $array[$limit]; }

function threshold ($array, $disc, $min, $max){ $i=0; $limitArray=count($array)-1; for($i=0; $i<=$limitArray; $i++){ if($array[$i]<=$disc){ $array[$i]=$min; } else{ $array[$i]=$max; } } return $array; }

5

Page 6: PAC3_PA

function meanThreshold($array){ $i=0; $counter=0; $limitAverage=count($array); $limitArray=count($array)-1; for($i; $i<=$limitArray; $i++){ $counter+=$array[$i]; } $average=$counter/$limitAverage;

$j=0; $min=$array[$j]; $max=$array[$j];

for($j=1; $j<=$limitArray; $j++){ if($array[$j]<$min){ $min=$array[$j]; } if($array[$j]>$max){ $max=$array[$j]; } }

$k=0; while ($k<=$limitArray){ if($array[$k]<$average){ $array[$k]=$min; } else{ $array[$k]=$max; } $k++; } return $array; }

/*function reverse($array){ $i=count($array)-1;

while($i>0){ echo $array[$i].' # '; $i-=1; } echo $array[$i]; }*/

function reverse($array){ $newArray=array(); $i=0; $limit=count($array)-1; $counter=$limit;

for($i; $i<=$limit; $i++){ $newArray[$counter]=$array[$i]; $counter-=1; } return $newArray; }

6

Page 7: PAC3_PA

function evenODDSeparator($array){ $i=0; $limit=count($array)-1; $newLimit=$limit; $evenCounter=0; $oddCounter=$limit;

for($i; $i<=$limit; $i++){ if($array[$i]%2==0){ $newArray[$evenCounter]=$array[$i]; $evenCounter=$evenCounter+1; }

if($array[$i]%2!=0){ $newArray[$oddCounter]=$array[$i]; $oddCounter=$oddCounter-1; } } return $newArray; }

/******************MAIN*********************/

$filename = $_GET["filename"];include ($filename);$data = explode (" ", $cadena);//$data is a data array

printArray( $data, "Array entrada");

$out = threshold ($data, 25, 5, 45);printArray( $out, "Llindar 25");

$out = threshold ($data, 50, 25, 200);printArray( $out, "Llindar 50");

$out = meanThreshold($data);printArray( $out, "Llindar mitjana");

$out = reverse ($data);printArray( $out, "Invertida");

$out = evenOddSeparator ($data, 50, 5, 95);printArray( $out, "Parells - Senars");

?>

</div>

</body>

</html>

7

Page 8: PAC3_PA

Exercici 2: Problema, algorisme i programa modular amb taules en PHP [50%]

Tasca: Simular el joc de daus CRAPS.

El joc CRAPS és famós per la seva aparició a moltes pel·lícules on surt gent apostant quan algun personatge tira una parella de daus. Tot i no ser un joc de regles complicades, tampoc es poden descriure en un parell de línies.

Una ronda de CRAPS2 pot tenir dues fases i es pot guanyar o perdre en qualsevulla d'elles.

Fase 1: Es tiren el dos daus. Si es treu un 7 o un 11, s'ha guanyat. Si es treu 2, 3 o 12 s'ha perdut. Si no es treu cap d'aquests 5 valors, s'anota el valor obtingut "punt" i es passa a la fase 2.

Fase 2: Es van tirant repetidament els dos daus mentre no surti punt o un 7. Qualsevol dels dos resultats en una tirada de dos daus finalitzen la partida. Si s'ha obtingut un 7, s'ha perdut. Si es repeteix primer el valor punt s'ha guanyat. Aquesta segona fase és de longitud indeterminada. Tan es pot acabar en una sola tirada com es pot necessitar una sèrie de 10 o més tirades.

A la imatge de l'esquerra es mostra una ronda en què es treu un punt que val 9 i, a la segona fase es guanya a la tercera tirada perquè s'ha tornat a obtenir un 9.

En la de la dreta s'ha treu un punt de 10 i s'ha perdut a la segona fase perquè en la quarta tirada s'ha obtingut 7.

El programa s'escriurà a la plantilla PAC3_exer2_plantilla.php que es canviarà el nom a PAC3_exer2.php pel lliurament.

El joc, en el cas d'haver de passar a la segona fase, haurà de crear una taula per emmagatzemar tots els daus que es tiri, la primera tirada de la sèrie anirà a les posicions 0 i 1, la segona a les posicions 2 i 3, ... la tirada n a les posicions 2n i 2n+1.Indicacions:

2 http://es.wikipedia.org/wiki/Craps

8

Page 9: PAC3_PA

Per a l'execució, totes les imatges se situaran a la mateixa carpeta de localhost que el fitxer php

En el programa s’haurà de crear la function putDices que rebrà com paràmetres els números corresponents a dos daus i els mostrarà en la pantalla precedint-los i posant després d'ells la imatge sep.png, per tal de mostrar una separació en el tapet verd.Aquesta function s’emprarà sempre que s’hagi de mostrar els daus d'una tirada.

S'haurà de crear una function firstShot sense paràmetres que farà la tirada de la primera fase, escriurà el cartell "Primera Tirada" i sota mostrarà els daus que s'ha obtingut. Haurà de retornar la puntuació obtinguda en la tirada.

S'haurà de crear la function longPlay que farà la sèrie de tirades fins guanyar o perdre. Aquesta funció rebrà el punt com paràmetre (li és necessari per decidir quan acaba de fer tirades perquè es guanya) i retornarà una taula que contindrà tots els daus llençats en la sèrie.Aquesta function no ha de mostrar cap dau per la pantalla.

S'haurà de crear la function win que rebrà la taula de daus obtinguda en la segona fase, també rebrà punt i retornarà true si s'ha guanyat en la sèrie o false si s'ha perdut.

S'haurà de crear la function writeLongPlay que rebrà la taula de daus de la sèrie i la mostrarà en pantalla. Per mostrar els daus, haurà d'invocar la function putDices.

Si l’estudiant ho creu convenient pot crear més function en el programa.

Haurà de funcionar amb una crida del tipus: PAC3_exer2.php, sense cap paràmetre. Es pot comprovar el funcionament a

http://phppract.comlu.com/pac3/PAC3_exer2.php

Tant si el jugador guanya com si perd, ha d'aparèixer un missatge final que expliciti perquè ha guanyat o perdut

9

Page 10: PAC3_PA

Copieu aquí el codi de la vostra solució

<!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>PAC 3 Exer2 CRAPS</title></head><body><h3>CRAPS</h3><h3>Jaume Villarreal Quintana</h3><div><?php

/******************FUNCTIONS*********************/

function LF( echo '<br/>'; }

function randomDice(){ $dice=rand(1,6); return $dice; }

function printDice($dice){ echo "<img src='$dice.png' />"; }

function putDices($numb1, $numb2){ echo "<img src='sep.png' />"; printDice($numb1); printDice($numb2); echo "<img src='sep.png' />"; }

function firstShot(){ LF(); echo '<h3>'.'Primera tirada'.'</h3>'; $dice1=randomDice(); $dice2=randomDice(); putDices($dice1, $dice2); return $dice1+$dice2; }

function longPlay($score1){

$i=0; $j=1; $cond=false;

while($cond!=true){

10

Page 11: PAC3_PA

$dice1=randomDice(); $dice2=randomDice(); $score2=$dice1+$dice2;

$diceArray[$i]=$dice1; $diceArray[$j]=$dice2;

if($score2==7 || $score2==$score1){ $cond=true; }

$i+=2; $j+=2; } return $diceArray; }

function win ($array, $score){ $limit=count($array)-1; if($array[$limit-1]+$array[$limit]==$score){ $winGame=true; }

if($array[$limit-1]+$array[$limit]==7){ $winGame=false; } return $winGame; }

function writeLongPlay($array){ $limit=count($array)-1; $i=0; $j=1;

while($j<=$limit){ putDices($array[$i], $array[$j]); $i+=2; $j+=2; } }

/******************MAIN*********************/

$score=firstShot();

if($score==7||$score==11){ LF(); echo '<h3>'.'Has guanyat, has tret '.$score.'.'.'</h3>'; }

elseif($score==2||$score==3||$score==12){ LF(); echo '<h3>'.'Has perdut, has tret '.$score.'.'.'</h3>'; }

11

Page 12: PAC3_PA

else{ $arrayDice=longPlay($score); $finalResult=win($arrayDice,$score); LF(); echo '<h3>'.'Sèrie de tirades.'.'</h3>'; writeLongPlay($arrayDice); if($finalResult==true){ echo '<h3>'.'Has guanyat, has igualat'.$score.'.'.'</h3>'; } if($finalResult==false){ echo '<h3>'.'Has perdut, has tret 7'.'</h3>'; } }

?></div></body></html>

12