PAC 2 de l'assignatura de Programació del Grau Multimèdia de la UOC. Per a descarregar els arxius en PHP, visita la meva wiki: http://raco-vermell.wikispaces.com/PROGRAMACI%C3%93
1. Estudis d’Informàtica, Multimèdia i Telecomunicació
Programació
PAC2 — Segona Prova d'Avaluació Continuada
Cognoms: RIBAS TUR
Nom: PAQUITA
Indicacions generals:
Raoneu i justifiqueu totes les respostes.
Les respostes incorrectes no disminueixen la nota.
Per a dubtes i aclariments sobre l’enunciat, adreceu-vos al consultor responsable de l’aula.
Lliurament:
1. S'ha de respondre les preguntes al mateix document de l'enunciat que rebrà el nom
CognomsNomP_PAC2.doc (o CognomsNomP_PAC2.odt)
2. La codificació de la pregunta 7 es lliurarà mitjançant el fitxer PAC2_Exer07.php que es
construirà sobre las plantilla adjunta. És especialment important respectar el nom
d'aquesta arxiu php.
3. Els dos fitxers es comprimiran en un únic arxiu de format zip o rar de nom
CognomsNomP_PAC2.zip (o CognomsNomP_PAC2.rar) que es lliurarà a la bústia de
"Lliurament i registre d'AC"
4. Data límit per lliurar la solució: dilluns, 7 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 PAC.
1
2. Exercici 1: Declaració d’accions i funcions [10%]
Objectius: Distingir entre accions i funcions. Declarar accions i funcions per a resoldre un
problema. Definir els paràmetres, amb els tipus de dades corresponents i els modificadors
d’entrada i sortida correctes.
Materials: M1 i M2
Tasca: Per a cada apartat, decidiu si és millor una acció o una funció i definiu-ne la
capçalera (només es demana la capçalera, no cal que dissenyeu cap algorisme).
Es demana la capçalera d'un mòdul (acció o funció) que:
a) Donades la productivitat horària d’una persona (amb decimals) del mes actual i del
mes anterior retorni si la del mes actual s’ha incrementat o no respecte a la del mes
anterior.
funcio increment (mesActual, mesAnterior): boolea
b) Donades les despeses ealitzades en programari fins el moment, el preu d’una
nova llicència i el número total de llicències que es compren ara, actualitzi l’import
total de la compra de programes acumulant l’import d’aquestes noves llicències.
accio despesesProgramari (ent preuLlicencia: real,
ent numLlicencia: enter,
entsor despeses: real)
c) Donada una població de gats, llegeixi del canal d’entrada estàndard les
característiques d’aquests gats i retorni el número de gats de la població que són
de color negre.
funcio (gats): enter
d) Donat l’import d’un préstec, el percentatge de finançament i el número de mesos
finançat, retorni l’import mensual a pagar.
funcio importMensual (import, percentatge, mesos): real
2
3. Exercici 2: Especificació d’accions i funcions [10%]
Objectius: Descriure de manera precisa què fa una funció o una acció sense necessitat de
saber com ho fa.
Materials: M1 i M2
Tasca: Especifiqueu les funcions i/o accions dels apartats a i b de l’exercici 1. Cal
que indiqueu la precondició, la postcondició i, si es tracta d’una funció, què retorna.
a)
{Pre: mesActual = MESACTUAL i mesAnterior=MESANTERIOR}
funcio increment (mesActual, mesAnterior): booleà
{Post: si mes Actual > mes Anterior increment= CERT sinó increment = FALS}
b)
{Pre: despeses = DESPESES i preuLlicencia = PREULLICENCIA i numLlicencia =
NUMLLICENCIA}
accio despesesProgramari (ent preuLlicencia: real,
ent numLlicencia: enter,
entsor despeses: real)
{Post: despeses = (preuLlicencia x numLlicencia) + despeses}
3
5. Exercici 3: Modificadors d’entrada i sortida [10%]
Objectius: Saber detectar la correctesa en la crida a accions o funcions, entenent el
funcionament dels modificadors d’entrada i sortida dels paràmetres.
Materials: M1 i M2
Tasca: Donats l’algorisme i les capçaleres de les següents accions i funcions:
funcio function1( x: enter, y: enter) : enter;
funcio function2( x: enter, c: caracter) : boolea;
accio action1( ent x: enter, ent y: real, entsor b: boolea, entsor z: enter) ;
accio action2( ent c: caracter, sor x: enter, entsor y: enter);
algorisme algorithm
var
x, y: enter;
c : real;
d : caracter;
b: boolea;
fvar
x := 5;
y := 10;
c := 0.0;
d := readChar();
b := fals;
...
writeInteger (x + y);
writeRea l(c / 2.0);
writeChar (d);
b := (x + y) = (c / 2.0);
si (b) llavors
writeChar(‘S’);
sino
writeChar(‘N’);
fsi
falgorisme
5
6. Responeu a cada apartat si és correcte o no substituir el requadre gris de
l’algorisme algorithm per la instrucció que es dóna i, si no ho és, indiqueu-ne les
causes.
a) action2 (d, x, realToInt(c) );
INCORRECTE: entsor ha de ser una variable
b) action1 (function1(x, y), readChar(), function2(x, d), x);
CORRECTE
c) x := function1 (function1(x, y), y);
CORRECTE
d) b := function2 (action1 (x, c, b, x), d);
INCORRECTE: Action1 no ens torna un enter
6
7. Exercici 4: Disseny d’algorismes [15%]
Objectius: Entendre un algorisme i saber fer crides a accions i funcions.
Materials: M1 i M2
Tasca: Disposem d’un algorisme que ens retorna informació del resultat d’una
cursa. Llegeix del canal d’entrada estàndard el dni d’un conductor (numèric, sense
lletra) i un identificador de cursa, també numèric, i:
Si es tracta d’una cursa de cotxes escriu al canal de sortida estàndard:
o ‘W’ si el conductor indicat ha guanyat la cursa, i ha igualat o superat
la velocitat mitja obtinguda en la resta de carreres, i si aquesta és la
carrera en que ha fet menys parades,
o i ‘L’ en la resta de casos.
En cas de no ser una cursa de cotxes escriu ‘N’.
Ompliu les caixes, amb una única instrucció o expressió a cada una, per
aconseguir el comportament que us hem descrit. L’algorisme resultant ha d’utilitzar
obligatòriament les següents accions i funcions, que no heu d’implementar:
Acció que llegeix del canal d’entrada estàndard la informació del conductor i cursa:
accio getInfo (sor dni: enter, sor idRace: enter);
Acció que donats el dni d’un conductor i l’identificador de cursa retorna si aquest ha guanyat
la cursa, la velocitat mitja que ha portat a la cursa i el número d’aturades que ha fet:
accio getInfoRunnerRace (ent dni: enter, ent idRace: enter,
sor won: boolea, sor averageSpeed: real, sor numberStops: enter);
Acció que donat el dni d’un conductor retorna la velocitat mitja que ha portat a les curses
que ha fet, i el número mínim d’aturades que ha fet fins al moment en totes les seves
curses:
accio getInfoRaces ( ent dni: enter, sor averageSpeed: real, sor numberStops: enter);
Acció que donat un identificador de cursa retorna cert si és una cursa de cotxes i fals en cas
contrari:
funcio isCarRace (idRace: enter) : boolea;
7
8. algorisme RaceInfo
const
WIN : caracter = ‘W’;
LOSE : caracter = ‘L’;
NOCAR : caracter = ‘N’;
fconst
var
dni, idRace: enter;
bCarRace, wonRace: boolea;
averageSpeedRace, averageSpeed: real;
numberStopsRace, numberStopsMin: enter;
fvar
{Llegeix del canal d’entrada estàndard la informació del conductor i de la cursa
que hem de tractar}
getInfoRunnerRace (dni, idRace, wonRace, averageSpeedRace, ;
numberStopsRace);
isCarRace (idRace);
bCarRace := ;
si bCarRace llavors
{Obtenim la informació associada al conductor / cursa llegida del canal
estàndard}
getInfo (dni, idRace);
;
{Obtenim la informació genèrica del conductor en totes les seves curses}
getInfoRaces (dni, averageSpeed, numberStopsMin);
;
{Decidim quin caràcter s'ha d'escriure}
si WIN = CERT i averageSpeedRace ≥ averageSpeed i llavors
numberStopsRace < numberStopsMin)
writeChar(WIN);
sino
writeChar(LOSE);
fsi
sino
writeChar(NOCAR);
fsi
falgorisme
8
9. Exercici 5: Disseny d’algorismes [15%]
Objectius: Dissenyar una funció/acció.
Materials: M1 i M2
Tasca: Es demana un mòdul (acció o funció) que determini el pagament a realitzar
per les entrades a un espectacle amb les següents condicions: només es poden
comprar fins a quatre entrades i, si es compra més d'una entrada, hi ha descompte:
al cost de dues entrades es descompta el 10%, al de tres entrades el 15%, i a la
compra de quatre entrades el 20%.
El mòdul ha de rebre com a paràmetres el número total d’entrades comprades i el
preu d’una entrada, i ha de retornar per una banda si el número total d’entrades
demanades està dintre dels límits, i per altra banda l’import total de les entrades
(retornarà import 0 en cas d’haver-ne demanat més entrades de les permeses).
accio entrades (ent numero: enter,
ent preu: real,
sor límits: booleà,
sor total: real)
var
numero: enter;
preu, total: real;
límits: booleà;
fvar
si (numero > 0 i ≤ 4 ) llavors
límits := cert;
Si (numero =1) llavors
total := preu;
fsi
si (numero =2) llavors
total := (preu -10%) * 2;
fsi
si (numero =3) llavors
total := (preu -15%) * 3;
fsi
si (numero =4) llavors
total := (preu -20%) * 4;
fsi
sinó
total = 0;
límits := fals;
fsi
faccio
9
10. Exercici 6: Seguiment de l’execució [15%]
Objectius: Fer el seguiment, pas a pas, de l’execució d’una funció. Mantenir una taula amb
els valors que van prenent els objectes a mida que avança l’execució.
Materials: M1 i M2
Tasca: Disposem d'un algorisme capaç de calcular els dies transcorreguts entre dues
dates a partir de la vigència del calendari gregorià (aprox. 1583). Aquest algorisme té en
compte el patró de distribució dels anys de traspàs.
L’algorisme és:
algorisme daysBetwen
var
day1, month1, year1, day2, month2, year2 : enter;
counter1, counter2: enter;
fvar
getData(day1, month1, year1);
getData(day2, month2, year2);
si wrongData (day1, month1, year1, day2, mont2, year2) llavors
writeCharacter ('E');
sino
counter1 := daysAfter1583(year1, month1, day1);
counter2 := daysAfter1583(year2, month2, day2);
writeInteger (counter2-counter1);
fsi
falgorisme
accio getData (sort day: enter, sort month:enter, sort year: enter)
day := readInteger();
month := readInteger();
year := readInteger();
faccio
funcio wrongData (day1:enter, month1:enter, years1:enter, day2:enter, mont2:enter,
year2:enter): boolea
var
wrong: boolea;
fvar
wrong:= false;
si (year2<year1) llavors
wrong:= true;
sino si ((year2=year1) i (month2<mont1)) llavors
wrong:= true;
sino si ((year2=year1) i (month2=mont1) i (day2<day1)) llavors
wrong:= true;
fsi
fsi
fsi
retorna (wrong);
ffuncio
10
11. funcio isLeapYear (year: enter): boolea
var
leap: boolea;
fvar
si (year mod 400 = 0) llavors
leap := true;
sino si (year mod 100 = 0 ) llavors
leap := false;
sino si (year mod 4 = 0 ) llavors
leap := true;
sino
leap := false;
fsi
fsi
fsi
retorna (leap);
ffuncio
funcio dayOfTheYear(year: enter, month:enter, day:enter): enter
var
daysCounter: enter;
fvar
daysCounter := day;
si (month >11) llavors
daysCounter := daysCounter + 30;
fsi
si (month >10) llavors
daysCounter := daysCounter + 31;
fsi
si (month >9) llavors
daysCounter := daysCounter + 30;
fsi
si (month >8) llavors
daysCounter := daysCounter + 31;
fsi
si (month >7) llavors
daysCounter := daysCounter + 31;
fsi
si (month >6) llavors
daysCounter := daysCounter + 30;
fsi
si (month >5) llavors
daysCounter := daysCounter + 31;
fsi
si (month >4) llavors
daysCounter := daysCounter + 30;
fsi
si (month >3) llavors
daysCounter := daysCounter + 31;
fsi
si (month >2) llavors
daysCounter := daysCounter + 28;
fsi
si (month >1) llavors
daysCounter := daysCounter + 31;
fsi
si (isLeapYear(year) i month > 2) llavors
daysCounter := daysCounter + 1;
fsi
retorna (daysCounter);
ffuncio
11
12. funcio daysYearsAfter1583 (year:enter) : enter
var
daysCounter: enter;
currentYear: enter;
leap: boolean;
fvar
daysCounter := 0;
currentYear := 1583;
mentre (currentYear < year)fer
daysCounter := daysCounter + 365;
leap := isLeapYear(currentYear)
si (leap) llavors
daysCounter := daysCounter +1;
fsi
currentYear := currentYear + 1;
fmentre
retorna (daysCounter);
ffuncio
funcio daysAfter1583(year: enter, month:enter, day:enter): enter
retorna (daysYearsAfter1583 (year) + dayOfTheYear(year, month, day));
ffuncio
a) Ompliu la taula amb tots els valors que van prenent en la function
daysYearsAfter1583 els objectes si el valor rebut com paràmetre és 1586 (empreu
una línia de la taula per cada canvi de valor d'una de les variables; hi ha més fileres
que les necessàries).
currentYear daysCounter
1583 0
1584 365
1585 730
1586 1195
b) Ompliu la taula amb els valors de la variable daysCounter en la function
dayOfTheYear si els paràmetres de la crida són (1956, 3, 13).
(Hi ha més caselles que les necessàries).
41 72 73
c) Suposant que la seqüència d’entrada és < 15 12 2000 15 12 2000>, què s’escriurà
a la sortida estàndard?
0
12
13. Exercici 7: Programació [15%]
Objectius: Codificar un algorisme en llenguatge PHP. Fer proves per a veure si el
funcionament és correcte.
Materials: Guia bàsica de PHP i miniguies.
Tasca: Codifiqueu en llenguatge PHP i proveu l’ algorisme de l’exercici 6.
Document php adjunt: PAC2_exer7
13
14. Exercici 8: Codificació [10%]
Objectius: Comprensió d’algorismes en PHP.
Materials: Guia bàsica de PHP i miniguies.
Tasca 1: El model de calendari gregorià, va substituir el calendari julià que considerava
anys de traspàs tots els múltiples de 4. Creeu una function isLeapYearJulian equivalent a
isLeapYear, però seguint les normes del calendari julià:
funcio isLeapYearJulian (year: enter): booleà
var
leap: booleà;
fvar
si (year mod 4 = 0) llavors
leap := cert;
sinó
leap := fals;
fsi
retorna (leap);
ffuncio
PHP:
function isLeapYearJulian ($year)
{
if ($year mod 4 = 0) {
$leap == true;
} else {
$leap == false;
}
return ($leap);
}
14
15. Tasca 2: L'any 1582, quan es va aplicar el calendari gregorià, es va haver de fer un
reajustament del calendari de manera que el dia posterior al 5 d'octubre va ser el 15
d'octubre (els dies 6 al 14 no van existir). Modifiqueu la function dayOfTheYear per tal que
fos vàlida també per l'any 1582
funcio dayOfTheYear(year: enter, month:enter, day:enter): enter
var
daysCounter: enter;
fvar
daysCounter := day;
si (month >11) llavors
daysCounter := daysCounter + 30;
fsi
si (month >10) llavors
daysCounter := daysCounter + 31;
fsi
si (month >9) llavors
daysCounter := daysCounter + 30;
fsi
si (month >8) llavors
daysCounter := daysCounter + 31;
fsi
si (month >7) llavors
daysCounter := daysCounter + 31;
fsi
si (month >6) llavors
daysCounter := daysCounter + 30;
fsi
si (month >5) llavors
daysCounter := daysCounter + 31;
fsi
si (month >4) llavors
daysCounter := daysCounter + 30;
fsi
si (month >3) llavors
daysCounter := daysCounter + 31;
fsi
si (month >2) llavors
daysCounter := daysCounter + 28;
fsi
si (month >1) llavors
daysCounter := daysCounter + 31;
fsi
si (isLeapYear(year) i month > 2) llavors
daysCounter := daysCounter + 1;
fsi
15
16. si (year = 1582) llavors
si (month > 10) llavors
daysCounter := daysCounter – 9;
fsi
si (month = 10 i day > 5) llavors
daysCounter := daysCounter – 9;
fsi
fsi
retorna (daysCounter);
ffuncio
PHP
function dayOfTheYear ($year, $month, $day)
{
$daysCounter = $day;
if ($month > 11) {
$daysCounter = $daysCounter + 30;
}
if ($month > 10) {
$daysCounter = $daysCounter + 31;
}
if ($month > 9) {
$daysCounter = $daysCounter + 30;
}
if ($month > 8) {
$daysCounter = $daysCounter + 31;
}
if ($month > 7) {
$daysCounter = $daysCounter + 31;
}
if ($month > 6) {
$daysCounter = $daysCounter + 30;
}
if ($month > 5) {
$daysCounter = $daysCounter + 31;
}
if ($month > 4) {
$daysCounter = $daysCounter + 30;
}
16
17. if ($month > 3) {
$daysCounter = $daysCounter + 31;
}
if ($month > 2) {
$daysCounter = $daysCounter + 28;
}
if ($month > 1) {
$daysCounter = $daysCounter + 31;
}
if (isLeapYear ($year) && $month > 2) {
$daysCounter = $daysCounter + 1;
}
if ($year == 1582) {
if ($month > 10) {
$daysCounter = $daysCounter – 9;
}
if ($month == 10 && $day > 5) {
$daysCounter = $daysCounter – 9;
}
}
return ($daysCounter);
}
Tasca 3: Sabem que el dia 1 de gener de 1583 (primer any complet amb vigència del
calendari gregorià) va ser dissabte.
Creeu la function weekDay en PHP que rebi en un paràmetre la quantitat de dies passats
des de 1-1-1583 fins una data determinada i escrigui el dia de la setmana de què es tracta
aquesta data.
acció weekDay (ent nombreDies: enter);
var
nombreDies: enter;
fvar
Si (nombreDies mod 7 = 0) llavors
writeCharacter (‘dissapte’);
fsi
Si (nombreDies mod 7 = 1) llavors
writeCharacter (‘diumenge’);
fsi
Si (nombreDies mod 7 = 2) llavors
writeCharacter (‘dilluns’);
fsi
17
18. Si (nombreDies mod 7 = 3) llavors
writeCharacter (‘dimarts’);
fsi
Si (nombreDies mod 7 = 4) llavors
writeCharacter (‘dimecres’);
fsi
Si (nombreDies mod 7 = 5) llavors
writeCharacter (‘dijous’);
fsi
Si (nombreDies mod 7 = 6) llavors
writeCharacter (‘divendres’);
fsi
facció
PHP
function weekDay ($nombreDies)
{
if ($nombreDies % 7 == 0) {
print ("dissapte");
}
if ($nombreDies % 7 == 1) {
print ("diumenge");
}
if ($nombreDies % 7 == 2) {
print ("dilluns");
}
if ($nombreDies % 7 == 3) {
print ("dimarts");
}
if ($nombreDies % 7 == 4) {
print ("dimecres");
}
if ($nombreDies % 7 == 5) {
print ("dijous");
}
18