You are on page 1of 96

Introducci a la programaci

Isidre Guix Miranda

Programaci estructurada i modular

Programaci estructurada i modular

Introducci a la programaci

ndex

Introducci ............................................................................................... Objectius .................................................................................................... 1. Conceptes bsics ................................................................................. 1.1. Programaci i programa ............................................................. 1.2. Algorismes..................................................................................... 1.2.1. Classificaci dalgorismes segons el flux dexecuci .... 1.2.2. Caracterstiques desitjables per als algorismes ............. 1.2.3. Representaci dalgorismes ............................................ 1.3. Cicle de vida duna aplicaci informtica ................................. 1.3.1. Anlisi prvia. Definici del problema............................ 1.3.2. Anlisi funcional ............................................................... 1.3.3. Anlisi orgnica. Disseny dels algorismes ...................... 1.3.4. Programaci de laplicaci informtica ......................... 1.3.5. Posada en marxa (installaci i explotaci) ................... 1.4. Tipus de programaci .................................................................. 1.5. Llenguatges de programaci ...................................................... 1.5.1. Classificaci dels llenguatges de programaci ............... 1.5.2. Entorns integrats de programaci .................................. 1.6. Introducci al llenguatge C i C++ ............................................ 1.6.1. Realitzaci del primer programa .................................... 2. Dades i operadors ............................................................................... 2.1. Memria de lordinador .............................................................. 2.2. Variables i constants ................................................................... 2.3. Tipus de dades esttiques simples ............................................ 2.4. Dades de tipus numric .............................................................. 2.4.1. Dades de tipus enter ........................................................ 2.4.2. Dades de tipus natural ..................................................... 2.4.3. Dades de tipus real ............................................................ 2.4.4. Operadors sobre el tipus numric ................................... 2.4.5. Declaraci de variables i constants de tipus numric .. 2.5. Dades de tipus carcter .............................................................. 2.5.1. Operadors sobre el tipus carcter ................................... 2.5.2. Declaraci de variables i constants de tipus carcter.... 2.5.3. Representaci de carcters ............................................. 2.6. Dades de tipus lgic .................................................................... 2.6.1. Operadors sobre el tipus lgic ......................................... 2.6.2. Declaraci de variables i constants de tipus lgic ......... 2.6.3. Operadors relacionals ......................................................

5 7 9 9 11 13 13 14 15 15 15 16 18 22 23 26 27 29 29 30 33 33 35 39 41 42 42 42 43 43 45 46 46 46 46 47 48 49

Programaci estructurada i modular

Introducci a la programaci

2.7. Expressions i ordre davaluaci dels operadors ....................... 2.8. Tipus de dades simples en el llenguatge C .............................. 2.8.1. Declaraci de variables i constants ................................ 2.8.2. Especificaci de valors constants ................................... 2.8.3. Tractament del tipus lgic ............................................... 2.8.4. Conversi de tipus ............................................................ 2.8.5. Constants simbliques ..................................................... 2.8.6. Introducci al precompilador C ...................................... 2.9. Tipus de dades simples definibles ............................................. 2.9.1. Tipus de dades enumerades ............................................ 2.9.2. Subtipus de dades en pseudocodi ................................... 2.9.3. Redefinici de tipus de dades en C ................................. 3. Instruccions seqencials bsiques .................................................... 3.1. Ordinogrames .............................................................................. 3.2. Instrucci dassignaci ............................................................... 3.3. Instruccions dentrada ................................................................ 3.3.1. Instruccions dentrada en pseudocodi i en ordinogrames ............................................................. 3.4. Instruccions de sortida ............................................................... 3.4.1. Instruccions de sortida en pseudocodi i en ordinogrames ............................................................. 3.4.2. Instruccions de sortida en llenguatge C ......................... 3.5. Instruccions dutilitzaci freqent ............................................. 3.6. Exemples d'utilitzaci d'instruccions seqencials bsiques ...

50 51 56 58 60 61 62 63 64 64 68 69 70 70 71 72 73 81 81 82 87 90

Programaci estructurada i modular

Introducci a la programaci

Introducci

Aquesta unitat didctica pretn introduir-vos en el mn de la programaci de manera que conegueu el que s un programa, el que vol dir fer un programa i els components mnims per realitzar un programa. Possiblement heu sentit expressions com dissenyar programes, desenvolupar aplicacions informtiques, llenguatges de programaci, codificaci i moltes altres ds freqent en mbits de programaci. Si no s aix, potser esteu entrant en el mn de la programaci amb mal peu, sense tenir gaire idea de la porta que esteu travessant. No interpreteu el pargraf anterior, en cas que us hagueu sentit alludits, com una sentncia desfavorable al seguiment que pugueu fer daquest crdit. Simplement pretenem que us adonssiu del que pot suposar a una persona que no ha vist mai un avi (cal tenir imaginaci!) iniciar uns estudis denginyeria aeronutica. Oi que pot suar una mica per tal de seguirlos amb aprofitament? En un principi li costar, per si t les capacitats adequades i hi dedica el temps necessari, sen sortir i tirar endavant. Doncs passa el mateix en el mn de la programaci. En el nucli dactivitat Conceptes bsics us pretenem situar en el mn de la programaci, introduint un seguit de conceptes que, a partir daquest moment, han de formar part del vostre llenguatge natural. En cas que els tingueu assolits us recomanem igualment el seguiment acurat del nucli, ja que s bastant com que persones que han fet incursions en el mn de la programaci tinguin coneixements esbiaixats de la realitat. En el nucli dactivitat Dades i operadors ens endinsarem en el mn de les dades esttiques simples que sutilitzen en la confecci dels programes: quines dades permeten representar i quines sn les operacions permeses. En primer lloc sefectua una visi genrica vlida per a la majoria de llenguatges de programaci i, posteriorment, es posen en prctica en el llenguatge C. Poca cosa podem fer si disposem de diverses possibilitats per representar les dades, per no tenim mtodes per gestionar-les. La programaci estructurada es fonamenta en tres tractaments bsics: seqencial, condicional i iteratiu. En el nucli dactivitat Instruccions seqencials bsiques sintrodueix el tractament seqencial i aix es poden posar en prctica els coneixements adquirits sobre les dades esttiques simples. Els dos tractaments restants

Programaci estructurada i modular

Introducci a la programaci

(condicional i iteratiu) els estudiarem en la unitat didctica Estructures de control. Per aconseguir els nostres objectius, heu de reproduir en el vostre ordinador i, si pot ser, en diverses plataformes, tots els exemples incorporats en el text, per a la qual cosa, en la secci Recursos de contingut del web daquest crdit, trobareu tots els arxius necessaris. Per a lestudi daquest crdit heu destar al corrent de la representaci interna de les dades.

Programaci estructurada i modular

Introducci a la programaci

Objectius

En acabar la unitat didctica, heu de ser capaos del segent: 1. Valorar els programes informtics com a eines de treball imprescindibles. 2. Reconixer i classificar els diferents tipus de llenguatges de programaci. 3. Dissenyar algorismes per resoldre problemes quotidians. 4. Assolir les diferents fases de desenvolupament de programes. 5. Fer servir adequadament lentorn de programaci del llenguatge C: ledici, la compilaci, el muntatge i lexecuci. 6. Fer servir adequadament els diferents tipus de dades esttiques simples per a les dades constants i variables en el disseny dalgorismes en pseudocodi. 7. Dissenyar algorismes seqencials en pseudocodi per resoldre problemes que permetin una soluci seqencial. 8. Identificar i aplicar la representaci grfica per a lestructura seqencial. 9. Aplicar lestructura seqencial i els tipus de dades simples en la codificaci de programes en llenguatge C. 10. Fer servir de manera adequada el depurador del llenguatge C per al seguiment de lexecuci dels programes.

Programaci estructurada i modular

Introducci a la programaci

1. Conceptes bsics

En iniciar qualsevol aprenentatge acostuma a ser necessari la introducci dun seguit de conceptes bsics i aquest fet es mant en el camp de la programaci. Aix, s important introduir conceptes com programaci, programa, algorisme, fases de desenvolupament, tipus de programaci. Tamb shan de conixer llenguatges de programaci com el llenguatge C.

1.1. Programaci i programa


Qu s un ordinador? El podem definir com una mquina que ens permet aconseguir el tractament de dades duna manera automtica. Per lordinador no s intelligent i, per tant, no executar el tractament esperat si ning no lha preparat per a aquesta tasca. Aquesta preparaci sanomena programaci i t com a resultat final el programa que, quan s executat per lordinador, permet aconseguir lautomatisme que es pretenia.

Intelligncia artificial En lactualitat els ordinadors no tenen capacitat de pensar. Potser heu sentit parlar de la intelligncia artificial. No caigueu en paranys. Els ordinadors sn mquines creades per lsser hum i noms poden fer les feines per a les quals han estat programats.

Un programa s una seqncia dordres, comprensibles per lordinador, que permeten la realitzaci duna tasca determinada. La programaci s la seqncia de passos que ha defectuar el programador per obtenir un programa.

Exemple de programaci Considerem el tpic exemple que es proposa a tot estudiant de programaci en la seva primera classe. Volem ensenyar a alg (persona o mquina) com ha de fer una truita francesa de dos ous. Som-hi! Tots tenim clar qu cal fer. Els passos sn els segents: a) Cal preparar un plat, una forquilla, una paella, loli, la sal, els dos ous i tenir un fog. b) Es trenquen els dos ous dins el plat sense que hi caigui cap tros de closca. c) Es posa una mica de sal sobre els rovells. d) Es bat la clara i els rovells amb la forquilla. e) Cal posar un rajol doli a la paella i escalfar-la en el fog. f) Quan loli estigui calent, saboca el contingut del plat a la paella. g) A mesura que el contingut va quallant, es plega sobre si mateixa amb lajut de la forquilla. h) Cal treure la paella del foc quan el contingut hagi quallat del tot. B, ja tenim la truita feta. Bon profit!

Programaci estructurada i modular

10

Introducci a la programaci

A lexemple anterior hem elaborat un programa que permet aconseguir un objectiu final: fer una truita francesa de dos ous. Aqu tenim el resultat final, el programa, per per arribar-hi hem hagut de seguir, en lordre segent: 1) Una fase danlisi, pensant detalladament tot el que suposa fer una truita; 2) Una fase de disseny, lligant de manera adequada totes les idees aparegudes a la fase danlisi; 3) Una fase descriptura, redactant de manera ordenada i clara la seqncia de passos que cal seguir. Els passos anteriors constitueixen, a grans trets, el procs de programaci i, el resultat final, la redacci dels passos que van des de la a) fins a la h), s el programa en llengua catalana, de manera que qualsevol persona amb suficient coneixement daquesta llengua el podria seguir per aconseguir fer una truita francesa de dos ous. Ara b, el resultat final, tal com el tenim, no serveix per a una persona sense coneixements de llengua catalana. Daquest exemple cal que poseu una atenci especial en uns termes importants en el desenvolupament de programes: fase danlisi, fase de disseny, fase descriptura i llengua. Per acabar, tamb hauria de quedar clar quan t sentit desenvolupar un programa, ats que fer-ho no s simple. Bsicament, s pertinent en dos casos: 1) Quan lexecuci del programa sha de fer un gran nombre de vegades, s a dir, quan el programa permet automatitzar el desenvolupament de tasques, complexes o no, de carcter repetitiu, com s el cas duna cadena de muntatge, la confecci de nmines dels treballadors, etc. 2) Quan el programa serveix per assegurar lexecuci, unes poques vegades, duna tasca complexa i feixuga, en la qual sha dassegurar fiabilitat i rapidesa, com s el cas del control duna nau espacial. s a dir, no t cap sentit desenvolupar un programa per resoldre un problema que ens trobarem poques vegades o que s de molt fcil resoluci. En tal cas, t ms sentit fer el tractament manual que calgui que no pas realitzar el programa corresponent. !

Programaci estructurada i modular

11

Introducci a la programaci

1.2. Algorismes
Hem de ser rigorosos i comenar a conixer i a utilitzar la terminologia correcta en lmbit de la programaci. Una aplicaci informtica, que no s altra cosa que un conjunt de programes enllaats de manera convenient, t per objectiu fer ms gils els processos i disminuir el nombre de fases de desenvolupament que shi esmercen. Per aix, la realitzaci o el disseny de programes comporta el seguiment metdic dun procs dexecuci. La soluci del problema que planteja lusuari ha de passar necessriament per la realitzaci duna seqncia daccions determinades. Aquesta seqncia constitueix un algorisme.

Un algorisme s un mtode de resoluci dun problema en un nombre finit de passos.

Usuari Usuari s el terme que sutilitza per referir-se a la persona que fa servir una aplicaci informtica amb la intenci daconseguir un resultat final.

Algorisme no significa la resoluci dun problema particular per una situaci particular, sin la resoluci de tots els problemes del mateix tipus, sigui quina sigui la situaci de partida i preveient les alternatives dactuaci convenients segons les diferents situacions que es puguin presentar. !
Exemple dalgorisme En lexemple de la preparaci duna truita a la francesa de dos ous, el programa per a la seva realitzaci es basa en un algorisme o seqncia finita de passos (preparar els ingredients, trencar els dos ous, posar una mica de sal, batre la clara...) que shan de seguir, el qual s utilitzable a qualsevol lloc. s a dir, lalgorisme no depn de la cuina on shagi de fer la truita, ni de com sn els ous (rossos o blancs), ni de quina paella fem servir, ni de com s la forquilla. Lalgorisme ens serveix per fer una truita mentre tinguem tots els ingredients. Ara b, continuant amb el mateix algorisme, cal remarcar que no preveu certes situacions que es poden donar, com s el cas de qu cal fer si manca algun dels ingredients: plat, forquilla, paella, oli, sal, dos ous i fog. Sembla clar que hi ha ingredients que no hi poden faltar: els ous i el fog. Per els altres potser sn substitubles o eliminables. Expliquem-nos: una paella es podria substituir, per exemple, per un altre tipus dutensili. La forquilla segur que s substituble. La sal ja s ms difcil, per el programa davant la detecci de la manca de sal potser podria preguntar al futur comensal si li va b sense sal i en cas afirmatiu continuar amb la preparaci de la truita o avortar el procs en cas contrari. Segur que els professionals hostalers ens en podrien impartir llions i llions, de com fer truites a la francesa.

Exemple de processador

Anomenem processador tota entitat capa dexecutar un algorisme donat. El conjunt deines necessries per executar un algorisme constitueix lentorn de lalgorisme.

En lexemple de la preparaci duna truita a la francesa, tota persona que spiga llegir catal, per seguir les instruccions i fer-la, i que disposi de les eines (o els ingredients) necessries pot ser un processador adequat per aconseguir la truita.

Programaci estructurada i modular

12

Introducci a la programaci

Entorn i algorisme estan estretament lligats, ja que la majoria de vegades el disseny de lalgorisme depn de lentorn, s a dir, de les eines posades a disposici del processador.
Entorn i algorisme: el cas dun expenedor de begudes Imaginem una mquina de begudes que rep, per part del comprador, un conjunt de monedes i una sollicitud de compra (la beguda desitjada). Lentorn de lalgorisme que sha dexecutar est format pels actes executats pel comprador (el conjunt de monedes introdudes i la sollicitud de beguda) i per lestoc de begudes i monedes que hi ha a la mquina (per tal de poder servir la beguda demanada i de retornar el canvi que correspongui). s prou clar que les decisions que ha dexecutar la mquina depenen de lentorn. Per tant, lalgorisme dissenyat ha de tenir en compte totes les situacions possibles. El seu disseny ha estat en funci de lentorn. Per qu no comenceu a pensar com es dissenya lalgorisme que executa la mquina de begudes?

Les mquines expenedores sn un bon exemple de ls dalgorismes en la vida real.

Per tant, un algorisme s la descripci exacta i sense ambigitat de la seqncia de passos elementals que cal aplicar per, a partir de lentorn del problema, trobar la soluci cercada. Perqu un algorisme sigui complet haur de preveure totes les alternatives lgiques possibles que les diferents combinacions dentorns possibles puguin presentar. Cadascun dels passos dun algorisme sanomena sentncia o instrucci.

Una instrucci s una combinaci de paraules, dades i smbols que, obeint la sintaxi prpia del llenguatge, sn utilitzats per lordinador per dur a terme una acci determinada.

Si ens centrem en el cas que el processador sigui un ordinador, lentorn del problema est constitut per un conjunt dinformacions que ha de fer servir lordinador i que anomenem dades. Anomenem dada tota informaci que fa servir lordinador.

Amb els conceptes de dada i instrucci introduts ja podem dir que tot algorisme ha de complir dues condicions fonamentals: 1) Descripci, mitjanant instruccions, de les accions (passos) que shan dexecutar. 2) Descripci, mitjanant declaracions i definicions, de les dades que sn manipulades per aquestes instruccions. Un programa s lexpressi dun algorisme en un llenguatge entenedor per a lordinador.
En aquest crdit treballarem amb un llenguatge teric (pseudocodi) i un llenguatge real (C).

No hi ha un llenguatge nic i universal per descriure els algorismes.

Programaci estructurada i modular

13

Introducci a la programaci

1.2.1. Classificaci dalgorismes segons el flux dexecuci


Segons el flux dexecuci, els algorismes es poden classificar en: 1) Lineals o seqencials, en qu les instruccions sexecuten en el mateix ordre en qu shan escrit.
Exemple dalgorisme lineal En lexemple de la preparaci duna truita a la francesa de dos ous, lexecuci ordenada de tots els passos per preparar-la fa que lalgorisme sigui lineal.

2) Cclics o iteratius, en qu un grup de lnies sexecuta un nombre finit de vegades.

Exemple dalgorisme cclic En lexemple de la preparaci duna truita a la francesa de dos ous, hi ha una fase que consisteix a esperar que loli sigui calent. En realitat, aquesta espera no s cap altra cosa que lexecuci continuada dun cicle semblant a esperar cinc segons mentre loli no sigui calent. s a dir, esperem cinc segons i mirem si loli s calent. Si no s aix tornem a esperar cinc segons, i aix successivament fins que arriba un moment que podem assegurar que loli s calent. Si no ho pogussim assegurar, el programa mai no sortiria daquest cicle i shauria quedat en un cicle infinit.

3) Condicionals o alternatius, en qu hi ha certes condicions que provoquen lexecuci de fases diferents del programa depenent del fet que es compleixin o no aquestes condicions.

Exemple En lexemple de la preparaci duna truita a la francesa de dos ous, podem tenir previst diferents alternatives per al cas en qu manqui algun dels ingredients: plat, forquilla, paella, oli, sal, dos ous i fog. s a dir preveient les diferents situacions que es poden donar millorarem lalgorisme. En aquests casos estarem davant una situaci condicional, en qu lalgorisme variaria la seva execuci en funci de la situaci detectada o de les respostes efectuades per lusuari.

En realitat s molt difcil trobar un algorisme que es classifiqui exactament en un dels tres casos anteriors. El que acostuma a passar s que un algorisme s una seqncia lineal daccions, algunes de les quals sn iteratives i daltres, condicionals. !

1.2.2. Caracterstiques desitjables per als algorismes


Quan es dissenya un algorisme sha de procurar que tingui les caracterstiques segents: finit, s a dir, cal assegurar que finalitza;

Programaci estructurada i modular

14

Introducci a la programaci

llegible, o sia, que estigui escrit de manera que sigui fcil de llegir i entendre; portable, de manera que pugui ser installat en diferents tipus dordinador; modificable, ja que aix les modificacions i actualitzacions necessries per a una nova situaci del programa seran fcils de fer; eficient, perqu ocupi tan poc espai com sigui possible i aix saprofiti al mxim la memria de lordinador i saconsegueixi que el temps dexecuci sigui mnim; estructurat, situaci que saconsegueix utilitzant de manera adequada les regles de la programaci estructurada; modular, de manera que el programa, anomenat programa principal, pugui estar subdividit en mduls o programes ms petits, si tenen ra de ser per si mateixos, anomenats subprogrames, cadascun dels quals realitza una part del programa principal.

1.2.3. Representaci dalgorismes


Hi ha diferents representacions utilitzades per confeccionar algorismes. Coneguem-les: 1) Diagrames de flux o ordinogrames, basats en smbols grfics per a la seva resoluci. 2) Taules de decisi, que permeten tabular totes les possibles situacions que es poden presentar en el problema i les corresponents accions que cal prendre per a cadascuna daquestes.
Exemple de taula de decisi Considerem els criteris de clcul de descompte que aplica una determinada empresa als seus clients. La taula 1 en mostra la taula de decisi. Per normal general, als clients que tenen una antiguitat superior als 3 anys, sels aplica un 15% de descompte si el seu volum de compra anual supera els 6.000 _, un 10% de descompte si el seu volum de compra supera els 3.000 _ (per no els 6.000 _) i un 5% de descompte altrament. En canvi, als clients amb antiguitat igual o inferior a 3 anys, sels aplica un 10% de descompte si el seu volum de compra anual supera els 6.000 _, un 5% de descompte si el seu volum de compra supera els 3.000 _ (per no els 6.000 _) i es queden sense descompte altrament. Hi ha, per, uns clients seleccionats com a especials, per als quals no es t en compte lantiguitat i als quals saplica un 20% de descompte si el seu volum de compra anual supera els 6.000 _ o un 15% de descompte en cas contrari. La taula mostra la taula de decisi corresponent a la situaci plantejada.

Programaci estructurada i modular

15

Introducci a la programaci

Taula 1. Taula de decisi per al clcul del descompte a aplicar als clients duna empresatol taula5 El client s especial Volum anual de compres > 6.000 _ Condicions Volum anual de compres <= 6.000 _ Antiguitat superior als 3 anys Antiguitat igual o inferior als 3 anys Volum anual de compres > 3.000 _ i <= 6.000 _ Volum anual de compres <= 3.000 _ Descompte del 20% Accions Descompte del 15% Descompte del 10% Descompte del 5% Sense descompte X X X X x X X X S S S S No S S No S S No S S No S S No S S Np S S

3) Pseudocodi, que permet descriure un algorisme utilitzant una barreja de frases en llenguatge com, instruccions de llenguatge de programaci i paraules clau que en defineixen les estructures bsiques. El mtode que sutilitza en programaci estructurada s el pseudocodi. Els altres, en lactualitat, estan fora ds pel que fa al disseny genric dalgorismes. No obstant aix, a vegades es fan servir per acompanyar lalgorisme en pseudocodi i ajudar a la seva comprensi.

1.3. Cicle de vida duna aplicaci informtica


El desenvolupament duna aplicaci informtica comprn les fases que esmentem a continuaci: 1) Anlisi prvia. Definici del problema. 2) Anlisi funcional. 3) Anlisi orgnica. 4) Programaci de laplicaci informtica, amb les subfases codificaci, traducci, muntatge i verificaci. 5) Posada en marxa (installaci i explotaci). Una vegada posada en marxa laplicaci (i a vegades, fins i tot, abans) pot donar-se el cas que la problemtica inicial per la qual es va desenvolupar laplicaci hagi canviat i, per tant, calgui efectuar retocs a laplicaci informtica per tal dadaptar-la als nous requeriments. Estem, en aquest cas, davant la problemtica defectuar una adaptaci a una aplicaci informtica (finalitzada o no) i per fer-ho, cal tornar a aplicar les

Programaci estructurada i modular

16

Introducci a la programaci

cinc fases sobre el material ja existent (no es tracta de partir de zero!). Apareix, per tant, un cicle que fa que laplicaci informtica es trobi en contnua evoluci. Sacostuma a anomenar cicle de vida de laplicaci informtica. !

1.3.1. Anlisi prvia. Definici del problema


La definici del problema s el primer pas del procs que cal seguir per resoldrel. Cal tenir molt clar qu s el que sha de resoldre. I aix implica una molt bona comunicaci amb lorganitzaci que encarrega la realitzaci del programa i amb els usuaris finals, establint amb precisi i claredat els objectius que es volen assolir.

1.3.2. Anlisi funcional


Una vegada el problema est definit, cal estudiar-ne la resoluci, cercant les diferents opcions i escollint-ne la millor, la qual caldr valorar en termes deficincia i de costos de realitzaci. En aquesta fase sacostuma a: parlar amb tots els usuaris implicats (des del director o gerent fins al conserge, si s el cas) de manera que aconseguim tenir tots els punts de vista davant el problema; donar totes les solucions possibles amb un estudi de viabilitat, considerant els costos econmics (material i personal); proposar al client, futur usuari de laplicaci, una soluci dentre les possibles, i ajudar-lo a prendre la decisi ms adequada; trencar la soluci adoptada en parts independents, anomenades unitats funcionals, per facilitar el tractament per separat en la fase segent. Totes les fases de desenvolupament dun programa sn importants, per aquesta s, potser, la fonamental, ja que s la fase en qu es prenen les decisions. !

Els analistes funcionals sn les persones que desenvolupen aquesta fase danlisi funcional.

Lanlisi no s responsabilitat del programador. Aix no implica, per, que no hagi de ser-ne coneixedor. Al contrari, ja que el programador haur de desenvolupar programes a partir danlisis efectuades per analistes.

Programaci estructurada i modular

17

Introducci a la programaci

1.3.3. Anlisi orgnica. Disseny dels algorismes


En aquesta fase, destinada als analistes orgnics, es dissenya lalgorisme de tractament corresponent a cada unitat funcional definida en la fase danlisi funcional. Dissenyarem els algorismes en pseudocodi i, puntualment, amb taules de decisi i amb ordinogrames. El pseudocodi s un llenguatge que fem servir per escriure lalgorisme duna manera entenedora, utilitzant paraules del nostre llenguatge. Ara b, hi ha algunes paraules clau dobligada utilitzaci i que es consideren reservades, s a dir, nhi ha que no es poden fer servir per a cap altra cosa que per a ls que tenen assignat. En la realitzaci dun algorisme en pseudocodi se segueixen les regles que detallem: ! 1) Les paraules clau sescriuen diferenciant-les de la resta de paraules dalguna manera com, per exemple, subratllant-les. En el cas de material imprs, sacostuma a fer amb negreta i amb el tipus de lletra courier. Linformtic, quan fa els seus algorismes en paper, acostuma a utilitzar el subratllat. Per tant, ja sabeu qu us toca: heu de subratllar les paraules reservades del llenguatge en qesti. 2) En els algorismes sutilitza el concepte de bloc per agrupar un conjunt dinstruccions del mateix nivell. Doncs b, el text interior dun bloc, lescriurem sagnat respecte del marge de la capalera. Daquesta manera es poden distingir visualment els diferents blocs que cont el programa. 3) Tota instrucci sha dacabar amb un punt i coma (;). Un programa en pseudocodi ha de tenir, com a mnim, lestructura segent:
programa <nom> s <cos del programa principal> fiprograma
En aquest material farem servir la lletra negreta per a les paraules clau.

Paraules reservades Les paraules reservades no sn una caracterstica exclusiva del pseudocodi. Tot llenguatge de programaci tamb en t.

Les expressions emmarcades entre els smbols < i > indiquen que corresponen a paraules que pot decidir el programador, sense fer servir cap de les paraules reservades. B, fem el tpic programa que sacostuma a dissenyar en laprenentatge de tots els llenguatges i que consisteix a aconseguir que lordinador ens doni el missatge Hola, mn!.

Programaci estructurada i modular

18

Introducci a la programaci

Per aconseguir aix, necessitem una manera dobligar lordinador que faci el que nosaltres volem, que no s altra cosa que donar un missatge. s a dir, volem que lordinador sexpressi, ja sigui parlant (per laltaveu o per mdem) o escrivint (per la pantalla o la impressora). Qualsevol daquestes formes dexpressi saconsegueix mitjanant el que en programaci sanomena instrucci de sortida. A partir dara disposarem en pseudocodi de la instrucci de sortida segent:
escriure ("<text del missatge>");

que suposarem que treu el missatge per la pantalla. De moment no ens ha de preocupar el fet dutilitzar altres canals de sortida com ara la impressora, laltaveu, etc. Per tant, ja podem escriure lalgorisme:
programa primer_programa s escriure ("Hola, mn!"); fiprograma

Enhorabona! Ja heu escrit el vostre primer algorisme en pseudocodi.

1.3.4. Programaci de laplicaci informtica


Una vegada tenim definit lalgorisme (o sigui, escrit en pseudocodi), cal transmetrel a la mquina. I aix ho farem amb un conjunt de passos (codificaci, traducci, muntatge i verificaci) que shan de seguir de manera ordenada. Cadascun dels passos segents ha destar ben documentat, per tal que qualsevol informtic, fins i tot el mateix programador quan ja ha passat un cert temps, pugui retocar laplicaci si s necessari. Penseu que en un programa informtic sautomatitza una forma dactuaci, la qual cosa implica reflectir un cert coneixement. Per el coneixement no s nic i, per tant, entendre el que un altre informtic o conjunt dinformtics va decidir en una situaci pretrita s molt difcil. La documentaci s l'nica manera de garantir aquest coneixement.

Linformtic Un informtic s un artista que aconsegueix que una mquina tingui un determinat comportament, per, a diferncia de lartista tpic, no es pot permetre la llicncia de no documentar-ho. Ha de deixar la seva obra de tal manera que un altre artista pugui continuar-la, reformar-la, retocar-la, etc.

Codificaci. Llenguatges de baix i alt nivell La fase de codificaci consisteix a reescriure lalgorisme en un llenguatge especial que puguem fer entendre a lordinador. Per a aquest objectiu tenim els llenguatges de programaci.

Programaci estructurada i modular

19

Introducci a la programaci

Els llenguatges de programaci es poden classificar en dos grans apartats: llenguatges de baix nivell i llenguatges dalt nivell.

Un llenguatge de baix nivell s un llenguatge que pot ser ents directament per lordinador.

Per a nosaltres, el catal s un llenguatge de baix nivell, ja que lentenem directament i no necessitem cap traducci. En canvi, per a la immensa majoria de nosaltres, el xins no s un llenguatge de baix nivell, ja que necessitem alg que ens el tradueixi si volem entendre el missatge que vehicula. Els ordinadors, conjunt de ferralla i components electrnics, noms entenen impulsos elctrics (hi ha corrent o no nhi ha). Dit en altres paraules, lordinador sap treballar amb dos estats, cosa que sha convingut a representar amb zeros i uns.

El llenguatge mquina s un llenguatge consistent en combinacions de 0 i 1 agrupades en octets.

Bits i octets (bytes) Un bit (de smbol ms habitual b) s l'acrnim de l'angls binary digit i s la unitat d'informaci mnima utilitzada en informtica. Un bit pot tenir noms dos estats mtuament exclusius, habitualment representats amb els dgits 0 i 1 o els valors vertader i fals. L'octet o byte (de smbol ms habitual B) s l'acrnim de l'angls binary term i s'utilitza principalment per designar la quantitat de memria de l'ordinador i dels sistemes d'emmagatzematge. En ordinadors antics s'havia arribat a definir bytes de 6, 7 o 9 bits. Per a la fi es va arribar a l'acord de considerar un byte com un conjunt de 8 bits, i per aix, en el nostre idioma, tamb s conegut com a octet.

Escriure un programa en llenguatge mquina s feina de Els errors sn a lordre del dia. Per aquest motiu shan incorporat al mn de la programaci uns altres llenguatges de baix nivell.

El llenguatge assemblador s un llenguatge constitut per un conjunt de smbols mnemotcnics que representen cadascuna de les operacions que el processador s capa dexecutar.

Un programa escrit en llenguatge assemblador es tradueix a llenguatge mquina amb eines subministrades pels mateixos fabricants del maquinari. Treballar amb els llenguatges de baix nivell implica conixer larquitectura del processador en qu es basa lordinador i, com que de processadors

Programaci estructurada i modular

20

Introducci a la programaci

nhi ha de diferents caracterstiques, codificarem un programa que noms serviria per a ordinadors amb processador igual o equivalent. Aquest fet provoca que no es programi en llenguatges de baix nivell.

Els llenguatges dalt nivell sn llenguatges propers al llenguatge hum i independents del tipus de processador.

Aix ja ens agrada ms. Podrem escriure programes en llenguatge habitual per a nosaltres. Sabeu angls, oi? Doncs us agradar saber que els llenguatges dalt nivell acostumen a ser propers a langls.
Editor de textos Ah! Un comentari: per escriure el programa caldr utilitzar un editor de textos. La majoria de llenguatges dalt nivell ja en porten un dincorporat en el seu entorn de treball. Per si no us agrada podeu fer servir el que millor us sembli. Noms heu de tenir una precauci: enregistrarlo en format textual.

Angls i informtica Dominar langls tcnic s imprescindible per a un informtic, ja que s lidioma vehicular principal de la programaci.

Traducci. Entorns intrprets i entorns compilats Els programes escrits en llenguatges dalt nivell sn fcils de llegir, modificar i transportar entre diferents plataformes. Ara b, aquestes caracterstiques sn possibles perqu hi ha unes eines que tradueixen el programa escrit en llenguatge dalt nivell al llenguatge mquina de la plataforma que correspongui.

El programa font s el resultat de la codificaci dun algorisme en un llenguatge dalt nivell.

A partir del programa font hi ha dues possibilitats de treball, en funci de lentorn de programaci: interpretat i compilat. !

Un entorn de programaci interpretat tradueix el codi font a codi mquina i lexecuta, instrucci per instrucci. Un entorn de programaci compilat tradueix tot el codi font a codi mquina i obt un nou programa anomenat programa objecte.

Qestions de vocabulari A vegades es parla del codi font en lloc de programa font. Es pot anomenar codi objecte el programa objecte. Podem parlar de programes compiladors o simplement compiladors per referir-nos a programes traductors.

El procs de compilaci, dut a terme per un programa traductor, avalua la sintaxi emprada en tot el codi font, i, en cas derrors, dna els corresponents avisos, sense arribar a generar el codi objecte. En tal situaci, el programador ha de revisar el codi font i repetir el procs fins a aconseguir el codi objecte.

Programaci estructurada i modular

21

Introducci a la programaci

Lavaluaci de la sintaxi emprada en un procs interpretat sefectua instrucci per instrucci durant lexecuci del programa. Per tant, i ats que un programa pot tenir fluxos de caire alternatiu, pot succeir que un error de sintaxi no aparegui fins que no es produeixi una determinada situaci que provoqui lexecuci duna part no executada mai abans. Aix s un inconvenient de lentorn interpretat davant lentorn compilat. Un altre inconvenient s la prdua de temps que comporta traduir el programa a cada execuci. Cal distingir els errors de compilaci dels errors dexecuci. Quan obtenim el codi objecte ens assegurem que no hi hagi errors de compilaci. Hi pot haver, per, errors detectats en temps dexecuci, que sn produts per situacions no controlades pel programador, s a dir, per errors en el disseny de lalgorisme.

Generaci dexecutables. Execuci amb runtime Els entorns compilats sagrupen en dues categories en funci de la forma dexecuci: generaci de codi executable o execuci amb runtime.

Un programa muntador s un programa que genera un programa executable a partir del(s) programa(es) objecte(s).

Qestions de vocabulari A vegades es parla de codi executable en lloc de programa executable.

El terme angls utilitzat per referir-se al programa muntador s linker. Aquest terme es fa servir colloquialment en expressions com ara lincar laplicaci, error de lincatge, etc.; per el terme catal que correspon a link s enlla, i el verb s fer un enlla. El procs de muntatge avalua la coherncia dels diferents codis objectes muntats juntament amb les llibreries necessries per a lexecuci del programa. En cas derrors, dna els corresponents avisos, sense arribar a generar el codi executable. En tal situaci, el programador ha de revisar el(s) codi(s) font i repetir el procs fins a aconseguir el codi executable. Un programa executable estaria format per diversos programes objectes en cas que shagus dissenyat la soluci al problema subdividida en diferents apartats (unitats funcionals o equivalents).
Linker El terme angls utilitzat per referirse al programa muntador s linker. Aquest terme es fa servir colloquialment en expressions com ara lincar laplicaci, error de lincatge, etc.; per el terme catal que correspon a link s enlla, i el verb s fer un enlla.

Podem imaginar-nos una llibreria com un conjunt deines que els programes necessiten per a la seva execuci i que depenen del llenguatge de programaci emprat. Per aix, en la fase de muntatge sajunten codi(s) objecte i llibreries.

Programaci estructurada i modular

22

Introducci a la programaci

Entenem per programa executable un arxiu (en llenguatge mquina) que es pot executar des del sistema operatiu en qesti. Per exemple, un programa executable en el sistema operatiu DOS el distingim perqu t extensi .exe o .com. En altres sistemes, com per exemple Unix (Linux), no s necessari que tinguin cap extensi especial. Hi ha, per, alguns entorns compilats que no tenen la possibilitat de generar un programa executable. En tal cas parlarem dexecuci amb runtime.

Una execuci amb runtime consisteix a executar un programa objecte per mitj dun programa que s el conductor de lexecuci, el qual sanomena runtime.

Ja hem comentat que per a lentorn intrpret, no hi ha fase de compilaci que generi codi objecte i, per tant, lexecuci parteix del mateix codi font. En aquest cas tamb hi ha un runtime que condueix la traducci i lexecuci. Lexecuci dun compilat amb runtime s molt ms rpida que lexecuci dun interpretat (que tamb necessita un runtime), ja que la traducci ja est feta. A ms, en el compilat ja hem assegurat una sintaxi correcta. Verificaci. Depuraci Una vegada tenim el programa per ser executat (sigui quin sigui lentorn) cal comprovar que el programa actua tal com shavia decidit que havia dactuar.

Un joc de proves s un conjunt de situacions que permet provar la bona actuaci del programa. Aquest conjunt ha de ser complet en el sentit que ha dabastar totes les possibilitats reals.

s a dir, primer caldr dissenyar i preparar el joc de proves per, posteriorment, executar el programa per a les diferents situacions preparades, de manera que sen pugui comprovar el bon funcionament en tot moment. En cas que sempre vagi b, perfecte! Podem estar ms o menys segurs de la fiabilitat del programa. La realitat s que sempre sescapen situacions no previstes (aix vol dir una anlisi defectuosa del problema). Aquestes es detectaran, quin remei!, en la fase dexplotaci. Qu hem de fer quan veiem que no funciona? Cal cercar on s el problema, que pot residir en: a) disseny del(s) algorisme(s), b) codificaci incorrecta (per amb sintaxi correcta, ja que ha compilat).

Programaci estructurada i modular

23

Introducci a la programaci

A vegades lerror es troba de manera senzilla amb un simple seguiment de lalgorisme dissenyat. Per a vegades, la majoria de les vegades, lerror costa de trobar perqu ens entossudim que lalgorisme s correcte. En aquest cas no hi ha cap altre remei que comenar la depuraci del programa. Un programa depurador s un programa que permet: ! executar un programa instrucci per instrucci i veure qu passa desprs de lexecuci de cada una; obtenir el valor de les dades abans i desprs dexecutar una instrucci; modificar el valor de les dades durant lexecuci; interrompre o aturar lexecuci del programa en qualsevol punt. La majoria dentorns de programaci actuals disposen deines de depuraci. Si no s el cas, el programador no tindr ms remei que activar manualment la depuraci, mtode que consisteix a intercalar instruccions de seguiment (missatges per on passa el programa, valors de les dades, etc.) enmig del codi del programa, per tal de fer el seguiment de lexecuci i localitzar la causa del problema.

El terme angls equivalent a depurador s debugger.

1.3.5. Posada en marxa (installaci i explotaci)


Una vegada es t el programa final (executable o objecte o font, tot dependr de lentorn), cal installar-lo seguint les instruccions de lentorn i les directrius de ladministrador del sistema informtic i, una vegada installat, posar-lo en funcionament: fase dexplotaci. Sembla que arribem al final del procs, per encara ens queda una acci: formar lusuari. Cal tenir pacincia. Pensem que nosaltres hem estat molt de temps pensant en el problema i treballant en la soluci. Per a nosaltres s la soluci normal, la tenim assumida, per per a lusuari no s necessriament la soluci desitjada o esperada. Per tant, caldr tenir una bona dosi de pacincia per explicar el funcionament de laplicaci. La formaci de lusuari ha danar acompanyada, sempre, de la guia o manual de lusuari. No ha de ser un llibre de difcil lectura; haurien de ser els apunts que li permetessin moures rpidament per laplicaci, tractant totes les possibilitats duna manera rpida i clara.
Ladministrador del sistema informtic s la persona que t la responsabilitat, entre daltres, dassignar espai a les diferents aplicacions que shan dexecutar. Administrador del sistema informtic

1.4. Tipus de programaci


Hi ha diferents tipus de programaci depenent dels mtodes i de les tcniques emprades. Aix, podem parlar de programaci estructurada, programaci modular, programaci orientada a objectes, programaci concurrent, programaci funcional, programaci lgica, etc.

Recordem que lobjectiu daquest crdit, tal com indica el nom, s la programaci estructurada i modular.

Programaci estructurada i modular

24

Introducci a la programaci

Cadascun daquests tipus de programaci ha comportat laparici de llenguatges de programaci dalt nivell especfics. 1) Programaci estructurada La programaci estructurada va nixer a finals dels seixanta (1960) com a soluci als problemes que presentava la tcnica de programaci utilitzada fins al moment, la qual no tenia cap nom explcit, per que es va anomenar programaci no estructurada a partir de laparici de la programaci estructurada. Un programa no estructurat s un programa procedimental, en el qual les instruccions sexecuten en el mateix ordre en qu han estat escrites i utilitza la instrucci goto (anar) per passar el control a qualsevol altra part del programa. En executar-se una instrucci goto, la seqncia dexecuci del programa continua a partir de la instrucci indicada pel goto. Daquesta manera, per entendre com funciona un programa s necessari simularne lexecuci i aix vol dir que en la majoria dels casos es fa molt difcil comprendre la lgica del programa. Observem la segent seqncia dinstruccions corresponents a un possible algorisme no estructurat per a un robot dedicat a rentar els utensilis emprats en una cuina, amb la responsabilitat de deixar els plats en una pila de plats i la resta dutensilis rentats en una pila genrica:
1. agafar_objecte; 2. posar_sab; 3. passar_el_fregall_per_lobjecte; 4. si_queda_brutcia_goto_a_la_instrucci_2; 5. si_lobjecte_s_un_plat_goto_a_la instrucci_9; 6. posar_objecte_a_la_pila_genrica; 7. si_queden_objectes_per_netejar_goto_a_la_instrucci_1; 8. goto_a_la_instrucci_11; 9. posar_objecte_a_la_pila_de_plats; 10. goto_a_la_instrucci_7; 11. netejar_la_pica; 12. informar_de_final_de_procs;

Oi que es fa una mica difcil fer el seguiment daquestes 12 instruccions? I aix que coneixem lobjectiu final de les 12 instruccions! Ara imagineuvos que arriba a les nostres mans un codi similar per amb mils de lnies i hem de fer-ne el seguiment per tal defectuar-hi alguna modificaci o cercar-hi un error... Vaja, que potser s millor llenar-ho i tornar-ho a fer partint de zero! La programaci estructurada utilitza nicament tres tipus dinstruccions: seqncia, instrucci condicional i instrucci repetitiva, amb les quals es pot desenvolupar qualsevol programa informtic i no permet la utilitzaci dinstruccions de transferncia incondicional com goto. !

Programaci estructurada i modular

25

Introducci a la programaci

a) La seqncia indica que les instruccions es llegiran de principi a fi. b) La condicional indica que segons una condici sexecutar un conjunt dinstruccions o un altre. c) La repetitiva indica que un conjunt dinstruccions, sota una certa condici, es podria repetir un determinat nombre de vegades. A ms, es recomana utilitzar el sagnat en les instruccions imbricades en altres per facilitar el seguiment i la comprensi. ! Observem la versi estructurada de lalgorisme per al robot que renta els utensilis emprats en una cuina:
mentre hi_ha_objectes_bruts fer agafar_objecte; mentre hi_ha_brutcia_a_lobjecte fer posar_sab_a_lobjecte; passar_el_fregall_per_lobjecte; fimentre si lobjecte_s_un_plat llavors posar_objecte_a_la_pila_de_plats; sin posar_objecte_a_la_pila_genrica; fisi fimentre

Oi que s ms llegible i comprensible que la versi no estructurada? Els principals avantatges de la programaci estructurada sn: Els programes sn ms fcils dentendre. Es redueix la complexitat de les proves a efectuar. Augmenta la productivitat del programador. Els programes queden ms ben documentats internament. Es redueixen els costos de manteniment (modificacions a efectuar). El principal inconvenient daquest tipus de programaci s que sobt un nic bloc de programa, el qual pot esdevenir molt gran, fet que provoca una dificultosa manipulaci. Per aix se soluciona amb la programaci modular. 2) Programaci modular La programaci modular consisteix a dissenyar el programa per parts, anomenades mduls. Un programa dissenyat de forma modular cont un mdul principal que coordina les crides a la resta de mduls. A la vegada, cada mdul t un programa que pot cridar altres mduls. Els diferents programes de cada mdul estan desenvolupats utilitzant la programaci estructurada.

Programaci estructurada i modular

26

Introducci a la programaci

3) Altres tipus de programaci La programaci estructurada i modular s un tipus de programaci bsica per poder abordar qualsevol altre tipus de programaci. Enumerem, per, a continuaci, altres tipus de programaci importants, amb una breu descripci en la qual apareixeran termes desconeguts i que no podem abordar en aquest moment, ja que estem a les beceroles del coneixement de la programaci informtica, per que s important que comencin a sonar. a) Programaci orientada a objectes Aquest tipus de programaci apareix com levoluci lgica de la programaci estructurada i modular i s una tcnica que augmenta considerablement la velocitat de desenvolupament dels programes grcies a la reutilitzaci de codi (objectes). Lelement principal en aquesta programaci s lobjecte, que podem veure com un compartiment que cont dades i el codi per gestionar-les. Altres caracterstiques molt potents de la programaci orientada a objectes sn el polimorfisme i lherncia. b) Programaci concurrent Aquest tipus de programaci sutilitza quan hem de realitzar diverses accions a la vegada. Sacostuma a utilitzar per controlar els accessos dusuaris i de programes a un recurs de forma simultnia. c) Programaci funcional s un tipus de programaci caracteritzada per permetre la declaraci i crida de funcions dins daltres funcions. d) Programaci lgica Sacostuma a utilitzar en intelligncia artificial i es basa en el clcul de predicats, teoria matemtica que permet aconseguir que un ordinador pugui donar solucions intelligents basant-se en fets i regles lgiques.

1.5. Llenguatges de programaci


En general, un llenguatge s un conjunt sistemtic de regles per comunicar idees, que es basa en un conjunt de smbols. A nosaltres ens interessa, ara mateix, els llenguatges de programaci.

Un llenguatge de programaci s una notaci formal per descriure algorismes que han de ser executats en un ordinador.

Programaci estructurada i modular

27

Introducci a la programaci

Els llenguatges de programaci sn utilitzats pels programadors per expressar un procs mitjanant el qual un ordinador resoldr un problema. Un llenguatge de programaci permet al programador especificar de forma precisa sobre quines dades un ordinador ha doperar, com han de ser emmagatzemades i transmeses i quines accions ha de prendre sota una variada gamma de circumstncies. Tota notaci formal t dos components: sintaxi i semntica. a) La sintaxi s un conjunt de regles formals que especifiquen la composici dels programes basant-se en un conjunt de lletres, dgits i altres carcters. Aix, exemples de regles sintctiques poden ser: Cada parntesi obert ha de portar el corresponent parntesi tancat en les expressions aritmtiques. Tota instrucci ha de finalitzar amb el smbol punt i coma. b) La semntica especifica el significat de qualsevol programa sintcticament vlid, escrit en un determinat llenguatge de programaci. Les regles semntiques permeten traduir els programes al codi mquina perqu siguin executats per lordinador. Aix, per exemple, les regles semntiques indicaran que una instrucci sintcticament correcta com la segent:
mentre hi_hagi_objectes_bruts fer agafar_objecte_brut; netejar_objecte_brut; fimentre

consisteix en la repetici ininterrompuda del conjunt format per les dues accions agafar_objecte_brut i netejar_objecte_brut sempre que hi_hagi_objectes_bruts.

1.5.1. Classificaci dels llenguatges de programaci


Al llarg de la histria de la programaci informtica han aparegut diversos llenguatges de programaci pensats, cadascun, per cobrir unes determinades necessitats i per donar servei a diferents tipus de programaci i adequats a les arquitectures dordinadors del moment. Es poden establir diferents classificacions dels llenguatges de programaci: 1) Segons el nivell de comunicaci programador mquina

Programaci estructurada i modular

28

Introducci a la programaci

Aquest punt de vista es refereix a la proximitat entre el llenguatge utilitzat pel programador i el llenguatge que entn la mquina. Tenim: a) Llenguatge mquina b) Llenguatges assemblador: Assembler c) Llenguatges imperatius dalt nivell: Fortran, Pascal, C, C++, Ada, d) Llenguatges declaratius dalt nivell: Prolog, Lisp Ja som coneixedors de la distinci entre llenguatge mquina, llenguatge assemblador i llenguatge dalt nivell. Ens ve de nou, per, la distinci, dins els llenguatges dalt nivell, entre llenguatges imperatius i llenguatges declaratius.

Els llenguatges imperatius es caracteritzen per indicar com fer les coses, mentre que els llenguatges declaratius es caracteritzen per indicar qu cal fer.

Els llenguatges declaratius sn molt propers a les matemtiques i a la lgica, mentre que els llenguatges imperatius sn ms propers al raonament hum. Com a exemple podem pensar en un programa que resolgui el clcul del nombre factorial dun valor enter no negatiu. Un llenguatge declaratiu podria resoldre el problema dient:
factorial(0) = 1 factorial(n) = n*factorial(n-1)

s important notar que lordre de les instruccions s fonamental, doncs: la primera instrucci possibilita que el procs finalitzi, la segona instrucci possibilita que per a un nombre superior a 0 (si fos zero ja ho resol la primera instrucci) es torni a repetir el procs. En canvi, un llenguatge imperatiu resoldria el problema dient com sha defectuar el clcul de forma propera al raonament hum:
anar multiplicant 1 * 2 * 3 * ... fins arribar a n

2) Segons el domini daplicaci. Sota aquest punt de vista tenim: a) Llenguatges genrics (per a qualsevol mbit): C, C++, Ada, Java b) Llenguatges cientfics: Fortran, APL, Pascal

Programaci estructurada i modular

29

Introducci a la programaci

c) Llenguatges comercials: Cobol, Visual Basic d) Llenguatge de bases de dades: T-SQL, PL/SQL e) Llenguatge dintelligncia: Prolog, Lisp 3) Segons el tipus de programaci. Sota aquest punt de vista tenim: a) Llenguatges imperatius: C, Pascal, Fortran b) Llenguatges orientats a objectes: C++, Simula, Smalltalk, Eiffel c) Llenguatges funcionals: Lisp, Scheme, ML, Haskell d) Llenguatges de programaci lgica: Prolog e) Llenguatges concurrents: Ada
Llenguatge ADA

4) Segons el desenvolupament histric. Sota aquest punt de vista tenim: a) Llenguatges de primera generaci: Fortran (la versi apareguda el 1957) b) Llenguatges de segona generaci: Algol 60 c) Llenguatges de tercera generaci: Pascal, C d) Llenguatges posteriors a tercera generaci: Llenguatges orientats a objectes: Java, C++ Entorns visuals: Java, Visual Basic, Visual C, Borland C Sacostumen a considerar llenguatges de tercera generaci aquells que donen ple suport a la programaci estructurada i modular. La majoria daquests permeten gestionar sistemes gestors de fitxers per emmagatzemar les dades. Posterior als llenguatges de tercera generaci van anar apareixent llenguatges especialitzats en entorns visuals i/o en lorientaci a objectes. Cal esmentar tamb lexistncia dels anomenats entorns de 4a. generaci que corresponen a sistemes gestors de bases de dades que incorporen diferents llenguatges per a tractaments especialitzats (llenguatge per a tractament de pantalles, llenguatge per a tractament dinformes, llenguatge per a tractament de mens...).
Aquest llenguatge apareix el 1983 i el seu nom s en honor de Lady Augusta Ada Byron (1815-51), filla del poeta angls Byron, considerada la primera dona programadora dordinadors pel seu treball en la mquina de Babbage.

1.5.2. Entorns integrats de programaci


Es parla dentorn integrat de programaci quan el programador treballa amb una eina que li permet editar els programes font, invocar els programes traductor, muntador i depurador i, fins i tot, executar els programes resultants. O sigui, un entorn integrat de programaci no s altra cosa que lacumulaci de les diferents eines de programaci necessries per facilitar la feina

Programaci estructurada i modular

30

Introducci a la programaci

al programador. Per totes les eines es poden utilitzar directament des del sistema operatiu amb la sintaxi adequada. s a dir, es pot treballar sense leina. Noms necessitarem un editor de textos per escriure el programa font i podrem aconseguir els programes objecte i executable per mitj dordres directes en lmbit del sistema operatiu. Aix implica conixer la sintaxi adequada, i la veritat s que la majoria de programadors treballen sempre en entorns integrats de programaci, tamb anomenats entorns de desenvolupament.

1.6. Introducci al llenguatge C i C++


El llenguatge C va nixer en els laboratoris Bell dAT&T i ha estat estretament vinculat al sistema operatiu Unix, ja que el desenvolupament daquest sistema (per Brian W. Kernighan i Dennis M. Ritchie) i el del llenguatge C (inicialment implantat per Dennis M. Ritchie) varen ser realitzats en parallel. El sistema Unix, el compilador de C i la majoria de programes i eines dUnix varen ser escrits en C sense utilitzar gaireb el llenguatge assemblador.
El llenguatge C C s un llenguatge de programaci dutilitzaci general, caracteritzat perqu s concs i t un modern flux de control i estructures de dades, aix com un ric conjunt doperadors. No s un llenguatge de molt alt nivell ni gran i no est especialitzat en cap rea particular daplicaci. En canvi, la seva carncia de restriccions i la seva generalitat el fan ms efica i convenient, per a moltes tasques, que altres llenguatges suposadament ms potents. B. W. Kernighan; D. M. Ritchie (1985). El Lenguaje de programacin C (prefaci). Aqu trobem una primera referncia a bibliografia procedent dHispanoamrica. s clar que langls s imprescindible per a tot informtic, ja que la immensa bibliografia original s escrita en aquest idioma. Hi ha, per, algunes obres tradudes al castell i, en temes informtics, s molt probable que es tracti dedicions hispanoamericanes. En aquests casos sha danar amb compte amb alguns termes utilitzats a les traduccions, gens naturals en el nostre entorn.

El llenguatge C s el llenguatge que farem servir en lordinador per a laprenentatge de la programaci estructurada i modular.

Avui en dia est molt de moda el llenguatge C++, resultant de levoluci del C per tal de permetre la programaci orientada a objectes. C++ s un llenguatge que mant la compatibilitat amb lestndard C i que ha adoptat totes les caracterstiques de la programaci orientada a objectes. El llenguatge C (i tamb C++) porta el compilador corresponent, que permet generar, a partir del programa font, el programa objecte que s utilitzat pel programa muntador per aconseguir el programa executable definitiu. Els programes compiladors de C i C++ sn diferents, cosa evident ja que el llenguatge C++ incorpora ms conceptes que el llenguatge C. Per, fins i tot, la traducci que efectua el compilador C++ per un programa escrit ntegrament amb C (sense utilitzar conceptes exclusius de C++) s difeCompte amb els compiladors En aquest crdit programarem amb lestndard C, per lestudiant podr fer servir un entorn C o C++ indistintament, tenint en compte una nica consideraci: els compiladors sn diferents.

Programaci estructurada i modular

31

Introducci a la programaci

rent de la traducci efectuada pel compilador C. I aqu heu de posar una atenci especial si treballeu en un entorn C++. ! Un programa font escrit en llenguatge C ha de tenir un nom i s molt recomanable que la seva extensi sigui .c. Un programa font escrit en llenguatge C++ ha de tenir un nom i s molt recomanable que la seva extensi sigui .cpp. Hi ha entorns de programaci que obliguen a utilitzar les extensions .c i .cpp i utilitzen l'extensi per deduir quin s el compilador a emprar. Ara s el moment dinstallar i comenar a utilitzar un entorn de programaci en C efectuant una lectura detallada de tota la informaci que lentorn aporta. Aix, cal tenir clar: Com sescriu un programa font. Com es compila un programa font per obtenir el programa objecte. Com es munta un(s) programa(es) objecte per obtenir el programa executable. Com es detecten errors de traducci o muntatge. Com sinvoca el programa depurador.

Extensi .c En aquest crdit, tot el codi es desenvolupa amb lestndard C. Per tant, tingueu-ho present a lhora danomenar els programes font amb la corresponent extensi .c.

1.6.1. Realitzaci del primer programa


El disseny del programa en pseudocodi amb el qual fem que lordinador digui Hola mn! s:
programa primer_programa s escriure ("Hola, mn!"); fiprograma

Com es codifica lanterior programa en C? El resultat final seria una cosa semblant a:
void main(void) { printf ("Hola, mn!"); }

!!
Trobareu larxiu u1n1p01.c en la secci Recursos de contingu del web d'aquest crdit a Codi font en C.

Tot programa en pseudocodi ha danar entre les paraules clau programa i fiprograma. En llenguatge C, tot programa sidentifica per la paraula clau main i el contingut del programa, que constitueix el que anomenarem bloc, ha danar entre les claus {}. Aix noms s una primera aproximaci de com ha de ser un programa escrit en C. Observem que la paraula main apareix acompanyada de valors per davant i per darrere... De moment us demanem que feu un acte de fe i us ho cregueu. Ms endavant ja nexplicarem el significat.

!!
Per installar diversos entorns de programaci en C i poder escriure i executar un primer programa, vegeu, en la secci Recursos de contingut del web daquest crdit, Utilitzaci de l'entorn de programaci Anjuta per programar en C i Utilitzaci de lentorn de programaci Turbo C++ 1.01.

Programaci estructurada i modular

32

Introducci a la programaci

Veiem, tamb, que el terme equivalent a escriure del pseudocodi s, en C, printf. No s lnica manera. Ara s el moment ideal per escriure aquest programa a lordinador en lentorn de programaci en C que correspongui per tal darribar a assolir el codi executable. Cal, potser, que ens posem dacord amb la nomenclatura que utilitzarem per referir-nos a tots els exemples daquest llibre. Els programes fonts en llenguatge C els anomenarem: uXnYpZZ.c. Aix vol dir: Unitat didctica X Nucli activitat Y Programa ZZ (01, 02, 03...) Com ja sabeu, el crdit est estructurat en unitats didctiques i aquestes en nuclis dactivitat. Aix doncs, el programa anterior lanomenem u1n1p01.c Sou vosaltres qui escriviu el programa i li doneu nom. En la fase de traducci, lordinador genera el programa objecte i lanomena amb el mateix nom canviant lextensi (u1n1p01.obj en Windows / u1n1p01.o en Linux). Per fi, el programa muntador genera el programa executable, seguint la mateixa mecnica de canviar lextensi (u1n1p01.exe en Windows / u1n1p01 en Linux). Com observeu, les extensions utilitzades depenen dels sistemes operatius. ! s natural anomenar els programes objecte i els programes executables amb el mateix nom (variant-ne lextensi), ja que aix s ms fcil identificar els diferents arxius que tenim en els disquets. Els entorns integrats de programaci acostumen a treballar daquesta manera, s a dir, el programador dna nom al programa font, suposem nom.c, i lentorn, quan executa les fases de traducci i muntatge, genera els corresponents compilat i executable mantenint el nom i utilitzant lextensi que correspongui.

Programaci estructurada i modular

33

Introducci a la programaci

2. Dades i operadors

Ens proposem introduir el concepte dels tipus de dades, bsic per a la gesti de les dades en els nostres programes, veient-ne diverses classificacions i entrant a fons en el coneixement dels tipus de dades esttiques simples, en pseudocodi i en el llenguatge C.

2.1. Memria de lordinador


El terme dada indica tota informaci que fa servir lordinador en les execucions dels programes. ! s a dir, lexecuci dun programa consisteix generalment a gestionar dades que han de residir en alguna part de lordinador. Fem ara una simulaci del funcionament de lordinador quan sexecuta un programa. Vosaltres sou lordinador i nosaltres som els usuaris. Suposem que teniu un programa que permet preguntar a lusuari a travs dun missatge de pantalla el seu nom i que es queda esperant que lusuari mitjanant el teclat lintrodueixi. Posteriorment lordinador ofereix un missatge de benvinguda personalitzant el missatge amb el nom de lusuari. Au, som-hi. Nosaltres, que som els usuaris, executem dins vostre (feu dordinador) el programa anterior. La seqncia de passos de la situaci que es produeix s: 1) Vosaltres pregunteu: Quin s el teu nom? i espereu la nostra resposta. 2) Nosaltres responem: Isidre. 3) Vosaltres dieu: Benvingut, Isidre. Hi esteu dacord? Esperem que s. Doncs b, aquest funcionament tan normal en la nostra vida quotidiana s el que hem daconseguir en lordinador mitjanant el programa informtic. Hi ha un punt en qu cal posar una atenci especial: lordinador est a lespera que lusuari introdueixi el seu nom i, quan succeeix aquest fet, dna un missatge personalitzat amb el nom que hagi introdut lusuari. Quan els ssers humans mantenim un dileg com lanterior, la persona que fa dordinador i espera la resposta lemmagatzema en la seva memria, de manera que, com que disposa daquesta informaci, la pot utilitzar posteriorment. Lordinador t un funcionament semblant. Quan rep la

Programaci estructurada i modular

34

Introducci a la programaci

resposta de lusuari, lha demmagatzemar en algun lloc per, posteriorment, donar el missatge personalitzat. Aquest lloc s la memria.

La memria de lordinador s lelement utilitzat per emmagatzemar dades.

Lordinador t, bsicament, dos tipus de memries: voltils i no voltils.

Una memria s voltil si les dades emmagatzemades desapareixen en el moment de desconnectar laparell. Una memria s no voltil si les dades enregistrades noms desapareixen per una acci especfica sollicitada per lusuari.

Les dades que tractem en aquest moment sn dades que un programa utilitza en execuci. Lordinador les guarda en memria de tipus voltil. s a dir, si lordinador es desconnecta mentre sest executant, aquestes dades es perdran. Tamb es perden en finalitzar lexecuci del programa si no s que el programa es preocupa denregistrar-les en memria de tipus no voltil. La memria dun ordinador tamb admet una altra classificaci: interna i externa.

Enregistrament de dades Per enregistrar les dades que gestiona un programa abans del seu acabament sutilitzen els arxius en disc. Els programes del sistema operatiu s'encarreguen d'aquest enregistrament, per en moltes ocasions s'installen sistemes gestors de fitxers i sistemes gestors de bases de dades que complementen la tasca d'enregistrament del sistema operatiu i faciliten una gesti eficient de les dades en disc.

La memria interna (tamb anomenada central) s la memria que hi ha a la mateixa placa base de lordinador. La memria externa (tamb anomenada en massa) s la memria emmagatzemada en altres tipus de suport, bsicament magntics i ptics.

Per entendrens, si extrapolem aquests dos tipus de memria a lsser hum, la memria interna es correspondria amb el cervell, mentre que la memria externa es correspondria amb els suports externs de qu lsser hum disposa per guardar aquells coneixements que no vol (o no pot) mantenir en el seu cervell i per als quals utilitza paper, cintes dudio, cintes dimatge... De la mateixa manera que la capacitat de la memria humana s limitada, la memria interna de lordinador tamb ho s. En canvi, els suports externs de qu disposa lsser hum per emmagatzemar coneixements sn prcticament illimitats, cosa que tamb passa amb la memria externa de lordinador. !

Programaci estructurada i modular

35

Introducci a la programaci

La major part de la memria interna de lordinador s voltil i es fa servir per emmagatzemar les dades que gestionen els programes. Quan acaba la seva execuci, les dades gestionades deixen lliure la memria per a noves dades que hagin de gestionar altres programes. Noms una petita part de la memria interna s no voltil i no s modificable pels programes en execuci. All es guarden les dades necessries perqu lordinador spiga fer alguna cosa quan es connecta.
Memria interna voltil i no voltil: RAM i ROM La part voltil de la memria interna sanomena RAM (random access memory) i s memria de lectura i escriptura, ja que els programes la poden llegir i hi poden escriure. s com si escrivssim en un full de paper amb un llapis. La part escrita es pot esborrar i tornar-hi a escriure. En la memria RAM, no cal esborrar per tornar a escriure; simplement sescriu al damunt, igual com passa quan enregistrem una can en una cinta dudio que ja havia enregistrat altres canons. La part no voltil de la memria interna sanomena ROM (read only memory) i s noms de lectura. Els programes noms la poden llegir. No hi poden escriure. Llavors, qui lha escrit? s el fabricant de la placa base de lordinador qui lha gravat amb uns mecanismes especials. La memria interna s daccs molt rpid perqu es troba a la placa base de lordinador, de manera semblant a la memria del nostre cervell, a la qual accedim instantniament. En canvi, la memria externa, constituda per suports magntics (discos durs, discos flexibles, cintes magntiques) i ptics (els actuals discos compactes) s daccs ms lent, de manera semblant als suports externs utilitzats tradicionalment per lsser hum (per exemple, el paper). Les memries externes sn bsicament de lectura i escriptura. Aix no vol dir que no us en pugueu trobar de noms lectura, de la mateixa manera que una cinta dudio o de vdeo pot estar protegida i no permetre lenregistrament.

2.2. Variables i constants


Un cop ja sabem on guarda lordinador les dades que el programa gestiona, introduirem una classificaci daquests tipus de dades. Una dada gestionada en un programa pot ser, segons la durada de la seva existncia, de dos tipus: constant o variable.

Una dada constant s una dada el valor de la qual existeix des de linici de lexecuci del programa fins a la fi i es mant inalterable.

Si fem una comparaci entre el funcionament dun ordinador i de lsser hum, exemples de dades constants en les persones serien, sense voler entrar en cap tipus de discussi sobre si el valor dalguna podria variar segons la persona, el nom, la data i el lloc de naixement, el sexe i el color dulls. Aquestes dades podrem dir que existeixen des del naixement de lsser hum i es mantenen inalterables fins a la seva mort. En altres entorns tamb tenim exemples de constants: els nombres i e en matemtiques,

Programaci estructurada i modular

36

Introducci a la programaci

el nom fiscal i el codi didentificaci fiscal duna empresa (podrem discutir-ho).

Una dada variable s una dada que ocupa una zona de memria i el valor que representa pot anar canviant durant lexecuci del programa.

Exemples de dades variables, en lsser hum, sn el nom de la parella; les dates de casament; el pes; lalada; el nivell destudis, etc. Per a algunes persones, alguna daquestes dades es pot mantenir inalterable des del moment de la seva aparici (una persona pot tenir una parella estable tota la seva vida), per s una variable i no una constant, ja que no ha existit durant tota la vida de la persona (la parella apareix en un determinat moment). En canvi, altres dades com el pes o lalada segur que no donen lloc a discussi: tothom les considera variables. I per qu fem servir constants? Evidentment podrem passar sense constants i treballar noms amb variables mentre tingussim la precauci de no modificar el seu valor al llarg de lexecuci. La resposta a la pregunta est en el fet que treballant amb constants podem facilitar la modificaci de programes en determinades ocasions.
Utilitat de les constants Suposem que un programa gestiona classes duna escola amb una capacitat mxima de vint-i-cinc alumnes per aula. Segur que dins del programa el valor vint-i-cinc alumnes apareix en un munt de llocs. Si alguna vegada sha de refer el programa per causa duna modificaci de la capacitat mxima, caldr cercar en el programa tots els llocs on apareix el valor 25, comprovar que correspon a la capacitat mxima (podrem tenir un valor 25 que correspongus a un altre significat) i modificarlo adequadament. En canvi, si aquest valor el tenim declarat com una constant CAPACITAT = 25 i la utilitzem al llarg del programa, noms haurem de canviar la lnia de la seva declaraci.

Dades variables i constants en les cultures Si prenem com a exemple algunes tribus indgenes en les quals la persona ja t la parella assignada en el moment del seu naixement, seria una constant si no pogus tenir una altra parella a la seva vida, per seria variable si li fossin permeses altres parelles.

Ja hem dit que una constant existeix durant tota lexecuci del programa i s inalterable. En canvi, una variable pot existir durant tota lexecuci del programa (variables esttiques) o durant una part de lexecuci i, fins i tot, tenir ms o menys capacitat segons la necessitat de valors que shagin demmagatzemar (variables dinmiques). Aquesta situaci ens permet diferenciar els tipus de variables, segons el moment temporal en qu existeixen.

Una variable esttica existeix durant tota lexecuci del programa. T una capacitat fixa i els valors que emmagatzema poden variar. Una variable dinmica es crea i es destrueix quan cal durant lexecuci del programa. T capacitat decidida en temps dexecuci i els valors que emmagatzema poden variar.

Per a un bon tractament de variables dinmiques, cal conixer a fons el tractament de variables esttiques i, per tant, aquest s el nostre primer objectiu.

Programaci estructurada i modular

37

Introducci a la programaci

Podem encara classificar les variables segons la capacitat demmagatzematge.

Una variable simple s una variable que t capacitat per emmagatzemar un nic valor. Una variable composta s una variable que t capacitat per emmagatzemar diversos valors.

Es produeixen exemples de variables simples quan el programa ha de gestionar dades com les segents: edat de la persona, nom de la persona (discutible, ja que el nom s un conjunt de carcters), nombre dalumnes duna classe, capacitat en litres dun dipsit. Es produeixen exemples de variables compostes quan un programa ha de gestionar dades com les segents: notes dels alumnes matriculats en un crdit, dades duna persona de manera global: el nom, el sexe, la data de naixement, el pes, lalada, el DNI, la professi, ladrea, el codi postal, la poblaci, etc. Ara que ja tenim les dades classificades, les farem servir en els nostres programes.

Tota dada que fem servir en un programa ha dhaver estat declarada pel programador.

I com es fa, aix? En pseudocodi les dades que shan de gestionar les declarem en una zona especfica per a tal finalitat, situada com es veu a continuaci:
programa <nom programa> s const <nom_constant_1> = <valor_1>; <nom_constant_2> = <valor_2>; ... ficonst var <nom_variable_1> : <tipus_variable_1>; <nom_variable_2> : <tipus_variable_2>; ... fivar <instruccions del programa> fiprograma

Programaci estructurada i modular

38

Introducci a la programaci

Tal com heu intut, les constants es declaren en una zona delimitada per les paraules reservades const i ficonst i les variables, de manera similar, en una zona delimitada per var i fivar. Tamb veieu que les constants i les variables tenen un nom, el qual farem servir dins el programa per referenciar la zona de memria que cont el valor emmagatzemat. s a dir, si tenim declarada una dada (constant o variable) de nom edat, quan lordinador comenci lexecuci del programa destinar una zona de la memria a aquesta dada, com s'exemplifica a la figura 1
Figura 1. Exemple de dada ocupant part de la memria RAM

El terme edat s el nom de la dada, que permet al programador fer referncia, en el programa, a la zona de memria assignada. Aquesta zona no s la mateixa a cada execuci del programa; la posici que ocupa la decideix el sistema operatiu quan comena cada execuci. El que no variar al llarg de les diferents execucions s la capacitat i, per tant, lespai que ocupa.

El nom duna dada s la manera que t el programador per referenciar la zona de memria que el sistema operatiu assignar a cada execuci del programa.

Cada llenguatge informtic t unes determinades normes que fan referncia a com pot ser aquest nom que decideix el programador. No difereixen gaire. En pseudocodi considerarem que: ! pot ser una seqncia de lletres i dgits de qualsevol longitud; no pot contenir signes de puntuaci; no pot tenir espais en blanc; no pot ser cap de les paraules reservades del pseudocodi; no hi pot haver, en principi, dades amb el mateix nom; no hi ha distinci entre les majscules i les minscules. El sentit com indica que el nom duna dada hauria destar pensat de manera que tingui a veure amb el valor que hi volem emmagatzemar. Aix, a lexemple edat, cal suposar que es tracta duna dada per contenir ledat dalguna cosa. No seria gens lgic utilitzar aquest terme per emmagatzemar el sou duna persona.
En pseudocodi, el llenguatge informtic no pot contenir comes, punts, punts i comes, dos punts, etc.

Altres opcions En alguns llenguatges, com el C, hi ha distinci entre majscules i minscules, de manera que dades amb noms EDAT, Edat, edat, eDat, etc. sn considerades diferents. En aquest cas es diu que el llenguatge s case sensitive.

Programaci estructurada i modular

39

Introducci a la programaci

Qu cal fer si necessitem tenir dues dades de tipus edat, una per a un home i una altra per a una dona? En tal cas caldr declarar dues dades i podrem pensar en diferents possibilitats: edat1 i edat2: caldr tenir molt clar quina es refereix a lhome i quina a la dona. edath i edatd: ja s ms entenedor, per encara pot portar a confusi. edat home i edat dona: s el ms clar; no hi ha dubtes. La darrera possibilitat s errnia perqu cont espais en blanc. Per solucionar aix, sacostuma a utilitzar el smbol _ (subratllat) per simular els espais en blanc. Aix doncs, la darrera possibilitat seria edat_home i edat_dona. Tamb seria molt bona opci emprar edatHome i edatDona. Hi ha algun conveni especfic referent als noms de les dades? En principi el programador t total llibertat per decidir-ne el nom. Hi ha, per, certs convenis notacionals, els quals se solen fer servir en alguns llenguatges concrets, per que es poden generalitzar en altres entorns. Aix, en pseudocodi escriurem les constants amb lletra majscula i les variables amb lletra minscula.

Subratllat Largot informtic acostuma a fer servir el terme angls underline (subratllat) per referir-se al gui baix.

2.3. Tipus de dades esttiques simples


Suposem que volem que edat sigui una variable que ha de contenir un valor que variar al llarg del programa. Haurem de declarar-la a la corresponent zona de variables:
var ... edat : <tipus de variable>; ... fivar

I qu vol dir <tipus de variable>?

El tipus duna dada permet definir el conjunt de valors que pot prendre la dada.

s clar que la nostra variable edat ha de contenir valors numrics de tipus natural. No hem de permetre que edat contingui per valors una paraula, una data, etc. s discutible, per, si hem de permetre o no valors decimals per poder representar situacions semblants a t dotze anys i mig. Tots els programes gestionen informaci que es representa en forma de dades, per no totes les dades tenen la mateixa naturalesa. Aqu apareix el concepte de tipus.
Tipus de dades Per exemple, 27-1-1958 s una dada i Teresa s una altra dada, per evidentment no sn del mateix tipus. Aix es pot comprovar si intentem fer operacions entre totes dues. Oi que no t cap sentit intentar sumar-les?

Programaci estructurada i modular

40

Introducci a la programaci

Per tot aix apareix la necessitat de classificar les dades en uns certs tipus.

El tipus de dada s un conjunt de valors que porta associades unes operacions que es poden realitzar sobre aquestes dades i que tenen una representaci interna determinada per a lordinador, la qual cosa depn del sistema operatiu utilitzat.

Els tipus de dades que es pot utilitzar en un programa i la informaci que podem representar amb aquelles depn del sistema operatiu i del llenguatge de programaci emprat. De tota manera hi ha un gran acord en els tipus de dades necessaris i la majoria dels llenguatges els incorporen. El concepte de tipus de dada s bsic en programaci, ja que lordinador assigna a cada dada declarada en el programa una determinada zona de memria on emmagatzema el valor amb la representaci interna que correspongui.

Comencem el coneixement dels tipus de dades amb les possibilitats existents en lmbit dels tipus de dades esttiques simples. A continuaci en fem la classificaci que cal tenir en compte a lhora de dissenyar els algorismes en pseudocodi. Quan codifiquem el programa pseudocodi en un llenguatge informtic, caldr conixer les possibilitats de tipus de dades que aquest llenguatge informtic aporta. Passem, doncs, a la classificaci: 1) Definides: les porten incorporades els llenguatges de programaci; segons sigui la naturalesa del valor que representen es poden classificar en: a) Numriques: per representar valors numrics que es puguin utilitzar en operacions aritmtiques. Aqu trobem els tipus segents: Enter: valors positius i negatius sense decimals (el zero tamb). Natural: valors positius sense decimals (el zero tamb). Real: qualsevol valor numric. b) Carcter: per representar els carcters, entenent per carcter qualsevol lletra, xifra, signe de puntuaci, smbol matemtic o de qualsevol altre tipus que es pugui utilitzar. c) Lgiques: per representar els dos valors lgics cert i fals. 2) Definibles: aquelles en les quals el conjunt de valors possibles el pot definir el programador. Hi trobem dades dels tipus segents: a) Enumerades: definides pel conjunt de valors que utilitza (enumeraci de tots els valors possibles) i les operacions que shi poden efectuar.

Programaci estructurada i modular

41

Introducci a la programaci

b) Subrangs: definides com un subconjunt de valors dels enters, naturals, carcters o dun tipus enumerat.
La notaci hongaresa En el mn de la programaci hi ha alguns convenis notacionals per al nom de les dades. Ara que hem introdut el concepte de tipus, podem parlar duna notaci utilitzada en certs entorns. La notaci hongaresa consisteix a iniciar el nom de totes les variables amb una lletra que indica el seu tipus (n per al tipus natural, e per al tipus enter, r per al tipus real, c per al tipus carcter, l per al tipus lgic, etc.) seguit del nom de la variable en minscules excepte la primera lletra, que va en majscula. Exemples: nEdat, lEsCasat, cSexe, rSou, etc.

2.4. Dades de tipus numric


Sn les dades que permeten emmagatzemar valors numrics. Nhi ha de diferents tipus a causa dels diferents conjunts de nombres existents. En pseudocodi considerarem els tres tipus bsics segents: enter, natural i real. Abans, per, cal tenir clar que cada combinaci de sistema operatiu i llenguatge de programaci utilitza una determinada quantitat de memria per destinar-la a una dada dun determinat tipus en temps dexecuci. Expliquem-nos. Suposem un sistema operatiu S, on sexecutar un programa P codificat en un llenguatge de programaci L. Suposem que el programa gestiona una dada D de tipus T. Doncs b, en executar-se el programa P, el sistema operatiu S destina una zona de memria (referenciada pel nom de D) amb la capacitat fixada segons el tipus T pel llenguatge L en el sistema S. Suposem que aquesta zona ocupa N1 octets. Doncs b, el mateix programa executable aconseguit per una combinaci diferent de llenguatge i sistema, tot i utilitzar un tipus de dada equivalent pot tenir per a la dada D una zona de memria assignada de N2 octets diferent de N1. Aquest fet s molt important, ja que lordinador, amb un espai finit, noms pot representar una quantitat finita de dades. Penseu en la tpica situaci que us trobeu quan empleneu un determinat formulari en qu hi ha caselles per situar les vostres dades personals. Oi que en aquestes caselles no disposeu despai illimitat? Doncs b, els espais assignats per a les dades en memria tenen tamb unes capacitats fixades i, per tant, els valors que shi han demmagatzemar sn finits. Aix s un fet que el programador ha de tenir molt clar i, per fer-ho ms problemtic, depn del llenguatge i del sistema operatiu utilitzats. Tamb cal dir que hi ha una gran normalitzaci en aquest aspecte i que no ens trobarem amb gaires diferncies, per sempre que es codifiqui un programa en un determinat llenguatge, el programador ha de conixer les classes de dades que el llenguatge permet i les implicacions de cadascuna daquestes.

Conjunts de nombres En matemtiques, els conjunts de nombres sn N, Z, Q, R, etc.

Programaci estructurada i modular

42

Introducci a la programaci

Tot llenguatge de programaci t un manual de referncia, on hi ha dhaver lexplicaci detallada del llenguatge en qesti. En versions antigues acostuma a ser imprs en paper, per les versions actuals el solen incorporar en el sistema dajuda de lentorn de programaci. En aquest cas parlem de manual en lnia (en argot informtic angls, on-line). En pseudocodi fugirem daquestes consideracions i suposarem que una dada dun determinat tipus permet emmagatzemar qualsevol valor daquell tipus. En canvi, quan apliquem tot aix al llenguatge C veureu que caldr tenir en compte totes les limitacions.

2.4.1. Dades de tipus enter


Les dades tipus enter permeten emmagatzemar un subconjunt finit (per la capacitat fixa de memria assignada) dels nombres enters (conjunt matemtic Z). s a dir, permeten guardar valors com 0, 1, 2, 3, ..., 1, 2, 3, ... La capacitat finita provoca que hi hagi un lmit per la banda positiva i un lmit per la banda negativa.

2.4.2. Dades de tipus natural


Permeten emmagatzemar un subconjunt finit (per la capacitat fixa de memria assignada) dels nombres naturals (conjunt matemtic N). s a dir, permeten guardar valors com 0, 1, 2, 3, ... La capacitat finita provoca que hi hagi un lmit.

2.4.3. Dades de tipus real


Permeten emmagatzemar un subconjunt finit (per la capacitat fixa de memria assignada) dels nombres reals (conjunt matemtic R). s a dir, permeten guardar valors com 0, 1, 1, 3.5, 4.333, 7.9, ... La capacitat finita provoca que hi hagi un lmit per les bandes positiva i negativa i, a ms, que els valors reals que tenen un conjunt infinit (o molt gran) de nombres decimals no poden tenir la seva representaci exacta. Per aix, quan es parla de representaci de nombres reals caldr especificar la precisi amb qu es treballa. En pseudocodi no ens ha de preocupar; s, en canvi, en la codificaci en un llenguatge en concret.

Programaci estructurada i modular

43

Introducci a la programaci

2.4.4. Operadors sobre el tipus numric


Ja tenim les dades numriques tipificades, per poca cosa podrem fer sense poder-hi operar. Necessitem, per tant, uns operadors numrics. Aquest concepte tamb depn de cada llenguatge de programaci. En pseudocodi considerarem els presentats a la taula 2.
Taula 2. Operadors numrics en pseudocodi Operador + Operador Operador * Operador / Operador div Operador mod Efectua la suma de valors numrics. Efectua la diferncia de valors numrics. Efectua el producte de valors numrics. Efectua la divisi real de valors numrics (donant resultat amb decimals). Calcula el quocient enter de la divisi entera de valors numrics enters (dna el quocient sense baixar decimals). Calcula el residu de la divisi entera de valors numrics enters (residu calculat sense haver baixat decimals). Possibilitats dels operadors numrics Estem parlant doperadors que ens permeten efectuar operacions internes, s a dir, operem amb dades numriques per obtenir una altra dada numrica. Hi ha la possibilitat doperar amb dades dun tipus per obtenir dades dun altre tipus. En aquest cas, estarem en operadors externs.

Cal destacar la importncia del tipus del resultat en funci dels tipus dels operands. En aix, hem dassumir la regla segent: quan operem amb dos valors numrics de diferent tipus, el resultat ser del tipus ms global. s a dir: Si en sumem un de natural i un de real, el resultat ser real. Si en multipliquem un de natural i un denter, el resultat ser enter. I si en dividim (amb div) un de natural i un de real? Error, ja que la divisi entera exigeix que els operands siguin enters (els naturals sn un subconjunt dels enters i no causen lerror; aquest s produt per loperand real).

2.4.5. Declaraci de variables i constants de tipus numric


Una vegada tenim tots els ingredients necessaris, podem passar a declarar variables i constants en els nostres programes, com es veu a les segents lnies de pseudocodi.
const N = 25; /* constant assumida com a natural i amb valor 25*/ R = 2.5; /* constant assumida com a real i amb valor 2.5*/ Z = -5; /* constant assumida com a enter i amb valor 5*/ ficonst varedat : natural; /* variable declarada com a natural*/ saldo_ptes : enter; /* variable declarada com a enter*/ saldo_euro : real; /* variable declarada com a real*/ fivar

Comentem ara les lnies de pseudocodi anteriors. Veureu com en traurem fora suc.

Programaci estructurada i modular

44

Introducci a la programaci

En primer lloc, observeu que les dades constants no les declarem de cap tipus en concret. Ja sabem que les dades constants conserven el seu valor inalterable durant tota lexecuci del programa. Per tant, cal donar valor en el moment en qu es declaren tal com es veu a les anteriors lnies de pseudocodi. El programa traductor, avaluant la naturalesa del valor escrit pel programador, assigna el tipus que pertoqui. El valor 25 lassumeix com a natural o com a enter? No us preocupeu. Penseu que sigui quina sigui la decisi el valor ser inalterable i per tant no ens ha de preocupar. Si volem exigir al programa traductor que una constant amb valor 5 sigui assumida com a real, escriurem 5. (Dgit 5 seguit del punt decimal.) I les variables? Qu observeu de diferent respecte de les constants? La resposta ens porta a una altra pregunta: quin valor guarden les variables quan es comena lexecuci del programa? Les variables es declaren dun tipus i no podem fer cap suposici respecte del valor inicial que emmagatzemen. Hem de considerar el seu valor inicial com a valor escombraria o valor porqueria, conseqncia de la interpretaci que faci lordinador dels valors (zeros i uns) que hi ha en els bits que ocupen. Hi ha llenguatges que asseguren els valors inicials que prenen les variables. En tal cas, el normal s que les variables numriques quedin inicialitzades amb el valor zero. Per aix no s sempre aix.
Terminologia En terminologia informtica, el punt decimal sempre s un punt, mai una coma. Una altra cosa s parlar de com apareixen en pantalla o en paper els valors numrics reals (aix es parametritza en funci de les preferncies de lusuari).

Per tant, s responsabilitat del programador inicialitzar totes les variables que fa servir en un programa.

Aquesta inicialitzaci no cal fer-la a les primeres instruccions del programa. Es pot fer quan la variable es necessiti per primera vegada. Segur que ja penseu en la pregunta: i com sinicialitzen, llavors, les variables? La resposta la trobarem quan coneguem la instrucci dassignaci. Hi ha llenguatges en qu les variables no es declaren i, per tant, no tenen cap tipus assignat. En tal situaci una variable sutilitza quan es necessita i el tipus que pren depn del valor que emmagatzema. s ms, en aquests llenguatges sacostuma a permetre que la variable pugui canviar de tipus durant lexecuci del programa. Aquest funcionament trenca les bases de la programaci. Aqu les considerem un atemptat contra la integritat de la programaci. Sabem que hi ha programadors que consideren que aquesta manera de funcionar s millor perqu sestalvien haver descriure tota la part corresponent a la declaraci de les variables.

!!
En lapartat Instrucci dassignaci podreu veure com es pot assignar valor a una variable en qualsevol punt dun programa.

Programaci estructurada i modular

45

Introducci a la programaci

Quins raonaments es pot aportar per justificar la declaraci de les variables? Obliga que el programador pensi, abans de comenar a programar, en totes les variables que necessitar en el programa (obliga a analitzar i dissenyar millor lalgorisme). Davant qualsevol modificaci que calgui efectuar en el programa, hi ha una zona on podem trobar la declaraci de totes les variables amb, fins i tot, comentaris explicatius relatius al significat i a la utilitzaci dels valors que emmagatzemen. Cal saber que hi ha la possibilitat dincorporar en els programes font comentaris que ajudin a comprendrels; en el cas que ens ocupa, comentaris per entendre la utilitzaci de les constants i variables. La immensa majoria de llenguatges ofereixen la possibilitat dincloure comentaris en el programa font, els quals sn ignorats pel programa traductor. En pseudocodi tamb farem servir aquesta possibilitat. Considerarem que qualsevol text escrit entre els smbols /* i */ s un comentari, tal com podem observar en els exemples anteriors.

2.5. Dades de tipus carcter


Aquest tipus de dada el trobareu en tots els llenguatges de programaci. Podrem dir que s el tipus de dada ms internacional.

Entenem per carcter qualsevol lletra, xifra, signe de puntuaci, smbol matemtic o de qualsevol altre tipus que es pugui utilitzar en les representacions de les dades.

En pseudocodi, els valors de tipus carcter els notarem entre cometes simples (), cosa que permet diferenciar-los dels noms de les possibles variables. Tots els llenguatges fan servir aquest conveni o lalternatiu, que consisteix a utilitzar cometes dobles (). Fins i tot alguns llenguatges permeten els dos tipus de conveni. En pseudocodi farem servir cometes simples. Les cometes dobles sutilitzen per a un altre tipus de dada (cadena) que encara no coneixem. Atenci! No sha de confondre mai un carcter dgit (per exemple 5) amb un nmero duna xifra (nmero 5 en lexemple que ens ocupa). En el primer cas no s res ms que un smbol. En el segon cas s un valor numric que es pot utilitzar en clculs matemtics. !

Programaci estructurada i modular

46

Introducci a la programaci

2.5.1. Operadors sobre el tipus carcter


En el tipus carcter no considerarem, per ara, lexistncia de cap operador intern, s a dir, els carcters no es poden operar per obtenir un carcter com a resultat.

2.5.2. Declaraci de variables i constants de tipus carcter


De manera semblant a les dades numriques, declarem constants i variables de tipus carcter.
const lletra = 'A'; /*constant assumida com a carcter i amb valor 'A'*/

ficonst var vocal : carcter; /*variable declarada com a carcter*/ fivar

Pel que fa a la inicialitzaci de les variables de tipus carcter, hi ha els mateixos problemes que en les numriques. Aix s responsabilitat del programador. En alguns llenguatges sassegura la inicialitzaci de les variables carcter amb un espai en blanc (el qual tamb s un carcter).

2.5.3. Representaci de carcters


Quants carcters podem representar? Com molt b sabeu, lordinador sempre t activa una taula de carcters formada per 256 smbols. Per tant, els carcters representables sn aquest conjunt, els quals segueixen un determinat ordre i estan numerats comenant per 0 i fins a 255.
Sistemes de representaci dels carcters A lhora de decidir quins sn els 255 carcters representables i quin ordre segueixen, sutilitzen diferents codis establerts, entre els quals destaquen el codi ASCII i el codi EBCDIC. El codi ASCII s el ms ests, sobretot per la gran proliferaci dordinadors personals (anomenats, en angls, personal computer PC). El codi ASCII inicial representava 128 carcters en lloc dels 256. Quan es van necessitar carcters especials per als diferents idiomes, es va ampliar amb 128 carcters ms, i es va constituir el codi ASCII ests. Com que hi ha diferents extensions, cal especificar sempre quina s la taula ASCII carregada a lordinador (conjunt de carcters representables). El codi EBCDIC s un producte de la marca IBM per a ordinadors centrals i tamb consisteix en un codi binari format per 8 bits (1 octet) que permet, per tant, definir 256 carcters. Ha quedat mpliament superat pel codi ASCII.

2.6. Dades de tipus lgic


Una dada lgica noms pot prendre dos valors: cert o fals. No tots els llenguatges incorporen aquest tipus de dada. Alguns fan servir altres tipus de dades per aconseguir el servei que faciliten les dades lgiques.

En certs entorns de programaci, les dades lgiques sanomenen dades booleanes.

Programaci estructurada i modular

47

Introducci a la programaci

Quina utilitat tenen? En principi la de representar un dels dos valors, cert o fals, per aquest raonament s incorrecte, ja que aix tamb podrem fer-ho amb una variable de tipus carcter, enregistrant els valors C o F. La grcia daquest tipus de dada s emmagatzemar els valors utilitzats en lgica, els quals sn nicament dos, ni ms ni menys, i per als quals hi ha unes operacions ben definides.
Lgica La lgica s la cincia del raonament, de les lleis del pensament, i s imprescindible per treballar en programaci informtica.

2.6.1. Operadors sobre el tipus lgic


Els operadors necessaris en aquest tipus de dada sn els que permeten executar les operacions de la lgica: la conjunci (i), la disjunci (o) i la negaci (no).

Operaci binria i unria Una operaci binria s aquella que actua sobre dos operands com, per exemple, la suma o la resta. La majoria doperacions sn binries. En canvi, una operaci unria actua sobre un nic operand com, per exemple, larrel quadrada, la potncia, etc.

La conjunci s loperaci lgica binria que pren com a resultat el valor cert quan els dos operands tenen valor cert i fals en qualsevol altre cas. La disjunci (tamb anomenada disjunci no exclusiva) s loperaci lgica binria que pren com a resultat el valor cert quan algun dels dos operands (o ambds) t el valor cert i fals en qualsevol altre cas. La disjunci exclusiva s loperaci lgica binria que pren com a resultat el valor cert quan noms un dels dos operands t el valor cert i fals en qualsevol altre cas. La negaci s loperaci lgica unria que canvia el valor lgic de loperand.

Els llenguatges fan servir diferents smbols per representar els operadors corresponents. La taula 3 ens ho mostra.
Taula 3. Smbols per representar els operadors lgics Operaci Conjunci Disjunci Disjunci Negaci Lgica XOR Pseudocodi i o xor no Llenguatges and, & & or, II xor not, !

Per entendre millor el comportament dels operadors lgics ens poden ajudar les taules de veritat.

Programaci estructurada i modular

48

Introducci a la programaci

Les taules de veritat sn un procs que ens permeten esbrinar, amb claredat i fiabilitat, tots els possibles resultats duna operaci lgica a partir dels valors dels operands.

Aix s factible perqu no hi ha un gran nombre de valors inicials possibles. Vegem-ho. Suposem que tenim dues variables o constants lgiques, A i B, amb les quals volem operar fent servir les operacions binries conjunci, disjunci i disjunci exclusiva. A i B noms poden tenir dos valors; per tant, la combinaci de les dues dades noms pot considerar quatre possibles situacions, s a dir, un nombre petit de situacions fcilment representables, com queda pals a la taula 4.
Taula 4. Taula de veritat per a les operacions lgiques conjunci, disjunci i disjunci exclusiva A Cert Cert Fals Fals B Cert Fals Cert Fals AiB Cert Fals Fals Fals AoB Cert Cert Cert Fals A xor B Fals Cert Cert Fals

Taules de veritat En general, si tenim n dades lgiques, la representaci en taules de veritat haur de considerar 2 elevat a n situacions.

Per al cas de la negaci tamb podem utilitzar una taula de veritat (taula 5), per en aquest cas, saplica a una nica dada lgica, ja que la negaci s una operaci unria.
Taula 5. Taula de veritat per a loperaci lgica negaci A no A

Cert Fals

Fals Cert

2.6.2. Declaraci de variables i constants de tipus lgic


De manera semblant a la les dades numriques i carcter, declarem constants i variables de tipus lgic.
const V = cert; ficonst /*constant assumida com a lgica i amb valor cert*/

var s_vocal : lgic; fivar

/*variable declarada com a lgica*/

Programaci estructurada i modular

49

Introducci a la programaci

Pel que fa a la inicialitzaci de les variables de tipus lgic, hi ha el mateix problema que en la resta de tipus: s responsabilitat del programador. En alguns llenguatges sassegura la inicialitzaci de les variables lgiques amb el valor fals.

2.6.3. Operadors relacionals


Les operacions conegudes sobre dades numriques i carcters sn operacions internes, s a dir, operen amb dades dun tipus per obtenir un resultat del mateix tipus. Introdum ara els operadors relacionals (operadors de comparaci) que operen amb dades dun mateix tipus (numric o carcter) i donen com a resultat una dada de tipus lgic. Els operadors de comparaci sn, com indica el seu nom, operadors que permeten comparar dades.

A tall dexemple, sn operadors que permeten preguntes com les segents: LOriol t ms anys que en Guifr? La Maria Teresa s ms alta que la Loli? Sn iguals els dos cotxes? Totes aquestes qestions tenen un denominador com: el resultat s de tipus lgic, ja que noms pot prendre dos valors: cert o fals. Com a representaci dels operadors de comparaci sutilitzen els smbols matemtics als quals tots estem acostumats i que recollim a la taula 6.
Taula 6. Operadors relacionals Operador menor que menor o igual que major que major o igual que igual que diferent que Matemtica < > = Pseudocodi < o <= > o >= = o == o <> o != Llenguatges < <= > >= = o == <> o !=

Mentre que en els diferents llenguatges i pseudocodis hi ha unanimitat respecte dels quatre primers operadors, no passa el mateix amb els dos darrers. La majoria de pseudocodis que trobareu en llibres de programaci fan servir: Un signe = per a loperador igual que . El signe o la combinaci <> per a loperador diferent que .

Programaci estructurada i modular

50

Introducci a la programaci

En canvi, en el material que teniu a les vostres mans, farem servir: Dos signes = per a loperador igual que , o sigui, ==. La combinaci != per a loperador diferent que . El motiu daquesta decisi s facilitar-vos laprenentatge de la programaci en llenguatge C, el qual utilitza la nomenclatura exposada. Tots teniu clar com lordinador compara valors numrics, ja que coneixeu quina s la relaci dordre definida en els conjunts numrics. Ara b, com actuar lordinador en la comparaci de dos carcters? Sabem que el conjunt de carcters consta de 256 elements que estan numerats des de 0 fins a 255. Doncs b, quan lordinador es troba amb dues dades, A i B, de tipus carcter, mira en quin lloc (entre 0 i 255) es troben els valors emmagatzemats a A i B i efectua la comparaci numrica de les posicions corresponents. Aix, si la variable o constant A est emmagatzemant el smbol <, que en la taula ASCII s a la posici 60 i la variable o constant B est emmagatzemant el smbol Z, que en la taula ASCII s a la posici 90, resulta que lordinador avaluaria: com a certes les expressions: A < B, A <= B, A != B com a falses les expressions: A == B, A > B, A >= B Les majscules i minscules i les vocals accentuades sn carcters diferents que ocupen posicions diferents a les taules de carcters. Cal tenir-ho present. !

Particularitats del llenguatge C El llenguatge C tamb incorpora el smbol =, per t una finalitat diferent a la de loperador de comparaci i igual que .... El llenguatge C no acostuma a queixar-se quan se li introdueix aquest smbol, per la qual cosa molts programadors lutilitzen equivocadament com a operador de comparaci i, en executar el programa, aquest no obt el resultat esperat. Aix provoca la desesperaci del programador, que est convenut que ha dissenyat i codificat de manera correcta lalgorisme.

2.7. Expressions i ordre davaluaci dels operadors


Sabem que existeixen els tipus de dades simples bsics per a lelaboraci de programes i que es poden realitzar diferents operacions sobre aquestes dades. Tamb sabem que la majoria doperadors sn binaris (exceptuantne la negaci, que s unria). En els dissenys dalgorismes, per, moltes vegades apareixen expressions que combinen una gran quantitat doperacions, com per exemple: (x + y) * (a b) (a + b) div 2 < c i s_blanc

Suposem que les dades de les anteriors expressions sn dels tipus adequats a les operacions que shi utilitzen, s a dir: a) x, y, a, b han de ser numriques, ja que aix t sentit considerar les expressions x + y i a - b, les quals tamb sn dades numriques, i per

Programaci estructurada i modular

51

Introducci a la programaci

tant t sentit lexpressi proposada, la qual t, com a resultat, una dada numrica. b) a i b han de ser enteres, ja que aix lexpressi a + b s entera i es pot efectuar loperaci div per 2 i obtenir un resultat enter que es vol comparar amb c, la qual ha de ser, bviament, numrica; el resultat de lexpressi (a + b) div 2 < c s, per tant, lgic i aquesta expressi est seguida de i s_blanc, la qual cosa implica que s_blanc ha de ser una dada lgica; el resultat final de lexpressi s una dada lgica. Qu, com ho veieu? Segur que deveu pensar que el que hem fet no s altra cosa que lavaluaci duna expressi, efectuada de manera similar a lavaluaci que estveu acostumats a fer en matemtiques: desquerra cap a dreta, per tenint en compte que algunes operacions tenen ms prioritat que daltres. Una pregunta: quin s el resultat de lexpressi 3 + 4 * 5? Esperem que la vostra resposta hagi estat 23. Si no s aix, teniu un greu problema de base matemtica. Si la vostra resposta ha estat 35 vol dir que no teniu clar lordre davaluaci de les expressions matemtiques. Se suposa que aquest concepte el teniu plenament assolit. Per tant, si no s aix, cal que cerqueu el suport necessari que us permeti entendre lordre davaluaci en les expressions matemtiques. ! Quan tinguem expressions complexes, cal tenir molt clar quin ser lordre davaluaci que seguir lordinador. La prioritat en lavaluaci dels operadors en tota expressi s, ordenadament: parntesis (comenant pels ms interns); potncies (si el llenguatge els suporta en pseudocodi, no en tenim); productes i divisions (desquerra a dreta); sumes i restes (desquerra a dreta); concatenacions (pel tipus de cadena que encara no hem vist); relacionals; negaci; conjuncions i disjuncions (desquerra a dreta).

Programaci estructurada i modular

52

Introducci a la programaci

2.8. Tipus de dades simples en el llenguatge C


Vegem quines possibilitats facilita el llenguatge C per a la gesti dels tipus de dades simples: 1) Dades de tipus numric Detallarem els diferents tipus de dades numriques que proporciona el llenguatge C amb les caracterstiques que tenen i les operacions possibles. a) Dades numriques enteres i naturals short int o, simplement, short Dada per emmagatzemar valors enters positius i negatius compresos entre 32768 (215) i 32767 (215 1). Ocupa 2 octets. Pot ser precedida de la partcula signed per indicar que es tracta dun tipus que pot tenir signe, s a dir, pot emmagatzemar valors positius i negatius. int Dada per emmagatzemar valors enters positius i negatius igual que el tipus anterior. La grandria en octets depn de larquitectura de la mquina i de la versi del compilador de C. Si la mquina i el compilador sn de 32 bits, estarem davant una implementaci del tipus int en 4 octets, per en arquitectures de 16 bits, simplementa en 2 octets i llavors coincideix amb el tipus short. Pot anar precedit per la partcula signed. long int o, simplement, long Dada per emmagatzemar valors enters positius i negatius com les anteriors. El nombre doctets depn de larquitectura de la mquina i del compilador. Tant en les plataformes de 16 bits com en les de 32 bits es correspondria amb 4 octets i els valors possibles estarien compresos entre 2147483648 ( 231) i 2147483647 (231 1). En canvi, en plataformes de 64 bits, es correspondria amb 8 octets i els valors possibles estarien compresos entre 263 i 2631. Pot anar precedit de la partcula signed. Si necessitem la precisi de 64 bits i estem en plataforma de 32 bits, les darreres implementacions de C faciliten el tipus long long int (o signed long long int).. unsigned short int o, simplement, unsigned short Dada per emmagatzemar valors enters positius compresos entre 0 i 65535 (216 1). Ocupa 2 octets. unsigned int o, simplement, unsigned Dada per emmagatzemar valors enters positius utilitzant 4 octets en plataformes de 16 i de 32 bits i amb valors possibles entre 0 i 4294967295 (232 1). En canvi, en plataformes de 64 bits utilitza 8 octets

Programaci estructurada i modular

53

Introducci a la programaci

i els valors possibles estan compresos entre 263 i 263 1. Si necessitem la precisi de 64 bits i estem en plataforma de 32 bits, les darreres implementacions de C faciliten el tipus unsigned long long int. unsigned long int o, simplement, unsigned long Dada per emmagatzemar valors enters positius utilitzant 4 o 8 octets segons plataforma. En el cas de 4 octets, els valors possibles estan compresos entre 0 i 4294967295 (232 1).

Cal utilitzar dades de tipus enter o natural quan els nostres clculs hagin de treballar amb valors sense decimals. Escollirem short, int o long en les seves versions signed o unsigned, en funci de la grandria dels valors emmagatzemats.

Al llarg daquest contingut suposarem que la plataforma de mquina compilador utilitzada s de 32 bits i, per tant, que el tipus int sigui de 4 octets. El llenguatge C t una caracterstica que no tenen la resta de llenguatges i que porta molts problemes als programadors inexperts i, fins i tot, als programadors experts procedents daltres llenguatges. Sabem que tota dada numrica entera t una capacitat finita. Qu passa en temps dexecuci quan el programa demana a lordinador que emmagatzemi en una variable entera un valor per al qual la variable no t capacitat suficient? En molts llenguatges es produeix un error en temps dexecuci que provoca la fi immediata del programa. En argot informtic es diu que el programa ha avortat. Quan aix passa, el programa acostuma a informar dun error doverflow (valor per damunt de la capacitat permesa, tant en el vessant positiu com en el negatiu). Doncs el nostre amic C no fa aix. No provoca cap error i, per tant, no avorta l'execuci del programa. Llavors, com actua? En cas que el valor a representar superi el mxim valor representable, el valor a representar es transforma en el resultat de la suma del menor valor representable ms el nombre d'unitats en qu el valor a representar sobrepassa el mxim valor representable ms 1. I en cas que el valor a representar estigui per sota del menor valor representable, el valor a representar es transforma en el resultat de restar al major valor representable el nombre d'unitats en qu el valor a representar est per sota del mnim valor representable menys 1. D'aix se'n diu comportament cclic dels clculs amb variables enteres en C.

Programaci estructurada i modular

54

Introducci a la programaci

Llenguatge C: comportament cclic en dades enteres Suposem que i, j i k sn variables de tipus unsigned short. Per tant, ja sabem que poden emmagatzemar valors entre 0 i 65535. Suposem que en un moment determinat. la variable i est emmagatzemant el valor 30000, la variable j est emmagatzemant el valor 40000, i volem (encara no sabem com programar-ho!) emmagatzemar dins k la suma dels valors que guarden i i j. s clar que el valor que esperem guardar dins k ha de ser 70000 i sabem tamb que no hi cap. Doncs "Mister C" no es queixa i hi guarda 4464. Com apareix aquest valor? Imagineu-vos el conjunt de valors numrics representables (065535) com un conjunt cclic: aix, d'igual manera que desprs del 60000 ve el 60001, succeeix que desprs del 65535 ve el 0 i desprs l'1, i aix successivament. Per tant, com que 70000 excedeix el valor mxim, 65535, en 4465 unitats, tornant a comenar pel valor mnim, que s 0, resulta que arribem a 4464, valor que s l'emmagatzemat dins k.

Aquest funcionament passa en tots els tipus de dades numriques enteres. b) Dades numriques reals float Dada per emmagatzemar valors reals de precisi simple (4 octets), s a dir, nombres reals que tenen un conjunt de dgits significatius relativament baix (concretament, 7 dgits significatius). Els valors emmagatzemats estan compresos entre: 3.402823E+38 i 1.175494E38 per a nombres negatius. 1.175494E38 i 3.402823E+38 per a nombres positius.
Exemples de notacions cientfiques Com molt b deveu saber, estem utilitzant notaci cientfica per expressar aquests valors; s a dir, el valor X que segueix la lletra E indica que cal multiplicar el valor anterior a la E per 10 elevat al valor X. 2.5E+5 indica 2.5 multiplicat per 10 elevat a 5, s a dir, 250000. 2.5E4 indica 2.5 multiplicat per 10 elevat a 4, s a dir, 0.00025. 2.5E+5 indica 2.5 multiplicat per 10 elevat a 5, s a dir, 250000. 2.5E4 indica 2.5 multiplicat per 10 elevat a 4, s a dir, 0.00025.

double Dada per emmagatzemar valors reals de precisi doble (8 octets), s a dir, nombres reals que tenen un conjunt de dgits significatius superior al tipus float (concretament, 16 dgits significatius). Els valors emmagatzemats estan compresos entre: 1.79769E+308 i 2.22507E308 per a nombres negatius. 2.22507E308 i 1.79769E+308 per a nombres positius.

Programaci estructurada i modular

55

Introducci a la programaci

long double Dada per emmagatzemar valors reals de precisi doble en format llarg (10 octets), s a dir, nombres reals que tenen un conjunt de dgits significatius superior, encara, al tipus double (concretament, 19 dgits significatius). Els valors emmagatzemats estan compresos entre: 1.189731E+4932 i 3.362103E4932 per a nombres negatius. 3.362103E4932 i 1.189731E+4932 per a nombres positius.

Cal utilitzar dades de tipus real quan els nostres clculs hagin de treballar amb valors decimals. Escollirem float, double o long double en funci de la grandria dels valors emmagatzemats i de la quantitat de xifres significatives que calgui considerar.

c) Operadors numrics La correspondncia en el llenguatge C amb els operadors numrics que hem definit, de moment, en pseudocodi, s el que mostra la taula 7.
Taula 7. Equivalncia operadors numrics en pseudocodi i llenguatge C Pseudocodi Llenguatge C

+ +

* *

/ /

div /

mod %

Ara b, el llenguatge C disposa duns altres operadors per facilitar la feina del programador. A continuaci presentem els ms utilitzats: Operadors dincrement + + i decrement Sn operadors que poden acompanyar una variable numrica per la dreta o per lesquerra i la incrementen o decrementen en una unitat.

int n = 3; float r = 5.3; n++;/* La variable n passa a contenir el valor 4; s equivalent escriure ++n */ f--; /* La variable f passa a contenir el valor 4.3; s equivalent escriure --f */

No sempre s equivalent aplicar aquests operadors per lesquerra o per la dreta. La diferncia s'observa en utilitzar aquests operadors en els ndexs per accedir a les taules i en les crides a funcions, per aquests conceptes s'escapen dels objectius actuals.

Programaci estructurada i modular

56

Introducci a la programaci

Operadors doperaci ms assignaci +=, -=, /=, *=, %= Sn operadors que consisteixen a sumar, restar, dividir, multiplicar o fer el mdul del valor de la dreta sobre la variable de lesquerra, assignant el resultat a aquesta variable.
int n = 5; n += 3; /* s equivalent a fer n = n + 3; */ n -= 2;/* s equivalent a fer n = n - 2; */ n *= 4; /* s equivalent a fer n = n * 4; */ n /= 5;/* s equivalent a fer n = n / 5; */ n %= 2; /* s equivalent a fer n = n % 2; */

2) Dada de tipus carcter El llenguatge C aporta dos tipus de dada per al tractament del tipus carcter. Com que el conjunt de valors que cal representar consta de 256 elements, nhi ha prou, en qualsevol cas, amb 1 octet. a) char C utilitza aquest tipus per emmagatzemar un valor enter entre 128 i 127. Els valors de 0 a 127 equivalen als 128 primers carcters del codi ASCII. Els segents carcters (des del que ocupa el lloc 128 fins al que ocupa el lloc 255) estan representats pels valors enters 128 1. b) unsigned char C utilitza aquest tipus per emmagatzemar un valor enter entre 0 i 255, el qual es correspon amb el carcter que ocupa el lloc corresponent. Per tant, en C es pot utilitzar els tipus carcter per tractar dades numriques enteres, els valors de les quals siguin entre 128 i 127 per al tipus char i entre 0 i 255 per al tipus unsigned char.

2.8.1. Declaraci de variables i constants


De manera semblant al pseudocodi, un programa en C tindr la forma:
void main() { /* declaraci de constants i variables */ /* instruccions del programa */ }

En C, a diferncia del pseudocodi, podrem tenir les constants i les variables barrejades. Si ho preferiu, podeu posar primer les constants i desprs les variables, per no s obligatori.

Programaci estructurada i modular

57

Introducci a la programaci

La sintaxi que cal utilitzar per declarar una dada en C s:

[const] <tipus> <nom_dada> [ = <valor> ] [,<nom_dada> [= <valor>] ];

Heu de comenar a acostumar-vos a la notaci que sutilitza en informtica: Qualsevol element entre claudtors [ i ] s optatiu. Qualsevol element entre claus { i } s obligatori. Qualsevol element en negreta indica paraula clau (reservada) que no admet cap altra forma descriptura; en alguns entorns sutilitza la majscula i, fins i tot, hi ha entorns en els quals les paraules clau no sindiquen de cap manera especial; per en tal cas, les paraules no clau (escollibles pel programador) sn les que van acompanyades dalguna indicaci. Qualsevol element entre < i > indica paraula escollible pel programador. Qualsevol llista delements separats per | indica diferents alternatives de les quals el programador nhaur descollir una. Qualsevol llista delements separats per , i acabada amb indica una seqncia indefinida. Comentem, per, el cas que ens ocupa: Utilitzarem const quan vulguem definir una constant; per defecte, estarem definint una variable. s optatiu acompanyar una dada dun valor; en cas que ho fem, estem inicialitzant la dada. Evidentment, farem servir aquesta possibilitat per inicialitzar les constants; en cas contrari, el valor que lordinador els assigni ser el que mantindran al llarg de lexecuci del programa, ja que una constant no s modificable. Podem utilitzar tamb aquesta possibilitat per donar un valor inicial a les variables; tant si ho fem com si no, posteriorment, disposarem de mecanismes per modificar el valor que contenen. Els punts suspensius del final ens permeten utilitzar una mateixa declaraci [const] <tipus> per declarar diverses constants i/o variables del mateix tipus. Exemples:
const unsigned int edat = 25, ptes = 0; float pes = 85.5, altura;

Programaci estructurada i modular

58

Introducci a la programaci

Cal tenir en compte els punts segents: En el primer exemple, hem declarat dues constants unsigned int de noms edat i ptes amb valors 25 i 0, respectivament. En el segon exemple, hem declarat dues variables float de noms pes i altura amb valor inicial 85.5 per a la primera; no podem dir res sobre el valor inicial que lordinador assignar, en execuci, a la variable altura, valor que pot canviar a cada execuci del programa.

2.8.2. Especificaci de valors constants


Hi ha diferents sistemes de numeraci utilitzats en informtica (decimal base 10, octal base 8 i hexadecimal base 16). Com podem indicar en un programa que un valor constant s dun determinat tipus? s a dir, quan en un programa sescrigui la constant 3, com pot el programador indicar al compilador si aquest 3 s real, enter, etc.? Una constant en llenguatge C pot ser un enter, un real o un carcter. 1) Constants enteres La sintaxi per especificar una constant entera s: {[+] | -} [{0|Ox|0X}]<valor>[{L|U|UL}] s a dir: Si s positiva pot portar o no el smbol +, per haur de portar obligatriament el smbol si s negativa. El valor pot tenir per prefix els smbols 0 (zero), 0x (zero ms x), 0X (zero ms X) o no tenir-ne. Sense prefix: indica una constant en base 10, la qual pot contenir un o ms dgits del 0 al 9, el primer dels quals ha de ser diferent de zero. Amb prefix 0: indica una constant en base 8, la qual pot tenir un o ms dgits del 0 al 7. Amb prefix Ox o OX: indica una constant en base 16, la qual pot tenir un o ms carcters del 0 al 9 i de la A a la F, en majscules o minscules. El valor pot tenir per sufix els smbols U, L, UL o no tenir-ne.

Programaci estructurada i modular

59

Introducci a la programaci

Sense sufix: si s en base 10, el seu tipus s el primer dels tipus int, long i unsigned long en el qual pugui ser representat. Si s en base 8, el seu tipus s el primer dels tipus int, unsigned int, long i unsigned long en el qual pugui ser representat. Si s en base 16, el seu tipus s el primer dels tipus int o unsigned int en el qual pugui ser representat. Amb sufix L: el seu tipus s long quan el valor pot ser representat per aquest tipus (s dins linterval de valors corresponent); en cas contrari, s considerat unsigned long. Amb sufix U: el seu tipus s unsigned int quan el valor pot ser representat per aquest tipus; en cas contrari s considerat unsigned long. Amb sufix UL: el seu tipus s unsigned long.
Exemples de representaci de constants enteres en el llenguatge C 2500UConstant entera en base 10 representada com a unsigned int 10000Constant entera en base 10 representada com a int 50000Constant entera en base 10 representada com a int en plataforma de 32 bits, per representada com a long en plataforma de 16 bits, ja que 50000 no s representable com a int en plataforma de 16 bits. 0350000Constant entera en base 8. El seu valor en base 10 s 118784 i, per tant, en plataforma de 32 bits s representada com a int per en plataforma de 16 bits seria representada com a long. 035000Constant entera en base 8 representada com a int, ja que el seu valor en base 10 s 14848, que pot ser representat, en primer lloc, com a int. 0x35AFFConstant entera en base 16. El seu valor en base 10 s 219903 i, per tant, en plataforma de 32 bits s representada com a int, per en plataforma de 16 bits seria representada com a long.

2) Constants reals La sintaxi per especificar una constant real s:

{[+] | }<part_entera>.<part_fraccionria>[{e|E}{[+] | }<exponent>][f|F|l|L]

en qu: Si s positiva pot portar o no el smbol +, per haur de portar obligatriament el smbol si s negativa. <exponent> representa zero o ms dgits del 0 al 9. E o e s el smbol dexponent de la base 10, que pot ser positiu o negatiu (E3 indica 10 elevat a 3). Pot portar un sufix f o F o l o L, o no portar-ne. Sense sufix: el seu tipus s double.

Programaci estructurada i modular

60

Introducci a la programaci

Amb sufix f o F: el seu tipus s float. Amb sufix l o L: el seu tipus s long double.
Exemples de representaci de constants reals en el llenguatge C 15.45FConstant de tipus float amb valor 15.45 12.30E4 Constant de tipus double amb valor 0.00123 .001e5L Constant de tipus long double amb valor 100

3) Constants carcter Sn sempre de tipus char i consisteixen en un nic carcter entre cometes simples. A vegades, per, es pot fer referncia al carcter per mitj del seu codi ASCII en hexadecimal. En tal cas, cal posar el valor precedit dels carcters \x i tamb entre cometes simples. ! Les seqncies descapament (carcters de les posicions 0 a 31, en el codi ASCII) sn considerades com un nic carcter i el llenguatge C acostuma a facilitar-ne tenir alguna nomenclatura especial.
Exemples de representaci de constants carcter en el llenguatge C 'A' Constant char corresponent a la lletra majscula A '\x41' Constant char corresponent a la lletra majscula A ja que 41 s el codi ASCII '\x10' Constant char corresponent a la seqncia descapament LF (salt de lnia) '\n' Constant char corresponent a la seqncia descapament LF (salt de lnia)

2.8.3. Tractament del tipus lgic


El llenguatge C no disposa dun tipus especfic per representar les dades lgiques. Com sho manega, doncs? C utilitza les dades numriques per a tal finalitat.

En el llenguatge C, tota dada numrica amb valor igual a zero s considerada falsa a efectes lgics, i tota dada numrica amb valor diferent de zero s considerada certa a efectes lgics.

s a dir, si tenim:
int n = 10, p = 0; char c = 'A'; float f = 0;

el llenguatge C, interpretant-les com a variables lgiques, tindria n i c com a certes i p i f com a falses.

Programaci estructurada i modular

61

Introducci a la programaci

Els programadors acostumen a utilitzar variables enteres per al tractament dels valors lgics. ! 1) Operadors lgics La correspondncia en el llenguatge C amb els operadors lgics que hem definit en pseudocodi s el que mostra la taula 8. Observar que el llenguatge C no facilita un operador lgic per a la disjunci exclusiva.
Taula 8. Equivalncia operadors lgics en pseudocodi i llenguatge C Pseudocodi Llenguatge C i && o || xor no !

2) Operadors relacionals La correspondncia en el llenguatge C amb els operadors relacionals que hem definit en pseudocodi s la que es mostra en la taula 9.
Taula 9. Correspondncia entre llenguatge i pseudocodi Pseudocodi Llenguatge C

< <

> >

<=

>=

== ==

!= !=

2.8.4. Conversi de tipus


Quan els operands que intervenen en una operaci sn de tipus diferents, abans defectuar loperaci especificada es converteixen a un tipus com, dacord amb les regles que sexposen a continuaci: Els operands que intervenen en una determinada operaci sn convertits al tipus de loperand de precisi ms alta. En C, les constants reals sn considerades de tipus double per defecte. Una expressi lgica dna 1 com a resultat cert i 0 com a resultat fals. En una assignaci, el valor de la part dreta s convertit al tipus de la variable de lesquerra, dacord amb les regles segents: Els carcters es converteixen a enters. Els enters es converteixen a carcters, preservant els bits de menys pes, s a dir, desaprofitant els bits de ms pes en excs. Els reals sn convertits a enters, truncant la part fraccionria.

Programaci estructurada i modular

62

Introducci a la programaci

Un double passa a float, arrodonint i perdent precisi si el valor double no pot ser representat exactament com a float. En C est permesa una conversi explcita del tipus duna expressi mitjanant una construcci denominada cast, que t la forma que segueix a continuaci:
(<nom_de_tipus>) expressi

Lexpressi s convertida al tipus especificat si la conversi s permesa; en cas contrari, es produir un error. La utilitzaci apropiada de construccions cast garanteix una avaluaci consistent, per sempre que es pugui s millor evitar-la, ja que suprimeix la verificaci de tipus proporcionada pel compilador i, per tant, pot conduir a resultats inesperats.

float f = 5.2; (double) f;

/* Expressi que considera el valor 5.2 de f com a double */

2.8.5. Constants simbliques


El llenguatge C proveeix un altre mtode de declaraci de constants diferent de la utilitzaci del mecanisme const. En realitat no sn constants en el sentit estricte de la paraula. Sn les anomenades constants simbliques, utilitzades com a constants per molts programadors. Sabem que les dades ocupen memria i que les classifiquem en variables i constants en funci de si el seu valor es pot modificar o no al llarg de lexecuci del programa. Per tant, una constant s una dada que ocupa memria i que cont un valor des del seu inici. Suposem, per exemple:
const edat = 25;

!!
En lapartat Variables i constants podeu veure la definici dels conceptes variables i constants.

Tal com veiem en la figura 2, 25 est ocupant part de la memria mentre sexecuta el programa.

Declarar una constant simblica s una manera de comunicar al programa compilador un nom que porta associat un valor, de manera que, en el procs de traducci, el programa compilador substituir totes les aparicions del nom pel valor en qesti.

Programaci estructurada i modular

63

Introducci a la programaci

Figura 2. Exemple de dada constant ocupant part de la memria RAM

La sintaxi que sutilitza s:


#define <nom_constant_simblica> <valor>

Exemples de declaraci de constants simbliques:


#define edat 25 #define ptes 0

Utilitzant constants simbliques, lordinador no assigna cap zona de memria en temps dexecuci. s a dir, en execuci, el processador no es trobar cap instrucci en qu es faci referncia a una constant de nom edat o pes, sin que trobar directament els valors 25 i 0, respectivament. En canvi, quan es treballa amb constants en el sentit informtic de la paraula, en execuci, el processador troba els noms edat i pes en les instruccions que correspongui i mitjanant el nom accedeix a la memria per tal de cercar el valor. I ara segur que us feu la pregunta del mili: quan codifiquem amb el llenguatge C, qu s millor: utilitzar constants tipus const o constants tipus #define? Ja veureu que, de moment, farem servir sempre #define, s a dir, no aplicarem el concepte informtic de constant. El motiu s clar: si no ocupen memria, per qu caldria utilitzar un altre mtode que s que nocupa?
La modificaci de les constants Fins al moment hem introdut molts conceptes sobre la utilitzaci de la memria en temps dexecuci per mitj de constants i variables. I hem convingut que una constant s una dada immodificable durant lexecuci del programa. Aquesta darrera afirmaci s certa a mitges. Una constant, durant lexecuci del programa, ocupa memria. El processador t accs absolut a la memria RAM. Per tant, assegurar que no s modificable s fora arriscat, ja que si el processador hi t accs absolut, podria, si volgus, modificar-la. O no? Us heu dimaginar la memria com una habitaci que cont les constants i les variables i que t, com a accs, dues portes: una per a les constants i una altra per a les variables. Imagineu-vos el programa que est en execuci. Quan ha daccedir a una constant, cosa que fa per mitj del seu nom, entra a la memria per la porta de les constants; per tant, noms pot veure (llegir) el valor emmagatzemat. Per al cas de les variables, entra a la memria per la porta de les variables; per tant, hi pot llegir i escriure.

Programaci estructurada i modular

64

Introducci a la programaci

En realitat hi ha un tercer accs. Com molt b sabeu, la memria est dividida en octets, els quals estan numerats. s a dir, cada zona de la memria t una adrea i el processador pot anar a cada adrea i fer-hi el que li sembli oport. Per tant, la realitat s que tota dada emmagatzemada a la memria s accessible i pot ser modificada si es coneix ladrea on el processador lha deixat. I molts llenguatges de programaci entre els quals hi ha el nostre amic C faciliten al programador la possibilitat daccedir a la memria mitjanant adreces. Per aquest s un tema que sescapa dels objectius actuals.

2.8.6. Introducci al precompilador C

El precompilador C s un processador de text que manipula el text dun arxiu font (arxiu dextensi C) com a part duna primera fase de traducci i abans que la fase de compilaci prpiament dita comenci.

El precompilador avalua tot larxiu font, per noms en manipula les parts conegudes com a directrius pel precompilador.

Una directriu s una instrucci per al precompilador de C.

Les directrius sn utilitzades per fer programes fcils de canviar i fcils de compilar en diferents entorns dexecuci. Les directrius indiquen al precompilador quines accions especfiques ha dexecutar. Per exemple: substituir elements en el text (utilitzant #define); inserir contingut daltres arxius (utilitzant #include); suprimir la compilaci de parts de larxiu font (amb #if...#endif). s a dir, la declaraci duna constant simblica no s altra cosa que la utilitzaci duna directriu de precompilaci, de manera que, abans diniciar la veritable fase de traducci del programa font, actua el precompilador i substitueix totes les aparicions de la constant simblica pel valor assignat. Com que les directrius de precompilaci savaluen en una fase inicial, hi ha el costum entre els programadors en C de declarar-les al comenament dels arxius font, abans i tot de la lnia on apareix la paraula reservada main.
En aquest moment no entrem en profunditat en la utilitzaci de les directrius de precompilaci. A mesura que les necessitem les anirem introduint.

2.9. Tipus de dades simples definibles


Els tipus de dades simples que ens permet emmagatzemar un nic valor, ens les proporcionen la majoria de llenguatges. Alguns llenguatges permeten al programador la definici daltres tipus de dades per facilitar el disseny dalgorismes.

Programaci estructurada i modular

65

Introducci a la programaci

Els tipus de dades simples definibles es divideixen en dos grans apartats: enumerades i subrangs o subtipus.

2.9.1. Tipus de dades enumerades


Una enumeraci s un procs pel qual sestableix una correspondncia, dun a molts, entre una variable entera i els nics valors que aquesta pot prendre. Els valors de la variable, que es defineixen com a possibles dins lenumeraci, estan associats a identificadors que, si no sinicialitzen, prenen valors correlatius. Enumeracions en pseudocodi La sintaxi que farem servir s:
enum <nom> = (<identificador> [,<identificador> ...]) ;

En pseudocodi suposarem que els identificadors no sinicialitzen. Els elements de lenumeraci tenen un ordre que s precisament lordre en qu shan escrit els valors. En llenguatge C no s exactament aix. Un exemple val ms que mil paraules, oi? Suposem que en el nostre programa hem de treballar amb els dies de la setmana. Potser estar b disposar dun tipus de dada que ens permeti treballar amb els dies, passant al segent, a lanterior, etc.

Funcionalitat dels llenguatges Per treballar amb un llenguatge que facilita lenumeraci cal cercar informaci corresponent a la seva funcionalitat. No tots els llenguatges proporcionen la mateixa. Ara b, s que en tots s semblant.

enum dies = (dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge) ;

Amb aquesta declaraci acabem de definir un nou tipus de dada simple que podem fer servir en el nostre programa. Una vegada tenim declarada lenumeraci, podrem definir variables daquest tipus i operar-hi juntament amb els operadors que veurem a continuaci. Aix, doncs, podem declarar:
var dia : dies; fivar

i podrem fer assignacions del tipus:


dia = dilluns;

Programaci estructurada i modular

66

Introducci a la programaci

Veient lexemple, no us pregunteu on es declara lenumeraci? B, hem dit abans que lenumeraci s un nou tipus i ja hem comprovat que podem declarar variables daquest nou tipus. Sembla lgic pensar que s necessari haver declarat lenumeraci abans de declarar les corresponents variables. En efecte, per encara hi ha ms coses que cal tenir en compte.

El concepte denumeraci ha estat el primer que ens ha perms declarar tipus nous en els nostres programes. Aquesta prctica s fonamental per poder dissenyar algorismes entenedors i eficients

En pseudocodi s obligatori declarar els tipus en una zona especial per a aquesta finalitat (de manera semblant a la declaraci de constants i de variables). Tenim, doncs, que lestructura dun programa passa a ser la segent:
programa <nom programa> s const <nom_constant_1> = <valor_1>; <nom_constant_2> = <valor_2>; ... ficons tipus <declaraci_tipus1>; <declaraci_tipus2>; ... fitipus var <nom_variable_1> : <tipus_variable_1>; <nom_variable_2> : <tipus_variable_2>; ... fivar <instruccions del programa> fiprograma

A mesura que avancem en aquest crdit, anirem aportant maneres de declarar nous tipus.

Aix, en lexemple anterior, haurem escrit:

tipus enum dies = (dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge) ; fitipus var dia : dies; fivar

Operadors sobre els tipus de dades enumerats En realitat les operacions sn funcions, aix implica que retornen un resultat. Atesa una variable x corresponent a un tipus de dada enumerat, tenim les operacions (funcions) segents: suc(x), que retorna el valor de la dada enumerada immediatament superior a x; si x s la ms gran, retorna la mateixa x; pre(x), que retorna el valor de la dada enumerada immediatament inferior a x; si x s la ms petita, retorna la mateixa x;

suc(x): el nom prov de successor.

pre(x): el nom prov de predecessor.

Programaci estructurada i modular

67

Introducci a la programaci

ord(x), que retorna un nombre natural corresponent al nmero dordre de x dins lenumeraci (suposarem que comencen a comptar des de zero). Aquests tipus de dades permeten fer servir els operadors relacionals. Enumeracions en llenguatge C El llenguatge C permet, tamb, els tipus enumerats, per amb diferncies substancials respecte del pseudocodi. La sintaxi que hem dutilitzar s:
enum <nom> { <identificador>[=<valor_enter>] [,<identificador>[=<valor_enter>] ...] };

ord(x): el nom prov dordinal.

Sobre aix, cal comentar el segent: A diferncia del pseudocodi, els diferents identificadors es poden inicialitzar amb valors enters, que no tenen per qu ser correlatius. Qualsevol identificador es pot inicialitzar amb un valor enter resultat duna expressi. Els identificadors successius prendran valors correlatius a partir daquest, si no s que tamb tinguin assignat un valor. Per defecte, el primer identificador sinicialitza amb el valor zero. Dos o ms identificadors poden tenir el mateix valor. Un mateix identificador no pot aparixer en diferents tipus de dades. No s possible llegir o escriure directament un valor dun tipus enumerat. Considerem alguns exemples.
enum dies {dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge};

En aquest cas, dies s un nou tipus que t set possibles valors naturals (0...6) identificats pels noms dilluns, dimarts, ... diumenge:
enum dies {dilluns=-1, dimarts=1, dimecres=-2, dijous=2, divendres=0, dissabte=1, diumenge=2};

En aquest cas, dies s un nou tipus que t els valors naturals segents: 1 identificat per dilluns

Programaci estructurada i modular

68

Introducci a la programaci

1 identificat per dimarts i dissabte 2 identificat per dimecres 2 identificat per dijous i diumenge 0 identificat per divendres Com podeu observar, el tipus enumerat del llenguatge C s ms potent que el tipus enumerat del pseudocodi. Ara b, atesa una variable en C declarada a partir dun tipus enumerat, C la considera de tipus int i, per tant, aquesta variable pot rebre qualsevol valor de tipus int per mitj dels conductes de modificaci de valor duna variable (instrucci dassignaci o instrucci de lectura). s a dir, C dna total llibertat al programador per tractar la variable com un int. Un darrer comentari respecte de lltim exemple: no pretengueu cercar cap lgica en aquesta definici. La majoria de les vegades ens interessar identificar els dies de la setmana des d1 dilluns fins a 7 diumenge (sobretot si som a Catalunya). Com es defineix en C una variable dun tipus enum? Tenim diverses formes de fer-ho. En primer lloc, vegem algunes maneres de declarar el nou tipus (no totes): Definici del tipus dins la declaraci de variables abans de declarar cap variable del tipus en qesti. Posteriorment es poden declarar variables del tipus.
enum dies {dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge}; /* tipus */ enum dies dia1, dia2, dia3; /* variables */
Lmits del llenguatge C El llenguatge C s molt potent i aquesta potncia es troba, precisament, en el fet que aquest llenguatge t per mxima el programador ja sap el que es fa; jo lobeeixo. Per tant, alerta! s responsabilitat del programador en C controlar els valors que prenen les variables dun tipus enumerat.

Als Estats Units ens interessaria identificar els dies de la setmana com a 0 per al diumenge, 1 per al dilluns, ..., 6 per al dissabte.

Definici del tipus dins la declaraci de variables abans de declarar cap variable del tipus en qesti, aprofitant la mateixa declaraci de tipus per declarar una o ms variables. Posteriorment es poden declarar ms variables del tipus.
enum dies {dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge} dia1, dia2; /* tipus i dues variables */ enum dies dia3; /* variable */

Per acabar, en llenguatge C no hi ha operadors especfics per al tractament de variables de tipus enum. Cal fer servir els operadors del tipus int.

2.9.2. Subtipus de dades en pseudocodi


Alguns llenguatges incorporen la possibilitat de delimitar el conjunt de valors possibles per als tipus enter, natural i carcter (tipus estndards) i per als tipus enumerat (definit pel programador), definint un nou tipus que s considerat subtipus del tipus del qual els seus valors en sn subconjunt.

Programaci estructurada i modular

69

Introducci a la programaci

Les operacions permeses en els subtipus sn les mateixes que les dels tipus dels quals deriven. En llenguatge C no hi ha la possibilitat de declarar subtipus; en canvi, ja sabem que el tipus enum del llenguatge C s molt ms potent que el tipus enumerat vist en pseudocodi. Per tant, noms farem referncia a subtipus en pseudocodi. La sintaxi s la segent:
tipus <nom_tipus> = <llista_valors_possibles> | <interval_valors_possibles>; ... fitipus

Exemples de definici de subtipus:


tipus sexe = 'H', 'D'; trimestres = 1,2,3,4; /* o tamb 1..4 */ notes = 0..10; enum dies = (dilluns, dimarts, dimecres, dijous, divendres, dissabte, diumenge); diesfeiners = dilluns...divendres; diesfestius = dissabte...diumenge; fitipus

2.9.3. Redefinici de tipus de dades en C


El llenguatge C permet redefinir el nom dels tipus de dades estndards que hi ha i, fins i tot, els tipus de dades creats pel programador, utilitzant la paraula reservada typedef, abreviatura de definici de dada per, realment, redefinici de nom de tipus de dada. La sintaxi dutilitzaci daquesta instrucci s la segent:
typedef <nom_actual_tipus> <nom_nou_tipus>;

Com a exemple, podrem efectuar les segents redefinicions per apropar ms el llenguatge C al pseudocodi:
typedef typedef typedef typedef typedef typedef typedef unsigned int natural4; unsigned long natural8; int enter4; long enter8; float real4; double real8; char caracter;

Posteriorment podrem definir variables utilitzant els noms nous:


natural4 edat; /* unsigned int */ natural8 ptes; /* unsigned long */ real4 euros; /* float */

Programaci estructurada i modular

70

Introducci a la programaci

3. Instruccions seqencials bsiques

Una vegada coneixem els tipus de dades simples que es fan servir en pseudocodi i la seva implementaci en el llenguatge C, aix com les operacions que podem efectuar amb aquestes, ens manca saber com hem de lligar les diferents operacions per tal de plasmar en lalgorisme la seqncia de passos per aconseguir la soluci desitjada. Una estructura seqencial s un conjunt dinstruccions que sexecuten luna a continuaci de laltra. Una vegada executada la primera instrucci sexecuten totes les altres en lordre en qu shan descrit. Quan es dissenya una estructura seqencial en pseudocodi sacostuma a escriure una instrucci, acabada en ;, a cada lnia. Podem, per, escriure diverses instruccions per lnia. La bona prctica aconsella fer servir el mtode duna instrucci per lnia, ja que sassoleixen algorismes ms clars per a seguiments futurs. Per tant, un algorisme en pseudocodi tindr la forma segent:
programa <nom [ const ... ficonst ] [ var ... fivar ] instrucci instrucci instrucci ... instrucci fiprograma programa> s

1; 2; 3; N;

En el llenguatge C se segueix exactament la mateixa sintaxi descrita pel pseudocodi: instrucci darrere instrucci acabada cadascuna amb el smbol ;.

3.1. Ordinogrames

Els ordinogrames o diagrames de flux del procs representen la seqncia lgica de les operacions que cal fer per dur a terme el procs.

Programaci estructurada i modular

71

Introducci a la programaci

Els smbols ms usats habitualment en els ordinogrames, recollits en la figura 3, sn: inici-final del procs, operaci bsica interna, operaci bsica dentrada-sortida de perifrics, preses de decisi i subprocs.
Figura 3. Smbols ms usats habitualment en els ordinogrames

!!
En la unitat didctica Estructures de control podeu veure els smbols utilitzats en les preses de decisi. Perifric Anomenem perifric tot objecte que permet la comunicaci del processador amb lexterior (pantalla, teclat, mdem, impressora, altaveu, etc.).

La figura 4 mostra les formes que pot adoptar un ordinograma duna estructura seqencial.
Figura 4. Formes que pot adoptar un ordinograma d'una estructura seqencial

3.2. Instrucci dassignaci


La primera instrucci que hem destudiar s la que assigna el valor a una variable. De fet, ja lhem fet servir, de manera amagada, quan hem donat el valor inicial a lhora de declarar les variables.

La instrucci dassignaci s la que permet donar valor a una variable.

Programaci estructurada i modular

72

Introducci a la programaci

La sintaxi utilitzada en pseudocodi s, principalment, la segent:

<nom_variable> <expressi> /* Notaci prpiament de pseudo-codi */ <nom_variable> := <expressi> /* Notaci tipus Pascal */ <nom_variable> = <expressi> /* Notaci tipus C -la que utilitzarem- */

Una expressi s una combinaci de variables, constants i operadors que, desprs dhaver estat avaluada segons les lleis de la matemtica i la lgica, retornen un resultat.

En concret, una expressi pot estar constituda per un nic valor. Cal suposar que els tipus de la variable i del resultat de lexpressi sn equivalents o compatibles. s a dir, no s possible assignar un resultat lgic a una variable de tipus numric o carcter. Ara b, s que es pot assignar un resultat numric enter a una variable de tipus real, per exemple.

Per representar una assignaci en un ordinograma farem servir un smbol doperaci bsica interna, com es mostra en la figura 5.
Figura 5. Representaci duna instrucci dassignaci en un ordinograma

En llenguatge C se segueix exactament la sintaxi descrita pel pseudocodi, que consisteix en la utilitzaci del smbol =. Per no confondrel amb loperador relacional digualtat, aquest es representa, com molt b sabeu, amb un doble smbol digualtat ==.

3.3. Instruccions dentrada


La immensa majoria de programes han de gestionar dades que provenen de lexterior (des del punt de vista de lordinador), les quals sn introdudes mitjanant els perifrics dentrada, a petici del programa que les ha de gestionar.

Les instruccions dentrada sn les que permeten al programa rebre informaci de lexterior.

Programaci estructurada i modular

73

Introducci a la programaci

De manera semblant al funcionament de lsser hum quan rep informaci, el qual lemmagatzema inicialment en el cervell per tal de tractar-la posteriorment, els programes, quan reben informaci, lhan demmagatzemar a la seva memria i, per tant, la utilitzaci dinstruccions dentrada implica la corresponent utilitzaci de variables. A causa del fet anterior, i perqu hi ha diferents canals per introduir informaci a lordinador (el teclat, els suports magntics, el mdem, el ratol, etc.), els llenguatges de programaci necessiten instruccions dentrada especialitzades (per tipus de dada i per canal dentrada).

3.3.1. Instruccions dentrada en pseudocodi i en ordinogrames


En pseudocodi, de moment, no ens complicarem la vida i considerarem que lentrada es produeix, nicament, per teclat. La instrucci dentrada en pseudocodi s:
llegir ( <nom_variable> [, <nom_variable> ...] );

en la qual sobserva que en una instrucci llegir el programa pot rebre un o ms valors introduts des de lexterior. s obligatori que les variables hagin estat declarades prviament i han de ser del tipus de dada que sha de recollir. En pseudocodi suposarem que la dada que arribi de lexterior sempre ser del tipus adequat a la variable que lha de rebre. Quan codifica els algorismes en un llenguatge informtic concret, el programador ha dadoptar les mesures pertinents per controlar la possibilitat que la dada rebuda sigui del tipus adequat, control que depn del llenguatge concret.
Control de les instruccions dentrada Hi ha llenguatges de programaci que tenen un fort control en les instruccions dentrada, de manera que si, per exemple, lentrada sefectua per teclat i lusuari escriu una dada de tipus erroni, el programa es queda aturat fins que lusuari introdueix una dada del tipus esperat. Aquest s el comportament normal quan, per exemple, sest demanant una dada numrica i lusuari, per equivocaci, introdueix carcters. Estem parlant de control del tipus de dada en lentrada. Aix no sha de confondre amb el domini de valors que es poden introduir. Per exemple, si lusuari ha dentrar un valor numric natural entre 0 i 9 i introdueix un 15, aqu no hi ha error de tipus de dada; estem davant un error del valor introdut. Els errors de valors sempre els ha de controlar el programador; hi ha llenguatges que aporten ajudes per a aquest tipus de control. Lerror a qu ens referem a linici s error de tipus de dada. Hi ha llenguatges que ja ho controlen per si mateixos. Daltres no ho fan i, en aquests casos, s responsabilitat del programador. Dins el grup de llenguatges que no ho controlen podem distingir dos subgrups: llenguatges que, en cas de produirse un error no controlat pel programador, avorten lexecuci del programa (llenguatges actius o agressius) i llenguatges que, en el mateix cas, continuen lexecuci sense haver llegit la dada, de manera que la variable de recepci no ha modificat el seu valor (llenguatges passius). El llenguatge C pertany al grup de llenguatges que no ho controlen i que deixen prosseguir lexecuci del programa.

Programaci estructurada i modular

74

Introducci a la programaci

Per representar una instrucci dentrada en un ordinograma farem servir un smbol doperaci bsica dentrada, com es mostra en la figura 6.
Figura 6. Representaci duna instrucci dentrada en un ordinograma

Si lentrada es produeix per teclat podem utilitzar el smbol corresponent i tindrem la representaci que es mostra en la figura 7.
Figura 7. Representaci duna instrucci dentrada per teclat en un ordinograma

Per ltim, cal comentar que la instrucci llegir no es pot utilitzar per efectuar lentrada de qualsevol tipus de dada. Aix, per exemple, no es pot utilitzar per introduir valors lgics ni valors de tipus enumerats. !

3.3.2. Instruccions dentrada en llenguatge C


En el llenguatge C tenim moltes instruccions corresponents al llegir del pseudocodi. Ens centrarem, de moment, en una nica instrucci: la funci scanf. La funci (penseu instrucci) scanf llegeix dades de lentrada estndard (anomenada stdin en llenguatge C i que acostuma a ser el teclat), les interpreta dacord amb el format indicat i les emmagatzema en els llocs indicats. La funci scanf t moltes possibilitats. Per per entendre-les hem desperar a tenir ms coneixements del llenguatge C. De moment, farem servir la sintaxi daquesta funci imprescindible per poder llegir dades per teclat. No intenteu, en aquest moment, sense ser experts en programaci i en el llenguatge C, cercar informaci daquesta funci enlloc. Us embolicareu de manera innecessria. La sintaxi s:
scanf ("<format de lectura>", &<nom_variable>[, &<nom_variable>, ...] );
Com ja deveu saber, lordinador pot tenir diversos canals dentrada i diversos canals de sortida, dels quals nhi ha un que s el canal dentrada estndard (normalment el teclat) i un que s el canal de sortida estndard (normalment la pantalla), tot i que els canals estndard es poden redireccionar, mitjanant el sistema operatiu, cap a altres canals. En llenguatge C, el canal dentrada estndard sanomena stdin i el canal de sortida estndard, stdout. Canals dentrada i de sortida

en la qual hi ha dhaver, com a mnim, una variable, la qual ha destar prviament declarada.

Programaci estructurada i modular

75

Introducci a la programaci

Sintaxi de la instrucci scanf El programa traductor de C necessita, en temps de compilaci, informaci sobre la sintaxi de la instrucci scanf. Aquesta informaci la cerca, de manera automtica, en certs directoris definits en lentorn de programaci on es desenvolupa el programa. A vegades, per, aquests directoris no estan definits o no contenen la informaci cercada. Llavors cal informar-ne explcitament al compilador, la qual cosa es fa mitjanant la directriu de precompilaci #include. La directriu #include diu al precompilador que inclogui el fitxer especificat en el programa font, en el lloc on apareix la directriu. Hi ha dues maneres dutilitzar-la: La sintaxi

#include "arxiu"
que provoca que larxiu es busqui en primer lloc en el directori actual de treball i posteriorment en els directoris estndards definits en lentorn de programaci. La sintaxi

#include <arxiu>
que provoca que larxiu es busqui nicament en els directoris estndards definits. En el cas que ens ocupa, la informaci necessria per a la instrucci scanf es troba a larxiu stdio.h (standard input output) que acostuma a estar en el directori include de lentorn de programaci. Aquestes directives #include se solen situar al comenament del programa font. En cas de fer servir el llenguatge C++, laparici de les directives #include s obligatria per a totes les funcions de C utilitzades en el programa font.

Acabem de dir que scanf s una funci. De moment no sha explicat qu s, en programaci, una funci, per vosaltres ja esteu acostumats a aquest terme en matemtiques. Us noferim una definici:

Una funci s un conjunt de clculs que donen un resultat final.

Per tant, scanf, a ms dintentar llegir les dades que arriben per teclat, ens dna un resultat, el qual no s altra cosa que un enter que correspon al nombre de dades llegides per lentrada estndard. Tamb sabeu que el llenguatge C no controla si les dades que arriben corresponen al tipus de les variables que les han de rebre; aix era tasca del programador. Doncs b, aquest haur dutilitzar el resultat que retorna la funci scanf per efectuar aquest control. Aviat veurem com es pot fer. Comentem, abans de continuar, en qu consisteix el format de lectura que apareix dins la funci scanf. El format de lectura interpreta cada dada de lentrada i est format per carcters que es poden agrupar en: 1) espais en blanc, que engloba (espai en blanc), \t (conjunt de smbols que C interpreta com un tabulador), \n (conjunt de smbols que C interpreta com un salt de lnia, return o un intro);

Programaci estructurada i modular

76

Introducci a la programaci

2) carcters ordinaris; 3) especificacions de format (%d, %c, %f, etc.). El format es llegeix sempre desquerra a dreta i cada variable que espera llegir (rebre) una dada ha de tenir la corresponent especificaci de format i en el mateix ordre. Posem-ne un exemple:
int i, j, k; char lletra; float import; ... scanf ("%d %f %c", &i, &import, &lletra); scanf ("%d %d", &j, &k);

En els exemples anteriors veiem dos casos dutilitzaci de la funci scanf. En el primer, es fa servir per intentar llegir tres dades emplenant les variables i (int), import (float) i lletra (char), mentre que en el segon sutilitza per intentar llegir dues dades emplenant les variables j i k (int). Ben segur que us deveu estar preguntant qu indiquen les expressions segents:
"%d %f %c" "%d %d"

en el format de lectura. El format de lectura indica al processador com ha dinterpretar les dades que li arribaran. Si un carcter de lentrada estndard no es correspon amb lentrada especificada pel format, savortar lentrada de dades i el programa passar a executar la instrucci segent. Quan sexecuta una instrucci scanf com les dels exemples anteriors, lexecuci del programa satura fins que per lentrada estndard (suposem que s el teclat) hi arriben les dades que espera. En cas dintroduir les dades per teclat, aquestes no sn assignades immediatament a les variables corresponents; si aix succes, no tindrem possibilitat de corregir una dada equivocada. La realitat s que les dades sescriuen en una zona de memria intermdia anomenada buffer i sn enviades al processador quan es prem la tecla <>. Aquestes dades, a mesura que sescriuen, sn visualitzades per pantalla amb la finalitat de veure el que lusuari est introduint. Quan la unitat central de processament inicia la interpretaci de les dades enviades, les ha de poder interpretar tal com especifica el format. Si no ho pot fer, avorta la introducci en la dada on ha fallat i passa a la instrucci segent. Ara b, les dades que han quedat pendents dassignar a variables continuen en estat despera, de manera que la propera instrucci de lectura no saturar, perqu ja t dades pendents de processar, i com que les
El smbol <return> El smbol indica la tecla <entrar>, coneguda normalment per <return> o <intro>.

Programaci estructurada i modular

77

Introducci a la programaci

dades que shan de processar no sn les que lusuari hauria volgut introduir, el programa haur perdut loremus i el seu funcionament ser, a partir daquest moment, imprevisible. Aix no passar mai si el programador ho controla b. La unitat central de processament pot rebre les dades una a una o, dalguna manera, en seqncia. En tal cas, les rep separades per qualsevol dels carcters abans agrupats sota la definici genrica despais en blanc, s a dir, lespai en blanc , el tabulador \t o el salt de lnia \n. Un espai en blanc abans o desprs duna especificaci de format fa que scanf llegeixi, per no emmagatzemi, tots els carcters espai en blanc, fins a trobar-ne un diferent de lespai en blanc. Posem casos dintroducci de dades basats en els exemples anteriors. Suposem que el buffer dentrada no cont cap dada pendent de processar i que, per tant, lordinador satura en el primer scanf. a) Escrivim:
5

i lordinador processa aquesta dada, ja que en prmer <> sinicia el procs; lespecificaci de format %d, que correspon a la primera dada, li indica que sha de trobar amb una dada que ha dinterpretar com un int i no t cap problema per fer-ho aix amb el valor 5 que li ha arribat, el qual assigna a la variable i; posteriorment es torna a aturar perqu la mateixa instrucci scanf encara t dues variables pendents demplenar; escrivim:
2

i sinicia el procs per a aquesta dada; lespecificaci de format %f que correspon ara, li indica que sha de trobar una dada que cal interpretar com a float i no t cap problema per fer-ho aix amb el valor 2 que li ha arribat, el qual assigna a la variable import; posteriorment es torna a aturar perqu la mateixa instrucci scanf encara t una variable pendent demplenar; escrivim:
A

i sinicia el procs per a aquesta dada; la tercera especificaci de format %c li indica que sha de trobar una dada que cal interpretar com a char i no t cap problema per fer-ho aix amb el valor A que li ha arribat, el qual assigna a la variable lletra. En aquest moment, la unitat central de processament ja ha acabat la primera instrucci scanf i ninicia la segona, da-

Programaci estructurada i modular

78

Introducci a la programaci

vant la qual, com que no ha quedat cap dada pendent de processar, torna a provocar laturada del programa en espera que introdueixin ms dades, procs que seria semblant al descrit. b) Escrivim:
5 2 A

i el processador inicia el mateix procs; lespai que hem deixat entre el 5 i el 2 i entre aquest i la A permeten a la unitat central de processament distingir una dada duna altra. El resultat final s equivalent al cas anterior. En els dos casos, la funci scanf dna el valor 3 com a resultat perqu ha pogut llegir els tres valors. El programador hauria pogut escriure la instrucci de la manera segent:
int r; ... r = scanf ("%d %f %c", &i, &import, &lletra);

i aix t a la variable r la quantitat de dades realment llegides, i pot actuar de la manera que cregui oport en cas que no shagi pogut completar la instrucci dentrada. c) Escrivim:
5 hola A

i lordinador, quan repeteix el procs, aconsegueix llegir el 5 com a int (%d), per falla en la lectura esperada del float (%f) perqu rep una h, carcter que no pot identificar amb un float. En aquest moment, lscanf acaba donant un 1 per resultat. Queden pendents de procs hola i A, que intentaran ser avaluades en la instrucci segent de lectura; en lexemple que ens ocupa, la segent instrucci scanf espera llegir dos int (%d), per la qual cosa ja falla en la primera lectura, perqu h no pot ser interpretada com un int. Savorta lexecuci daquest scanf, el qual retorna 0 per resultat (no ha pogut assignar valor a cap de les dues variables). Els valors hola i A continuen pendents de procs. Evidentment, quan una variable t assignat un valor i mitjanant una instrucci dentrada se li assigna un de nou, el valor anterior s destrut, ja que passa a ocupar el mateix espai de memria. En cas, per, que la instrucci de lectura falli, la variable conserva el valor que tenia prviament. Daltra banda, dins el format de lectura hi pot haver carcters ordinaris que no tenen res a veure amb les especificacions de format. Aix obliga que lusuari introdueixi els mateixos carcters ordinaris, s a dir, la funci

Programaci estructurada i modular

79

Introducci a la programaci

scanf espera trobar les dades amb els carcters ordinaris corresponents. Aix, la instrucci:
int r, e, c; ... r = scanf("%d euros i %d cntims", &e, &c);

obliga lusuari a introduir una expressi semblant a la segent:


25 euros i 60 cntims

cosa que la funci scanf interpreta correctament, ja que esperava trobar una dada que pogus interpretar com un int (%d), el text euros i, una dada que pogus interpretar com un int (%d) i el text cntims. Com que aix ha estat possible, les variables r, e i c han rebut els valors 2 (nombre de dades llegides), 25 i 60, respectivament. En lexemple anterior, si lusuari hagus escrit:
25 euros amb 60 cntims

la funci scanf noms hauria pogut llegir el 25, de manera que la variable r hauria quedat plena amb el valor 1, la variable e amb el valor 25 i la variable c no hauria variat el valor que tenia prviament. El buffer del teclat hauria quedat ple amb les dades que no han estat processades, s a dir, contindria amb 60 cntims, els quals intentarien ser processats en la instrucci dentrada segent. Vegem, per, com pot ser una especificaci de format. La sintaxi duna especificaci de format s la segent:
%[*][<ample>][h|l]<tipus>

Una especificaci de format sempre comena amb %. La resta dels elements sexpliquen en les taules 10 i 11.
Taula 10. Utilitzaci dels elements despecificaci de format en la funci scanf Element * Explicaci Un asterisc a continuaci del smbol % suprimeix lassignaci de la segent dada dentrada. Per exemple:

scanf ("%d %*c %d %*c", &euros, ims);


Una entrada com

17 e 45 c
produeix lassignaci euros = 17 i cntims = 45. Els carcters e i c sn llegits per no assignats. ample Mxim nombre de carcters que sha de llegir de lentrada. Els carcters en excs no es tenen en compte i queden pendents de processar.

Programaci estructurada i modular

80

Introducci a la programaci

Element h (hac) l (ela)

Explicaci Es fa servir com a prefix amb els tipus d, i, o, x i X per especificar que el valor s short int, o amb u per especificar que s un short unsigned int Es fa servir com a prefix amb els tipus d, i, o, x i X per especificar que el valor s long int, o amb u per especificar que s un long unsigned int. Tamb sutilitza amb els tipus e, E, f, g i G per especificar que el valor s double. El tipus determina com ha de ser interpretada la dada dentrada: com un char, com un int, com un float, etc. Aquest apartat tamb s obligatori. La taula 10 mostra els tipus que en aquests moments podem utilitzar.

tipus

Taula 11. Possibles tipus de dades en lespecificaci de format de la funci scanf Tipus Tipus de la variable Entrada esperada

d o x, X i

int int int int

Enters amb signe, en base 10. Enters amb signe, en base 8.


Enters amb signe, en base 16. Enters amb signe en base 10, 16 o 8. Si lenter comena amb 0 (zero) es pren el valor en octal i si comena amb 0x o 0x el valor es pren en hexadecimal. Enters sense signe, en base 10. Valor real en notaci cientfica: [-]d.dddd[{e|e}[+|-]ddd] Un nic carcter.

u f, e, E, g, G c

unsigned int float char

Vegem, en la taula 12, alguns exemples dutilitzaci de lespecificaci de format en la funci scanf a partir de les segents declaracions de variables:
int ptes; unsigned int edat; float euros; char sexe;

Taula 12. Exemples dutilitzaci de lespecificaci de format en la funci scanf Instrucci Entrada Valor enregistrat a la variable

scanf ("%d", &ptes) scanf ("%o", &ptes) scanf ("%i", &ptes)

25 25 25 025 0x25 0X25

25 21 (valor decimal de 25 en octal) 25 21 37 37 37 (valor decimal de 25 hexadecimal) 37 (valor decimal de 25 hexadecimal) 15 25.6 256 2.56

scanf ("%x", &ptes) scanf ("%X", &ptes) scanf ("%u", &edat) scanf ("%f", &euros)

25 25 15 25.60 25.60E1 25.60E1

Programaci estructurada i modular

81

Introducci a la programaci

Instrucci

Entrada

Valor enregistrat a la variable

scanf ("%g", &euros)

25.60 25.60E1 25.60E1

25.6 256 2.56 25.6 256 2.56 25.6 256 2.56 25.6 D H

scanf ("%G", &euros)

25.60 25.60E1 25.60E1

scanf ("%e", &euros)

25.60 25.60E1 25.60E1

scanf ("%E", &euros) scanf ("%c", &sexe)

25.60 D H

De la mateixa manera que en pseudocodi amb la instrucci llegir, la instrucci scanf no es pot utilitzar per efectuar lentrada de qualsevol tipus de dada. Aix, per exemple, no es pot utilitzar per introduir valors de tipus enum. Ara b, com el tipus enum guarda valors int, s que s possible utilitzar la funci scanf per introduir els corresponents valors int en dades de tipus enum. !

3.4. Instruccions de sortida


De manera semblant a com introduem les instruccions dentrada, els programes gestionen dades que, en algun moment, han de donar a conixer a lexterior.

Les instruccions de sortida sn les que permeten al programa enviar informaci cap a lexterior.

La informaci que el programa envia a lexterior pot estar confeccionada a partir dels valors emmagatzemats a les variables. Per aix, juntament amb el fet que hi ha diferents canals per enviar informaci a lexterior (la pantalla, els suports magntics, el mdem, els altaveus, les impressores, etc.), els llenguatges de programaci necessiten instruccions de sortida especialitzades (per tipus de dada i per canal de sortida).

3.4.1. Instruccions de sortida en pseudocodi i en ordinogrames


En pseudocodi, de moment, no ens complicarem la vida i considerarem que la sortida es produeix, nicament, per pantalla.

Programaci estructurada i modular

82

Introducci a la programaci

La instrucci de sortida en pseudocodi s:


escriure ( <expressi> [, <expressi> ...] );

Shi observa que en una instrucci escriure el programa pot enviar una o ms expressions cap a lexterior. A tot el que ja coneixem sobre avaluaci dexpressions cal afegir-hi que tamb s una expressi qualsevol text escrit entre dobles cometes. Per representar una instrucci de sortida en un ordinograma farem servir un smbol doperaci bsica de sortida, com es mostra en la figura 8. Si la sortida es produeix per pantalla podem fer servir el smbol corresponent i tindrem la representaci que es mostra en la figura 9.
Figura 8. Representaci duna instrucci de sortida en un ordinograma

!!
En lapartat Expressions i ordre davaluaci doperadors es treballa lavaluaci de les expressions.

Figura 9. Representaci duna instrucci de sortida per pantalla en un ordinograma

Per ltim, volem comentar que la instrucci escriure no es pot utilitzar per efectuar la sortida de qualsevol tipus de dada. Aix, per exemple, no es pot utilitzar per mostrar valors lgics ni valors de tipus enumerats. !

3.4.2. Instruccions de sortida en llenguatge C


En el llenguatge C tenim moltes instruccions corresponents a lescriure del pseudocodi. Ens centrarem, de moment, en una nica instrucci: la funci printf. La funci printf escriu dades a la sortida estndard (anomenada stdout en llenguatge C i que acostuma a ser la pantalla), dacord amb el format indicat.

Programaci estructurada i modular

83

Introducci a la programaci

Tal com succea amb la funci scanf, la funci printf admet mltiples variants. Veurem, ara, les que podem fer servir. La sintaxi s la segent:
printf ("<format de sortida>"[, <expressi>, <expressi>, ...] )

Observem que s possible que no hi hagi cap expressi. Aix s motivat perqu, de manera semblant al pseudocodi, ens podem trobar amb text que ha de ser enviat a lexterior. En tal cas, el text forma part del format de sortida i, per tant, no ser necessria cap expressi. En aquesta instrucci, entenem per expressi una variable o expressi aritmtica amb un resultat. I hem comentat que printf s una funci, s a dir, ha de retornar un resultat. Aix s; dna un resultat enter igual al nombre de carcters escrits. De manera semblant a la funci scanf, la informaci que pot necessitar el compilador sobre la funci printf es troba a larxiu stdio.h, de manera que en cas que el compilador es queixi perqu no troba la declaraci de la funci printf, caldr incorporar a linici del programa font la corresponent #include. En qu consisteix el format de sortida que apareix dins la funci printf? El format de sortida especifica com ser la sortida. s una seqncia de carcters formada per: carcters ordinaris (text que apareixer tal qual); especificacions de format (%d, %c, %f, etc.); seqncies descapament (que ens permetran gestionar salts de lnia, avisos daltaveu, etc.). El format es llegeix sempre desquerra a dreta. Posem-ne un exemple:
int a=5; float b=2.1E2; ... printf ("El valors de a i b sn %d i %f\n",a,b);

Per pantalla apareixer:


Els valors de a i b sn 5 i 210.000000

i el cursor haur efectuat un salt de lnia (provocat per la seqncia descapament \n).

Programaci estructurada i modular

84

Introducci a la programaci

Vegem la sintaxi duna especificaci de format:


%[<flags>][<ample>][.<precisi>][{h|l|L}] <tipus>

Una especificaci de format sempre comena amb %. La resta dels elements sexpliquen a la taula 13.
Taula 13. Utilitzaci dels elements despecificaci de format en la funci printf

Element

Possibilitats

Explicaci
Justifica el resultat a lesquerra dins l<ample> especificat. Per defecte, la justificaci es fa per la dreta. Inicia sempre la sortida amb el signe + o per als valors numrics. Per defecte noms apareix el signe per als valors negatius. Emplena la sortida amb zeros no significatius dins l<ample> especificat. Inicia sempre la sortida amb un espai en blanc per als valors numrics positius. Signora si sutilitza juntament amb +. Funci dependent del <tipus> indicat: Tipus c, d, i, u Signora. Inicia la sortida amb 0, 0x, 0X respect. Obliga que la sortida contingui un punt decimal.

+ flags 0

Espai

flags

Tipus o, x, X Tipus e, E, f, g, G

amplada

Nombre mnim de posicions (carcters) per la totalitat de la sortida. Si el valor de lexpressi ocupa ms carcters dels especificats, lamplada s incrementada tant com calgui. Aquest apartat admet la possibilitat dun * (asterisc), el qual indica que el valor que sha de considerar com a <ample> s el resultat de la segent expressi a la llista de les expressions, abans de lexpressi que estem formatant.

precisi

Funci dependent del <tipus> indicat: Tipus d, i, o, u, x, X, c Tipus f, e, E, g, G Signora. Sense punt decimal.

<n> *

A tot estirar, <n> posicions. El valor que sha de considerar com a <precisi> s el resultat de lexpressi segent a la llista de les expressions, abans de lexpressi que estem formatant.

Sutilitza com a prefix amb els tipus d, i, o, x i X per especificar que el valor s short int, o amb u per especificar que s un short unsigned int. Sutilitza com a prefix amb els tipus d, i, o, x i X per especificar que el valor s long int, o amb u per especificar que s un long unsigned int. Tamb es fa servir amb els tipus e, E, f, g i G per especificar que el valor s double. Sutilitza com a prefix amb els tipus e, E, f, g i G per especificar que el valor s long double. El tipus determina com ha de ser interpretada la dada de sortida: com un char, com un int, com un float, etc. Aquest apartat tamb s obligatori.

l (ela)

tipus

Programaci estructurada i modular

85

Introducci a la programaci

La taula 14 mostra els tipus que en aquests moments podem fer servir.
Taula 14. Possibles tipus de dades en lespecificaci de format de la funci printf

Tipus d, i o x X u f

Tipus de la sortida int int int int int double

Sortida efectuada Enters amb signe, en base 10. Enters sense signe, en base 8. Enters sense signe, en base 16 (01...abcdef). Enters sense (01...ABCDEF). signe, en base 16

Enters sense signe, en base 10. Valor amb signe en notaci[]dddd.dddd. El nombre de dgits de la part entera depn de la magnitud del nmero. El nombre de decimals depn de la precisi, la qual s, per defecte, 6.

e, E

double

Valor amb signe en notaci cientfica: []d.dddd{e|e}[{+|}]ddd.

g, G

double

Valor amb signe, en format f o e/E segons quin sigui ms compacte pel valor i precisi donats. Un nic carcter, corresponent a loctet menys significatiu del valor considerat com a enter; o sigui, el valor que resulta de collocar el valor inicial dins linterval [0...255] fent tantes voltes com sigui necessari.

int

Vegem, en la taula 15, alguns exemples dutilitzaci de lespecificaci de format en la funci printf a partir de les segents declaracions de variables:
int ptes=-25; unsigned int edat=20; float euros=50.5; char sexe='?';

Taula 15. Exemples dutilitzaci de lespecificaci de format en la funci printf

Instrucci printf("%d",ptes) printf("%o",ptes) 25

Sortida efectuada

177747 Com s possible? %o tracta el valor int considerat sense signe; en tal cas, 25 es converteix en 65511 (65536 25), ja que linterval de valors en els enters sense signe s [0...65535], i el valor decimal 65511 s, en octal, 177747 ffe7 Esbrineu el perqu? 20

printf("%x",ptes)

printf( "%u",edat)

Programaci estructurada i modular

86

Introducci a la programaci

Instrucci printf("%o",edat) printf("%c",sexe) printf("%f",euros) printf("%.4f",euros) printf("%E",euros) printf("%.4e",euros) printf("%g",euros) printf("%.*E",3,euros)

Sortida efectuada 24, que s el valor octal de 20 decimal. ? 50.500000 50.5000 5.05000E+01 5.050e+01 50.5 5.05E+01

Comentem, en la taula 16, les seqncies descapament possibles, anomenades tamb carcters de control.
Taula 16. Seqncies descapament possibles en lespecificaci de format de la funci printf

Smbol \n \r \t \v \b \f \0 \a \\ \' \" %%

Efecte Salta a la lnia segent (line feed). Retorn de carro (carriage return). Provoca anar a linici de lnia. Tabula la sortida horitzontalment. Tabula la sortida verticalment. Retrocs (espai a lesquerra). Provoca salt de pgina (form feed). Provoca laparici del carcter nul, s a dir, el carcter que ocupa el lloc zero a la taula ASCII. Provoca que soni laltaveu. Provoca la sortida de la barra invertida (\). Provoca la sortida de la cometa simple. Provoca la sortida de les dobles cometes (). Provoca la sortida del smbol tant per cent (%).

Les seqncies descapament cal fer-les servir en els entorns en qu es poden fer servir. Dit en altres paraules, un salt de pgina t sentit quan la sortida sest produint cap a impressora. Si ho utilitzem en pantalla far que ens aparegui un smbol estrany, corresponent al smbol que ocupa el lloc 12 (comenant a comptar a partir de zero) en el codi ASCII i que correspon al salt de pgina. Igual que en pseudocodi amb la instrucci escriure, la instrucci printf no es pot utilitzar per efectuar la sortida qualsevol tipus de dada. Aix, per

Programaci estructurada i modular

87

Introducci a la programaci

exemple, no es pot utilitzar per mostrar valors de tipus enum. Ara b, com el tipus enum guarda valors int, s que s possible utilitzar la funci printf per mostrar els corresponents valors int emmagatzemats en dades de tipus enum. !

3.5. Instruccions dutilitzaci freqent


Els programadors solen trobar-se situacions que es repeteixen en els diferents algorismes que han de codificar. Els fabricants dels llenguatges de programaci en sn conscients i, per facilitar la feina dels programadors i, per tant, agilitar la fase de codificaci, incorporen en els llenguatges les instruccions adequades, de manera que el programador no les ha de codificar, sin que tan sols les ha dutilitzar. En realitat no sn instruccions, sin petits programes que farem servir dins els nostres programes i que estan desenvolupats utilitzant les instruccions bsiques del llenguatge. Per aix, a nosaltres, no ens importa. Podem considerar-les instruccions del llenguatge. Ara b, no tots els fabricants de llenguatge de programaci shan posat dacord a desenvolupar instruccions equivalents amb el mateix nom i, per tant, aix ens porta que, en utilitzar aquestes instruccions, els nostres programes fonts deixen de ser dutilitzaci universal. ! Com a exemple daquesta situaci veurem les instruccions de control de pantalla que el fabricant de llenguatges de programaci Borland ha incorporat en la seva saga de productes comercials mpliament coneguts Turbo C, Turbo C++, Borland C++,... i que en canvi, per exemple, no existeixen en lentorn de programaci de Microsoft Visual C++ ni en el conjunt de compiladors GCC del projecte GNU. A continuaci definirem les instruccions ds freqent que farem servir en pseudocodi i els seus equivalents en llenguatge C. 1) Esborrar la pantalla Aquesta instrucci, tal com el seu nom indica, deixa la pantalla en blanc (o en negre o verd o taronja, segons el color de la pantalla) i situa el cursor a la primera columna de la primera fila. En pseudocodi: netejar_pantalla En llenguatge C: No hi ha una instrucci especfica. Qu fem?

Programaci estructurada i modular

88

Introducci a la programaci

Es pot aconseguir la neteja de pantalla enviant una seqncia de carcters d'escapament per mitj de la funci printf:
printf("\033[2J\033[0;0f");

En realitat lanterior sentncia printf envia dues seqncies de carcteres descapament:

printf("\033[2J"); /* Neteja pantalla */ printf("\033[0;0f");/* Posiciona el cursor a la cantonada superior esquerra */

Sentn que la majoria de les vegades la neteja de pantalla comporta el posterior posicionament del cursor a la cantonada superior esquerra. Els productes de Borland incorporen una llibreria de funcions per a la gesti de la consola, la definici de les quals es troba a larxiu conio.h (console input output) que inclourem en el programa font, si s necessari, mitjanant la directriu de precompilaci #include. La utilitat proporcionada per Borland en els seus productes per a la neteja de pantalla s la funci clrscr()(provinent de clear screen). I en altres entorns? Pot ser que incloguin solucions similars a la funci clrscr() de Borland. 2) Esborrar la lnia en la qual estem situats Aquesta instrucci, tal com el seu nom indica, deixa la fila on s situat el cursor en blanc i situa el cursor a la primera columna de dita fila. En pseudocodi: netejar_fila En llenguatge C: No hi ha una instrucci especfica. Qu fem? Es pot aconseguir la neteja de la fila actual enviant una seqncia de carcters descapament per mitj de la funci printf:
printf ("\r\033[K\r");

Els productes de Borland incorporen la funci clreol() declarada a larxiu conio.h. I en altres entorns? Pot ser que incloguin solucions similars a la funci clreol() de Borland.

Programaci estructurada i modular

89

Introducci a la programaci

3) Posicionar el cursor en pantalla Aquesta instrucci permet situar el cursor en un lloc determinat de la pantalla, definit per les coordenades de la fila i de la columna. En pseudocodi: cursor (<columna>, <fila>) En llenguatge C: No hi ha una instrucci especfica. Qu fem? Es pot aconseguir el posicionament del cursor en pantalla enviant una seqncia de carcters descapament per mitj de la funci printf:
printf("\033[%d;%df",fila,columna); /* Posiciona el cursor a les coordenades indicades pels valors "fila" i "columna" considerant que la cantonada superior esquerra correspon a les coordenades (1,1) i que el valor "columna" indica desplaament cap a la dreta i el valor "fila" indica desplaament cap avall */

Els productes de Borland incorporen la funci gotoxy (<columna>, <fila>) declarada a larxiu conio.h. I en altres entorns? Pot ser que incloguin solucions similars a la funci gotoxy() de Borland. 4) Saltar lnia Aquesta instrucci permet situar el cursor a la primera columna de la fila segent. En pseudocodi: saltar_lnia; En llenguatge C: printf ("\n"); 5) Esperar que lusuari premi una tecla Amb aquesta instrucci satura lexecuci del programa fins que lusuari premi una tecla. En pseudocodi: esperar_tecla; En llenguatge C: No hi ha una instrucci especfica. Qu fem? Els productes de Borland incorporen les funcions getch() i getche() declarades a larxiu conio.h. Les dues funcions es diferencien perqu la segona mostra per pantalla (en el lloc on s el cursor) el smbol corresponent a la tecla premuda (la lletra e final indica que es fa echo, s a dir, es mostra per pantalla), mentre que la primera no el mostra. Totes dues sn funcions que retornen un resultat, que no s altre que el carcter corresponent a la tecla premuda. Aquestes funcions actuPosicionament del cursor en pantalla Aquesta instrucci acostuma a estar en tots els llenguatges. En molts, per, primer es posa la <fila> i desprs la <columna>. Tamb sol variar linterval de numeraci de les files i columnes, ja que a vegades s de 0 a 24 i de 0 a 79.

Programaci estructurada i modular

90

Introducci a la programaci

en sense buffer, s a dir, la tecla premuda s llegida immediatament sense possibilitat de correcci (a diferncia de la funci scanf). I en altres entorns? Pot ser que incloguin solucions similars a les funcions getch() i getche() de Borland.
Arxiu conio.h per a compiladors gcc Larxiu conio.h noms forma part dels entorns de programaci Borland. La utilitzaci daquests entorns s, per, tan estesa, que molts programadors pensen que aquest arxiu forma part del llenguatge C estndard i tenen problemes quan volen canviar de plataforma. Sempre hi ha la possibilitat, per tal daconseguir compatibilitat de les fonts en diferents plataformes, de dissenyar un arxiu conio.h que contingui les tpiques funcions clrscr(), clreol(), gotoxy(), getch(), getche() i daltres definides en larxiu conio.h original de Borland, de manera que si lutilitzem, els codis fonts dels programes desenvolupats podran ser vlids simultniament en diferents entorns.

!!
Vegeu una versi de larxiu conio.h per a compiladors gcc en la secci Recursos de contingut del web daquest crdit, en Codi font en C, que facilitar ls de les funcions que inclou.

6) Funcions predefinides En pseudocodi, a mesura que avancem, introduirem funcions predefinides i, parallelament, les treballarem en el llenguatge C. Els llenguatges acostumen a proporcionar als programadors un munt de funcions per efectuar clculs estndards i dutilitat general en diferents mbits. No passarem, en aquest moment, a fer una relaci exhaustiva de les que ens trobarem, ja que aix tamb depn del llenguatge. A tall informatiu, sapigueu que podreu trobar: Funcions numriques per calcular valors absoluts, logaritmes, exponencials, potncies, arrels, etc. Funcions trigonomtriques per calcular les raons trigonomtriques: sinus, cosinus, tangent, arcsinus, arccosinus, arctangent, sinus hiperblics, cosinus hiperblics, tangents hiperbliques, etc. Funcions alfanumriques per treballar amb expressions numriques i de text.

Trigonometria No us preocupeu si no recordeu la trigonometria. Per desenvolupar programes de gesti no s fcil que la necessiteu. Ara b, aix no vol dir que no lhagueu de conixer.

3.6. Exemples dutilitzaci dinstruccions seqencials bsiques


Tot seguit us exposem alguns exemples per illustrar el que heu aprs fins ara. 1) Fer un programa que calculi la superfcie dun rectangle. Primer de tot hem de saber qu vol dir calcular la superfcie dun rectangle. s a dir, en aquest cas, lanalista ha de tenir coneixements de matemtiques per poder dissenyar lalgorisme corresponent. Fem lanlisi

Programaci estructurada i modular

91

Introducci a la programaci

funcional. No entrem a detallar el resultat daquesta anlisi perqu ho sabem fer des de fa molt de temps, quan anvem a escola. Suposant que ja sabem qu vol dir calcular la superfcie dun rectangle, entrem a efectuar lanlisi orgnica per poder descriure lalgorisme que ens permeti resoldre el problema. Posem-nos en el lloc de lordinador i el primer que fem s preguntar a lusuari quant val la base i quant val laltura. Abans, per, lhem informat que ens ha de donar els dos valors en les mateixes unitats. Quan lusuari ens hagi donat els dos valors els multiplicarem i informarem lusuari del resultat, que s la superfcie del rectangle. Per poder efectuar la multiplicaci dels dos valors, necessitem haver-los guardat en algun lloc. La persona utilitza la seva memria; lordinador tamb, mitjanant les variables. Per tant, necessitarem dues variables per emmagatzemar els valors de la base i de laltura. Sembla evident que hauran de ser variables numriques. Millor que siguin reals per poder tractar valors decimals. Per poder informar lusuari del valor de la superfcie s necessari que aquest valor estigui en algun lloc. Per tant, necessitem una altra variable per emmagatzemar el resultat del producte. Aix doncs:
programa superfcie_rectangle s var base, altura, superfcie : real; fivar netejar_pantalla; escriure ("Haur d'introduir els dos valors amb les mateixes unitats"); saltar_lnia; escriure ("Introdueixi la base:"); llegir (base); saltar_lnia; escriure ("Introdueixi l'altura"); llegir (altura); saltar_lnia; superfcie = base * altura; escriure ("La superfcie del rectangle que t per base ",base," unitats i per altura ", altura, " unitats s ", superfcie, "unitats quadrades."); saltar_lnia; fiprograma
Flexibilitat de lanalista Lanalista ha de ser una persona amb capacitat per introduir-se en qualsevol camp. Si es tracta de desenvolupar una aplicaci informtica per gestionar la facturaci duna empresa, caldr conixer una mica com s el sector en el qual es mou lempresa. No s el mateix una facturaci per a una empresa que es dedica a la fabricaci de mitjons que per a una empresa que es dedica a la fabricaci de cotxes, tot i que la part legal de les dues facturacions deu ser molt semblant.

La darrera instrucci escriure s molt llarga i no ens cap en una lnia. Podem optar pel que tenim a lexemple, s a dir, per anar escrivint, de manera que si leditor ho mostra automticament en una altra lnia, s decisi seva, per nosaltres, en realitat, ho hem escrit tot en una lnia. Per tamb tenim una altra possibilitat, que s tallar la lnia en tantes lnies com ens sembli convenient, acabant cada lnia amb el smbol \, el qual indicar al compilador que aquella lnia i la segent han de ser considerades com una sola lnia. Aquest smbol no pot estar (en pseudocodi) dins de cap text entre dobles cometes, ja que en aquest cas no tindria aquesta interpretaci i, segurament, ens portaria problemes.

Hem utilitzat el smbol \ perqu s el smbol que utilitza el llenguatge C. En altres llenguatges no es pot fer servir, o utilitzen altres marques.

Programaci estructurada i modular

92

Introducci a la programaci

La darrera instrucci escriure cont expressions de diferents tipus separades per comes. Si lusuari ha introdut 10 com a resposta a la pregunta Introdueixi la base: i 20 com a resposta a la pregunta Introdueixi laltura, el programa haur emmagatzemat 200 a superfcie i, per tant, la sortida per pantalla del darrer escriure s:

La superfcie del rectangle que t per base 10 unitats i per altura 20 unitats s 200 unitats quadrades.

Ens podem estalviar la variable superfcie. Aquesta variable noms sutilitza per rebre el resultat del producte de la base per laltura i, posteriorment, ser enviat a la sortida estndard. La instrucci escriure permet, en la majoria de llenguatges, la inclusi dexpressions numriques, de manera que savaluen abans de produir-se la sortida i, el que sescriu, s el resultat. Nova versi amb les observacions efectuades:

programa superfcie_rectangle s var base, altura : real; fivar netejar_pantalla; escriure ("Haur d'introduir els dos valors amb les mateixes unitats"); saltar_lnia; escriure ("Introdueixi la base:"); llegir (base); saltar_lnia; escriure ("Introdueixi l'altura"); llegir (altura); saltar_lnia; escriure ("La superfcie del rectangle que t per base ", base, " unitats i ",\ "per altura ", altura, " unitats s ", base * altura, "unitats quadrades."); saltar_lnia; fiprograma

Versi en llenguatge C:

/* u1n3p01.C */ #include <stdio.h> #include <conio.h> void main() { float base, altura; clrscr(); printf ("Haur d'introduir els dos valors amb les mateixes unitats\n\n"); printf ("Introdueixi la base: "); scanf ("%f",&base); printf ("Introdueixi l'altura: "); scanf ("%f",&altura); printf ("La superfcie del rectangle que t per base %g unitats i per \ altura %g unitats s %g unitats quadrades\n", base, altura, base*altura); }

Programaci estructurada i modular

93

Introducci a la programaci

Hem de tenir en compte el segent: Desprs de cada scanf no hem posat un salt de lnia i, si ho executem, veiem que el fa. Com s possible? Aix s aix perqu lusuari, per validar lscanf, ha de prmer un <return>, el qual provoca el salt de lnia. En aquesta versi en programa C no hi ha cap control sobre els valors introduts per lusuari. s a dir, si lusuari entra carcters quan lordinador espera reals, pot passar qualsevol cosa. En aquests moments no estem encara en disposici de poder-ho controlar, tot i que caldr utilitzar el valor que retorna la funci scanf relatiu al nombre de dades que hagi pogut llegir. En el darrer printf hem obligat a efectuar la sortida dels valors reals amb lespecificaci de format %g. Daquesta manera, el programa decideix, en temps dexecuci, quina s la manera ms compacta descriure el valor, cosa que dependr de cada execuci. Hem utilitzat les directrius de precompilaci #include per indicar al compilador la sintaxi de les funcions de C utilitzades. Aix no s necessari en tots els entorns, per s millor acostumar-shi. Aquest exemple ens serveix per introduir, en C, el significat del smbol \ a final de lnia, semblant al que hem indicat en pseudocodi. Quan sescriu un programa font en llenguatge C, utilitzant un editor de textos, les lnies acostumen a tenir una llargada important (de prop de 250 carcters), la qual segurament no farem servir en la seva totalitat. Per, i si necessitssim una lnia ms llarga? El smbol \ a final de lnia permet indicar al programa traductor que el text que hi ha a la lnia segent s continuaci de la lnia actual. En el llenguatge C, el smbol \ es pot utilitzar enmig de textos entre dobles cometes (s a dir, un fragment del text en una lnia i la continuaci en laltra). No es pot, per, trencar noms de variables, paraules reservades, funcions, etc. En lexemple anterior, podeu observar que hem fet servir el smbol \ a final duna lnia que contenia la instrucci printf. Aix vol dir que la lnia segent forma part de la mateixa instrucci. Quan vosaltres escriviu el programa, veureu que no us s necessari aquest smbol, per per poder incloure el codi font en aquest material, ha calgut trencar la instrucci.
El smbol

!!
Trobareu larxiu u1n3p01.c en lapartat Codi font en C de la secci Recursos de contingut del web daquest crdit.

\ a final de lnia

La utilitzaci del smbol \ a final de lnia, tot i no ser necessria quasi mai, s convenient per a la impressi dels codis font. Quan sestan codificant programes amb fora lnies de codi i alguna cosa no acaba de funcionar, s bastant difcil seguir el programa en la pantalla de lordinador, ja que t un nombre bastant petit de lnies. En aquest cas, el programador acostuma a obtenir una cpia impresa del codi font i s ms fcil fer el seguiment.

Programaci estructurada i modular

94

Introducci a la programaci

Les cpies impreses, per, tenen una limitaci en lamplada de lnia. Per tant, s bo acostumar-se a no treballar amb lnies gaire llargues (tot i que leditor ens ho permeti) pensant en la impressi del codi font. En aquest cas s necessari utilitzar el smbol \ per trencar lnies.

2) Fer un programa que calculi la longitud duna circumferncia i la superfcie i el volum de cercle i esfera corresponents. En aquest cas, lanlisi funcional tamb ha estat fcil, ja que recordem (i si no les recordvem no ens costa gens cercar-les en algun llibre) les frmules per als clculs esmentats: Longitud de la circumferncia = 2 * * R Superfcie del cercle = * R2 Volum de lesfera = 4 * * R3 / 3 Doncs b, en letapa de lanlisi orgnica observem que ser necessari disposar duna variable de tipus real on es pugui recollir el radi del cercle per al qual lusuari vol calcular la superfcie. A ms, aqu apareix el valor que, com molt b sabeu, representa una constant amb un nombre infinit de xifres decimals. Doncs b, decidim utilitzar una constant per emmagatzemar aquest valor i fer servir, quan sigui necessari, la constant. En aquest programa, la constant esmentada caldr utilitzar-la en tres clculs. Havent-la declarat com a constant evitem haver descriure tres vegades el valor concret 3.1415..., amb la qual cosa aconseguim dues fites: evitar errors descriptura del valor en els diferents indrets (tres) en qu sutilitza i facilitar la possibilitat defectuar els clculs amb ms precisi (afegint-hi ms xifres decimals), ja que noms caldr modificar el valor de la constant en la seva declaraci. Per tant, en pseudocodi:
programa LSV_radi s const PI = 3.1415; ficonst var radi : real; fivar netejar_pantalla; escriure ("Introdueixi el radi:"); llegir (radi); saltar_lnia; escriure ("Donat el radi ", radi, " tenim:"); saltar_lnia; escriure ("Longitud circumferncia: ", 2 * PI * radi); saltar_lnia; escriure ("Superfcie cercle: ", PI * radi * radi); saltar_lnia; escriure ("Volum esfera: ", 4*PI * radi * radi * radi / 3); saltar_lnia; fiprograma

Programaci estructurada i modular

95

Introducci a la programaci

La versi en llenguatge C:

/* u1n3p02.c */ #include <stdio.h> #include <conio.h> main() { const float PI=3.1415; float radi; clrscr(); printf ("Introdueixi el radi: "); scanf ("%f",&radi); printf ("Donat el radi %g tenim:\n\n", radi); printf ("Longitud de la circumferncia: %10.3f\n", 2*PI*radi); printf ("Superfcie del cercle........: %10.3f\n", PI*radi*radi); printf ("Volum de l'esfera............: %10.3f\n", 4*PI*radi*radi*radi/3); }

Fixeu-vos en els punts segents:

!!
Amb lespecificaci de format %10.3f per als tres resultats, hem obligat que en tots la sortida tingui un mnim de 10 carcters i sempre amb tres decimals. Quan no arriba a 10 carcters, es justifica amb espais blancs per lesquerra. En cas que els resultats fossin superiors a 10 carcters, el programa agafaria lespai necessari. Recordeu que en C es poden tenir constants simbliques que utilitza el precompilador per substituir totes les aparicions en el programa font i que, per tant, en temps dexecuci no ocupen memria. En la versi anterior, la constant definida no s constant simblica. Nova versi en llenguatge C utilitzant constant simblica:
Trobareu larxiu u1n3p02.c en lapartat Codi font en C de la secci Recursos de contingut del web daquest crdit.

!!
Trobareu larxiu u1n3p03.c en lapartat Codi font en C de la secci Recursos de contingut del web daquest crdit.

/* u1n3p03.c */ #define PI 3.1415 #include <stdio.h> #include <conio.h> main() { float radi; clrscr(); printf ("Introdueixi el radi: "); scanf ("%f",&radi); printf ("Donat el radi %g tenim:\n\n", radi); printf ("Longitud de la circumferncia: %10.3f\n", 2*PI*radi); printf ("Superfcie del cercle........: %10.3f\n", PI*radi*radi); printf ("Volum de l'esfera............: %10.3f\n", 4*PI*radi*radi*radi/3); }

You might also like