L'assignatura de programació tracta de l'aprenentatge al disseny bàsic d'algoritmes.
La resolució d'algoritmes per cada problema es basa a aplicar una sèrie d'instruccions i càlculs que depenent del problema aquest tindrà més instruccions o menys. Aquesta tasca és bàsica, per poder després entendre qualsevol llenguatge de programació és una assignatura que si no es té coneixements previs és molt abstracta.
A part de la confecció d'algoritmes amb pseudocodi també es practica la resolució d'algoritmes utilitzant el llenguatge de programació PHP.
2. Exercici 1: Treball amb una seqüència heterogènia a l'entrada [20 %]
En una cadena de magatzems volen fer una estadística de les preferències dels seus
clients respecte els productes de la UE o de fora de la UE. En cada botiga, a la fi del
dia, a partir de les caixes es genera una seqüència del tipus:
<c1 q1 p1 c2 q2 p2 ..... cn qn pn 0> on
ci és el codi del producte i. Tots els codis són números de 8 xifres. Els productes
europeus comencen amb xifres del conjunt 0-4. Els de la resta del món
comencen amb les xifres 5-9.
qi és la quantitat de producte i adquirit.
pi és el preu unitari del producte i.
0 és el número 0 i indica el final de la seqüència
Tasca: Crear en llenguatge algorísmic el mòdul EU_import (acció o funció, el més
apropiat i justifiqueu la tria) que llegeixi de l'entrada estàndard la seqüència diària
corresponent a una botiga i retorni quin percentatge de la facturació es
correspon a productes de la UE
funció EU_import() :real
VAR:
c:enter;
q:enter;
p:real;
import_EU: real;
import_Total: real;
import:real;
FVAR;
import_EU=0;
import_Total=0;
c=llegir ();
mentre(c>0) fer
q=llegirEnter();
p=leer();
import=enterAReal(q)*p;
// llegirCaracter funcio que retorna un caracter introduït pel teclat del computador //
si(llegirCaracter(c)=0) import_EU=import_EU+import;
si(lllegirCaracter (c)=1) import_EU=import_EU+import;
si(llegirCaracter (c)=2) import_EU=import_EU+import;
si(lllegirCaracter (c)=3) import_EU=import_EU+import;
si(llegirCaracter (c)=4) import_EU=import_EU+import;
import_Total=import_Total+import;
c=llegir ();
fmentre
retorna import_EU*100/import_Total;
Valoració
- Determinació del tipus de mòdul, 0.1; justificació, 0.4.
- Determinació i justificació dels paràmetres paràmetres: 0.25.
- Determinació de variables: 0.25.
- Tractament de la seqüència: 1.0.
2
4. Exercici 2: Treball amb generació de seqüències [20 %]
Un matemàtic jubilat, quan va començar a treballar es va comprometre a fer la
seqüència de la seva vida: a copiar en una seqüència tots els números enters de tres
o més xifres que ha emprat al llarg de tota la seva carrera laboral. El dia que es va
jubilar va posar, per acabar la seqüència, un 1.
El matemàtic té la teoria que no totes les xifres tenen les mateixes probabilitats
d'aparèixer en un número de tres o més xifres i ara li toca mirar-se tota la seqüència de
la seva vida i comprovar la seva teoria.
Podríeu ajudar-lo?
Tasca: Creeu un mòdul myLifeSeq (acció o funció, el més adequat i justifiqueu la tria)
que rebi una xifra, llegeixi de l'entrada estàndard la seqüència i digui quants de
cops apareix la xifra en la seqüència de la vida del matemàtic.
Indicacions preceptives: La seqüència està constituïda per números, per la qual cosa
el tractament per seleccionar les seves xifres una a una, ha de ser un tractament
aritmètic. En aquests sentit ha de ser útil emprar els operadors div i mod.
funció
n m ..... 1
funcio myLifeSeq(i:enter)
llegir la seqüència
recorregut de la seqüència fins a 1
valor --> desglosar-ho en unitats 2012 --> 2, 0, 1, 2
comptar nombre de vegades que apareix i
retornar i
ffuncio
recorregut:
posicionar la seq.
mentre no fi
accions
avança
fmentre
function myLifeSeq(i: enter): enter
var
n,d,c:enter
fvar
c:=0;
n:=llegirEnter ();
mentre no (n=1) fes
//descomposar el nombre en digits
mentre no (n=0) fes
d:=n mod10;
n:=n div 10;
si (i=d) llavors c++;
fmentre
n:=llegirEnter ();
fmentre
retorna c;
Valoració
- Determinació del tipus de mòdul, 0.1; justificació, 0,4.
- Determinació de paràmetres: 0’25.
4
5. - Determinació de variables: 0.25.
- Tractament de la seqüència: 1.0.
5
6. Exercici 3: Treball amb seqüències en PHP [20 %]
Disposem d'una seqüència de tres o més números positius cadascun d'ells separat del
següent per un espai. La seqüència finalitza amb un zero.
Tasca: Es demana un programa que sigui capaç de llegir un fitxer que contingui una
cadena d'aquestes característiques i vagi escrivint en la pantalla blocs de quatre
provinents de la llista i separats per comes segons les següents normes
a. Els quatre números de cada línia s’escriuran ordenats de menor a major i
separats per comes.
b. La primera línia mostrarà els quatre primers números de la seqüència.
c. A cada línia nova es traurà el número més antic de la línia anterior i s’afegirà un
nou número de la seqüència.
Es pot observar com s’ha fet en la pantalla següent en què es tracta la
seqüència 12 11 10 9 8 7 6 5 4 3 2 1 0
Primer s’ha tractat 12 11 10 9, després 11 10 9 8, després 10 9 8 7, ..., 4 3 2 1
d. El 0 final no es considera part de les dades. Indica només la fi de la seqüència.
Quan s’arribi al 0 s’escriurà el missatge End of List
Indicacions preceptives
El fitxer php rebrà el nom prac1_exer3.php
La crida al programa serà del tipus
prac1_exer3.php? filename=data30
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)1
; ambdues instruccions ja
formen part de la plantilla i són les primeres del programa principal.
1
http://es2.php.net/manual/es/function.include.php
6
7. 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 una sèrie de números
enters i positius que estan separats per un espai i finalitza en un 0
Per exemple el fitxer data30 té el següent contingut
<?php
$cadena = "12 11 10 9 8 7 6 5 4 3 2 1 0";
?>
Per tal de recollir els números un a un de la seqüència que conté la cadena,
s'aconsella emprar la combinació de les instruccions explode i 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);2
// crea una llista amb els valors de $string
$var2 = array_shift($var1);3
// extrau el primer element de la llista
Podeu observar el codi i veure com funciona l'arxiu example.php que s'adjunta
a l'enunciat. La crida és del tipus example.php?filename=data53 i fa servir
com separador l'espai.
Si modifiqueu la instrucció
$var1 = explode(' ', $cadena);
a
$var1 = explode(', ', $cadena);
llavors estaríeu fent servir com separador la coma en lloc de l’espai i la
separació de la cadena en elements seria diferent
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 data33).
Les instruccions per carregar el fitxer amb la variable $cadena i crear la llista de
números rebuts ($data) ja formen part de la plantilla.
Els fitxers de dades s'hauran d'ubicar a la mateixa carpeta que els php
Nota important
Una de les feines a realitzar és ordenar cada bloc de 4 números a tractar i es una
tasca que ha de programar l’estudiant. En PHP existeix la funció sort que ordena els
elements que formen part d’un array. Queda especialment prohibit l’ús de la funció
sort de PHP en la resolució d’aquest problema.
Valoració
- Tractament de la seqüència: 1.2
- Procés d’ordenament de un conjunt de 4 números: 0.4.
- Concisió en l'ús de composicions i estalvi de variables: 0.4
2
http://es2.php.net/manual/es/function.explode.php
3
http://es2.php.net/manual/es/function.array-shift.php
7
8. //Aquí heu de posar el vostre codi
<?php
/************* FUNCTION *************/
//functions code
function LF()
{ //line feed
print "<br />";
}
function ordenar($n,$p)
{
//ordenar l'array de quatre posicions
$i=0;
$pos=$p;
while($i<4)
{
$j=$i+1;
while($j<4)
{
if($n[$i]>$n[$j])
{
$aux=$n[$i];
$n[$i]=$n[$j];
$n[$j]=$aux;
}
$j++;
}
$i++;
}
imprimir($n);
//retorna la posicio on va $p
}
8
11. Exercici 4: Treball amb seqüències de seqüències en PHP [20 %]
Els nostres amics de la xavalla, han decidit que, en lloc de trobar-se i mirar que duen a
les butxaques, escriuran una seqüència. Primer de tot han decidit codificar les
monedes de manera que amb un 1 es codifica la moneda d’1 cèntim, amb un 2 la de 2
cèntims, amb un 3 la de 5 cèntims i així, de manera creixent fins que el 8 codifica la
moneda de 2 €.
Cada amic escriu la seva part de la seqüència posant al principi el seu nom, després el
codi de tot el que contenen les butxaques i després un 0 que indica que s’ha acabat
amb les seves monedes. Després del zero continua el nom i les monedes d’un altre
amic i un altre zero, etc. Al final de tot hi posen el caràcter '#'.
Per exemple:
Solo 2 4 4 6 0 Leia 3 1 2 5 8 0 Chewbacca 2 4 4 0 #
Conté les dades de 3 amics:
1. Solo amb una moneda de 2 cèntims, dues de 10 cèntims i una de 50 cèntims.
2. Leia amb una moneda de 5 cèntims, una de 1, una de 2, una de 20 i una de 2
euros.
3. Chewbacca amb una moneda de 2 cèntims i 2 de 10.
Tasca: Crear un programa que sigui capaç de mostrar en pantalla els continguts de les
butxaques dels amics, el total de cadascú i al final digui quin dels amics té més
diners; tot això seguint normes exposades a partir de la seqüència que es llegirà
d'un arxiu de dades que la carrega a la variable $cadena.
11
12. Indicacions preceptives
El fitxer php rebrà el nom prac1_exer4.php
La crida al programa serà del tipus
prac1_exer4.php? filename=data40
Es faciliten les imatges per mostrar el contingut de les butxaques
1c.png 2c.png 5c.png 10c.png 20c.png 50c.png 1e.png 2e.png
Per a l'execució, totes les imatges se situaran a la mateixa carpeta de localhost
que el fitxer php
Es faciliten arxius de dades 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.
Es crearà la function putImage que rebrà el valor d’una moneda i mostrarà la
seva imatge a la pantalla. Sempre que s’hagi de mostrar una moneda es farà
servir aquesta function.
Es crearà la function getValue que rebrà com paràmetre un número enter
entre 1 i 8 (codi) i retornarà el valor de la moneda a què equival segons la
següent taula .
codi 1 2 3 4 5 6 7 8
valor 0.01 € 0.02 € 0.05 € 0.10 € 0.20 € 0.50 € 1 € 2 €
Les instruccions que llegeixen la cadena de dades i posen les dades en la llista de
nom $data ja formen part de la plantilla i no s’han de modificar.
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
El programa ha de veure’s com el tractament d’una seqüència on cadascun dels
elements és una seqüència.
La seqüència principal finalitza en trobar el caràcter “#” i els elements d’aquesta
seqüència estan formats per un nom i una seqüència de xifres.
Les seqüències secundàries són seqüències de xifres que finalitzen amb un 0
Recordeu que la instrucció array_shift($data) agafarà cada vegada una dada
elemental (un nom, un número) i no pot agafar una seqüència de cop.
Podeu emprar per a la confecció d’aquest exercici (i és aconsellable), functions
provinents de les PACs anteriors be sigui directament o bé adaptades als nous
imperatius. Podeu emprar functions construïdes per vosaltres o bé provinents de
les solucions.
Valoració
- Funcio putImage: 0.3
- Funció getValue: 0.3
- Tractament de la seqüència: 1.0
12
13. - Concisió en l'ús de composicions i estalvi de variables: 0.4
13
14. //Aquí heu de posar el vostre codi
<?php
/************* FUNCTION *************/
//functions code
function LF()
{ //line feed
print "<br />";
}// de LF
function putImage($img)
{
print "<img src='$img.png'>";
}
function getValue($coin)
{
$table_coins_values=array(0, 0.01, 0.02, 0.05, 0.10, 0.20, 0.50, 1.00, 2.00, 5.00, 10.00, 20.00, 50.00);
return $table_coins_values[$coin];
}
function maxim_value($seq, $nSeq)
{
$max=0;
$i=0;
while($i<$nSeq)
{
if($seq[$max]['value']<$seq[$i]['value']) $max=$i;
$i++;
}
echo "Is most rich ".$seq[$max]['nom']." <br> Pocket money ".$seq[$max]['value'];
}
/************* MAIN *************/
//main code
$filename = $_GET["filename"];
14
17. Exercici 5: Treball amb seqüències de caràcters a l'entrada en PHP [20 %]
Un espia ha dissenyat un mecanisme per enviar missatges codificats dins d’un text
que finalitza amb el caràcter ‘#’. Es tracta que entre les lletres d’un text d’aspecte
inofensiu hi introdueix el caràcter '@'per indicar que vindrà un caràcter del missatge
amagat.
Primer va posar simplement la '@' just abans del caràcter que amagava. Per exemple
la cadena de text:
“Amada @Laur@a,@ mucho@s pal@omos y @palom@as van@ @bolando com@o
@buitres bl@ancos#”
amagava el missatge “La sopa boba”. (en el text codificat s’han subratllat els caràcters
codificats i nosaltres no avaluarem l’ortografia de l’espia)
Com que el van descobrir molt aviat ara ha pensat en posar la lletra codificada a
diferents distàncies de la '@', primer a distancia 0, després a distància 1, després a
distancia 2 i anar repetint (0, 1, 2)
Veiem un exemple d’aquest revolucionari mètode:
“A@mada @Laura, muchos @palom@o@s y palomas van bolando como bui@tres
blanco@s#”
amaga el missatge “malo es”. (en el text codificat s’han subratllat els caràcters
codificats per comprovar les distàncies i marcat en vermell els caràcter intercalats)
Tasca: Crear un programa que rebi un fitxer que conté una cadena de text i escrigui en
la pantalla la cadena completa i, sota, el missatge codificat.
Els textos que empra per intercalar les ‘@’ mai tenen dins del seu contingut original
ni el caràcter ‘@’ ni el caràcter ‘#’, de manera que si quan es treballa amb una
cadena de text es troba la ‘@’ sabem que després, a la distància que calgui, vindrà
una lletra codificada. I si es troba un ‘#’ és que ja ha acabat el missatge i no cal
mirar més.
17
18. Indicacions preceptives
El fitxer php rebrà el nom prac1_exer5.php
La crida al programa serà del tipus
prac1_exer5.php?filename=data50
Les instruccions per carregar el fitxer de dades i posar el text a la variable
$cadena ja formen part del programa principal 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 que
assigna valor a $cadena.
No es pot emprar variables globals.
Consells
Recordeu que es poden agafar un a un els caràcters que formen una cadena de
text emprant el nom de la variable i l’index del caràcter que volem tractar. El
primer caràcter d’una cadena té l’index 0.
Per exemple, si tenim la instrucció $text=”Hola”; llavors $text[0] és la ‘H’;
$text[1] és la ‘o’; $text[2] és la ‘l’; i $text[3] és la ‘a’.
Recordeu que per concatenar dues cadenes de text o una cadena i un caràcter
existeix l’operador punt (.).
Per exemple $a = “Hola “.$name.”, què tal?”; en el cas que la variable
$name tingués com contingut el valor “Laura”, faria que el contingut de $a passés
a ser “Hola Laura, què tal?”.
Valoració
- Treball amb la cadena de text: 0.7
- Tractament de la seqüència: 1.0
- Concisió en l'ús de composicions i estalvi de variables: 0.3
18
19. //Aquí heu de posar el vostre codi
<?php
/************* FUNCTION *************/
//functions code
function LF()
{ //line feed
print "<br />";
}// de LF
function nova_distancia($distancia)
{
$distancia++;
return $distancia%3;
}
function imprimir_missatge($cadena, $text)
{
echo 'Light missage';
LF();
echo $cadena;
LF();
echo 'Shadow missage';
LF();
echo $text;
}
/************* MAIN *************/
//main code
$filename = $_GET["filename"];
include($filename);
$text='';
$distancia=0;
$index=0;
$fi=0;
19