UNIVERSITAT DE BARCELONA
NOTES SOBRE PROGRAMACIÓ
Curs 2002-2003
Alex Sánchez
Barcelona. Juliol 2002
DEPARTAMENT D’ESTADÍSTICA
Sèrie de quaderns docents del Departament d’Estadística
Núm. 9
1. CONCEPTES BÀSICS... ... ... .... 5
1.1 RESOLUCIÓDEPROBLEMESAMBORDINADOR ... 5
1.2 CICLEDEVIDAD'UNAAPLICACIÓINFORMÀTICA... ... 5
1.3 FASESDECREACIÓDELPROGRAMA ... ... ... 6
1.3.1 Anàlisi... 6
1.3.2 Disseny... 7
1.3.3 Implementació... ... ... ... 7
1.3.4 Exemple : Càlcul del salari d'un treballador. ... 7
1.3.5 Exemple : Càlcul del volum tumoral ... 8
1.4 ALGORISMES ... 8
1.5 CODIFICACIÓIIMPLEMENTACIÓDELSALGORISMES... 9
1.6 ELEMENTSD'UNPROGRAMA ...10
1.6.1 Objectes d'un programa ...11
1.6.2 Instruccions ...16
1.7 REPRESENTACIÓDELSALGORISMES ...18
1.7.1 Diagrames de flux...19
1.7.2 El pseudocodi ... ... ... ...21
1.8 DISSENYD'ALGORISMES ...23
1.8.1 Disseny descendent...24
1.9 RESUMDEDADESIINSTRUCCIONS ENPSEUDOCODIVBAIC...25
1.9.1 Tipus de dades simples...25
1.9.2 Constants i variables ...26
1.9.3 Estructura general d’un programa...26
1.9.4 Instruccions primitives. ... ... ...26
1.10 EXERCICIS ...27
2. ESTRUCTURA GENERAL D'UN PROGRAMA...29
2.1 PROGRAMES... ... ... ...29
2.2 PARTSD'UNPROGRAMA ...29
2.3 INSTRUCCIONSITIPUSD'INSTRUCCIONS...30
2.3.1 Instruccions de declaració ... ... ...30
2.3.2 Instruccions primitives...31
2.4 INSTRUCCIONSDECONTROL...31
2.4.1 Instruccions alternatives...31
2.4.2 Instruccions repetitives ... ... ...36
2.5 VARIABLESAUXILIARSD'UNPROGRAMA ... ...40
2.6 INSTRUCCIONSCOMPOSTES ...42
2.7 EXERCICIS ...43
3. SUBPROGRAMES O SUBALGORISMES: PROCEDIMENTS I FUNCIONS ...44
3.1 FUNCIONS...44
3.2 PROCEDIMENTS...45
3.3 ÀMBIT:VARIABLESLOCALSIGLOBALS ... ... ...46
3.4 COMUNICACIÓAMBSUBPROGRAMES :PASDEPARÀMETRES...48
3.4.1 Pas de paràmetres per valor o per referència ...48
3.4.2 Funcions i procediments com paràmetres...50
3.5 RECURSIVITAT ... ... ... ...50
3.6 EXERCICIS...52
4. ESTRUCTURES DE DADES ... ... ...53
5. ESTRUCTURES DE DADES ESTÀTIQUES ...55
5.1 TAULES ...55
5.2 CLASSIFICACIODELESTAULES ...56
5.2.2 Taules bidimensionals...57
5.2.3 Taules multidimensionals. ... ... ...58
5.3 OPERACIONSAMBTAULES ...58
5.4 CADENES...61
5.5 REGISTRES...63
5.5.1 Emmagatzematge de registres... ... ...66
5.6 EXERCICIS ...67
6. ESTRUCTURES DE DADES DINÀMIQUES...68
6.1 INTRODUCCIÓ ... ... ... ...68
6.2 PUNTERSIVARIABLESDINÀMIQUES ...69
6.3 ELMUNT(HEAP) ...69 6.4 LLISTES ...71 6.5 PILES ...75 6.6 CUES ...75 6.7 ARBRES ...76 6.8 EXERCICIS...78
7. ESTRUCTURES DE DADES EXTERNES: FITXERS...79
7.1 INTRODUCCIO ... ... ... ...79
7.2 FITXERSDELD.O.S.:FITXERSDETEXTE(ASCII)IBINARIS. ... ...79
7.2.1 Fitxers de text o ASCII. ...79
7.2.2 Fitxers binaris... ... ... ...80
7.3 FITXERSDEDADES:PERSPECTIVALÒGICAVSFÍSICA. ...81
7.3.1 Registres lògics ...81 7.3.2 Registres físics ...83 7.4 GESTIOD’ARXIUS ...84 7.4.1 Crear un arxiu... ... ... ...85 7.4.2 Obrir un arxiu... ... ... ...85 7.4.3 Tancar un arxiu...86 7.4.4 Eliminar un arxiu ...86
7.4.5 Exemples de gestió d’arxius en llenguatge C ... ...86
7.5 MANTENIMENTD’ARXIUS...87
7.5.1 Actualització d’arxius...88
7.5.2 Consulta d’arxius ... ... ... ...88
7.5.3 Reestructuració d’arxius...88
7.6 ORGANITZACIÓDELFITXERS ...89
7.6.1 Organització seqüencial ...89
7.6.2 Organització directa... ... ...90
7.6.3 Organització indexada ...90
7.7 ACCESALSREGISTRES ... ... ...90
7.7.1 Accés seqüencial...91
7.7.2 Accés directe...91
7.7.3 Accés per índexs ...91
8. BIBLIOGRAFIA ...92
Teoria...92
Metodologia de la programació...92
9. APÈNDIX I : UN CAS COMPLET : CANVIS DE BASE ... ...93
9.1 DESCRIPCIÓDELPROBLEMA... ... ...93
9.2 ANÀLISIDELASOLUCIÓ...94
9.3 DISSENY...94
9.4 CODIFICACIOENPSEUDOCODI ...99
10. APENDIX II: EL PSEUDOCODI ... ... ...103
10.1.1 Definició de l’entorn ...103
11. APÈNDIX II: COMPARACIÓ ENTRE EL PSEUDOCODI I ALGUNS LLENGUATGES
VBA, C I JAVA... ... ... ...106
11.1 EXPRESSIONS I OPERADORS...106
11.1.1 Identificadors... . 106
11.1.2 Constants, variables ... ... ...107
11.1.3 Tipus de dades simples...107
11.1.4 Operadors ...108
11.2 ESTRUCTURA GENERAL D’UN PROGRAMA EN DIVE RSOS LLENGUATGES. ...110
11.2.1 Instruccions de declaració ... ... ...111
11.2.2 Instruccions primitives. ... ... ...111
11.2.3 Sintaxi de les instruccions de bifurcació en alguns llenguatges ... . 112
11.2.4 Instruccions de repetició en diversos llenguatges. ...112
11.3 VARIABLESDETIPUSESTRUCTURATSENPASCALIC ...114
LLISTA D’EXEMPLES Exemple 2-1 Algorisme executable linealment, sense canvis en la seqüència ...31
Exemple 2-2 Ús d'una bifurcació simple en un càlcul ...35
Exemple 2-3 Ús d’una bifurcació múltiple per posar qualificacions ...35
Exemple 2-5 Ús de REPETIR... FINS... per fer un nombre variable d'operacions ...38
1. CONCEPTES BÀSICS
1.1 RESOLUCIÓ DE PROBLEMES AMB ORDINADOR
Un ordinador és una màquina electrònica amb la qual hom pot fer moltes coses, però que només és capaç de dur a terme tres menes d’operacions elementals, això sí, amb gran rapidesa:
• Operacions aritmètiques bàsiques : suma, resta, multiplicació i divisió. • Operacions lògiques, "i", "o", "no", que permeten fer comparacions. • Emmagatzemar i recuperar informació.
La combinació d'aquestes instruccions bàsiques en conjunts d'instruccions complexes, els programes, permeten dur a terme tasques de gran complexitat.
En línies generals, donat un problema i una forma de resoldre, l'objectiu que perseguim serà elaborar les indicacions necessàries per dur a terme aquesta solució amb ajut de (les capacitats de) l'ordinador.
Sense entrar en disquisicions filosòfiques val la pena considerar què vol dir "resoldre un problema amb l'ordinador". De fet, anant una mica més enllà, ens podem plant ejar quan té sentit fer servir l'ordinador per resoldre un problema. Podem trobar diversos tipus de problemes :
1. Alguns els sabem resoldre, però no té cap sentit que recorrem a l'ordinador per la seva senzillesa o poca complexitat. Per exemple: resoldre l'equació 3x -1 = 5 o ordenar alfabèticament les paraules "Pere", "Joan", "Miquel".
2. Altres els sabem resoldre de forma exacta o aproximada però són prou feixucs o repetitius com perquè valgui la pena fer servir l'ordinador. Per exemple : resoldre un sistema d'equacions lineal de 100 equacions o ordenar alfabèticament una llis-ta de 3000 noms.
3. Finalment n'hi ha que no sabem resoldre o que resulten excessivament feixucs. En aquest cas tampoc l'ordinador ens hi podrà ajudar.
L'objectiu que perseguirem al llarg d'aquestes notes serà aprendre a analitzar un proble-ma, del segon tipus dels esmentats, i dissenyar i escriure un programa per facilitar-ne la resolució amb l'ajut de l'ordinador.
1.2 CICLE DE VIDA D'UNA APLICACIÓ INFORMÀTICA
El procés que cal seguir des del plantejament d'un problema fins que disposem d'una so-lució instal·lada en l'ordinador i en funcionament pels usuaris finals s'anomena el cicle de vida de l'aplicació informàtica.
Aquest procés consta de dues fases agrupades en dos blocs ben definits, tal i com es pot veure en la figura 1 on es mostra cada una de les fases i el resultat obtingut en cada un d'elles :
Problema Anàlisi del problema Especificacions ANÀLISI Disseny de I l’algorisme DISSENY Algorisme Implementació Programa Edició Programa font Compilació Programa objecte Muntatge IMPLANTACIÓ Programa executable I EXPLOTACIÓ Prova d’'execució Aplicació Explotació i manteniment
1.3 FASES DE CREACIÓ DEL PROGRAMA
Per crear un programa cal definir i descriure amb el màxim detall i rigor possibles la manera en què es vol resoldre el problema. Això es pot fer de formes diverses, però un esquema bastant senzill contempla, com a mínim les fases següents :
1. Anàlisi del problema
2. Disseny i verificació de l’algorisme i de la solució informàtica 3. Implementació : Escriptura del programa en un llenguatge.
1.3.1 Anàlisi
• En primer lloc cal establir amb precisió què ha de fer el programa, decidint si es trac-ta d'un problema per al qual es coneix o es pot trobar la solució, o pel contrari no se sap com resoldre'l.
• A més a més cal definir quines són les entrades i les sortides del programa. Com a detalls menors cal establir quins recursos semblen necessaris per a la seva execució.
Definició del problema Especificacions d'entrada Especificacions de sortida= Resultats Anàlisi del problema
1.3.2 Disseny
En la fase del disseny cal passar de pensar en què cal fer, en com fer-ho. També es trac-ta de no pensar trac-tant en com resol el problema l'usuari i començar a fixar-se en com ho fa l'ordinador. L'anterior es pot resumir dient que cal dissenyar els algorismes que interve-nen en la solució.
1.3.3 Implementació
En aquesta fase cal traduir els algorismes a un determinat llenguatge de programació. Si bé és una feina relativament mecànica, a partir dels algorismes també està condicionada pel llenguatge escollit i les característiques del problema.
1.3.4 Exemple : Càlcul del salari d'un treballador.
Es vol fer un programa que calculi i imprimeixi les nòmines dels treballadors d'una em-presa de treball temporal. Per simplificar l'exemple, suposarem que no es fan hores ex-tres, és a dir es paguen totes al mateix preu, i que el programa efectua el càlcul només una vegada.
1.3.4.1 Anàlisi del problema
Els treballadors de les empreses de treball temporal cobren per hores una quantitat fixa-da que depèn de cafixa-da cas. Només se'ls reté una quantitat fixa en concepte d'impostos (un 15%). El sou brut s'obtindrà de multiplicar el nombre d'hores treballades pel preu hora. i el sou net s'obté de restar la retenció per impostos (el 15%) del sou brut
DADES D’ENTRADA : Hores treballades, Preu hora DADES DE SORTIDA : Sou brut, Sou net
DADES AUXILIARS : Percentatge de retenció de IRPF 1.3.4.2 Disseny : obtenció de l'algorisme
A partir de l'anàlisi hom pot proposar el següent algorisme per al càlcul del salari que ha de cobrar un treballador d'una empresa de treball temporal.
1. Llegir el nom i cognoms (NOM), el nombre d'hores treballades (NH) i el preu que es cobra per hora (PH).
2. Calcular
Sou Brut (SB) = NH * PH Retenció (RET)= 0.15 * SB Sou Net (SN) = SB - RET
1.3.4.3 Codificació
L'algorisme anterior es pot codificar en qualsevol llenguatge de programació. Per exe m-ple, en C, VBA o Java s’obtenen respectivament els programes llistats en EX11SOU1.C, EX11SOU1.VBA o EX11SOU.JAVA.
1.3.5 Exemple : Càlcul del volum tumoral
Certes aplicacions biomèdiques basades en exploracions o ecografies necessiten calcular el volum de tumors o altres cossos a partir de mesures indirectes. Sovint es disposa de dades com la longitud (dimensió major) o l’amplada del tumor i es desitja estimar-ne el volum a partir d’aquestes.
1.3.5.1 Anàlisi del problema
DADES D’ENTRADA : Longitud (L) i Amplada (A) del tumor DADES DE SORTIDA : Volum estimat (V)
Es farà la suposició que el tumor té la forma aproximada d’un elipsoide amb els dos semieixos menors iguals, de manera que la fórmula per al volum de l’elipsoide:
esdevé : 2 4 3 V = ⋅ ⋅ ⋅π L A 1.3.5.2 Disseny de l’algorisme
1. Llegir la longitud (L) i l’Amplada (A) del tumor. 2. Calcular
V = 4* 3.141592* L * A 3. Escriure el Volum del tumor 1.3.5.3 Codificació
L'algorisme anterior es pot codificar en qualsevol llenguatge de programació. Per exe m-ple, en C, VBA o Java s’obtenen respectivament els programes llistats en EX12VOLUM1.C, EX12VOLUM1.VBA o EX12VOLUM1.JAVA.
1.4 ALGORISMES
Un algorisme es defineix com un conjunt ben definit de regles (operacions,
instrucci-ons...) per a la resolució d'un problema en un nombre finit de passes.
Una definició equivalent és la d’una seqüència ordenada de passes, sense
No tots els problemes tenen un algorisme per a la seva solució. En aquest cas no serà possible escriure un programa per resoldre'ls.
La informació proporcionada a l’algorisme constitueix la seva entrada i la informació produïda per l’algorisme és la seva sortida.
Donada una entrada cal que un algorisme produeixi sempre exactament la mateixa sorti-da. Per fer això cal que estigui precisat amb el màxim de detall. Això es pot fer refinant molt la seva redacció i/o formalitzant-los en major o menor grau. Aquesta darrera opció (us d'un cert grau de formalisme) resulta tant més adient quant més complex sigui el pro-blema i per tant quan pugui caldre comunicar els algorismes i processos entre diverses persones que intervenen en el desenvolupament de l'aplicació.
Per resoldre un mateix problema hi pot haver infinitat d'algorismes. La qualitat d'un algo-risme es podrà mesurar per dos factors :
• El temps que cal per a executar-lo, o equivalentment, el nombre d'instruccions de cada tipus necessàries per resoldre el problema.
• Els recursos, en termes de memòria principal i d'emmagatzematge que es neces-siten per implantar-lo.
1.4.1.1 Verificació de l’algorisme
Un cop s’ha escrit l’algorisme cal comprovar que , efectivament, és capaç de dur a terme les accions per a les quals ha estat dissenyat. Això se sol fer executant-lo pas a pas, “ma-nualment” amb dades de prova escollides de forma que abastin totes les possibles cond i-cions d’execució. Així per exemple, si hom ha dissenyat un algorisme per fer un càlcul on intervé el radi d’un cercle, cal haver considerat que farà aquest si se li suministra un nombre negatiu. Si al donar un nombre negatiu no ho avisa vol dir que hi ha un error en el disseny que cal corregir.
Els algorismes se solen escriure mitjançant algun tipus de llenguatge algorísmic que ha de ser :
• independent del llenguatge de programació en que finalment es codifiqui el pro-grama.
• fàcil de traduïr a qualsevol llenguatge.
Hi ha diversos llenguatges algorísmics normalitzats, que hom pot fer servir per represen-tar algorismes, com els diagrames de flux, els diagrames de Nassi-Schneiderman o el pseudocodi , que s’estudien més endavant.
1.5 CODIFICACIÓ I IMPLEMENTACIÓ DELS ALGORISMES
La codificació dels algorismes, és a dir la creació del programa consta de dues fases: • L’algorisme s’ha de codificar en un determinat llenguatge de programació
• El codi s’ha de traduir a llenguatge màquina per tal que pugui ser “entes i executat per l’ordinador”
Un llenguatge de programació és un conjunt de símbols (el seu alfabet) i de regles per combinar-los (la seva gramàtica ) que serveix per expressar algorismes. Com passa en els llenguatges naturals les possibilitats d’expressió varien d’un llenguatge a altre.
Hi ha centenars de llenguatges de programa ció, i no sempre resulta fàcil respondre a la pregunta “quin és el millor llenguatge per a...?”. Alguns llenguatges es van crear per a la programació científica (FORTRAN, APL). Altres per a la gestio (COBOL) altres eren simplement de propòsit general (BASIC, C). A la pràctica l’elecció ve sovint condicio-nada per la disponibilitat i/o la moda del moment.
Ilustración 1 Alguns dels llenguatges de programació més coneguts
Un cop s’ha codificat l’algorisme en el llenguatge escollit s’ha de traduir a llenguatge
màquina, en un format comprensible per l’ordinador, o més exactament pel seu sistema
operatiu. Hi ha bàsicament dues formes de traducció i per tant de programes traductors: • Els interprets tradueixen el codi línia a línia. Això els sol donar força flexibilitat.
Com a contrapartida no són molt ràpids ja que si una instrucció s’ha d’executar un millio de vegades també es traduirà aquest nombre de cops. El llenguatge VBA de Microsoft o el lenguatge estadística R són interpretats.
• Els compiladors tradueixen tot el programa abans d’executar-lo. Això fa que puguin ser menys flexibles però alhora són més eficients. El Visual BASIC o el C són llen-guatges compilats.
Tradicionalment les funcions d’edició, traducció i execució dels programes es feien per separat. Avui en dia encara pot fer-se així, (per exemple fent programes en JAVA) però tendeix a fer servir entorns de programació que són programes des dels quals es poden fer totes les funcions sense distinció, és a dir es pot escriure el programa, compilar-lo i executar-lo des del mateix entorn.
1.6 ELEMENTS D'UN PROGRAMA
La implementació de l’algorisme en un llenguatge determinat dóna lloc a un programa. Els termes algorisme i programa es fan servir sovint com sinònims tot i no ser el mateix. • Els algorismes poden descriure’s en termes purament conceptuals o lògics sense
ha-ver de pensar en com s’implementen.
• Els programes estan lligats a la implementació concreta en un llenguatge de progr a-mació determinat. Per a això, a més a més dels algorismes calen altres elements.
De forma general podem considerar un programa com una seqüència lògica d'acci-ons, (instruccions), corresponents a un algorisme determinat, que manipulen un conjunt d'objectes (dades) per obtenir uns resultats (solució del problema).
En aquesta definició hi han intervingut dos elements : les instruccions i les dades. Això recorda la frase que sintetitza una de les més importants metodologies de programació : la programació estructurada :
Algorismes + Estructures de dades = Programes
Això ens duu a pensar que per aprendre a escriure programes cal que aprenguem sobre dos menes de coses:
• D'una banda hi ha els objectes dels programes, amb els quals representem les estructures de dades que són manipulades pels algorismes.
• D'altra banda hi ha les instruccions que representen les accions que es fa so-bre els objectes dels programes.
Ambdós conceptes són, de fet, més amplis que simplement estructures de dades o algo-rismes però l'esquema anterior té prou importància com per retenir-lo en una primera aproximació.
1.6.1 Objectes d'un programa
1.6.1.1 Constants, variables, funcions i expressions
Des d'un punt de vista més pràctic anomenem dada a qualsevol objecte amb el qual
opera un algorisme. Les dades poden ser de molts tipus, i aquests tipus de dades es
poden classificar segons molts criteris. Una classificació que està àmpliament admesa és la que els divideix en tipus simples i estructurats. Són dades de tipus simples aquelles que no es poden dividir en components més elementals. Equivalentment les dades que hom pot descompondre en components més elementals que elles mateixes s'anomenen estructurades.
Enter Real Numerics Caracter Lògic Definit per l'usuari No Numèrics SIMPLES Vectors Taules Estàtiques Piles Cues Llistes Arbres Dinàmiques Interns Seqüencial Directe Indexat Fitxers Bases de Dades Externs ESTRUCTURATS TIPUS DE DADES
Centrant-nos en els tipus de dades simples (les estructurades es van presentant en capí-tols successius) podem distingir :
• Enter. Valors d’un subconjunt finit dels nombres enters. El rang d’aquests dependrà del llenguatge amb el que hom codifiqui l’algorisme, així com de l’ordinador que es faci ser-vir. En són exemples els valors 12, -31 o 44567, si bé aquest darrer podria no ser repre-sentable en alguns casos.
• Real. Valors d’un subconjunt dels nombres reals, limitat en el tamany i la precisió pel llenguatge i l’ordinador. En són exemples 1.32, -2.4567, 154234.
• Lògic. Només poden prendre dos valors: VERITAT o FALS.
• Caràcter. Valors del conjunt finit de caracters que poden ser reconeguts i representats per l’ordinador.
• Cadena. Són sèries finites de caracters. Alguns llenguatges les consideren un tipus bà-sic simple, per la seva importància, mentre que d’altres les comnsideren dades estructu-rades. Una forma moplt usual de mirar-se les és com taules de caracters.
La major part dels llenguatges de programació disposen d’aquests tipus bàsics. En alguns no estan tots disponibles mentre que d’altres disposen de més tipus, alguns formats per subtipus dels anteriors com enters de poques o moltes xifres o reals de simple, doble o quadruple precisió (cada un dels quals és capaç de contenir un major nombre de xifres decimals).
Molts llenguatges permeten la creació de nous tipus, directament o per agrupació de va-lors senzills dels tipus predefinits. En aquest segon cas parlem de dades estructurades.
Quan hom estableix un tipus per una dada està determinant com estarà aquesta representa-da en memòria. Quant més flexible és el llenguatge més probable és que hom pugui tenir un tipus de dada “informàtic” diferent per a cada tipus de dada “real” diferent.
En un programa les dades es fan servir normalment en una de les formes següents: com constants, variables, expressions o funcions.
Una constant és un objecte el valor del qual roman invariable durant l'execució del pro-grama. Les constants poden ser literals o amb nom. En principi les constants poden ser dels mateixos tipus que les dades.
Una constant literal és un valor de qualsevol tipus que es fa servir en un punt de l’algorisme. Pot ser numèrica (P. ex : 100) o no (“VERITAT”, “CNN”,…).
Una constant amb nom té un valor concret i un nom que es fa servir sempre que es vol referenciar aquest valor.
PI = 3.141592, e = 2.718281.
Una variable és un objecte que pot modificar el seu valor un o més cops durant el des-envolupament de l’algorisme. S’identifica pel seu nom i el seu tipus, que pot ser qualse-vol dels disponibles i és el que determina el conjunt de valors que pot prendre la varia-ble.
X := 0 ( X comença valent 0)
X := X+1 ( X passa a valer 1)
Funcions La major part de llenguatges de programació incorporen funcions predefini-des, directament o través de “biblioteques”, amb les quals hom pot dur a terme les tas-ques més usuals. Les funcions, de forma similar a les de les matemàtitas-ques, solen rebre un o més arguments i retornen un valor que anomenem resultat.
Expressions. Les constants i les variables no apareixen aïllades sinó formant part d'ex-pressions. Una expressió és la representació d'un càlcul necessari per a l'obtenció d'un resultat. Una expressió es defineix, recurrentment, de la forma següent :
- Un valor és una expressió P. ex. : 1.25, "JOAN"
- Una constant o una variable són expressions P. ex : PI, E, X
- Una funció és una expressió
P. ex : Cos (X), Sqrt (25)
- Una combinació de valor, constants, variables, funcions i operadors que compleixen determinades regles de construcció és una expressió.
P. ex. : Cos (PI * X) + 1.25 N := 2 * PI * X
1.6.1.2 Operadors i operacions
Les expressions es construeixen fent operacions de tipus diversos entre els seus compo-nents. Els símbols que caracteritzen les operacions són els operadors.
Per aprendre a construir expressions cal saber quines operacions es poden fer i quin és l’ordre de prioritat entre els operadors, és a dir com es decideix quin operador actua primer quan n’hi ha més d’un que actua sobre un objecte.
Bàsicament distingirem tres grans grups d’operacions: Aritmètiques, relacionals o de comparació i lògiques.
1.6.1.3 Expressions aritmètiques
Són les expressions anàlogues a les fórmules matemàtiques. Les variables o constants que hi intervenen són numèriques(enteres o reals) i les operacions són les aritmètiques.
Operador Significat + suma - resta * multiplicació / divisió ^, ** exponenciació
div divisió entera mod mòdul (residu)
Els operadors es fan servir de la mateixa forma que en matemàtiques. Així per represen-tar l’expressió 2× −A 3 hom escriura “2 * A +3”, i per fer A2 posarem A*A o bé A**2 o A^2.
No tots els operadors es troben disponibles en tots els llenguatges, particularment div o mod que representen la divisió entera o el residu de la divisió poden estar absents (p.ex. en FORTRAN).
Els tipus de dades del resultat d’una operació ve determinat pel tipus de dades dels ope-rands i per l’operació realitzada.
Operador Significat Tipus dels operands
Tipus del resultat + suma Enter o real Enter o real - resta Enter o real Enter o real * multiplicació Enter o real Enter o real
/ divisió Real Real
^, ** exponenciació Enter o real Enter o real Div divisió entera Enter Enter Mod mòdul (residu) Enter Enter Per exemple si A, B, C són enters podem fer
A := B div C, o A := B mod C però no C := A/B
És a dir, no podem assignar un nombre real a una variable entera. En general funciona una conversió implicita de tipus sempre i quan sigui possible, és a dir el que sí podrem fer serà assignar un nombre enter a un real, i, serà com si li assignéssim el nombre real equi-valent, és a dir sense part decimal.
15 / 6 = 2.5, 15 div 6 = 2 15 mod 6 = 3 10.5/3.0 = 3.5 10 div 3
Regles de prioritat
Les expressions que tenen dos o més operands necessiten unes regles que permetin de-terminar en quin ordre s’avaluen. Això no passa només en la programació, sinó que tam-bé en els càlculs quotidians. Per exemple si hom ha d’avaluar l’expressió 3x2, amb x=10, tothom ( ?) farà 3*100, no 302. Ara bé si això ho ha de fer un ordinador caldrà especificar sense ambigüitats quina de les dues formes usar. Per a això hi ha establertes unes regles
de prioritat. Aquestes són :
1. Les expressions entre parèntesis s’avaluen en primer lloc
2. Les operacions aritmètiques dins d’una expressió segueixen el següent ordre de prioritat :
• Exponencial ^ o ** • *, /
• div, mod • +, -
Si dos operadors d’igual prioritat coincideixen es poden avaluar indistintament. 1.6.1.4 Expressions lògiques
Són expressions que poden valdre només “veritat” o fals i es formen combinant constants, variables o altres expressions lògiques mitjançant operadors lògics o operadors relacio-nals.
Operadors relacionals
Els operadors de relació serveixen per comparar dues expressions, retornant un valor de
fals o cert. Per exemple si X=1 i Y=2 :
(X+Y) < 10 és una expressió lògica que val cert “a” > “j” és una expressió lògica que val fals Els operadors de relació són els següents :
Operador Significat < Menor > Major = Igual <= Menor o igual >= Major o igual <> Diferent
Les operacions entre caracters depenen no rmalment del sistema de codificació utilitzat en cada cas.
Si hom compara dues expressions lògiques el valor fals és menor que el valor cert, és a dir que l’expressió (fals < cert) és certa
Operadors lògics
Els operadors lògics són no, i i o. Per comoditat al referir-nos-hi els indicarem amb els noms anglesos not, and i or. Els resultats d’actuar sobre expressions lògiques ve-nen donats per les taules de veritat dels operadors :
a not a
cert fals fals cert
a b a and b
cert cert cert fals cert fals cert fals fals fals fals fals
a b a or b
cert cert cert fals cert cert cert fals cert fals fals fals Regles de prioritat
Els operadors lògics i relacionals tenen uns ordres de prioritats que es combinen amb els dels aritmètics. La prioritat pot variar d’un a un altre llenguatge. Per exemple en els llen-guatges Visual Basic, C, o JAVA tenim :
Prioritat VisualBasic C Java
Més alta (Primera opera-ció executada) Més baixa (Última operació executada) ^(exponeciacio) - (negació) /, * \ (divisio entera) Mod (mòdul) +,- & (concatenació) <,>,=,<=,>=,<> Not And Or = (assignacio) ! (NOT) /,*, % (MOD), +,-, <,>,<=,>=, ==, != (igualtat) && (AND) || (OR) = (assignacio) ! (NOT) /,*, % (MOD), +,-, <,>,<=,>=, ==, != (igualtat) && (AND) || (OR)
1.6.2 Instruccions
Les instruccions no són només les indicacions de com s'efectuen les modificacions sobre les dades. Són els components bàsics tan dels algorismes com dels programes, motiu pel qual, quan parlem d’instruccions no fem distinció (o ens confonem amb facilitat) entre els uns i els altres. Podem diferenciar diferents tipus d’instruccions que es corresponen amb els diferents tipus d’accions que podem dur a terme sobre els objectes del progr ames. 1.6.2.1 (Instruccions de) declaració
En la majoria dels llenguatges de programació cal declarar explícitament els noms i els tipus de les constatnts variables amb què es treballa. Això es fa amb les instruccions de declaració que els assignen un nom i un espai de memòria inicials.
Per exemple si es vol treballar amb una constant PI i dues variables reals LONGITUD i AMPLADA la seva declaració seria:
• En llenguatge C++ const PI = 3.141592; float longitud, amplada; • En llenguatge Visual BASIC: Const PI = 3.141582
Dim longitud As Double, amplada As Double
1.6.2.2 Assignacions
L’assignació és l’acció que cal dur a terme per donar valor a una variable.
Una assignació consisteix en l'avaluació d'una expressió i l'emmagatzematge del seu va-lor en una variable. Sempre s'efectua seqüencialment i implica un moviment de dades dins la memòria i, potser, la realització d'operacions lògiques i/o aritmètiques.
El format general de l’operació és
nom de la variable := expressió L’operació
A := 5
indica que a la variable A se li ha assignat el valor 5.
Aquesta d’assignació és destructiva, és a dir després de l’assignació la variable pren el nou valor que se li ha assignat i perd l’antic.
És possible fer assignacions on aparegui la mateixa variable a ambdues bandes de l’assignació, del tipus :
N := N+1
Aquesta expressió indica que s’incrementa en 1 el valor de N.
En principi una assignació ha de donar a una variable un nou valor que sigui comp atible amb el seu tipus. Si per exemple X és un nombre i C un carácter no té sentit una assigna-ció del tipus :
X := C * 2
Exemples d’assignacions corresponents al programa de càlcul de volum de tumors • En llenguatge C++, VBA o java :
1.6.2.3 Entrades/Sortides
Les operacions d'entrada i sortida serveixen per a que el programa intercanviï informació amb un medi extern. En una operació d'entrada el programa assigna a una variable un valor emmagatzemat en un suport extern o generat per un perifèric. En una operació de sortida o escriptura el programa transfereix a un dispositiu de memòria massiva o a un perifèric el valor d'una variable.
Veiem exemples d’entrades i sortides corresponents al programa de càlcul de volum de tumors. A diferencia de l’assignació, molt similar en tots els llenguatges, les entrades o les sortides varien molt de llenguatge a llenguatge:
• En llenguatge C
// Entrada de la longitud i l'altura
printf("\nEntra la longitud del tumor "); scanf("%f",&longitud);
printf("\nEntra l'amplada del tumor "); scanf("%f",&lada);
// Sortida de resultats
printf("\nEl volum estimat del tumor es %f ",volum);
• En llenguatge Visual BASIC: 'Entrada de dades
longitud = Val(InputBox("Entra la longitud del tumor")) amplada = Val(InputBox("Entra l'amplada del tumor"))
'Sortida
MsgBox ("El volum estimat del tumor es: " + Str(volum))
1.6.2.4 Modi ficació del flux del programa. Instruccions i estructures de control Els algorismes es recorren, en principi, seqüencialment. Eventualment hom pot voler mo-dificar aquesta forma d'execució. Per fer-ho es disposa de les estructures de control que permeten mo dificar l'ordre en que es duen a terme les accions. Trobem dos tipus bà-sics d'estructures de control, les que serveixen per bifurcar el flux del programa i les que permeten repetir un procés un nombre fix o variable de vegades, es a dir les :
• Decisions o Bifurcacions • Cicles o Repeticions
• Condicionals • Incondicionals
Les instruccions de control són les que implementen les estructures de control i es des-criuen amb més detall en el capítol següent. Conceptualment és més ampla la idea d’estructura de control ja que un llenguatge determinat pot no tenir una instrucció deter-minada, però sí pot ser possible implementar la estructura de control corresponent. 1.6.2.5 Instruccions compostes (subrutines, procediments, funcions)
Sovint, a mida que augmenta la complexitat d'un programa, convé descompondre’l en parts més senzilles, fàcils d'executar separadament. Una subrutina és un fragment del programa que realitza una tasca concreta i pot ser cridat o activat des de una altra part del programa.
Un estudi més detallat de les ins truccions de control i les subrutines es presentarà en els capítols següents.
1.7 REPRESENTACIÓ DELS ALGORISMES
Per representar un algorisme se sol fer servir algun mètode que permeti independitzar-lo del llenguatge de programació escollit. Això permetrà de codificar-lo en el llenguatge que es desitgi. Per fer-ho cal algun mètode que sigui sistemàtic i objectiu i serveixi de bon pont entre les solucions obtingudes en l'etapa d'anàlisi i la codificació.
Hi ha diverses tècniques per descriure un algorisme. Entre elles podem indicar
• Els organigrames són eines gràfiques per a la representació d'algorismes. Estan for-mats per una sèrie de símbols units per fletxes. Els símbols representen accions i les fletxes l'ordre de realització d'aquestes.
• Els llenguatges de descripció d'algorismes o pseudocodi són llenguatges simi-lars al natural que permeten descriure l'algorisme de manera compacta orientada a la transcripció de l'algorisme a un llenguatge de programació donat.
• Els diagrames de Nassi-Scheiderman (N-S) són, com els organigrames, eines gràfi-ques pensats per a la representació d'algorismes seguint la metodologia de programa-ció anomenada programaprograma-ció estructurada. Aquest diagrames, que no s’estudiaran aquí es poden consultar a Alcalde y García (1992).
Sigui quina sigui la tècnica de representació de l'algorisme ha de tenir les propietats se-güents : • Senzillesa • Claredat • Normalització • Flexibilitat 1.7.1 Diagrames de flux
Els diagrames de flux (flowchart) són la tècnica més antiga i més coneguda, tot i que, actualment se'n fa menys ús. Consisteixen en diagrames que fan servir els símbols estàn-dard mostrats en la taula 2.1. i que tenen els passos de l'algorisme escrits dins de les cap-ses, unides per les línies, anomenades línies de flux que indiquen la seqüència en que s'han d'executar.
Símbols principals Funció
Terminal. Representa l'inici i el final d'un programa (o també una parada o interrupció).
Entrada/Sortida de qualsevol tipus de dades en la memòria des dels perifèrics.
Procés. Qualsevol operació que pugui originar canvi de valor, for-mat o posició de la informació emmagatzemada en la memòria.
Decisió. Indica operacions lògiques o de comparació entre dades i en funció d'aquesta determina quin de dos camins cal seguir.
Connector. Serveix per enllaçar dues parts qualsevulles d'un ordi-nograma que es trobin en la mateixa pàgina.
Connector per enllaçar dues parts d'un ordinograma entre pàgines diferents.
Crida a una subrutina o subprograma, és a dir a un mòdul indepen-dent del programa principal que rep una entrada provenint del grama, realitza una tasca determinada i retorna el control al pro-grama princ ipal.
Indicador de la direcció o línia de flux : indica el sentit d'execució de les operacions.
Línia connectora. Serveix d'unió entre dos símbols
Taula 1-1 : Principals símbols que intervenen en els diagrames de flux El diagrama de flux corresponent al programa de càlcul de la nòmina es mostra en la Fi-gura 2.1.
Inici Llegir NOM, N o m b r e d ' h o r e s ( N H ) P r e u H o r a ( P H ) S B : = N H * P H R E T : = 0 . 1 5 * S B S N : = S B - R E T Escriure NOM, SouBrut (SB), R e t e n c i ó ( R E T ) , S o u N e t ( S N ) F i
Figura 1-1 Diagrama de flux pel programa de càlcul de nòmines
1.7.2 El pseudocodi
Els pseudocodis o llenguatges d'especificació d'algorismes són, com el seu nom indica, llenguatges per a la descripció dels algorismes que procuren mantenir les propietats dels diagrames de flux de senzillesa, claredat, normalització i flexibilitat, però que, enlloc de basar-se en una notació gràfica es basen en paraules en llenguatge natural, preferent-ment en l'idioma propi del programador enlloc de l’anglès, base de molts dels llenguatges de programació.
Un inconvenient del pseudocodi és el menor grau de normalització que presenta respecte dels diagrames de flux. Per exemple, si hom consulta tres llibres moderns de programa-ció com són Alcalde (1995), Pérez (1996) o Joyanes (1996) troba en els tres la mateixa notació per als diagrames de flux, mentre que el pseudocodi utilitzat és molt més varia-ble.
1.7.2.1 Estructura general del pseudocodi El pseudocodi consta de dues parts principals :
• En la part primera o entorn s'hi posa el nom i l'entorn del programa, és a dir la in-formació de què es disposa, els tipus i noms de les variables i constants que es faran servir i la manera i lloc on s’emmagatzema
• En la part segona o procés central es descriu el procés pròpiament dit que corres-pon al desenvolupament ordenat i estructurat de l'algorisme. Aquesta segona part es correspon amb el diagrama de flux..
Tot pseudocodi ha de possibilitar la descripció dels diferents elements d’un algorisme, és a dir ha de permetre
• Representar els objectes del programes
Ø Declaració de constants, variables, o tipus de dades Ø Declaració de subprogrames
• Representar les diferents accions que es duen a terme en l’execució de l’algorisme mitjançant:
Ø Instruccions simples de procés com l’assignació, l’entrada o la sortida Ø Instruccions de modificació o control del flux de l’execució
Ø Instruccions compostes o subprogrames
Per tal de no patir de sobrecárrega d’informació anirem introduint els diversos compo-nents del pseudocodi a mida que haguem vist els conceptes que codifiquen.
1.7.2.2 Elements del pseudocodi (I) DESCRIPCIÓ DE L’ENTORN
Tipus de dades
• Tipus estandar o predefinits Ø Enter Ø Real Ø Caracter Ø Cadena Ø Logic Declaració d’objectes • Constants
CONST nom_constant = valor • Tipus de dades
TIPUS nom_tipus = definició del tipus • Variables
VAR nom_variable : nom_tipus
DESCRIPCIO DE L’ALGORISME Instruccions simples
Les accions simples o instruccions primitives són les que el processador executa de forma immediata.
• Assignació: Variable := Expressió • Entrada: LLegir Variable
• Sortida: Escriure Expressió
L’exemple següent mostra un pseudocodi corresponent a l’algorisme del càlcul de la nò-mina desenvolupat més amunt
1.8 DISSENY D'ALGORISMES
Com ja s'ha comentat al definir els algorismes, no hi ha cap procediment rigorós que permeti construir un algorisme que resolgui un problema donat. El disseny d'algorismes és doncs una tasca complexa on es poden seguir poques normes i on té molta importància la imaginació i l'experiència de la persona que el duu a terme. Observem els algorismes següents que s'encarreguen de decidir si un nombre N és parell.
Algorisme 1 2:Llegir N SI N = 2 ALESHORES escriure "és parell" FI SI SI N = 1 ALESHORES escriure "es senar" FI SI N := N-2 SI N > 0 ALESHORES ANAR A 2 FI SI PROGRAMA nomina1
** Els comentaris venen precedits d’un o més *
** Descripció: Programa que calcula la nòmina d'un treballador ** La primera part o entorn descriu les variables i constants ENTORN
CONST
nRETIRPF = 0.15 VAR
cNom : Cadena
nHores, nPreu : Enter
nSouBrut, nRetencio, nSouNet : Real
** La segona part conté les accions de què consta l'algorisme INICI ALGORISME
Llegir cNom, nHores, nPreu
nSouBrut := nHores * nPreu nRetencio := nSouBrut * nRETIRPF nSouNet := nSouBrut – nRetencio
Escriure cNom, nSouBrut, nRetencio, nSouNet FI ALGORISME
Algorisme 2 Llegir N M := 2 * PartEntera(N/2) SI M=N ALESHORES escriure "és parell" SI NO escriure "és senar" FI SI
L'algorisme 1 resol el problema en un nombre de passes que augmenta linearment amb la magnitud de N mentre que el 2 ho fa en un temps constant.
Això mostra la necessitat d'avaluar l'algorisme un cop dissenyat i, si es decideix que a-quest no és eficient, dissenyar-ne un de nou o optimitzar l'original introduint-hi modifica-cions que facin disminuir el temps necessari per resoldre el problema o reduir els recur-sos que es fan servir.
La complexitat de l'algorisme està relacionada, òbviament, amb la del problema que es vol resoldre. Hi ha un límit de complexitat per sobre del qual resulta molt difícil moure's independentment de l'experiència que es tingui. La ment humana està acostumada a treba-llar amb objectes que pot imaginar-se i a fer-ho en nombre reduït. Sempre hi haurà pro-blemes massa complexes per tenir-los al cap en conjunt.
Això dóna, però, una idea de com afrontar un problema complex. Podem anar descom-ponent el problema en subproblemes cada cop més senzills fins arribar a un nivell on siguem capaces de resoldre'l directament. Aquesta és, essencialment la idea del disseny descendent o "top down" que es descriu a continuació.
1.8.1 Disseny descendent
El mètode del disseny descendent consisteix en començar treballant a nivell abstracte per anar dividint el problema en les seves parts naturals. D'aquesta forma el problema a re-soldre es descompon en altres més senzills. A aquests darrers se'ls aplica el mateix pro-cediment fins arribar a problemes prou petits que podem resoldre directament.
Una forma d'entendre què es pretén amb aquest mètode consisteix en oblidar les possibi-litats reals de l'ordinador i suposar que aquest és capaç de dur a terme qualsevol acció. Vist així la resolució del problema serà senzilla. Les accions hipotètiques seran comple-xes i no tenen perquè coincidir amb les que és capaç de realitzar un ordinador real. En conseqüència la resolució de qualsevol problema serà senzilla. Un cop trobat un algoris-me basat en aquestes accions hipotètiques caldrà considerar individualalgoris-ment cada una d'aquestes accions i plantejar-les com nous problemes trobant algorismes que les resol-guin, fent servir si cal altres instruccions genèriques. Aquest procés s'anirà iterant, aug-mentant més i més el detall fins arribar a una solució factible del problema basada en accions que sí és capaç de realitzar un ordinador real. Això es coneix amb el nom de refinament de l'algorisme (stepwise refinement).
L'algorisme resolt d'aquesta forma es pot presentar com un arbre on cada node és un mò-dul, o problema, o solució hipotètica. Cada subarbre depenent d'aquest node es fa servir per a la resolució d'aquest subproblema. En particular el node del nivell més alt és el problema de partida. L'algorisme serà correcte si la solució que es dóna a cada nivell ho és.
El programa es podrà crear com un tot, tenint en compte l'algorisme complet, però una solució més raonable és dividir-lo en mòduls coincidents amb les parts naturals del pro-blema. En aquest cas es podria construir el programa d’avall a dalt creant primer
proce-diments que resolguin els mòduls de detall que, un cop comprovats seran utilitzats per altres procediments més generals fins a arribar a la creació del programa.
El diagrama següent mostra la descomposició de l'algorisme per al càlcul de la nòmina considerat més amunt.
Llegir NOM Entrada nom
Llegir NH, PH Entrada Hores i Preu Entrada de dades
SB = NH * PH Càlcul sou brut
Ret=SB * 0.15 Càlcul retencio
SN = SB - Ret Càlcul Sou net Càlcul dels sous
i retencions
Escriure NOM Imprimir nom
Escriure SB, RET, SN Imprimir sou brut, sou net i retenció Impressió nòmina Calcul i impressió de la
nòmina d'un treballador
1.9 RESUM DE DADES I INSTRUCCIONS EN PSEUDOCODI VBA I C 1.9.1 Tipus de dades simples
GENERAL PSEUDOCODI VBA C Numèriques Enters Reals Byte Integer Long Single Double Deci-mal short int signed long unsigned int unsigned short unsigned long float double long double No Numèr iques Caràcters Caracter Cadena String char
1.9.2 Constants i variables
GENERAL PSEUDOCODI VBA C
Constants CONST <Nom> = <Va-lor>;
Const <Nom> = <Valor> #define <NOM> <VALOR> const <tipus> <nom> = <valor> ; Variables VAR <Nom> : <tipus> ; DIM <Nom> as <tipus> <tipus> <nom>[=<valor>] ;
1.9.3 Estructura general d’un programa
GENERAL PSEUDOCODI VBA C
Capçalera Programa <Nom>; Sub <Nom>; main() Bloc de Decla-racions ENTORN Tipus <declaracions de tipus de dades> Constant <declaracions de con stants> Variable < declaracions de variables> Type <declaracions de tipus de dades> Const <declaracions de constants> DIM < declaracions de variables>
typedef <Nom d’un nou tipus>
#define <NOM> <V ALOR> [tipus] const nom = valor ;
<tipus > <nom de la va-riable>[= valor inici-al] ;
Bloc Executiu INICI ALGORISME [Codi executiu ] FI ALGORISME { } 1.9.4 Instruccions primitives. GENERAL Pseudoco-di VBA C
Instruccions d'Entra da Llegir INPUTBOX (Pet ició, ..) scanf([cadena de control], item1,…item2,…) getchar() Instruccions d'assignació Simple Composta := = = *=, /=, %=, +=, -=
Instruccions de Sortida Escriure MSGBOX (Missatge) printf([cadena de control], item1, -… item2,…)
1.10 EXERCICIS
1. Quin tipus de dades sembla més adient per representar cadascun dels conceptes se-güents:
a) El sou d’un treballador b) L’edat d’una persona c) El número de fills d) L’estat civil e) L’estat de caducat o no d’un producte f) El nº de telèfon g) Una frase h) El genoma humà 2. Quin és el resultat final de les operacions següents ?. En quin ordre s'han de dur a
terme ?
a) (((*5)**2 + 4 - 3 + (6*9))/2 b) 3+9**2 -((6/2)+5)
c) (5 < 0 AND 6 >= 7) OR (9 < (5 * 2) AND 3<> 3)
3. Donats els valors següents de les variables X := 1, Y := 4, Z :=10, i les constants PI=3.141592, i E=2.718281 avalueu les expressions següents
a) 2 * X + 0.5 * Y -1 / 5 * Z
b) PI * X ** 2 > Y OR 2 * PI * X <= Z c) E ^( X-1) / ( X * Z) / (X/Z)
d) "Don " + "Pepito" = "Don Pepito" OR "A"="a"
4. Construïu expressions correctes per a les fórmules següents a) ax2 bx c 0 + + ≥ b) 3 2 1 2 x y z xy z x y − − − + c) A B C D E F G H I J K − − − + + +
d) Si DN, MN, AN representen el dia, mes i any d'una persona i DA, MA, AA el dia, mes i any actuals, expressar si ha complert 18 anys.
5. Deduir els resultats que s’obtenen dels següents algorismes : var enter : x,y,z
inici x <- 5 y <-20 z <- x+y escriure (x,y) escriure (z) fi
6. Escriure un algorisme que llegeixi un nombre i calculi el seu quadrat
7. Dissenyar un algorisme que demani una quantitat de pessetes i retorni el seu equiva-lent en euros.
8. Dissenyar un algorisme que demani dues monedes, p.ex. Dolar i lliura esterlina, l’equivalència entre les dues i una quantitat en la primera moneda i retorni la quant itat inicial expressada en la segona moneda.
9. Escriure un algorisme per determinar l’àrea i el volum d’un cilindre les dimensions del qual es llegeixen des del teclat.
10. Escriure un programa que demani dos nombres enters, DIVIDEND i DIVISOR i en retorni el QUOCIENT i el RESIDU.
11. Escriure un programa que llegeixi un temps en segons i el retorni en format “ho-res:minuts:segons”.
2. ESTRUCTURA GENERAL D'UN PROGRAMA
2.1 PROGRAMES
Podem considerar un programa com una seqüència lògica d'accions (instruccions) que
manipulen un conjunt d'objectes (dades) per obtenir uns resultats (solució del pro-blema).
Qualsevol programa sol contenir dos blocs ben diferenciats :
• Bloc de declaracions on s'especifiquen els objectes que fa servir el programa. • Bloc d'instruccions format per les operacions que cal dur a terme per a la
realitza-ció de l'algorisme.
L'execució d'un programa consisteix en la realització seqüencial de les instruccions que el componen, des de la primera fins l'última, d'una en una. Aquesta seqüència pot ser alte-rada mitjançant instruccions de control de bifurcació, repetició o ruptura.
2.2 PARTS D'UN PROGRAMA
Les parts principals d'un programa estan relacionades amb els seus blocs. Esquemàtica-ment :
Programa
• Declaracions • Bloc d'instruccions
⇒ Entrada de dades
⇒ Procés (algorisme de resolució) ⇒ Sortida de resultats
L'entrada està formada per totes les instruccions que agafen les dades des d'un disposi-tiu extern i les emmagatzemen en la memòria central. Esquemàticament :
Dades d'entrada
Memòria central
El procés està format per les instruccions que modifiquen els objectes a partir del seu estat inicial (dades d'entrada) fins el final (resultats), deixant els objectes que el contenen disponibles en la memòria central. Esquemàticament :
Resultats Procés
Dades d'entrada
La sortida consta de totes les ordres i instruccions per donar format als resultats i con-trolar els dispositius de sortida. Esquemàticament :
Memòria central
Dades de sortida
L’estructura general d’un programa, en pseudocodi, és la següent. Cada llenguatge pot presentar variacions sobre aquesta estructura.
PROGRAMA NomPrograma ENTORN CONST NomConstant=valor ... TIPUS NomTipus={Definicio de Tipus} ... VAR NomVariable : NomTipus ... INICI ALGORISME ... ... ... FI ALGORISME
2.3 INSTRUCCIONS I TIPUS D'INSTRUCCIONS
Com ja hem comentat en el capítol anterior podem trobar diferents tipus d’instruccions : • De declaració • Primitives • I. d'entrada • I. d'assignació • I. de sortida • De control • Alternatives • Repetitives • De ruptura de seqüència • Compostes o subprogrames. 2.3.1 Instruccions de declaració
Serveixen per anunciar l’ús d'objectes en un programa indicant-ne el nom i, segons el llenguatge, el tipus. Poden ser obligatòries (com en Pascal o C) o no (com en BASIC). Les formes bàsiques de declaració, en pseudo codi, són les següents:
• Constants
CONST nom_constant = valor • Tipus de dades
• Variables
VAR nom_variable : nom_tipus
2.3.2 Instruccions primitives
Són les que el processador executa de forma immediata, és a dir no depenen més que de la seva aparició en el programa per ser executades. Poden ser d'entrada d'assignació o de sortida.
Les instruccions bàsiques d’assignació, en pseudocodi, són les següents: • Assignació: Variable := Expressió
• Entrada: LLegir Variable • Sortida: Escriure Expressió
Fent servir les instruccions de declaració i primitives ja és possible escriure programes senzills amb un flux lineal. El programa següent realitza el càlcul de l’àrea i el perímetre d’un cercle.
2.4 INSTRUCCIONS DE CONTROL
Són instruccions que no duen a terme cap feina concreta excepte l'avaluació d'expressi-ons, en general lògiques amb la finalitat de controlar l'execució d'altres instruccions o alterar l'ordre normal d'execució de les instruccions d'un programa. Serveixen per im-plementar les estructures de control descrites en el capítol anterior.
Hi ha tres grans grups d'instruccions de control : alternatives, repetitives i de ruptura de seqüència.
2.4.1 Instruccions alternatives
Són instruccions que controlen l'execució d'un o varis blocs d'instruccions, depenent de si es compleix o no alguna condició o del valor final d'una expressió. N'hi ha de tres me-nes : simple, doble o múltiple segons si la bifurcació del programa es pot produir passant per un, dos o més punts alternatius al principal. A continuació es mostra el pseudocodi i els diagrames de flux següents mostren aquests tipus d'instruccions.
Exemple 2-1 Algorisme executable linealment, sense canvis en la seqüència PROGRAMA Cercle1
ENTORN CONST
PI = 3.141592 VAR
nRadi, nLongitud, nArea: Real INICI
LLegir nRadi
nLongitud:=2*PI*nRadi nArea:=PI*Radi**2
Escriure nLongitud, nArea FI
2.4.1.1 Bifurcació simple
Considera només una condició que és una expressió lògica. Si aquesta es certa s’executaran les instruccions incloses en el bloc
Pseudo codi
SI CONDICIÓ
ALESHORES I1; I2;...;In FI SI Diagrama de flux Condició Acció SI NO
Figura 2-1 Bifurcació simple: SI... ALESHORES...
2.4.1.2 Bifurcació doble
Si l’avaluació de la condició produeix un resultat CERT s’executaran les instruccions del primer bloc si produeix un resultat FALS s’executaran les instruccions del segon bloc Pseudocodi
SI CONDICIÓ
ALESHORES I1; I2;...;In SI NO
J1; J2;...;Jm FI SI
Condició
Acció 1 SI
NO
Acció 2
Figura 2-2 Bifurcació doble: SI... ALESHORES... EN CAS CONTRARI... 2.4.1.3 Bifurcació múltiple
Davant d’un seguit d’opcions, expressades mitjançant una expressió alfanumèrica o nu-mèrica entera, s’executarà el bloc d’instruccions corresponent a l’opció que coincideixi amb el valor de l’expressió. Si cap ho fa s’executarà l’acció per defecte
Pseudocodi
SELECCIONAR PER EXPRESSIO
EN CAS QUE VALGUI V1 FER I1; I2;...;In1 EN CAS QUE VALGUI V2 FER J1; J2;....;Jn2 ....
EN CAS QUE VALGUI VK FER K1;...;Knk ALTRAMENT FER L1;L2;...;Lnl
FI SELECCIONAR
Diagrama de flux
Expressió
Acció 1 Acció 2 Acció N Alternativa a 1...N
...
V1 V2 VN Altres
Exemple. Bifurcació simple.
El programa següent calcula l’àrea d'un cercle a partir del radi. Per controlar si el radi que s'entra és o un nombre positiu fa servir una doble alternativa. El diagrama de flux és el següent : Treu MISSATGE D'ERROR Estructura IF..THEN..ELSE Calcula AREA INICI FI Entra RADI Treu RESULTAT Radi > 0? SI NO
Figura 2-4 Algorisme pel càlcul de l'area d'un cercle La codificació en pseudocodi dóna els llistats següents :
Exemple de bifurcació múltiple
El programa següent fa servir una bifurcació múltiple per decidir la qualificació que dó-na a un alumne en funció de la seva nota numèrica
Exemple 2-2 Ús d'una bifurcació simple en un càlcul PROGRAMA Cercle1
ENTORN CONST
PI = 3.141592 VAR
nRadi, nLongitud, nArea: Real INICI
LLegir nRadi
SI nRadi > 0 ALESHORES nLongitud:=2*PI*nRadi nArea:=PI*Radi**2
Escriure nLongitud, nArea SI NO
Escriure “El radi no pot ser negatiu” FI SI
FI
Exemple 2-3 Ús d’una bifurcació múltiple per convertir notes a qualificacions PROGRAMA PosaNota ENTORN VAR nNota: Real cQualificació: Cadena INICI LLegir nNota
SELECCIONAR PER nNota EN CAS QUE nNota < 5
cQualificacio = “Suspens”
EN CAS QUE (nNota >= 5) I (nNota <7) cQualificacio = “Aprovat”
EN CAS QUE (nNota >= 7) I (nNota <9) cQualificacio = “Notable”
EN CAS QUE (nNota >= 9) I (nNota <10) cQualificacio = “Excel.lent” EN CAS QUE (nNota =10)
cQualificacio = “Matricula d’honor” EN ALTRES CASOS
cQualificacio=”” FI SELECCIONAR
SI cQualificacio<>”” ALESHORES
Escriure “La qualificacio és :”,cQualifiacio SI NO
Escriure “Nota incorrecte” FI SELECCIONAR
2.4.2 Instruccions repetitives
Són les que controlen la repetició d'un conjunt d'instruccions anomenat rang mitjançant l'avaluació d'una condició que es realitza a cada repetició (repeticions condicionals) o mitjançant un comptador associat (repeticions incondicionals).
2.4.2.1 Repeticions condicionals
N'hi ha dues de principals. La instrucció MENTRE... REPETIR repeteix una instrucció mentre una condició sigui certa. La instrucció REPETIR ... MENTRE/ FINS QUE la re-peteix fins que una condició sigui certa. Són similars, i la diferència principal és que en el segon cas la instrucció s'executarà com a mínim un cop, mentre que en el primer, pot no haver-se d'executar mai.
Pseudocodi Ø Mentre
MENTRE CONDICIO FER I1; I2;...;In FI MENTRE Ø Repetir REPETIR I1; I2;...;In MENTRE/FINS CONDICIO Diagrames de flux Condició Acció Si No Acció Si Condició No
Repetir ... Mentre Repetir ... Fins
Figura 2-5 Diagrama de flux de "Mentre...Repetir" i "Repetir... Mentre / Fins que..."
Aquestes estructures s'utilitzen força per controlar l'entrada correcta d'informació o per repetir un mateix procés (per exemple el càlcul de la nòmina fins que l'usuari decideixi aturar-lo).
Exemple 2.4
El programa següent fa servir l'estructura MENTRE...REPETIR per controlar que, en l'exemple anterior de càlcul de l'àrea d'un cercle, el valor de radi que s'ha introduït sigui efectivament més gran de 0. Observeu que no es tracta d’anar repetint el càlcul sinó que el l’estructura “MENTRE... REPETIR” s’utilitza per entrar el radi tants cops com calgui fins que s’hi entri un valor positiu. Si el primer cop el radi ja es positiu el programa ni tan sols entrarà al bucle
º Treu resultat Calcula AREA INICI FI Entra RADI Entra RADI Estructura: WHILE... Radi < = 0? SI NO
Figura 2-6 Exemple de MENTRE...REPETIR
PROGRAMA AREACERCLE2 ENTORN
CONST Pi=3.14159 Real
VAR radi, arecercle, circumferencia : Real INICI ALGORISME
Llegir radi
MENTRE radi <=0 FER
Escriure El radi no pot ser un numero negatiu Escriure Entre un nombre positiu i prem INTRO Llegir radi
FI MENTRE
areacercle:= Pi * radi * radi circumferencia := Pi * 2 * radi Escriure areacercle, circumferencia FI ALGORISME
Una forma usual de fer servir els bucles condicionals és per repetir l'execució d'un pro-grama fins que l'usuari decideixi finalitzar. El propro-grama següent utilitza una estructura REPETIR...MENTRE per anar entrant nºs per promitjar fins que se n’hi entri un de nega-tiu
Exemple 2-5 Ús de REPETIR... FINS... per fer un nombre variable d'operacions
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.