Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

13
Estudis d’Informàtica, Multimèdia i Telecomunicació Programació Pràctica 1 Nom: Paquita Cognoms: Ribas Tur 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. Respecteu els noms dels exercicis en PHP 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.

Transcript of Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

Page 1: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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

Programació

Pràctica 1

Nom: Paquita

Cognoms: Ribas Tur

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. Respecteu els noms dels exercicis en PHP

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.

Page 2: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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ó, el més apropiat) en llenguatge algorísmic 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.

algorisme sumaProducte var n: enter: digit: enter; suma: enter; producte: enter; fvar

{Pre: n=N i N ≥ =} n:= llegirEnter();

suma := 0; producte := 1; mentre no (n = 0) fer digit := n mod 10; suma := suma + digit; si (dígit ≠ 0) llavors

producte := producte * digit; fsi

n := n div 10;

fmentre

escriureEnter (suma); escriureEnter (producte); {Post: la suma dels dígits de N s’ha escrit pel dispositiu de sortida i el producte dels dígits de N s’ha escrit pel dispositiu de sortida} falgorisme

Page 3: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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 estàndard

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 10).

El mecanisme d'encriptació seria simple: a cada caràcter a amagar 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 es fa el procés invers, cada caràcter del missatge encriptat se sustituirà pel caràcter que està clau posicions abans (per a la clau 3, a la C li correspondria la @, al símbol < li correspondria el 9, etc)

Page 4: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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>

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.

algorisme encriptarDesencriptar

var mode: caracter; // e(encriptar) o d (desencriptar) clau: enter; longitud: enter; // longitud de la paraula que es vol encriptar o desencriptar c: caracter; // caràcter que es va llegint comptador: enter; fvar

{Pre: Al dispositiu d’entrada hi ha una llista de caracters i enters amb la següent estructura: un caràcter que serà ‘e’ o ‘d’, a continuació un enter clau ≤ 10 i clau > o; un enter que és la longitud de la cadena; i una llista de ncaracters o n = longitud} comptador := 0; mode := llegirCaracter(); clau := llegirEnter(); longitud := llegirEnter();

mentre (comptador < longitud) fer c := llegirCaracter(); si (mode =’e’) llavors encriptar (c, clau); fsi si (mode = ‘d’) llavors desencriptar (c, clau); fsi comptador := comptador + 1; fmentre {Post: Hem imprès una cadena d’igual longitud a la d’entrada, encriptada o desencriptada segons l’acció triada i la clau} falgorisme

Page 5: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

accio encriptar (ent c : caracter, ent clau : enter) var codi := enter; fvar codi := charToCode ( c ); codi := codi + clau; si (codi > 126) llavors

codi := codi – 94; fsi

c := codeToChar (codi);

escriureCaracter (c);

facció

accio desencriptar (ent c : caracter, ent clau: enter) var codi := enter; fvar codi := charToCode ( c ); codi := codi – clau si (codi > 126) llavors

codi := codi + 94; fsi

c := codeToChar (codi);

escriureCaracter ( c );

faccio

Page 6: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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ó, el més apropiat) que llegeixi de l'entrada estàndard una seqüència diària i retorni la recaptació total del dia.

Page 7: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

algorisme vendesEntrades

var c2: enter; c1: caracter; recaudacio: real; fvar

recaudacio := 0; c1 := llegirCaracter(); mentre no (c1 = ‘X’) fer c2: llegirEnter();

recaudacio = recaudacio + calcularPreu (c1, c2); c1: llegirCaracter(); fmentre escriureReal (recaudacio); {Post: recaudacio = suma de l’import de tots els preus} falgorisme

Page 8: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

funcio calcularPreu (h: caracter, s: enter): real

var preu: real; fvar

{Pre: h=H i s=S} si (h = m) llavors si (s=1) o (s = 2) llavors preu:= 7.50; sino preu := 6.00; fsi fsi

si (h = t) llavors si (s=1) o (s = 2) llavors preu:= 8.50; sino preu := 7.00; fsi fsi

si (h = n) llavors si (s=1) o (s = 2) llavors preu:= 9.00; sino preu := 7.50; fsi fsi

si (h = g) llavors si (s=1) o (s = 2) llavors preu:= 8.50; sino preu := 7.00; fsi fsi

retorna(preu);

{Post: preu = preu d’una entrada} ffuncio

Page 9: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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 (amb segurament menys de 10

números):

o El missatge "Darrer grup de números" si és que té menys de 10

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 assigna valor a 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

Page 10: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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

Page 11: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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.

1.png 2.png 3.png 4.png Pàgina corresponent a la cadena

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

<?php $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 dóna valor a la variable

$cadena. Un cop carregat aquest nom, es pot incorporar la instrucció al programa

Page 12: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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 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

només serviria per saber si la totalitat d'una cadena petita està situada en una

determinada posició d'una cadena més gran.

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

Page 13: Programació - Pràctica 1 - Multimedia (UOC) - Paquita Ribas

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.