Programació. Resum d'algorismes i problemes resolts - Resum - Multimedia (UOC) - Paquita Ribas

2,264 views

Published on

Resum d'algorismes i problemes resolts. Assignatura de Programació del Grau Multimèdia de la UOC.

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,264
On SlideShare
0
From Embeds
0
Number of Embeds
732
Actions
Shares
0
Downloads
118
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Programació. Resum d'algorismes i problemes resolts - Resum - Multimedia (UOC) - Paquita Ribas

  1. 1. CONSTANTSconst constnomConstant1 : tipus = valorConstant1; N: enter = 100;nomConstant2 : tipus = valorConstant2; fconst...fconst TIPUS tipus color = {verd, blau, vermell groc, blanc}; dia = {dilluns, dimarts, dimecres, dijous}; mes = {gener, febrer, març, abril, maig}; ftipus VARIABLESvar varnomVariable1 : tipusVariable1; t: taula(N) de enter;nomVariable2 : tipusVariable2; i, n: enter;... fvarfvar COMPOSICIÓ ALTERNATIVAsiexpressiollavors sin > 0llavorsaccioa accio1sino sinoacciob accio2fsi fsi COMPOSICIÓ ITERATIVAindex := valor inicial; per index := valor inicial fins valor final [pas increment]mentreindex ≤ valor final fer acció;accio; fperindex := index + increment;fmentre
  2. 2. ACCIONSDECLARACIÓ: DECLARACIÓ:acciónom(param1, param2, ... , paramn) acciósuma(ent x: enter, sor y: enter, entsor z: enter) ... cos de l’acció ... cos de l’acciófacció faccióASSIGNACIÓ: ASSIGNACIÓ:nom de l’acció (obj1, obj2, ... , objn) suma (x,y,z) ACCIONS PREDEFINIDESaccioescriureEnter (ent e: enter) Acció que visualitza per pantalla el valor de l’enter eaccioescriureReal (ent r: real) Acció que visualitza per pantalla el valor del real raccioescriureCaracter(ent c: caracter) Acció que visualitza per pantalla el valor del caràcter c EXEMPLE Intercanviar les variables enteres x i y, z i w i v i u. Exemple d’algorisme aplicant una acció: accio intercanvia (entsor x: enter, entsor y: enter)Exemple d’algorisme sense acció: var aux: enter;{Pre: (x=X i y=Y) i (z=Z i w=W) i (v=V i u=U) } fvaraux := x; aux := x;x := y; x := y;y := aux; y := aux;aux:= z; faccióz := w; Podríem invocar l’acció en l’algorisme:w := aux;aux := v; algorisme intercanviarValorsv := u; {Pre: (x=X i y=Y) i (z=Z i w=W) i (v=V i u=U) }u := aux; intercanvia(x,y); intercanvia(z,w);{ Post: (x=Y i y=X) i (z=W i w=Z) i (v=U i u=V) } intercanvia(u,v); { Post: (x=Y i y=X) i (z=W i w=Z) i (v=U i u=V) } falgorisme
  3. 3. FUNCIONSfunció nom(param1, param2, ... , paramn): tipus funcioesPrimer (n: enter): booleà ... ...retornaexpressio; retorna primer;ffuncio ffuncio FUNCIONS PREDEFINIDESfunciorealAEnter(x: real): enterfuncioenterAREal(x: enter): real Funcions de conversió de tipusfunciocaracterACodi(x: caràcter): enterfunciocodiACaracter(x: enter): caracter Funció que retorna un enter introduït pel teclat delfunciollegirEnter():enter computador Funció que retorna un caracter que ha estat introduïtfunciollegirCaracter():caracter pel teclat del computador Funció que retorna un real que ha estat introduït pelfunciollegirReal():real teclat del computador
  4. 4. ESQUEMA DE RECORREGUT D’UNA SEQÜÈNCIAalgorismeesquemaRecorregutvar element: tipus;fvar element := llegir();inici tractamentmentrenofi sequenciafer(mentre no (element = marca) fer)tractar elementavançar sequencia element := llegir();fmentretractament finalfalgorisme ESQUEMA DE CERCA D’UNA SEQÜÈNCIAalgorismeesquemaCercavar trobat: boolea; element : tipus;fvarelement := llegir();trobat := fals;mentrenofi sequenciai no trobat fer(mentre no (element = marca) i no trobat feractualitzar trobatsi no trobat llavorstractar elementavançar sequenciaelement := llegir();fsifmentretractament finalfalgorisme
  5. 5. TAULESvar varnom: taula[mida] detipus; recaptacioCinema: taula[7] deenter;fvar fvar OPERACIONS ELEMENTALSSi tenim la taulavar podrem fer:t:taula[10] de enter; t[3] Accedim a l’element de tercera posiciófvarSi tenim la taula podrem fer:var aparicions[1] fa referència al primer element de la taula,aparicions: taula[26] de enter; aparicions[2] al segon, aparicions[3] al tercer i aixífvar successivament. ASSIGNACIÓ D’UNA TAULA t[5] := 11; LECTURA I ESCRIPTURA Escriu en el dispositiu de sortida el valor contingut en el posició 2escriureEnter(t[2]) de la taula “t”.escriureEnter(t) No té sentit. Provocaria Error Llegeix una dada del dispositiu d’entrada i l’assigna a la posició 4t[14] := llegirEnter() de la taula “t”.t := llegirEnter() No té sentit. Provocaria Error TAULES BIDIMENSIONALSLa declaració de l’exemple anterior seria:varrecaptacioCinema: taula[7,3] de enter;fvarPer assignar una recaptació de 84, el divendres, ala sala 2:recaptacioCinema[5,2] := 84;declaració:varrecaptacioCinema: taula[7] de taula [3] de enter;fvarAssignació:recaptacioCinema[5][2] := 84;
  6. 6. TUPLES tipus proveidor: tupla nom: taula[15]de caracter; telefon, fax: enter; ftupla ftipus var proveidor1, proveidor2: proveïdor; fvar OPERACIONS ELEMENTALS ACCÉS CORRECTE ACCÉS INCORRECTE nom[1] {No es pot fer referència al camp senseproveidor1.nom[1] {1er caràcter del camp nom indicar el nom de la tupla} de la tuplaproveidor1} proveïdor.telefon{No es pot fer servir el tipusproveidor2.telefon proveïdor com si for una variable}proveidor1.fax fax.proveidor1 {primer ha d’anar el nom de la tupla i després el nom del camp} ASSIGNACIÓ proveidor1.telefon := 935847259; proveidor2.telefon := 934528632; LECTURA I ESCRIPTURAa.x :=llegirReal() Llegeix una dada del dispositiu d’entrada i l’assigna al camp x de la tupla a.a := llegirReal() No té sentit, ja que implica operar amb la tupla sencera. Dóna error.escriureReal(a.x) Escriu en el dispositiu de sortida el valor contingut en el camp x de la tupla a.escriureReal(a) No té sentit, ja que implica operar amb la tupla sencera. Dóna error.tipus tipusllistaMes = {gener, febrer, març, abril, nota = {N, D, C, B, A};maig, juny, juliol, agost, alumne = tuplasetembre, octubre, codiMatricula: enter;novembre, desembre}; nom: taula [25] decaracter;data = tupla adreçaE: taula[40]decaracter;dia: enter; notesPAC: taula[5] de nota; mes: llistaMes; qualificació: nota; any: enter; ftupla ftupla ftipusftipus
  7. 7. PROBLEMES RESOLTSINTERCANVI DE VALORS{ Pre: x= X i y = Y}aux := x;x := y;y := aux;{ Post: x=Y i y = X }CALCULAR EL MÀXIM DE DOS NOMBRES ENTERS{ Pre: x= X i y = Y}si x > y llavorsz :=x;sinóz := y;fsi{ Post: z = màxim(X;Y) }CALCULAR EL FACTORIAL D’UN NÚMEROEl factorial d’un nombre és el producte de tots els números des de l’1 fins al nombre. Exemple: Elfactorial de 5 és 5x4x2x1 = 120.algorisme factorialvar i, n, fact := enter;fvarn := llegirEnter ();{Per: n = N i N > 0}fact := 1 //es parteix d’uns valors inicialsi := 1 // Se situa en el primer element de la seqüènciamentre i ≤ n fer //La condició serà certa per a tots els elements entre i i n fact := fact * i; //fact( que conté el producte dels nombres tractats fins al moment) esmultiplica pel valor que té i en aquesta seqüència. i := i + 1; //Fem avançar la seqüència.fmentre{Post: n=N, N>0, fact és el factorial de i-1 i i=n + 1, per tant, fac és el factorial de N}escriureEnter(fact);falgorisme
  8. 8. DIVISOR D’UN NÚMERO (Esquema de recorregut)Algorisme que donat un nombre enter positiu escrigui els divisors pel dispositiu de sortida. Sabemque un número és divisor d’un altre si aquesta divisió és exacta.algorisme divisorsvar n := enter; i := enter;fvarn := llegirEnter ();{ Pre: n=N i N ≥0 }i := 2mentre i < n fer // Els divisors de n més petits que i s’han escrit pel dispositiu de sortida si n mod i = 0 llavors //esbrinem si i és divisor de n escriureEnter (i); //Si ho és, l’algorisme l’escriu fsi i := i + 1; // per a fer avançar la seqüència, incrementarem ifmentre{ Post: la seqüència de tots els divisors de N s’ha escrit pel dispositiu de sortida }falgorismeSUMA DE LES XIFRES D’UN NÚMERO (Esquema de recorregut)Donat un número enter, escriu pel dispositiu de sortida un altre número enter que correspongui ala suma de les xifres del primer. Exemple: si el nombre és 7463, l’algorisme escriurà 20 (7+4+6+3).algorismesumaDigitsvar n, suma, d := enter;//n és el número que llegim, d és la variable que guarda el dígit a cada iteració.fvarn := llegirEnter ();{ Pre: n=N i N≥0 }d := n mod 10; //Es divideix per 10 per a calcular el mod. En la variable d es guardacada iteraciósuma := 0; //La suma s’inicialitza a 0mentreno (n=0) fer //no(n=0) podria ser n>0 o n≠0 suma := suma + d; //Aquí va sumant a cada iteració n := n div 10; //Es divideix n per 10 per a eliminar el darrer dígit d := n mod 10; //Es busca el darrer dígit següentfmentreescriureEnter (suma);{ Post: la suma dels dígits de N s’ha escrit pel dispositiu de sortida }falgorisme
  9. 9. NOMBRES PRIMERS (Esquema de cerca)Funció que determina si un nombre enter positiu és primer o no i retorna cert en cas afirmatiu ifals en cas contrari.Els nombres primers només poden ser dividits per la unitat i per ells mateixos.funcioesPrimer (n: enter): boolea;{ Pre: n> 0 }var trobat, primer: boolea; i: enter;fvari := 2; //Inicialitzarem i a 2trobat := fals;mentre i < n i no trobat fer si n mod i = 0 llavors //Cerquem un divisor de n trobat := cert; fsi sino trobat llavors //Si trobat és fals s’incrementa l’índex i := i + 1; fsifmentreprimer := no trobat; //El nombre és primer si no s’ha trobat cap divisorretorna primer;{ Post: primer és cert si n és primer i als en cas contrari }ffuncioCOMPTAR QUANTES VEGADES APAREIX LA LLETRA A (Recorregut aplicat a l’entrada)En una frase acabada amb un punt que s’introdueix pel teclat.algorismecomptaLletraAvarcar: caracter; //reflecteix l’estat de la seqüència i conté el darrer element llegit que es correspon amb el capçal de la seqüència.n: enter; //Conté el nombre de lletres ‘a’ que hi ha abans del capçalfvarcar := llegirCaracter();n := 0;mentreno car =’.’ fersi car = ‘a’ llavorsn := n + 1; // Si troba una lletra ‘a’ incrementarem ‘n’fsicar := llegirCaracter();fmentre escriureEnter();falgorisme
  10. 10. TROBAR UNA LLETRA ‘A’ (Esquema de cerca aplicat a l’entrada)És semblant a l’exemple anterior, però en aquest es resol amb una cerca perquè la seqüència nos’ha de continuar processant a partir del moment que es troba una lletra “a”.algorismesurtLletraAvartrobat: boolea;car: caracter;fvarcar := llegirCaracter();trobat := fals;mentreno (car = . ) i no trobat fer //Cap dels elements llegits anteriors a l’últim no és una lletra “a”. L’últim és a car trobat := car = a;si no trobat llavors car := llegirCaracter();fsifmentre // Si trobat és cert, car és una lletra “a”; si és fals, car és el punt final si trobat llavors escriureCaracter(S); sinó escriureCaracter(N);fsifalgorismeMITJANA ARITMÈTICA (Esquema de recorregut aplicat a l’entrada)Sèrie de nombres reals que es llegiran de l’entrada. Hi haurà almenys un nombre i tots elsnombres són diferents de 0.0. Darrere de l’últim element de la sèrie hi haurà un 0.0.algorisme mitjanavarx, suma: real; //suma dels nombresn: enter; //comptadorfvarx := llegirReal();n := 0;suma := 0.0;mentre no (x = 0.0) fersuma := suma + x;n := n + 1;x := llegirReal();fmentreescriureReal(sum/enterAREal(n));falgorisme
  11. 11. INDICAR SI UNA SÈRIE DE NOTES ESTÀ FORMADA EXCLUSIVAMENT PER APROVATS(Esquema de cerca aplicat a l’entrada)Les notes “A”, “B”, “C” (C+) són aprovats i “c” (C-) i “D” són suspensos. Darrere l’últim element dela sèrie hi haurà una “Z”.algorismetothomAprovavar trobat: boolea; car: caracter;fvarcar := llegirCaracter();trobat := fals;mentre no (car = “Z”) ino trobat fer trobat := (car =’c’) o (car =’D’); si no trobat llavors car :=llegirCaracter(); fsifmentre // Si trobat és cert, car és un suspens, si és fals car és “Z” si trobat llavors escriureCaracter(‘N’); sinó escriureCaracter(‘S’); fsifalgorisme
  12. 12. NOTA MITJANA DE SUSPENSOS O 0.0 SI NO HI HA SUSPENSOS(Combinació d’esquemes de recorregut i de cerca)Algorisme que llegeix una sèrie de notes entre 0.0 i 10.0, ordenada descendentment i marcadaamb un -1.0. L’algorisme en dóna la nota mitjana dels suspensos o 0.0 si no hi ha suspensos. Unsuspens és qualsevol nota inferior a 5.0.algorismemitjanaSuspensosvarx, suma, resultat: real; // x és la nota que anem llegint, suma va sumant els suspesos i resultat és el resultat finaln: enter; // n és el comptador de suspesostrobat: boolea;fvarx := llegirReal();trobat := fals;mentre no (x= -1.0) ino trobat fertrobat := x < 5.0 //perquè trobat sigui cert, ha de ser menor que 5.0si no trobat llavorsx := llegirReal();fsifmentre//cap de les notes llegides anterior a l’última no és un suspens. L’ultima és a x. Si trobat és cert, xés un suspens; si és fals, x és -1.0.n := 0;suma := 0.0;mentre no (x= -1.0) fer//suma = suma de tots els valors llegits a partir del primer suspens llevat de l’últim, que és lamarca i n = nombre d’elements sumats.suma := suma + x ;n := n + 1x := llegirReal();fmentre si n > 0 llavors resultat := suma/enterAReal(n); sino resultat := 0.0; fsi escriureReal(resultat);falgorisme
  13. 13. LONGITUD DE LA PRIMERA PARAULA D’UNA ENTRADA(Combinació d’esquemes de recorregut i de cerca)Si no hi ha cap paraula, la resposta és 0.{ Pre: A l’entrada es llegeixen una seqüència de caràcters que no conté cap punt seguida d’un punt}longPrimPar{ Post: Escriu la longitud long de la primera paraula (seqüència de lletres majúscules seguides o 0 sino hi ha cap lletra}algorismelongPrimParvarcar: caracter;n: enter; // n és el nombre de lletres llegidestrobat: boolea;fvarLLEGEIG CARÀCTERS FINS A TROBAR LA PRIMERA LLETRA DE LA PRIMERA PARAULAcar := llegirCaracter();trobat := fals;mentre no (car = ’.’) ino trobat fertrobat := (car ≤ ‘Z’) i (car ≥ ‘A’); //perquè trobat sigui cert, ha de ser un caràcter contingut entre A i Zsi no trobat llavorscar := llegirCaracter();fsifmentre// cap dels caràcters llegits anteriors a l’últim no és una lletra. L’últim és a car. Si trobat és cert, carés una lletra; si és fals, car és el punt final.LLEGEIG CARÀCTERS FINS A TROBAR EL PRIMER SEPARADOR POSTERIOR A LA PRIMERAPARAULA I VA COMPTANT LES LLETRES LLEGIDES. –si no hi ha paraula, la primera cerca fracassa ila segona cerca acaba immediatament sense entrar en el bucle i deixa el comptador a 0.trobat := fals;n := 0;mentre no (car = ’.’) ino trobat fertrobat := (car ≤ ‘Z’) o (car ≥ ‘A’);si no trobat llavors n := n + 1; car := llegirCaracter();fsifmentre// Si trobat és cert, car és un separador, si és fals, car és el punt final, n és el nombre de lletresllegides. escriureEnter(n);falgorisme

×