Correcció de la pràctica 1 de l'assignatura de Programació del Grau Multimèdia de la UOC. Per a baixar-se els arxius PHP, visita la meva wiki: http://raco-vermell.wikispaces.com/PROGRAMACI%C3%93
1. Estudis d’Informàtica, Multimèdia i Telecomunicació
Programació
Pràctica 1
SOLUCIÓ
Indicacions generals:
Llegiu amb detall les tasques encomanades a cada exercici i també les indicacions i
suggeriments de resolució.
Per a dubtes i aclariments sobre l’enunciat, adreceu-vos al consultor responsable de la
vostra aula.
Lliurament:
1. Els exercicis en llenguatge algorísmic han de resoldre’s en aquest mateix document
2. Cal lliurar la solució d’aquesta pràctica en un fitxer comprimit en format zip o rar
nomenat CognomsNom_P_PRACT1 adreçat a la bústia “Lliurament d’activitats”
3. El fitxer comprimit contindrà aquest fitxer amb les respostes als exercicis 1 a 3 i els
arxius php corresponents als exercicis 4 i 5. No s'ha d'adjuntar els fitxers d'imatges
ni de dades
4. Data límit per lliurar la solució: dilluns, 28 de novembre de 2011 (a les 23:59
hores).
És imprescindible respectar el format i data d’entrega. La no adequació a
aquestes especificacions pot suposar la no avaluació de la Pràctica.
2. Exercici 1: Treball amb seqüències [10 %]
Objectius: Donada una seqüència de dades, aplicar l’esquema adequat per construir
un algorisme que solucioni un determinat problema.
Materials: Mòdul 3: Tractament seqüencial.
Tasca: Crear mòdul (acció o funció) que rebi un número sense decimals, calculi, per
una banda, la suma de totes les xifres i per altre el producte de totes les xifres (si una
xifra és un zero no intervindrà en el càlcul del producte), i retorni els dos valors, suma i
producte.
P.e. si el número es el 123, es retornarà 6 i 6; si és el 420 es retornarà el 6 i el 8; si és
el 30, es retornarà el 3 i el 3.
Com que ha de retornar dos valors el mòdul ha de ser una acció.
accio sumProd( ent numero: enter, sor sum: enter, sor prod:enter)
var
digit: enter;
fvar
{inicialització de variables}
sum := 0;
si (numero = 0) llavors
prod := 0; {si el número és zero es retorna zero}
sino
prod:= 1; {per poder fer multiplicacions s'inicialitza a 1}
fsi
mentre (numero>0) fer
digit := numero mod 10; {es recull una xifra}
sum:= sum + digit;
si (digit ≠ 0) llavors
prod := prod * digit;
fsi
numero := numero div 10; {treiem la darrera xifra de numero}
fmentre
faccio
3. Exercici 2: Treball amb seqüències [15 %]
Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat
per construir un algorisme que solucioni un determinat problema.
Materials: Mòdul 3: Tractament seqüencial.
Tasca:
Codi ASCII estandard
A cada caràcter imprimible estàndard li
correspon un codi numèric entre el 32
(espai en blanc) i el 126.
Els caràcters que es mostren en vermell
tenien funció de control en les
comunicacions
Un estudiant d'informàtica vol fer un algorisme que li serveixi per encriptar i
desencriptar missatges escrits en anglès en els caràcters del codi ASCII, depenent
d'una clau secreta (un número entre 1 i 20).
El mecanisme d'encriptació seria simple: a cada caràcter li correspondria el caràcter
que està a clau posicions més enllà (p.e. si clau és 3, a la @ li correspondria la C, al 9
li correspondria el símbol <, a la a li correspondria la d, etc). Per aplicar el programa
suposarà que després del caràcter ~ (ASCII 126) ve l'espai en blanc (ASCII 32).
Per desencriptar
L'algorisme ha de llegir en primer lloc una lletra e (encriptar) o d (desencriptar),
després llegirà la clau, en tercer lloc la longitud de la cadena a codificar i després la
seqüència de caràcters per encriptar o desencriptar.
Per exemple, per ocultar la cadena "programa en PHP" amb una clau 8, la seqüència
d'entrada seria <e 8 15 programa en PHP>
4. Nota: la funció charToCode(c), retorna el codi ascii del caràcter que conté la variable
c. La funció codeToChar(num) retorna el caràcter el codi ascii del qual és num.
{Pre: a l'entrada hi ha una cadena action key long string
action és un caràcter que pot prendre els valors e o d
key un número entre 1 i 10
string una seqüència de caracteres
long la longitud de string}
algorisme secret
var
key, long: enter;
action: caracter;
fvar
action := readChar();
key := readInteger();
long := readInteger();
si (action = 'd') llavors key := -key; {així podem emprar encripta per codificar i
descodificar}
encripta(key, long);
falgorisme
acció encripta(ent key: enter, ent long: enter)
var
i, code: enter;
c: caracter;
fvar
per i:=1 fins long fer
c := readChar();
code := charToCode(c);
code := codi + key;
{es codifica una lletra a cada volta}
si (code > 126) llavors
code := code - 95; {això passa el 127 al 32, el 128 al 33, etc}
fsi
si (code <32) llavors
code := code + 95; {això passa el 31 a 126, el 30 al 125, etc}
fsi
writeChar(codeToChar(code));
fper
faccio
{post: a la sortida està la cadena de caràcters codificada amb la clau key }
5. Exercici 3: Treball amb seqüències [15 %]
Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat
per construir un algorisme que solucioni un determinat problema.
Materials: Mòdul 3: Tractament seqüencial.
Tasca: als multicinemes Penícules han automatitzat el despatx d'entrades de manera
que el registre de vendes d'entrades crea una seqüència diària del tipus:
<h1 s1 h2 s2 h3 s3 … hm sm X> on
hi és un caràcter el valor del qual pot ser
m matinal
t sessió de tarda
n sessió de nit
g sessió golfa
si és un número que pot tenir un valor entre 1 i 8
1 i 2 són sales 3D
la resta són sales normals
X és la lletra 'X' i indica el final de la seqüència
Els preus que s'apliquen a les sales varien segons la tipologia i sessió segons la
següent taula:
Tipus / sessió m t n g
3D 7.50 8.50 9.00 8.50
2D 6.00 7.00 7.50 7.00
Heu de crear un mòdul (acció o funció) que llegeixi de l'entrada estàndard una
seqüència diària i retorni la recaudació total del dia.
6. funcio dailyAmount(): real
const
CHEAPPRICE: real = 6.0;
MEDIUMPRICE: real = 7.0;
CHEAPPRICE: real = 6.0;
fconst
var
total: real;
cinema: integer;
session : character;
fvar
total := 0.0;
car := readCharacter();
mentre (car ≠ 'X') fer
si (car = 'm') llavors
total := total + 6.0;
sino si (car = 'n') llavors
total := total + 7.5;
sino
total := total + 7.0
fsi
fsi
cinema := readInteger();
si (cinema < 3) llavors
total := total + 1.5; {sobrepreu de 3D}
fsi
fmentre
retorna (total);
ffuncio
7. Exercici 4: Treball amb seqüències [30 %]
Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat
per construir un programa en PHP que solucioni un determinat problema.
Materials: Mòdul 3: Tractament seqüencial.
Guia Bàsica de PHP: mòduls 1 a 4 i mòdul 7.
Tasca: Tractar una seqüència de números per obtenir-ne valors singulars i estadístics.
A la crida del programa es rep, en el paràmetre filename, el nom d'un fitxer que
conté una instrucció php del tipus
<?php $cadena="50 32 19 53 32 27 51 33 34 34";.?>
la variable $cadena conté una cadena de text formada per números d'una o dues
xifres separats per un espai en blanc.
El programa ha de llegir la seqüència i
Al principi: dir quans números integren la seqüència
Durant la lectura: per cada deu números llegits, escriure en una línia, els deu
números, la suma i el producte dels 10 números i també la mitjana.
En arribar el darrer grup de números:
o El missatge "Darrer grup de números"
o La quantitat de números que integra aquest grup
o Llista, suma, producte i mitjana del darrer grup de números
Indicacions
El fitxer php rebrà el nom pract1_exer4.php
La crida al programa serà del tipus
pract1_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 carrega la variable
$cadena. Un cop carregat aquest nom, 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.
El fitxer example.php adjunt carrega un d'aquests fitxers i n'imprimeix el
contingut. la crida ha de ser del tipus example.php?filename=data45
Es faciliten diversos arxius de dades amb els noms data40 a data49. Són fitxers
de text i podeu obrir-los per comprovar el contingut: una instrucció php.
1
http://www.php.net/manual/es/function.include.php
8. Per a recollir els números un a un de la seqüència s'aconsella fer servir la
combinació d'instruccions explode i array_shift.
Per conèixer la longitud d'un array podeu fer servir la funció
count($nom_variable);2
S'haurà d'implementar una acció NL() per escriure el salt de línia a la sortida.
S'haurà d'implementar una acció block_10(entsor var1, ...) que rebi com a primer
paràmetre la variable sobre la que es fa l'array_shift (si cal en pot rebre més) i
escrigui, en una mateixa línia, totes les dades que es sol·licita per cada bloc de
dades.
Per exemple pel bloc de dades 1 2 3 4 5 6 7 8 9 1 escriuria 1 2 3 4 5 6 7 8 9 1 46
362880 4.6
L'acció NL() es farà servir sempre que es vulgui fer un salt de línia a la sortida des
del PHP.
L'acció block_10 s'emprarà cada cop que s'hagi d'escriure les dades
corresponents a un bloc de números.
Per escriure un número real amb un nombre concret de decimals cal per servir la
instrucció printf3
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.
2
http://www.php.net/manual/es/function.count.php
3
http://materials.cv.uoc.edu/continguts/PID_00149863/web/main/m3/v5_3.html i
http://materials.cv.uoc.edu/continguts/PID_00149863/web/main/m7/v2_2.html
9. <!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>Practica 1 - Exercici 4</title>
</head>
<body>
<h3>Practica 1 - Exercici 4</h3>
<h3>SOLUCIO</h3> <!-- No oblideu posar el nom -->
<div>
<?php
/* Carrega a la variable filename el nom d'un arxiu de text que conté una
instrucció que carrega les dades a la variable $cadena.
Les dades carregades són una sèrie de números de dues xifres
El programa, ha de llegir tots els números i escriure:
Al principi : Quants números hi ha.
Durant la lectura : Per cada 10 números llegits escriurà en una línia
la llista de números la suma, el producte i la mitjana
dels números del bloc
En arribar al darrer bloc de números:
el missatge "Darrer grup de números"
la quantitat de números que integra aquest grup
suma, producte i mitjana del darrer grup de números
PRACTICA 1 - setembre 2011- gener 2012
autor:
*/
/************ FUNCTION *************/
function NL()
{ //new line
print "<br />";
}
function block_10(&$list, $counter)
{ //write writes $counter long list numbers and statistics
$sume=0;
$prod=1;
NL();
for($i=0; $i<$counter; $i++)
{
$n = array_shift($list);
print"$n ";
$sume += $n;
$prod *= $n;
}
print " ($sume) ($prod) ";
printf ("(%.2f)", $sume / $counter);
}
/*********** PROGRAMA PRINCIPAL ************/
if (isset($_GET["filename"]))
{
// load data file
$filename=$_GET["filename"];
include($filename);
10. $numeros = explode(' ', $cadena);
// init variables
$quantity = count ($numeros);
// block sequence treatment
while ($quantity>0)
{
$counter = min(10, $quantity);
if ($counter<10)
{
NL();
print "Darrer grup de números";
}
block_10($numeros, $counter);
$quantity = count ($numeros);
}
}
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>";
}
?>
</div>
</body>
</html>
11. Exercici 5: Codificació en PHP [30 %]
Objectius: Donada una seqüència de dades a l’entrada, aplicar l’esquema adequat
per construir un programa en PHP que solucioni un determinat problema.
Materials: Mòdul 3: Tractament seqüencial.
Guia Bàsica de PHP: mòduls 1 a 4 i mòdul 7.
Tasca: Disposem de quatre imatges que representen quatre personatges familiars:
mare, pare, noia i noi, en format png i el nom de les quals són les quatre primeres
xifres.
La tasca plantejada és investigar en una cadena de text l'aparició de les paraules
mum, dad, girl i boy, per tal de fer aparèixer a una pàgina web tantes imatges com
cops apareix cadascuna de les paraules.
Pàgina corresponent a la cadena
1.png 2.png 3.png 4.png
14mumgfj00girltuicdaddshmumuboyhidadjf
A la crida del programa es rep, en el paràmetre filename, el nom d'un fitxer que
conté una instrucció php del tipus
$cadena="14mumgfj00girltuicdaddshmumuboyhidadjf";
la variable $cadena conté la cadena de text on s'ha de localitzar els noms dels
personatges.
Indicacions
El fitxer php rebrà el nom pract1_exer5.php
La crida al programa serà del tipus
pract1_exer5.php?filename=nom_arxiu_dades
per tant, s'haurà d'emprar la sentència $filename=$_GET["filename"]; per
carregar el nom del fitxer que incorpora la instrucció que carrega la variable
$cadena. Un cop carregat aquest nom, es pot incorporar la instrucció al programa
12. mitjançant l'ordre include($filename)4; ambdues instruccions ja formen part
de la plantilla i són les primeres del programa principal.
El fitxer example.php adjunt carrega un d'aquests fitxers i n'imprimeix el
contingut. la crida ha de ser del tipus example.php?filename=data24
Es faciliten diversos arxius de dades amb els noms data50 a data55. Són fitxers
de text i podeu obrir-los per comprovar el contingut: una instrucció php.
Com que tots els caràcters van seguits, sense cap separador, la funció explode
no és d'aplicació. 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.
PHP facilita la funció strlen($cadena)5; que retorna la longitud en caràcters de
la cadena de text $cadena
S'haurà d'implementar una acció NL() per escriure el salt de línia a la sortida.
S'haurà d'implementar el mòdul putImg($image_file) que ha de rebre com a
paràmetre el nom d'un fitxer en format png i el posarà a la pantalla. P.e. Si rep
com paràmetre oasis, posaria en la pàgina web el fitxer d'imatge osasis.png.
Per tal de localitzar les paraules mum, dad, girl i boy, s'haurà de crear el mòdul
detectStarring que rebrà la variable que conté la cadena de text y un número
(posició) i retornarà
o un 1 si a la posició de la cadena comença la subcadena mum.
o un 2 si a la posició de la cadena comença la subcadena dad.
o un 3 si a la posició de la cadena comença la subcadena girl.
o un 4 si a la posició de la cadena comença la subcadena boy.
o un 0 en els altres casos.
PHP facilita la funció substr_compare6($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".
AMPLIACIÓ OPCIONAL
Es pot crear la function contenida($main_str, $str, $offset) que retorni un 0 si la
cadena $str está sin de la cadena $main_str a partir de la posició $ofsset i un -1
altrament. De fet vindria a ser una simplificació de la funció substr_compare que
4
http://www.php.net/manual/es/function.include.php
5
http://es.php.net/manual/es/function.strlen.php
6
http://php.net/manual/es/function.substr-compare.php
13. només serviria per saber si la totalitat d'una cadena petita está situada en una
determinada posició d'una cadena més gran.
Si es crea aquesta funció, serà contenida i no pas substr_compare la que es faci
servir per localitzar les paraules mum, dad, girl i boy.
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.
<!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>Practica 1 - Exercici 5</title>
</head>
<body>
<h3>Practica 1 - Exercici 5</h3>
<h3>Nom de l'estudiant</h3> <!-- No oblideu posar el nom -->
<div>
<?php
/* Carrega a la variable filename el nom d'un arxiu de text que conté una
instrucció que carrega les dades a la variable $cadena.
El contingut de la variable cadena és una cadena de text en la qual
pot aparèixer les subcadenes "mum", "dad", "girl" i "boy".
El programa ha de revisar el contingut de la cadena i mostrar una imatge
("1.png", "2.png", "3.png" o "4.png") cada cop que troba en la
cadena la subcadena corresponent.
PRACTICA 1 - setembre 2011 - gener 2012
autor:
*/
/*********** 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 -=2; // beyond long-2 they are not coincidences
14. for ($i=0; $i<$long; $i++)
{
$starring = detectStarring($cadena, $i);
if ($starring!=0) putImg($starring);
}
}
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>";
}
/************ 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 detectStarring($string, $pos)
{
switch ($string[$pos])
{
case 'm': if (substr_compare($string, "mum", $pos, 3)==0) $starring=1;
break;
case 'd': if (substr_compare($string, "dad", $pos, 3)==0) $starring=2;
break;
case 'g': if (substr_compare($string, "girl", $pos, 4)==0) $starring=3;
break;
case 'b': if (substr_compare($string, "boy", $pos, 3)==0) $starring=4;
break;
default: $starring=0;
}
return ($starring);
}//de detectStarring
?>
</div>
</body>