• No se han encontrado resultados

Ús de REPETIR FINS per fer un nombre variable d'operacions

In document NOTES SOBRE PROGRAMACIÓ (página 38-87)

2.4.2.2 Repeticions incondicionals

De vegades es coneix, a priori quantes vegades s'executarà una instrucció. En aquest cas no cal anar avaluant una instrucció sinó que el que es fa és utilitzar un comptador (Vc) que, s'inicialitza en un determinat valor (Vi) i es va incrementant en una quantitat fixa (In). La repetició es duu a terme fins que el comptador assoleix un valor determinat (Vf) (de fet sí que s'avalua una condició, que és precisament si el comptador ha assolit aquest valor de terminació).

El nombre de repeticions d'una instrucci ó ve definit per la fórmula :

Nombre de repeticions = Part entera de V V I f i n −       +1 Pseudocodi

PER Vc DE Vi FINS Vf FER I1; I2;...;In FI PER Diagrama de flux Programa MITJANA ENTORN VARIABLES

nX: Real, nSuma: Real, nMig: Real nCont : Enter

ALGORISME INICI ALGORISME

** Inicialitzem les variables que fan paper d'acumuladors nSuma = 0

nCont = 0

** El bucle s’efectuarà com a mínim un cop REPETIR Llegir nX SI nX >= 0 ALESHORES nSuma = nSuma + nX nCont = nCont + 1 FI SI FINS QUE (nX<0) nMig = nSuma / nCont Escriure nMig

Vc<=Vf Vc:=Vc+In Si No Acció Vc:=Vi

Figura 2-7 Diagrama de flux de l'estructura FOR ... TO...

El programa següent fa servir una estructura PER...FINS per escriure un mateix caracter un cert nombre de vegades

Els bucles PER...FINS es nien sovint quant es vol realitzar alguna acció, no en una, sinó en dues direccions. Per exemple el programa següent estén l’anterior en el sentit que, enlloc de dibuixar una linia de caracters dibuixarà un triangle rectangle fet amb aquests:

PROGRAMA LINIACARACTERS ENTORN

VAR i, N : Enter, c : caracter INICI ALGORISME

LLegir “Quin caracter vols repetir?”, c LLegir “Quants cops el vols repetir?”, N PER i DE 1 FINS N FER

Escriure c ***Sense saltar de linia FI PER

FI ALGORISME

Exemple 2-6 Ús d'una estructura PER...FINS...

PROGRAMA TRIANGLECARACTERS ENTORN

VAR i,j N : Enter, c : caracter INICI ALGORISME

LLegir “Quin caracter vols repetir?”, c LLegir “Quants cops el vols repetir?”, N PER i DE 1 FINS N FER

PER j DE 1 FINS N FER

Escriure c ***Sense saltar de linia FI PER

Saltar linia FI PER

FI ALGORISME

2.5 VARIABLES AUXILIARS D'UN PROGRAMA

Com hem vist en el primer capítol els llenguatges de programació tenen elements bàsics que es fan servir com blocs constructius i regles mitjançant les quals hom pot combinar aquests elements. Aquestes regles són la sintaxi del llenguatge. Un ordinador només és capaç d'interpretar instruccions sint àcticament correctes, i els programes que contenen errors de sintaxi són rebutjats pel traductor.

Els elements bàsics constitutius d'un programa o algorismes són el que hem anomenat els objectes dels programes (paraules reservades, identificadors, constants variables i expressions) i les instruccions.

Hi ha altres elements que també formen part dels programes i el funcionament dels quals serà força important per un disseny correcte de l'algorisme i la codificació adient del programa. Es tracta de les variables auxiliars que són objectes que fa servir el progra- ma, i que, per la funció que duen a terme dins d'ell agafen un nom especial, moderl·litzant el seu comportament degut a la freqüència amb què apareixen.

Són els :

• comptadors, • acumuladors, • interruptors

Un comptador es fa servir per comptar qualsevol esdeveniment que es pugui presentar. Per exemple en un programa que vagi llegint nombres i comptant quants són positius. Un acumulador és un objecte que, com el seu nom indica serveix per acumular els resul- tats d’una operació que es realitza, normalment de forma successiva sobre un seguit d’elements. Per exemple si es vol calcular la mitjana de 10 nombres caldrà fer servir un acumulador per anar-hi guardant els valors sumats. Sempre s’ha d’inicialitzar, normal- ment a zero.

Un interruptor és un objecte que pot prendre només el valor cert o fals i es pot fer ser- vir per interrompre una seqüència que, altrament es prolongaria de forma indefinida. Per exemple en una bucle repetir mentre se sol fer servir al final d’aquest per decidir si es repeteix o s’acaba la iteració.

L’exemple següent calcula la potència d’un nombre i fa servir un acumulador per desar-hi els valors

L’exemple següent avalua els divisors d’un nombre per decidir si és primer i fa servir un interruptor per decidir sortir del bucle si no ho és.

PROGRAMA ESPRIMER ENTORN

VAR

Primer : Logic

i, ElNombre, MaxDiv : Enter Quocient : Real INICI ALGORISME

LLegir “Entra un nombre enter major que 3”, ElNombre Primer :=VERITAT

*** DIV representa divisio entera MaxDiv := ElNombre DIV 2

PER i DE 2 FINS ElNombre-1 FER Quocient := ElNombre/i

SI Enter (Quocient)=Quocient LLAVORS *** Divisió exacte: No és primer Primer :=FALS

SORTIR FI SI FI PER

SI Primer LLAVORS

Escriure ElNombre, “es un nombre primer” SI NO

Escriure ElNombre, “no és un nombre primer” FI SI

FI ALGORISME

Exemple 2-9 Combinació de vàries estructures en un càlcul PROGRAMA POTENCIA

ENTORN

VAR i, exponent : Enter

pot, base : Real INICI ALGORISME

LLegir base, exponent pot :=1

PER i DE 1 FINS exponent FER pot := pot*base

FI PER Escriure pot FI ALGORISME

2.6 INSTRUCCIONS COMPOSTES

Una instrucció composta representa un conjunt d'instruccions que es troben definides en una altra part diferent del punt on s'invoca aquesta. En general són crides a subprogra- mes.

Es representen en un ordinograma amb el símbol de subprograma acompanyats d'un identificador del subprograma o conjunt d'instruccions representades.

NomRutina

Els subprogrames apareixen relacionats amb el disseny descendent dels algorismes si bé es tracta d'una relació més conceptual que obligada. Atesa la seva importància es dedica- rà el capítol següent al seu estudi de forma independent.

2.7 EXERCICIS

1. Escriure un algorisme que determini el màxim de tres nombres, on B és el màxim d’A,B si B >= A.

2. Escriure un programa que demani un nombre enter i ens digui si es tracta d’un nom- bre parell

3. Escriure un programa que demani la nota d’un examen i tregui per pantalla la qualifi- cació en format “Apte” o “No Apte” segons si la nota es major o menor que 5. 4. Escriure un programa que permeti jugar a “doble o res”: El jugador aposta una qua nti-

tat i tira una moneda. Si surt cara guanya el doble de la quantitat apostada. Si surt creu ho perd tot

5. Escriure un algorisme que llegeixi una frase (de com, a molt 100 caràcters) i digui si és o no palíndrome (és a dir que es llegeix igual de dreta a esquerra que d'esquerra a dreta, sense comptar els blancs. Per exemple : "DABALE ARROZ A LA ZORRA EL ABAD".

6. Escriure un algorisme que donada una base d’una seqüència d’ADN (A, T, C, G) re- torni el seu complementari (AàT, TàA, CàG, GàC).

7. L’índex de massa corporal és una mesura per quantificar el grau d’obesitat d’una per- sona. Es defineix IMC = pes (kg)/altura2 (en m), i la seva interpretació és: si es infe- rior a 25: Normalitat; entre 25-30 : Sobrepés; entre 30 i 40: Obesitat; més de 40: O- besitat mòrbida. Fer un programa que demani l’altura i el pes i calculi l’IMC i digui en quina categoria es situa la persona.

8. Fer un programa que, donat el nom o el número d’un mes i si l’any es o no de traspàs, dedueixi el número de dies del mes.

9. Fer un programa per determinar la mitjana d’una llista de números positius acabada amb un número negatiu.

10. Fer un programa per sumar els números enters de 1 a 100 mitjançant : a) estructura (repetir) ; b) estructura (mentre) ; c) estructura (des de).

11. Fer un programa que llegeixi 100 números i determini la mitjana dels números posi- tius i la mitjana del negatius.

12. Modifiqueu el programa del joc de “doble o res” de forma que es pugui anar jugant fins que el jugador decideixi abandonar el joc. El programa ha de treure per pantalla el nombre total de jugades i el total que ha guanyat o que deu el jugador.

13. Fer un programa que rebi com entrada una cadena que representa una seqüencia d’ADN i que en retorni la seva cadena complementària

14. Feu un programa per llegir les qualificacions d’una classe d’informàtica i contar el número total d’aprovats (5 o més gran que 5).

15. Feu un programa per llegir les notes d’una classe d’informàtica i deduir totes aquelles que siguin NOTABLE (>=7 i <9).

16. Feu un programa per calcular l’enèsim terme de la sèrie de Fibonacci per : a1 = 1 a2 = 1 a3 = 1+2 = a1+a2 an = an-1 + an-2 (n>=3)

17. Feu un programa que determini si, donades dues cadenes, una d’elles esta continguda en l’altra

3. SUBPROGRAMES O SUBALGORISMES: PROCEDIMENTS I

FUNCIONS

En el capítol 2 s'ha explicat un mètode per dissenyar algorismes consistent en dividir el problema inicial en subproblemes cada cop més simples fins que els problemes petits resultin senzills de resoldre. Això s'anomena disseny descendent ja que s'inicia en la part superior com un problema general i se va refinant mitjançant el disseny específic de les solucions dels subproblemes. Normalment les parts en que es divideix un programa s'han de poder desenvolupar de forma independent les unes de les altres. Els llenguatges d'alt nivell com C, Pascal, FORTRAN o BASIC permeten implementar aquestes sol ucions independents en forma de subprogrames, coneguts com procediments, subrutines o funcions, o subalgorismes si es considera l'enfoc algorísmic.

Un subprograma pot fer les mateixes accions que un programa : acceptar dades realitzar càlculs i retornar els resultats. La diferència resideix en que és utilitzat pel programa principal per a un propòsit específic. El subprograma rep les dades del programa princ i- pal i retorna a aquest els resultats. Un subprograma pot cridar-ne d'altres.

Podem distingir subprogrames interns i externs segons si es troben o no inclosos en el programa principal. Els subprogrames externs s'enllacen amb el programa princ ipal en la fase d'enllaçat.

Hi ha dos tipus importants de subprogrames : les funcions i els procediments.

3.1 FUNCIONS

Des del punt de vista matemàtic una funció és una operació que agafa un o més valors anomenats arguments i produeix un valor que anomenem el resultat. Tots els llenguat- ges de programació tenen funcions incorporades i, la majoria, permeten que l'usuari defi- neixi les seves pròpies. Per exemple per calcular l'arrel quadrada en Pascal hi ha la fun- ció Sqrt().

Una funció s'invoca fent servir el seu nom dins d'una expressió o directament dins d'una instrucció.

Les funcions es dissenyen per dur a terme un tipus ben concret de tasques :agafen una llista de valors que hom anomena arguments o paràmetres d'entrada i retornen un sol va- lor.

Una funció es defineix en algun punt del programa mitjançant una sentència de declara- ció. El format de la declaració difereix segons el llenguatge, però en general ha de con- tenir el nom amb que se la invoca, els paràmetres que se li passaran i el valor que retor- narà.

Exemple

Es vol escriure una funció que calculi la hipotenusa d'un triangle rectangle de catets x, y:

Els valors x,y reben el nom de paràmetres formals de la funció i es fan servir únicament dins del cos de la funció. Els arguments utilitzats en la crida a la funció s'anomenen paràmetres actuals i són aquells objectes existents en el programa que crida a la funció que es passen a aquesta per que els faci servir enlloc dels paràmetres formals.

Per exemple, si un programa fa servir la funció anterior, amb dues variables "catet1" i "catet2" podem fer :

...

CATET1 = 3 CATET2 = 4

Escriure “La hipotenusa d'un triangle amb catets ”, CATET1, “ i ”, CA- TET2, “ és ”, Hipotenusa (CATET1, CATET2) ;

....

Aquesta és la forma típica de fer servir les funcions, dins d'una expressió. Molts llen- guatges permeten utilitzar-les en la manera en que, tradicionalment es fan servir els procediments, és a dir invocant-les pel nom sense incloure-les dins de cap expressió.

3.2 PROCEDIMENTS

Un procediment és un subprograma que executa un procés específic sense retornar cap valor determinat. No hi ha cap valor associat al nom del procediment, de forma que no es pot fer servir aquest dins d'una expressió.

No tots els llenguatges disposen de procediments com a tals. per exemple en C no n’hi ha i la diferència entre una funció i un procediment es fa palesa només en el tipus de dades que retorna. Les funcions que actuen com a tals retornen un tipus concret, mentre les que no retornen res, i per tant fan de procediments retornen un tipus void.

En Pascal un procediment es declara de forma similar a una funció fent servir la paraula procedure.

El següent exemple mostra com un programa per calcular les nòmines dels treballadors es pot descomposar pel mètode del disseny descendent en diversos subprogrames que, com no retornen res, actuen com procediments.

Exemple 4.1. Càlcul de la hipotenusa d’un triangle rectangle

FUNCIO Hipotenusa (x,y: Real): Real ENTORN

VAR nHipotènusa: Real INICI FUNCIO

nHipotènusa =sqrt(x*x+y*y) RETORNA nHipotènusa

3.3 ÀMBIT: VARIABLES LOCALS I GLOBALS

Les variables i altres objectes utilitzats en els programes principals i subprogrames es classifiquen en local s i globals.

Una variable local és aquella que està declarada i definida dins d’un subprograma, en el sentit que es declara i pren valors dins del subprograma i es diferent d’altres variables amb el mateix nom declarades en qualsevol lloc del programa principal. El significat de cada variable es limita al subprograma on ha estat declarada i altres variables amb el mateix nom declarades en altres subprogrames es refereixen a posicions diferents de la memòria.

Una variable global és aquella que està declarada pel programa o algorisme principal del qual depenen tots els subprogrames.

La part d’un programa o algorisme on es coneix, és a dir es manté, el valor d’una variable és el seu àmbit.

Exemple 4.2 Càlcul d’una nòmina amb procediments

PROGRAMA NOMINA2 ENTORN

CONST nRetirpf = 0.15 VAR vNom[30] : CAR VAR nHores, nPreu : Enter

VAR nSouBrut, nRetencio, nSounet : Real PROC Llegeixdades () PROC Calcula () PROC Imprimeixresultats () INICI ALGORISME Llegeixdades() Calcula() Imprimeixresultats() FI ALGORISME PROC LlegeixDades() INICI PROC Llegir Cnom Llegir nHores Llegir nPreu FI PROC PROC Calcula() INICI PROC

nSoubrut := nHores + nPreu nRetencio:= nSoubrut + nRetirpf nSounet := nSoubrut - nRetenció FI PROC PROC ImprimeixResultats() INICI PROC Escriure Cnom Escriure nSouBrut Escriure nRetenció Escriure nSounet FI PROC

Programa DEMO variable X, X1...

.... Àmbit de X

Procediment A

variable Y, Y1,... Àmbit de Y

Procediment B variable Z, Z1 Àmbit de Z .... Procedimiento C variable W,W1... Àmbit de W

L’ús de variables locals és avantatjós. Permet que els diversos subprogrames siguin in- dependents els uns dels altres i que es comuniquin amb el programa principal només mit- jançant la llista de paràmetres i els valors que retornen les funcions. Així per fer servir un subprograma només cal saber quins paràmetres rep i què retorna, sense que calgui saber com funciona per dins. Això permet que utilitzem en els nostres programes rutines que han estat desenvolupades per altres programadors o per nosaltres mateixos en altres pro- grames potenciant molt el desenvolupament de programes estructurats i la reutilització del codi.

L’accessibilitat a les variables des de els altres subprogrames depèn de com organitzi cada llenguatge de programació concret la definició dels subprogrames. Si un llenguatge permet, com és el cas del Pascal (però no del C !), la definició de subprogrames dins d’altres subprogrames, és a dir permet el niuament de subprogrames (nesting en an- gles), sol ser usual que les variables siguin accessibles des del punt on han estat declara- des. Això vol dir que hi poden accedir els objectes que es troben en el subprograma on s’ha declarat la variable, així com tos els dels subprogrames niats en aquest. En l’exemple anterior tindríem el següent:

Variables Definides en Tipus Accessibles des de

X, X1 DEMO Globals DEMO, A, B, C

Y, Y1 A Locals A, B

W, W1 C Locals C

Z, Z1 B Locals B

Altres llenguatges com el C, no permeten de niar subprogrames, però sí es pot crear-los en mòduls diferents, és a dir separats físicament en fitxers diferents. Això duu a conside- rar la necessitat de definir dues menes àmbit local: relatiu a un subprograma o relatiu a un mòdul. Per poder-ho manegar el llenguatge C permet definir tres tipus de variables pel que fa a àmbit i vigència (és a dir al temps durant el qual existeix la variable un cop defi- nida i inicialitzada).

Tipus Àmbit Vigència

Globals i Externes (extern)

Tot el programa.

Les externes es poden definir en un mòdul i usar en un altre

Execució del programa

Automàtiques (auto)

Dins de la funció on han estat definides.

Es creen al accedir la funció i s’eliminen al deixar-la

Estàtiques (static)

Dins de la funció on han estat definides.

Mantenen el seu valor entre crides suc- cessives a les funcionson han estat definides

El llenguatge C contempla encara un altre tipus, el tipus register, que està pensat per va- riables a les que s’accedirà molt sovint i que es guarden en un registre del processador directament per poder-hi accedir més depressa..

3.4 COMUNICACIÓ AMB SUBPROGRAMES : PAS DE PARÀMETRES

Quan un programa crida un subprograma la informació es comunica a través de la llista de paràmetres i s'estableix una correspondència automàtica entre els paràmetres formals i actuals. Els paràmetres formals són "substituïts" pels paràmetres actuals.

En principi cal que hi hagi una correspondència posicional entre els paràmetres, quan se'ls defineix i a l'hora de fer-los servir. En la funció "Hipotenusa (x, y)" definida més amunt no s'apreciaria cap error si s'utilitzen aquestes dues crides diferents

.... CATET1 = 3 CATET2 = 4

escriure(“La hipotenusa d'un triangle amb catets “, CATET1,CATET2,Hipotenusa (CATET1, CATET2)) ; ....

o

CATET1 := 3 CATET2 := 4

escriure (“La hipotenusa d'un triangle amb catets ”, CATET1,CATET2,Hipotenusa (CATET2, CATET1)) ;

Ara bé, si els dos paràmetres són de tipus diferents, o bé tenen papers diferents en el càl- cul, el resultat de cridar el subprograma passant-li els paràmetres en un ordre diferent no serà el mateix.

3.4.1 Pas de paràmetres per valor o per referència

Els paràmetres es poden passar de maneres diferents als subprogrames. En princ ipi l'e- lecció d'un o altre mètode dependrà de si es vol que el programa modifiqui, o no, els valors del paràmetre, o més exactament si es desitja conservar les modificacions que s'hagin efectuat quan l'execució del subprograma hagi finalitzat. Des d'aquest punt de vis- ta distingim entre pas de paràmetres :

per valor, per referència.

El pas de paràmetres per valor determina que, internament, el subprograma utilitzi una copia del valor que li hem passat com paràmetre, de forma que, tant si la modifica o no, en acabar l'execució aquesta còpia és destruïda i per tant el valor original roman inalte- rat. Aquest mètode resulta útil per entrar informació al subprograma.

Al fer pas per referència s'indica al subprograma que no ha d'actuar sobre una còpia de la variable sinó sobre el valor original, de forma que, si aquest es modifica la variable resulta modificada. Aquest mètode és útil quan el paràmetre actua com sortida d'informa- ció provenint del subprograma.

Exemple:

Un procediment que calculi la divisió de dos nombres i en retorni el quocient i el residu rebrà els dos primers paràmetres per valor, ja que són paràmetres d'entrada que no cal modificar i els dos darrers per referència ja que són paràmetres de sortida que reben nous valors com a resultat del càlcul.

Exemple 4.3 Proc DIVISIO: paràmetres per valor i per referència PROC Divisio ( Dividend, divisor : Enter PerRef

quocient, residu : Real PerVar) INICI PROC

quocient = dividend/divisor

residu = dividend- quocient*divisor FI PROC

L’exemple següent fa èmfasi en la idea que els paràmetres que es passen per valor, tot i poder canviar dins del subprograma no ho fan afora, mentre que els que es passen per referència canvien dins i fora del subprograma.

3.4.2 Funcions i procediments com paràmetres

Fins aquí hem vist dues maneres de passar valors als subprogrames. De vegades pot inte- ressar que un subprograma n’invoqui un altre que no estigui definit dins d’ell. Per exe m- ple un programa de representació gràfica de funcions pot necessitar que se li passi la funció a representar. Alguns llenguatges com el Pascal admeten paràmetres procediment i

In document NOTES SOBRE PROGRAMACIÓ (página 38-87)

Documento similar