Exercici 1: Treballamb seqüències d'entrada [20 %]
A un hotel, molts dels turistes estrangers fan canvi de moneda. Les monedes
acceptades estan restringides a USDolars ($), Lliures esterlines(£), Yens(¥), Yuans (Y)
i Rubles (R).
Tots els canvis de moneda efectuats al llarg del dia s’enregistren i constitueixen una
seqüència diària del tipus
<t1 q1 t2 q2 ..... tn qn X> on
ti és un caràcter que indica la moneda, el valor del qual pot ser ‘$’, ‘£’, ‘¥’, ‘Y’ o
‘R’ segons el tipus de moneda canviada a euros
qi és la quantitat de moneda estrangera canviada del tipus ti
X és la lletra 'X' i indica el final de la seqüència
Els canvis vigents dels diferents tipus de moneda són
Moneda
$
£
¥
Y
R
Valor en €
0.73
1.18
0.0075
0.022
0.11
Tasca: Creeu en llenguatge algorísmic el mòdul totalEuros (acció o funció, el més
adequat i justifiqueu el motiu de la tria), que llegeixi del canal estàndard d'entrada la
seqüència diària i escrigui en el canal estàndard de sortida, per a cada tipus de
moneda canviada la quantitat entrada al llarg del dia. També ha d’escriure el total
d’euros que han sortit de la caixa de canvi.
3.
Com que noretorna res es tractarà d'una acció.
accio totalEuros()
var
dollar, pound, yen, yuan, ruble: enter;
qtty :enter;
euro: real;
type : caràcter;
fvar
dollar := 0;
pound := 0;
yen := 0;
yuan := 0;
ruble := 0;
type := readCharacter();
{tractament inicial}
mentre (type ≠ 'X') fer
{tractament d’un element}
qtty := readInteger();
si (type = '$') llavors
dollar := dollar + qtty;
sino si (type = '£') llavors
pound := pound + qtty;
sino si (type = '¥') llavors
yen := yen + qtty;
sino si (type = '$') llavors
yuan := yuan + qtty;
sino
ruble := ruble + qtty;
fsi
fsi
fsi
fsi
type := readCharacter()
fmentre
euro
euro
euro
euro
euro
:=
:=
:=
:=
:=
integerToReal(dollar) * 0.73;
euro + integerToReal(pound) * 1.18;
euro + integerToReal(yen) * 0.0075;
euro + integerToReal(yuan) * 0.022;
euro + integerToReal(ruble) * 0.11;
writeCharacter('$');
writeInteger(dollar);
writeCharacter('£');
writeInteger(pound);
writeCharacter('¥');
writeInteger(yen);
writeCharacter('Y');
writeInteger(yuan);
writeCharacter('R');
writeInteger(ruble);
writeString('Total €');
writeInteger(euro);
faccio
{tractament final}
4.
Exercici 2: Treballamb seqüències [20 %]
No és gens estrany trobar rellotges o plaques commemoratives que expressen l’hora o
la data en números romans.
Com ja sabeu la numeració romana 1 empra lletres per representar les xifres i és un
tant peculiar perquè una xifra romana pot tenir un valor positiu o negatiu segons es
trobi a la dreta o l’esquerra d’una xifra de valor més gran.
Trobar el valor d’un número romà no és complicat si bé ens requereix una sèrie de
còmputs
Tasca: Crear en llenguatge algorísmic el mòdul moles (acció o funció, el més apropiat
i justifiqueu la tria) que rebi una quantitat representada correctament en números
romans i finalitzada en un punt i en retorni el valor representat en numeració
moderna.
Per exemple: Si rep “CDXIX.” retornaria 419. Si rep “MDLXXXVII.” retornaria
1587.
Indicació 1: Cal tenir present que el valor d’una xifra romana no se sap exactament quan es
mira la xifra, perquè pot ser positiu o negatiu segons la xifra següent.
Indicació 2: El número romà que rep el mòdul és un número romà correcte i acaba amb un
punt. No heu de fer cap mena de control d’errors.
Es tria una funció perquè retorna només un valor
La solució, recorre la cadena de text xifra a xifra calculant el seu
valor. Es manté temporalment el valor de la xifra fins comprovar si és
positiva o negativa quan mira la xifra següent.
Es fa servir una funció auxiliar valorXifra que retorna el valor d’una
xifra romana
funcio moles(roma: cadena): enter
var
valorActual, valorAnterior, total: enter;
i : enter;
fvar
total := 0;
valorAnterior = valorXifra(cadena[1]);
i := 2;
{tractament inicial}
mentre (cadena[i] ≠ '.') fer
{tractament d’un element}
valorActual := valorXifra(cadena[i]);
si (valorAnterior < valorActual) llavors
valorAnterior = -valorAnterior;
fsi
total := total + valorAnterior;
valorAnterior := valorActual;
fmentre
total := total + valorAnterior;
{tractament final}
retornar total;
ffuncio
1
http://ca.wikipedia.org/wiki/Numeraci%C3%B3_romana
5.
funcio valorXifra (xifra:caracter): enter
var
valor : enter;
fvar
si (xifra = 'I') llavors
valor := 1;
sino si(xifra = 'V') llavors
valor := 5;
sino si(xifra = 'X') llavors
valor := 10;
sino si(xifra = 'L') llavors
valor := 50;
sino si(xifra = 'C') llavors
valor := 100;
sino si(xifra = 'D') llavors
valor := 500;
sino
valor := 1000;
fsi
fsi
fsi
fsi
fsi
fsi
retorna valor;
ffunció
6.
Exercici 3: Treballamb seqüències en PHP [20 %]
Disposem d'unes cadenes de text en què s'intercalen xifres i lletres, com ara
"12c4354gy3232z9087r26."
Tasca: Es demana un programa que
sigui capaç de llegir un fitxer que
contingui una cadena de text
d'aquestes característiques i escrigui
en pantalla, a una línia per bloc de
xifres, la suma de totes les xifres que
formen cada bloc. Quan arriba al
punt, escriu Dot found i finalitza
l'execució.
Indicacions preceptives
•
El fitxer php rebrà el nom prac1_exer3.php
•
La crida al programa serà del tipus que es mostra i les dades s'entraran en un
fitxer de text
prac1_exer3.php?filename=data30
els fitxers de dades consten d’una única instrucció de php en què la variable
$cadena rep com valor una cadena de text integrada per sèries de xifres que
estan separats per un o més caràcters i conté un punt.
Per exemple el fitxer data30 té el següent contingut
<?php
$cadena="12c4354gy3232z9087r26.";
?>
Podeu comprovar el funcionament del programa que se us demana que escriviu amb
la crida:
http://prog.uoc.edu/prac1/prac1_exer3.php?filename=data30
Podeu provar canviant els noms dels fitxers de dades (data30 a data34).
•
Les instruccions per carregar el fitxer amb la variable $cadena ja formen part de la
plantilla.
•
Els fitxers de dades s'hauran d'ubicar a la mateixa carpeta que els php
Altres indicacions
•
La variable $cadena és una variable de text i les xifres que l'integren, com les
lletres, són caràcters, cosa que s'haurà de tenir en compte a l'hora de fer
comparacions.
•
També s'haurà de tenir en compte per a fer sumes. Si el contingut de la
variable $a és el caràcter '1', si el volem afegir a $total, la instrucció serà
7.
$total = $total+ (int)$a; per tal de convertir el caràcter al seu valor numèric
abans de sumar
•
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.
•
Per a un plantejament adequat del problema cal tenir present que la seqüència
rebuda està formada per diferents tipus d'unitats: caràcters i blocs de xifres. Un
primer tractament és recórrer aquestes unitats fins trobar el punt. El tractament
de les unitats serà no fer res en el cas dels caràcters i quan s'arriba a una xifra
engegar el tractament del bloc de xifres que ha de donar com resultat escriure
en pantalla el valor de la suma de totes les xifres.
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, que
resultin útils i que l'estudiant vulgui desenvolupar voluntàriament.
8.
//Aquí heu deposar el vostre codi
<?php
/************* FUNCTION *************/
//Aquí va el codi de les funcions
function LF()
{ //line feed
print "<br />";
}
/************* MAIN *************/
//Aquí va el codi del programa principal
$filename = $_GET["filename"];
include($filename);
$i = 0;
$char = $cadena[0]; //init great sequence treatment
while ($char != '.')
{
if (($char >= '0')&&($char <= '9')) //$char is a digit
{
$sum = 0;
//init litle sequence treatment
while (($char >= '0')&&($char <= '9'))
{
$sum += (int)$char;
$i++;
$char = $cadena [$i];
}
LF();
print "Sum of digits = $sum";
}
Exercici 4: Treballamb seqüències en PHP [20 %]
Tasca: Crear un programa que sigui capaç de mostrar en pantalla totes les figures
d'una màquina escurabutxaques el nom de les quals formi part de un text que es
llegirà d'un arxiu de dades que el carrega a la variable $cadena.
Indicacions preceptives
•
El fitxer php rebrà el nom prac1_exer4.php
•
La crida al programa serà del tipus
prac1_exer4.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 fitxer, es pot incorporar la instrucció al
programa mitjançant l'ordre include($filename) 2; ambdues instruccions ja
formen part de la plantilla i són les primeres del programa principal.
El fitxer example1.php adjunt carrega un d'aquests fitxers i mostra en pantalla el
contingut. La crida ha de ser del tipus
example1.php?filename=data42
•
Es crearà la function putImg que rebrà el nom d'una figura i posarà en pantalla la
imatge que li correspon. Sempre que s'hagi de posar una imatge en pantalla es
farà amb una crida a aquesta function.
•
Es crearà la function detectFruit que rebrà com a paràmetres la cadena de text i
un número enter que serà en la posició en que cercarà si hi ha el nom d'una
figura. En el cas que en aquesta posició del text es trobi el nom d'una figura, es
retornarà aquest nom. Altrament es retornarà un zero.
Per exemple, si $cadena="ablemonst" la crida detectFruit($cadena,1) retornaria
0 mentre que la crida detectFruit($cadena,2) retornaria "lemon"
•
Es faciliten els fitxers d'imatge en format png necessaris per al desenvolupament
de l'exercici
banana
•
2
bell
grapes
lemon
melon
orange
peach
plum
Els fitxers d'imatge s'hauran d'ubicar a la mateixa carpeta que el php
http://es2.php.net/manual/es/function.include.php
seven
11.
•
Es faciliten arxiusde text de prova amb noms data40, data41, ..., data43. Els
arxius, que són arxius de text, s'hauran d'ubicar a la mateixa carpeta que el fitxer
php.
•
PHP facilita la funció strlen($cadena) 3; que retorna la longitud en caràcters de
la cadena de text $cadena
•
PHP facilita la funció substr_compare 4($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"..
•
Podeu comprovar el funcionament del programa que se us demana que escriviu
amb la crida:
http://prog.uoc.edu/prac1/prac1_exer4.php?filename=data40 o, si voleu, canviant
el nom del fitxer de dades
Consells.
•
Que un fitxer de dades tingui un contingut molt extens, no assegura que contingui
el nom d'alguna figura.
•
El programa ha de fer un recorregut per la cadena cercant en cada posició si troba
algun dels noms de les imatges. Com que la imatge que té un nom més curt és la
campana, és inútil fer cerques quan estem a tres posicions del final de la cadena.
Això ho podem aprofitar per a que el nostre programa no doni voltes innecessàries
a la composició iterativa.
•
Els noms de dos imatges es poden solapar, com ara grapeseven o bellemon en
que una mateixa lletra forma part dels dos noms.
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.
3
4
http://es.php.net/manual/es/function.strlen.php
http://php.net/manual/es/function.substr-compare.php
12.
//Aquí heu deposar el vostre codi
<?php
/************ FUNCTION *************/
function putImg($image_file)
{ // put the image
print "<img src=".$image_file.".png>";
}//de putImg
function NL()
{ // new line
print "<br />";
}// de NL
function detectFruit($string, $pos)
{
$fruit = "0";
switch ($string[$pos])
{
case 'b': if (substr_compare($string, "banana", $pos, 6)==0) $fruit="banana";
else if (substr_compare($string, "bell", $pos, 4)==0) $fruit="bell";
break;
case 'g': if (substr_compare($string, "grapes", $pos, 6)==0) $fruit="grapes";
break;
case 'l': if (substr_compare($string, "lemon", $pos, 5)==0) $fruit="lemon";
break;
case 'm': if (substr_compare($string, "melon", $pos, 5)==0) $fruit="melon";
break;
case 'o': if (substr_compare($string, "orange", $pos, 6)==0) $fruit="orange";
break;
case 'p': if (substr_compare($string, "peach", $pos, 5)==0) $fruit="peach";
else if (substr_compare($string, "plum", $pos, 4)==0) $fruit="plum";
break;
case 's': if (substr_compare($string, "seven", $pos, 5)==0) $fruit="seven";
13.
}
return ($fruit);
}//de detectFruit
/***********PROGRAMA PRINCIPAL ************/
if (isset($_GET["filename"]))
{
// load data file
$filename=$_GET["filename"];
include($filename);
// data file contains $cadena assignation
$long= strlen($cadena);
//$long contains $cadena length
$long -=4; // beyond long-4 they are not coincidences
for ($i=0; $i<$long; $i++)
{
$fruit = detectFruit($cadena, $i);
if ($fruit!="0") putImg($fruit);
}
}
else
{
print "Falta el nom de l'arxiu de dades";
NL();
print "la crida és del tipus <b>pract1_exer5.php?filename=<i>nom_d'arxiu</i></b>";
}
?>
14.
Exercici 5: Treballamb seqüències de seqüències a l'entrada en PHP [20 %]
Un addicte al set i mig que es juga al poble anota, cada cop que juga, quines cartes li
han sortit. Per a això fa servir un codi que fa correspondre a cada carta un número del
0 al 39 en què les cartes 0-9 corresponen als oros, 10-19 a les copes, 20-29 a les
espases i 30-39 als bastos i, dins de cada palo es codifiquen les cartes per ordre
numèric.
La seqüència que crea és del tipus
{c11 c12 ... c1n # c21 c22 ... c2n # c31 c32 ... c3n # ... # cm1 cm2 ... cmn .} on
•
cij : és el codi corresponent a la carta situada en posició i de la partida situada
en posició j.
•
•
# és el caràcter ‘#’ que indica la fi de les cartes d’una partida
. és el caràcter '.' que indica la fi de la seqüència
Aquestes tres partides correspondrien
a la seqüència
<21 8 34 # 2 14 22 # 16 28 .>
Tasca: Crear un programa que rebi un fitxer amb la seqüència d’una sèrie de partides i
les mostri en pantalla, a una partida per línia i acompanyades per la puntuació
obtinguda o bé la paraula "Pass"
Indicacions
•
El fitxer php rebrà el nom prac1_exer5.php
•
La crida al programa serà del tipus
prac1_exer5.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); ambdues instruccions ja
formen part de la plantilla i són les primeres del programa principal.
15.
El fitxer example1.phpadjunt carrega un d'aquests fitxers i mostra en pantalla el
contingut. La crida ha de ser del tipus
example1.php?filename=data53
•
Amb els fitxers de l’enunciat, es faciliten 40 fitxers d’imatge en format png
corresponents a l'anvers de les cartes espanyoles.
•
Per tal de recollir els elements un a un de la seqüència, s'aconsella emprar la
combinació de les instruccions explode i posteriorment array_shift.
Per tal d'obtenir de la cadena $string un a un els números que la formen, on s'ha
fet servir com separador el caracter $c, podeu emprar consecutivament:
•
•
$var1 = explode ($c, $string); 5
$var2 = array_shift($var1); 6
Podeu observar el codi i veure com funciona l'arxiu example2.php que s'adjunta
a l'enunciat. La crida és del tipus
example2.php?cadena=5,6,7,8,91,2,3,4,5,5,676767,78,8,89 i fa servir com
separador una coma.
Si modifiqueu la instrucció $var1 = explode(',', $cadena); a
$var1 = explode(' ', $cadena); llavors haureu de fer servir com separador
l'espai en blanc en lloc de la coma.
La instrucció
• $var2 = array_shift($var1);
equival al que en llenguatge algorísmic escriuríem var2 := readInteger()
considerant que $var1 és el canal d’entrada. Posa a la variable $var2 el valor
que està en la primera posició de $var1 a l’hora que elimina aquest valor de
$var1 de manera que tots els elements de $var1 corren una posició endavant.
5
6
http://es2.php.net/manual/es/function.explode.php
http://es2.php.net/manual/es/function.array-shift.php
16.
Un cop carregadala cadena de dades s'emmagatzemarà la llista de dades a la
variable $data. Aquestes instruccions ja formen part de la plantilla.
•
Podeu comprovar el funcionament del programa que se us demana que escriviu
amb la crida:
http://prog.uoc.edu/prac1/prac1_exer5.php?filename=data50 o canviant el nom del
fitxer de dades.
•
Es faciliten diversos arxius de dades amb els noms data50 a data53. Són fitxers
de text i podeu obrir-los per comprovar el contingut: una instrucció php.
•
Els fitxers de dades i d’imatge han se posar-se a la mateixa carpeta que el fitxer
php
•
S'ha de crear la function putCard que, a partir del número de codi mostrarà una
carta en pantalla.
•
S’ha de crear la function cardValue que rep el número corresponent a la imatge
d'una carta (només el número) i retorna el seu valor en el joc. Per exemple si rep
32 (3 de bastos) retornaria 3, i si rebés 18 (cavall de copes) retornaria 0.5.
•
S’ha de crear la funció played que rep la seqüència i extreu d’ella les cartes d’una
partida, les mostra i escriu la puntuació total de la partida. Aquesta function,
retornarà com paràmetre la mateixa seqüència (però sense les dades extretes) i
un valor true o false segons quedin més dades a la seqüència o ja s’hagi acabat.
•
El programa principal està completament escrit i no s’ha de modificar.
17.
//Aquí heu deposar el vostre codi
<?php
/************* FUNCTION *************/
//Aquí va el codi de les funcions
function LF()
{ //line feed
print "<br />";
}
function putCard($pref, $num)
{
print "<img src='".$pref.$num.".png'>";
}// de putCard
function cardValue($card)
{
$value = $card % 10 + 1;
if ($value > 7) $value = 0.5;
return ($value);
}// de cardValue
function played(&$sequence)
{
$actual = array_shift($sequence);
$value = 0;
while (($actual!="#") && ($actual!="."))
{
putCard ('e', $actual);
$value += cardValue($actual);
$actual = array_shift($sequence);
}
18.
if ($value<8) print" Play Value = $value";
else print " Pass";
LF();
if($actual == '#') return (true);
else return (false);
}
/************* MAIN *************/
//Aquí va el codi del programa principal
$filename = $_GET["filename"];
include($filename);
$data = explode(" ", $cadena);
$nextGame = true; //begin a new Play
while ($nextGame) $nextGame = played($data);
?>