estudis d’informàtica, multimèdia i telecomunicació · n 01 n (f-1)(c-1) > on f indica la...
TRANSCRIPT
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);
?>