Estudis d’Informàtica, Multimèdia i Telecomunicació · n 01 n (f-1)(c-1) > on f indica la...

21
Estudis d’Informàtica, Multimèdia i Telecomunicació Programació Pràctica 2 Cognoms: Andolz Santacana Nom: Olivia

Transcript of Estudis d’Informàtica, Multimèdia i Telecomunicació · n 01 n (f-1)(c-1) > on f indica la...

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

Programació

Pràctica 2

Cognoms: Andolz Santacana

Nom: Olivia

Exercici 1: Recorregut en taules de taules [20 %]

La companyia Garibaldi de creuers low cost per a estudiants té vaixells de 400 camarots de 6 lliteres cadascun. Per aquest motiu els tipus de dada estructurada que s'han creat per emmagatzemar la distribució del passatge són tipus

cabin: taula[6] de cadena;{manté el nom dels sis ocupants del camarot}

boat: taula[400] de cabin; {representa els 400 camarots del creuer}

ftipus

A més, s’ha creat la variable harpagon del tipus boat per emmagatzemar en ella les dades del passatge del pont del primer de maig. En cada posició de la taula de taules es desa el nom d'un passatger. Si en una llitera determinada no hi ha assignat cap passatger està emmagatzemada la paraula "empty".

P.e. en harpagon[213][4] trobaríem el nom del passatger que ocupa la llitera 4 del camarot 213 o bé "empty" si la llitera està buida per aquesta travessia. Tasca: Crear el mòdul vacancy (acció o funció, el més adequat) que rebi la taula

corresponent al vaixell i retorni la quantitat total de lliteres buides i una taula de 400 posicions (una per camarot) en què en cada posició ens diu quantes lliteres buides té el camarot en qüestió.

Valoració

- Determinació correcta del tipus de mòdul: 0.2

- Ús correcte dels paràmetres: 0.4 - Treball correcte amb índex de taules i taules de taules: 1 - Concisió en l'ús de composicions i estalvi de variables: 0.4

Primer de tot haig de crear el mòdul vacancy, aquest serà una ACCIÓ, ja que ha de retornar

dos valors, i les funcions sempre retornen un únic valor.

algorisme

tipus

cabin: taula[6] de cadena;{manté el nom dels sis ocupants del camarot}

boat: taula[400] de cabin; {representa els 400 camarots del creuer}

ftipus

var

harpagon: boat; {Taula de taules}

taulaLliteresBuides: taula[400] de enter;

fvar

accio vacancy(ent harpagon: boat, sor numLliteresBuides:

enter, sor lliteresBuides: taulaLliteresBuides)

camarot:= 1;

mentre camarot <= 400 fer

suma:= 0;

llitera:= 1;

mentre llitera <= 6 fer

persona:= harpagon[camarot][llitera];

si persona = “empty” llavors

suma:= suma + 1;

fsi

llitera:= llitera + 1;

fmentre

lliteresBuides[camarot]:= suma;

camarot:= camarot + 1;

fmentre

sumatotal:= 0;

camarot:= 1;

mentre camarot <= 400 fer

buides:= lliteresbuides[camarot];

sumatotal:= sumatotal + buides;

camarot:= camarot + 1;

fmentre

numLliteresBuides:= sumatotal;

faccio

falgorisme

Exercici 2: Treball taules de taules en PHP [30 %]

Les taules de taules s'empren per treballar amb col·leccions de dades homogènies cadascuna de les quals és, alhora, una col·lecció de dades. En aquest exercici treballarem amb taules de taules que contenen números i que es representen mitjançant boles de color segons aquesta taula d'equivalència

Valor 0 1 2 3 4 5 6 7 8 9 Nom fitxer

B R G Y BG RG GY RB BY YR

Codi (Ull, no és exactament igual que la taula emprada en pràctiques anteriors)

Tasca: Crear un conjunt de functions en

php que creïn i manipulin taules de taules segons les indicacions. Les taules de taules es representaran en pantalla a mode de tauler de boles de color.

Algunes de les function hauran de treballar directament amb taules de taules i d'altres amb taules simples (recordeu que els elements d'una taula de taules és una taula simple)

El programa principal ja forma part de la plantilla així com la function createNumberTable que carrega les

dades des del fitxer d'entrada i retorna una taula de taules.

Indicacions preceptives El programa rebrà un paràmetre filename que és el nom del fitxer de dades en què

s’indiquen les mides del tauler i els valors numèrics de cada posició. El contingut del fitxer és una cadena de text on podem veure una seqüència de nombres que respon a l’esquema:

<f c n00 n01 n(f-1)(c-1)>

on f indica la quantitat de files de la taula de taules c indica la quantitat de columnes de la taula de taules fi j indica el valor situat a la posició [i][j] de la taula de taules

Per exemple la cadena de text "2 3 0 1 2 3 4 5" correspondria a la taula de taules

0 1 2

Que representa el tauler de boles

3 4 5

La plantilla prac2_exer2_plantilla.php porta incorporat el programa principal que fa les crides a les function. També incorpora la function createNumberTable que

carrega les dades des del fitxer d'entrada i retorna una taula de taules. El codi que va escrit a la plantilla no s'ha de modificar.

S'ha de crear la function addsColNumbers que rep la taula de taules i escriu en una línia els resultats de sumar cada columna separats per guions.

0 1 2

La suma de les columnes és - 3 - 5 - 7 -

3 4 5

S'ha de crear la function addsBoardNumbers que rep la taula de taules i retorna la suma de totes les seves posicions.

S'ha de crear la function transposeTable que rep una taula de taules i en retorna

una altra transposada, on estan els mateixos valors però canviant files per columnes

S'ha de crear la function nextTable que rep una taula de taules i en torna una nova

de les mateixes dimensions on a cada posició hi ha la xifra següent a la de la mateixa posició de la taula original (es considera que el següent al 9 és el 0)

S'ha de crear la function showBoard que rep dos paràmetres, una taula de taules i una cadena de text i:

o En una línia escriu el text rebut a mode de títol o A les línies següents mostra les boles corresponents a les xifres d'una filera

de la taula rebuda seguides de la suma de les xifres o Sota les files de boles, mostra les sumes de les columnes o En una darrera línia mostra la suma total de la taula de taules.

0 1 2 Per exemple, a partir de la taula de

l'esquerra, la crida showBoard($table, "Original Data");

mostraria l'aspecte de la dreta

3 4 5 $table

Es faciliten arxius de dades (data20 a data24) per a les proves.

Els fitxers d'imatge i dades s'han d'ubicar a la mateixa carpeta de localhost que el fitxer php.

No es poden emprar variables global. Tampoc es poden emprar functions d'array incloses a php llevat de count.

Altres indicacions

En les instruccions print no es pot posar una posició d'array directament dins d'una cadena constant. Cal emprar l'operador de concatenació · (punt).

per exemple, la instrucció

print "<td width='80'> $oneDog[$i] </td>"

escriuria una casella d'una taula amb el contingut exacte $oneDog[$i] en lloc del continguts d'aquesta casella de l'array. Per obtenir el resultat desitjat s'ha d'emprar la concatenació print "<td width='80'>".$oneDog[$i]."</td>"

Recordeu que, a diferencia de les taules en llenguatge algorísmic que comencen en la posició 1, en PHP la primera posició dels arrays és la posició 0.

Podeu emprar functions confeccionades per a exercicis o provinents de solucions anteriors, ja siguin completes o adaptades a les noves dades estructurades.

Podeu comprovar el funcionament a:

http://prog.uoc.edu/prac2/prac2_exer2.php?filename=data20

Consells

Pot ser molt útil reutilitzar functions d'exercicis anteriors. Mostrar el tauler de boles és mostrar les fileres una a una, i això ja s'ha fet en la PAC3. Igualment convertir les xifres a codis de color també forma part d'un exercici anterior.

Cal analitzar ben bé què s'ha de fer en cadascun dels mòduls que es demanen en aquest programa i mirar quins mòduls de programes anteriors es poden emprar bé directament o bé amb petites modificacions per adaptar-los a les noves necessitats.

Valoració - Function addsColNumbers: 0.4

- Function addsBoardNumbers: 0.4 - Function transposeTable: 0.4 - Function nextTable: 0.4

- Function showBoard: 1 - Concisió en l'ús de composicions i estalvi de variables: 0.4

Copieu aquí el codi de la vostra solució

<?php

/************* TEMPLATE FUNCTION *************/

//Aquí va el codi de les funcions

function LF()

{ //line feed

print "<br />";

}

function createNumberTable($data)

{ //creates a number table fron $data contents

$height = array_shift($data); //fila

$width = array_shift($data); //columna

for ($i=0; $i < $height; $i++)

for ($j=0; $j < $width; $j++)

{$bitable[$i][$j]=array_shift($data);}

return $bitable;

}//de createTable

/************* REUSED FUNCTION *************/

function putImG($lletra)

{

print "<img src='$lletra.png'>";

return;

}

function valueToColor($codi)

{

$codis = array("B","R","G","Y","BG","RG","GY","RB","BY","YR");

return $codis[$codi];

}

//put here function from other exercices

/************* STUDENT's FUNCTION *************/

function addsColNumbers($tt)

{

$count = count($tt[0]); //ens indica el nombre de columnes que hi ha

for ($j = 0; $j < $count; $j++){

$suma[$j] = 0;

}

$height = count($tt); //contar el nombre de files que hi ha

$width = count($tt[0]); //contar el nombre de columnes que hi ha

for ($i = 0; $i < $height; $i++)

for ($j = 0; $j < $width; $j++)

{

$suma[$j] = $suma[$j] + $tt[$i][$j];

}

for ($j = 0; $j < $count; $j++){

print " - " . $suma[$j];

}

print " -";

return;

}

function addsBoardNumbers($tt)

{

$sumaallpos = 0;

$height = count($tt); //contar el nombre de files que hi ha

$width = count($tt[0]); //contar el nombre de columnes que hi ha

for ($i = 0; $i < $height; $i++)

for ($j = 0; $j < $width; $j++)

{

$sumaallpos = $sumaallpos + $tt[$i][$j];

}

return $sumaallpos;

}

function transposeTable($tt)

{

$height = count($tt); //contar el nombre de files que hi ha

$width = count($tt[0]); //contar el nombre de columnes que hi ha

for ($i = 0; $i < $height; $i++)

for ($j = 0; $j < $width; $j++)

{

$transposat[$j][$i] = $tt[$i][$j];

}

return $transposat;

}

function nextTable($tt)

{

$height = count($tt); //contar el nombre de files que hi ha

$width = count($tt[0]); //contar el nombre de columnes que hi ha

for ($i = 0; $i < $height; $i++)

for ($j = 0; $j < $width; $j++)

{

$tt1[$i][$j] = ($tt[$i][$j] + 1) % 10; //calculem el residu de dividir per 10 per treure el 0 despres de

sumar-li 1 al 9

}

return $tt1;

}

function showBoard($tt, $text)

{

print "<div><h3> $text </h3></div>";

$height = count($tt); //contar el nombre de files que hi ha

$width = count($tt[0]); //contar el nombre de columnes que hi ha

for ($i = 0; $i < $height; $i++)

{

$suma = 0;

for ($j = 0; $j < $width; $j++)

{

/*$codi = $tt[$i][$j];

$lletra = valueToColor($codi);

putImG($lletra);*/

putImG(valueToColor($tt[$i][$j])); //estalvi de variables

$suma = $suma + $tt[$i][$j];

}

print " - " . $suma;

LF();

}

addsColNumbers($tt);

LF();

print addsBoardNumbers($tt);

return;

}

//put here new function

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

//Aquí va el codi del programa principal

$filename = $_GET["filename"];

include($filename);

$data = explode(" ",$cadena);

$baseTable = createNumberTable($data);

showBoard($baseTable, "Original Data");

$transTable = transposeTable($baseTable);

showBoard($transTable, "Transposed Data");

$nextTable = nextTable($baseTable);

showBoard($nextTable, "NextNumber Data");

?>

Exercici 3: Disseny i treball amb tuples [20 %]

Una farmàcia vol informatitzar la gestió d'emmagatzematge i stock dels medicaments. Ha hagut de fer reformes per instal·lar un robot que emmagatzema i recupera els medicaments en el magatzem, de manera que el magatzem s'ha convertit en un conjunt de prestatgeries dividides en caselles (box). Les prestatgeries tenen com nom una lletra i cada casella de la prestatgeria un número, de manera que el box on està un medicament ve determinat per una parella del tipus A 23 o F 150. En aquest moment el magatzem està constituït per 10 prestatgeries (de la A a la J) i les prestatgeries tenen entre 100 i 250 box.

Tasca: Es demana que dissenyeu:

El tipus tBox per emmagatzemar la ubicació d'una casella del magatzem:

tipus

llistaLletra = {A,B,C,D,E,F,G,H,I,J};

tBox = tupla

lletra: llistaLletra;

numero: enter;

ftupla

ftipus

Dissenyeu la dada estructurada specific adequada per mantenir la informació

d'un medicament en stock. Per a cada medicament s'ha d'emmagatzemar la

següent informació: codi (un enter), nom, laboratori que el fabrica, box en què

està, tipus (pastilla, xarop, injectable, etc), unitats del medicament que es

tenen, preu de compra i preu de venda.

tipus

specific = tupla

codi: enter;

nom: taula[30] de caracter;

laboratori: taula[40] de caracter;

situacioBox: tBox;

tipus:{pastilla,xarop,injectable,capsules};

unitatsStock: enter;

preuCompra: real;

preuVenda: real;

ftupla

ftipus

Per mantenir tota la informació de la farmàcia s'ha creat la tupla pharmacy de la

següent manera

pharmacy = tupla

drug: taula [5000] de specific; {fitxes dels medicaments}

qtty : enter; {número que indica quantes fitxes estan plenes}

ftupla

i la variable farmacia del tipus pharmacy, on s'ha entrat tota la informació de

manera que totes les fitxes de medicaments plenes estan posades

consecutivament des de la primera posició.

Escriviu l'expressió que digui si el darrer medicament entrat a farmacia té un

format de càpsules.

si (farmacia.drug.tipus = “capsules”) fer

...

fsi

Escriviu el mòdul totalValue (acció o funció, el més adequat) que rebi

farmacia, i escrigui en la sortida estàndard, per a cada medicament en stock el

nom, les unitats que hi ha i el valor total de compra de les unitats en stock i

retorni el valor total que té invertit la farmàcia en els seus medicaments en

stock.

És una funció ja que només hem d’obtenir un valor com a resultat, en aquest cas el valor

total que té invertit la farmàcia en els seus medicaments en stock. (Com que estalviem

més codi en les funcions també es preferible utilitzar-la sempre que sigui possible).

funcio totalValue(farmacia: pharmacy, valorTotalInvertit: real): real;

comptador:= 1;

sumaCompra:= 0;

mentre comptador < farmacia.qtty fer

unitatsStockMed:= farmacia.drug[comptador].unitatsStock;

preuCompraMed:= farmacia.drug[comptador].preuCompra;

escriureCaracter(farmacia.drug[comptador].nom);

escriureEnter(unitatsStockMed);

escriureReal(preuCompraMed);

sumaCompra:= sumaCompra + (preuCompraMed * unitatsStockMed);

comptador = comptador + 1;

mentre

ffuncio

Valoració

- Definició correcte dels camps de les tuples: 0.5 - Mòdul totalValue: 0.5 - Ús correcte de la sintaxi de taules i de tuples: 0.8

- Concisió en l'ús de composicions i estalvi de variables: 0.2

Exercici 4: Treball amb tuples i taules de tuples en PHP [30 %]

Un institut científic ha recollit una sèrie de mostres en diferents ubicacions i les dades

les ha emmagatzemat en arrays associatius (tuples) del següent tipus

$t[“name”] és el nom de la mostra $t[“data”] és un array de números, els valors de la mostra $t["average"] és la mitjana de la mostra (s’ha inicialitzat a 0)

El conjunt de mostres està emmgatzemat en un array ($samples)

Tasca: Recollides les dades en un array de tuples, crear un conjunt de functions en

php que manipulin tuples i taules de tuples segons les indicacions. El programa principal ja forma part de la plantilla i no s’ha de modificar.

El programa s'escriurà a la plantilla prac2_exer4_plantilla.php que es canviarà de nom a prac2_exer4.php pel lliurament.

Podeu provar el funcionament a l'enllaç http://prog.uoc.edu/prac2/prac2_exer4.php Indicacions preceptives

Per a dur a terme aquesta tasca es facilita el fitxer de dades data que és el que

sol·licita el programa principal.

El fitxer de s'ha d'ubicar a la mateixa carpeta de localhost que el fitxer php.

La plantilla porta incorporada la instrucció include(“data”) que carrega l’array de tuples. La variable que conté les tuples té per nom $samples, de manera

que per accedir al nom de la primera tupla, haurem de referir-nos a: $samples[0].[“name”].

De la mateixa manera, per accedir al segon valor numèric de les dades de la mostra que està en 5é lloc, la referència seria: $samples[4].[“data”][1]

1

Heu de crear la function showSample que rep una tupla i la mostra repartida en tres línies:

1. Camp “name” de la mostra

2. Camp “data” de la mostra

3. Camp “average” de la mostra

Sempre que s’hagi d’escriure una mostra es farà servir aquesta function.

1 recordeu que en PHP la primera posició dels arrays és la posició 0

Heu de crear la function showAllSample que rep l’array de tuples i les mostra totes per pantalla. Per escriure cada tupla farà una crida a showSample.

Heu de crear la function withFirstLetter que rep dos paràmetres, el primer és

l’array de tuples i el segon una lletra. La function mostrarà en pantalla un títol del tipus With initial C (si “C” és la lletra rebuda com paràmetre) i a continuació

totes les tuples el nom de les quals comenci amb dita lletra. En el cas que no existeixi cap tupla que tingui la inicial cercada, s’escriurà el missatge "No samples with C initial". El reconeixement de la inicial s’ha de fer indistintament en majúscula i minúscula.

Heu de crear la function computeAverage que rep i modifica la taula de tuples omplint els camps “average” de cada tupla amb la mitjana dels valors que integrin el camp “data” de la mateixa tupla.

Heu de crear la function showSamplesUpper que rep dos paràmetres, la taula de tuples i un valor numèric i mostra en pantalla un títol del tipus With average bigger than 5 (si 5 és el valor numèric rebut) i, seguidament les mostres que tinguin en el camp “average” un valor superior al valor rebut.

Consells

No es dóna en cap lloc informació de la longitud de cap dels arrays, els haureu

de calcular emprant la function count que ja s’ha emprat en diverses ocasions:

count($samples) retornaria la quantitat de tuples que formen part de l’array i

count($samples[$i][“data”]) retornaria la quantitat de dades numèriques que

conté el camp “data” de la mostra d’index $i

Podeu reutilitzar directament o modificant-les functions d'altres pràctiques o

PACs, be siguin vostres o de les solucions.

Valoració - Function showSample: 0.5

- Function showAllSamples: 0.2 - Function withFirstLetter: 0.5 - Function computeAverage: 0.5

- Function showSamplesUpper: 0.5 - Ús correcte de la indexació de taules i taules associatives: 0.5 - Concisió en l'ús de composicions i estalvi de variables: 0.3

//Aquí heu de posar el vostre codi

<?php

/* loads the data file "data" that defines the array $sample

$sample array is an associative array defined by:

name => string that contains sample name

data => numeric array not fixed length

average => numeric initialized at 0

*/

/***********************FUNCTION**********************************/

function LF()

{//line feed

print "<br />";

}

function title($title)

{// print a tittle in header 3

print "<h3> $title </h3>";

}

function showSample($tupla)

{

print "Name: " . $tupla["name"];

LF();

print "Data : ";

$contador = count($tupla["data"]);

for ($i = 0; $i < $contador; $i++)

{

print " " . $tupla["data"][$i];

}

LF();

print "Average:" . $tupla["average"];

LF();

return;

}

function showAllSamples($arraytuples)

{

$contador = count($arraytuples);

title("Show all Samples");

for ($i = 0; $i < $contador; $i++)

{

showSample($arraytuples[$i]);

LF();

}

return;

}

function withFirstLetter($arraytuples, $lletra)

{

$exist = 0;

$lletra = strtoupper($lletra);

title("With initial $lletra");

$contador = count($arraytuples);

for ($i = 0; $i < $contador; $i++)

{

$may = strtoupper($arraytuples[$i]["name"][0]);

if ($lletra == $may) {

showSample($arraytuples[$i]);

LF();

$exist = 1;

}

}

// si passa per el for i no hi ha cap resultat print no samples

if ($exist == 0) {

print "No samples with $lletra initial";

}

return;

}

function computeAverage(&$arraytuples) //& perque es un parametre d'entrada i de sortida

{

$contador = count($arraytuples);

for ($i = 0; $i < $contador; $i++)

{

$datos = $arraytuples[$i]["data"];

$conta_datos = count($datos);

$suma = 0;

for ($j = 0; $j < $conta_datos; $j++)

{

$suma = $suma + $datos[$j];

}

$average = $suma / $conta_datos;

$arraytuples[$i]["average"] = $average;

}

return;

}

function showSamplesUpper($arraytuples, $num)

{

title("With average bigger than $num");

$contador = count($arraytuples);

for ($i = 0; $i < $contador; $i++)

{

$average = $arraytuples[$i]["average"];

if ($average > $num) {

showSample($arraytuples[$i]);

LF();

}

}

return;

}

/***********************Programa Principal**********************************/

include ("data");

// function call

withFirstLetter($samples, 'F');

withFirstLetter($samples, 'W');

withFirstLetter($samples, 'c');

computeAverage($samples);

showAllSamples($samples);

showSamplesUpper($samples, 3);

showSamplesUpper($samples, 5);

?>