73
Programació estructurada Joan Arnedo Moreno Programació bàsica (ASX) Programació (DAM)

fp_asix_m03_u2_pdfindex

Embed Size (px)

DESCRIPTION

ioc java 2

Citation preview

  • Programaci estructuradaJoan Arnedo Moreno

    Programaci bsica (ASX)Programaci (DAM)

  • Programaci bsica (ASX)Programaci (DAM) Programaci estructurada

    ndex

    Introducci 5

    Resultats daprenentatge 7

    1 Algorismes 91.1 Definici del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2 Disseny de lalgorisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    1.2.1 Programaci estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.2 Representaci dalgorismes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.3 Implementaci del programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.4 Verificaci i proves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.5 Posada en marxa i manteniment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

    2 Estructures de selecci 172.1 Una desviaci temporal del cam: selecci simple . . . . . . . . . . . . . . . . . . . . . . . . 17

    2.1.1 Sintaxi i comportament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.1.2 Exemple: calcular un descompte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.1.3 Aspectes importants de la selecci simple . . . . . . . . . . . . . . . . . . . . . . . . 21

    2.2 Dos camins alternatius: la sentncia if/else . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.1 Sintaxi i comportament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.2 Exemple: endevina el nombre secret . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    2.3 Diversos camins: la sentncia if/else if/else . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3.1 Sintaxi i comportament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.3.2 Exemple: transformar avaluaci numrica a text . . . . . . . . . . . . . . . . . . . . 27

    2.4 Combinaci destructures de selecci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.4.1 Exemple: descompte mxim i control derrors . . . . . . . . . . . . . . . . . . . . . 312.4.2 Mltiples blocs dinstruccions i mbit de variables . . . . . . . . . . . . . . . . . . . 33

    2.5 El commutador: la sentncia switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.5.1 Sintaxi i comportament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.5.2 Exemple simple: diferents opcions en un men . . . . . . . . . . . . . . . . . . . . . 372.5.3 Exemple amb propagaci dinstruccions: els dies dun mes . . . . . . . . . . . . . . . 39

    2.6 Control derrors en lentrada bsica mitjanant estructures de selecci . . . . . . . . . . . . . 422.7 Solucions dels reptes proposats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    3 Estructures de repetici 473.1 Control de les estructures repetitives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483.2 Repetir si es compleix una condici: la sentncia while . . . . . . . . . . . . . . . . . . . . 49

    3.2.1 Sintaxi i estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493.2.2 Exemple: estalviar-vos descriure el mateix molts cops . . . . . . . . . . . . . . . . . 503.2.3 Exemple: aprofitar un comptador . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.2.4 Exemple: no sempre se suma u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533.2.5 Exemple: acumular clculs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.2.6 Exemple: semfors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573.2.7 Exemple: semfors i comptadors alhora . . . . . . . . . . . . . . . . . . . . . . . . . 59

  • Programaci bsica (ASX)Programaci (DAM) Programaci estructurada

    3.3 Repetir almenys un cop: la sentncia do/while . . . . . . . . . . . . . . . . . . . . . . . . . 613.3.1 Sintaxi i estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623.3.2 Exemple: control dentrada per teclat . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    3.4 Repetir un cert nombre de vegades: la sentncia for . . . . . . . . . . . . . . . . . . . . . . 643.4.1 Sintaxi i estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.4.2 Exemple: la taula de multiplicar, versi 2 . . . . . . . . . . . . . . . . . . . . . . . . 663.4.3 Exemple: ms enll de sumar i restar . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    3.5 Combinaci destructures de selecci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.5.1 Exemple: la taula de multiplicar, versi 3 . . . . . . . . . . . . . . . . . . . . . . . . 683.5.2 Exemple: endevinar el nombre secret, versi 3 . . . . . . . . . . . . . . . . . . . . . 69

    3.6 Solucions dels reptes proposats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

  • Programaci bsica (ASX)Programaci (DAM) 5 Programaci estructurada

    Introducci

    Si b quan es parla de les tasques del programador el primer que ve al cap sla generaci del codi font, en realitat la seva feina va ms enll i engloba unprocs ms general que va des de saber definir exactament el problema que calresoldre fins al desplegament de laplicaci, passant per garantir que el programas correcte. Per tant, abans de prosseguir amb els aspectes vinculats a la generacide codi font, val la pena donar una visi general del cicle de vida duna aplicaci.Dins daquest cicle de vida s especialment important el fet que, sense ni tan solsobrir les vostres eines de programaci, heu de reflexionar i pensar com ser elvostre programa: esquematitzar quin s el seguit de passes que shan de seguirperqu faci correctament la seva tasca. s a dir, definir un algorisme.

    Per definir lalgorisme, cal tenir present que un programa es dedica principalmenta transformar i manipular dades. Per tant, totes les instruccions vinculadesa la seva gesti sn de gran importncia. En aquest aspecte, la tasca delprogramador s establir com cal utilitzar variables en lavaluaci dexpressionsi lemmagatzemament del resultat. Si un programa se cenyeix exclusivament aaix, la seva estructura sempre tindr forma de seqncia dinstruccions que esvan executant de manera consecutiva, una darrere laltra. Un cop totes i cadascunade les instruccions shan executat i sarriba a la darrera de totes, el programa esdna per finalitzat. Totes les instruccions sempre sacaben executant, i cadascunaho far una sola vegada.

    Ara b, si us fixeu en els programes que useu habitualment, aquests estan plens desituacions en les quals aix no es compleix. En un videojoc, quan sinicia, sovint hiha diferents opcions: comenar la partida, recuperar una partida desada, entrar a laconfiguraci, etc. A ms a ms, quan sacaba la partida, no passa mai que sacabalexecuci del programa i per tornar a jugar cal tornar-lo a executar. Normalment,us demana si voleu jugar de nou. Per tant, s clar que dins dun programa hiha moltes instruccions, per ni totes sexecuten sempre, ni el cam que en segueixlexecuci s nic cada cop que el posem en marxa. Aquest segueix una estructurams complexa, en qu hi ha bifurcacions i bucles. I s que, precisament, unaaltra tasca tamb molt important del programador ser establir aquesta estructura:quin s el flux de control, o dexecuci, del programa, cada cop que es posien marxa. Per aix, haur de considerar sota quines condicions cal executar ono certes instruccions, i quan cal que algunes sexecutin repetides vegades. Enaquesta unitat veureu com es fa, mitjanant les sentncies que permeten declararestructures de control.

    Com a pas previ a estudiar les estructures de control, lapartat Cicle de vida dunaaplicaci resumeix breument quines sn les tasques del programador a lhora decrear un programa i com podeu dissenyar els vostres algorismes.

    A lapartat Estructures de selecci sexpliquen quines sentncies es poden usar

  • Programaci bsica (ASX)Programaci (DAM) 6 Programaci estructurada

    per crear bifurcacions dins del codi dels vostres programes, de manera que sexe-cutin unes instruccions o unes altres de diferents dacord amb certes condicions.Aix permet que un programa actu de manera diferent cada vegada que sexecuta,normalment depenent de les dades que llegeixi del sistema dentrada/sortida.

    Tot seguit, a lapartat Estructures de repetici sexplica com podeu dur a termebucles dinstruccions dins del codi font, de manera que unmateix bloc sexecuti unnombre consecutiu de vegades o fins que es compleixi alguna condici concreta.Aix simplifica enormement algunes parts del codi o, si ms no, el fa molt mscurt, i permet poder tornar a dur a terme certes accions sense haver de tornar aexecutar el programa de nou des del principi.

    Al llarg de la unitat, com a fil argumental, es partir sempre de lanlisi dunexemple en qu es veu clarament de quina manera varia el comportament dunprograma en diferents execucions. Novament, desprs dexposar temes impor-tants, us proposem reptes per fer per tal dentendrels millor.

    Ara b, heu de tenir en compte que, tot i que els exemples estaran centrats en lasintaxi especfica del llenguatge Java, els conceptes explicats sn genrics de laimmensa majoria de llenguatges de programaci. Noms us caldr veure quina sla sintaxi exacta en cada cas, per lestructura bsica sol ser la mateixa. Per tant,igual que en la gesti de variables, heu de tenir present que aquests conceptes vanms enll del llenguatge Java.

  • Programaci bsica (ASX)Programaci (DAM) 7 Programaci estructurada

    Resultats daprenentatge

    En finalitzar aquesta unitat, lalumne/a:

    1. Utilitza correctament tipus de dades simples i compostes emprant lesestructures de control adients.

  • Programaci bsica (ASX)Programaci (DAM) 9 Programaci estructurada

    1. Algorismes

    El desenvolupament duna aplicaci informtica es pot dividir en un conjunt defases que prenen com a punt de partida la detecci de la necessitat de fer unprograma, i que finalitzen quan es comprova que aquest ja funciona correctament.Des dun punt de vista simplista, un cop el programa est essent utilitzat, es podriaconsiderar que la feina del desenvolupador ha acabat. Ara b, moltes vegades espot donar la circumstncia que durant ls es detectin possibles canvis o milloresque caldria fer. En aquest cas, caldr recular a alguna de les fases prvies itreballar-hi fins a disposar duna nova versi del programa.

    En aquest darrer cas, apareix un cicle que fa que laplicaci informtica estrobi en contnua evoluci. Per aix sacostuma a parlar del cicle de vidaduna aplicaci informtica.

    En aquest apartat sexplicar en qu consisteix cadascuna de les fases daquestcicle de vida, enumerades tot seguit:

    1. Definici del problema.

    2. Disseny de lalgorisme.

    3. Implementaci del programa.

    4. Verificaci i proves.

    5. Posada en marxa i manteniment.

    1.1 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 bonacomunicaci amb lorganitzaci que encarrega la realitzaci del programa i ambels usuaris finals, establint amb precisi i claredat els objectius que es volen assolir.

    Normalment, el punt de partida sestableix quan un client (ja sigueu vosaltresmateixos o una tercera persona), detecta que necessita resoldre diverses vegadesun problema de certa complexitat i decideix que ser molt ms fcil si potautomatitzar les operacionsmitjanant un programa. Arribats a aquesta conclusi,cal comenar per la realitzaci duna anlisi del problema, que de vegades pot durbastant temps, ja que el problema pot ser difcil de comprendre o el client pot notenir del tot clar qu vol.

  • Programaci bsica (ASX)Programaci (DAM) 10 Programaci estructurada

    Qu s un programa

    Una definici clssica s:Programa = dades + algorisme.

    Un cop el problema est definit, cal dur a terme una anlisi funcional. Aquesta nos estrictament responsabilitat del programador, ra per la qual no sen far mfasien aquest apartat, per aix no implica que no nhgiu de ser coneixedors. A fi decomptes, els programadors sereu els encarregats de desenvolupar els programesresultants daquesta etapa.

    En aquesta anlisi, sacostuma a fer el segent:

    Parlar amb tots els usuaris implicats de manera que aconseguim tenir totsels punts de vista possibles sobre el problema. Si vosaltres sou els usuarisla feina s ms senzilla, evidentment.

    Donar totes les solucions possibles amb un estudi de viabilitat, considerantels costos econmics (material i personal).

    Proposar al client, futur usuari de laplicaci, una soluci entre les possibles,i ajudar-lo a prendre la decisi ms adequada.

    Trencar la soluci adoptada en parts independents per dividir les tasquesentre un equip de treball.

    Com a resultat, es disposar duna idea clara de qu cal fer i amb quins recursos.Noms llavors s el moment de veure com sha de fer, en forma duna aplicaciinformtica.

    1.2 Disseny de lalgorisme

    Un cop establert quin s el problema que cal resoldre, s el moment daturar-se a reflexionar sobre quina estratgia caldr seguir per resoldrel mitjanant unprograma i quina forma haur de prendre el codi font. Per establir-ho, cal recordarclarament qu pot fer un ordinador (quina mena dordres pot acceptar) i qu hi hadins dun programa. Pel que fa a qu pot fer un ordinador, bsicament es tracta deprocessar dades. Quant a la composici dun programa, es pot considerar que hi hados elements fonamentals que collaboren per dur a terme la tasca encomanada.Duna banda, hi ha les dades que cal processar, ja sigui directament en formade literals o introdudes per lusuari. Duna altra banda, el conjunt dordres quees dna a lordinador, les instruccions, per tal que es produeixi aquest procs detransformaci.

    Dins dun programa es representar el que es coneix formalment com aalgorisme: un mecanisme per resoldre un problema o una tasca concreta,descrit com una seqncia finita de passes.

    Si b tots els programes contenen algorismes, traduts en un seguit dinstruccions,aquest concepte no est lligat exclusivament a la programaci. Qualsevol descrip-ci composta per un seguit de passes que cal seguir ordenadament per assolir una

  • Programaci bsica (ASX)Programaci (DAM) 11 Programaci estructurada

    fita s un algorisme. Fora del mn dels ordinadors, un dels exemples ms clarssn les receptes de cuina. Per exemple, el conjunt segent de passes podria serlalgorisme per fer un parell dous ferrats:

    1. Agafar dos ous de la nevera.

    (a) Si no nhi ha, anar-ne a comprar.

    2. Agafar sal i oli de larmari.

    (a) Si no nhi ha, anar-ne a comprar.

    3. Posar oli a la paella.

    4. Posar la paella al foc.

    5. Mentre loli no estigui calent, cal esperar.

    6. Per cada ou cal fer el segent:

    (a) Trencar-lo i posar el contingut a la paella.

    (b) Posar-hi sal.

    7. Mentre els ous no estiguin fregits, cal esperar.

    8. Treure els ous de la paella i servir-los.

    En qualsevol cas, el fet primordial s que, tant per establir qu ha de fer una personacom un ordinador, abans cal pensar exactament com cal dividir la tasca en accionsindividuals i quin ordre han de seguir. Per tant, una de les tasques primordialsdel programador abans de ni tant sols comenar a escriure codi font s dedicarun temps a reflexionar i a dissenyar un algorisme que serveixi per dur a terme latasca donada per la definici del problema. Aquesta fase s molt important, jaque condicionar totalment la fase dimplementaci. Si lalgorisme s incorrecte,haureu perdut temps i esfor creant un codi font que no fa el que voleu.

    1.2.1 Programaci estructurada

    Hi ha diferents aproximacions per dissenyar algorismes. La que aprendreu enaquest mdul s lanomenada programaci estructurada. En aquesta, les passesdun algorisme es divideixen en diferents blocs dinstruccions, cadascun triatnicament entre els tres tipus destructura segents:

    Estructura lineal o seqencial: les instruccions sexecuten en el mateixordre en qu shan escrit. Aquest s el que heu vist fins ara. En lexemplede lou ferrat, equivaldria a la transici entre el pas 5 i 6. Un sempre vadarrere de laltre, seqencialment.

  • Programaci bsica (ASX)Programaci (DAM) 12 Programaci estructurada

    Estructura de selecci o condicional: hi ha certes condicions que pro-voquen lexecuci de blocs dinstruccions diferents depenent de si escompleixen o no aquestes condicions. En lexemple de lou ferrat, aquests el cas dels passos 1 o 2, en els quals, donada una condici, lacci sdiferent. Depenent de si hi ha ous a la nevera, sen poden agafar o b caldranar a comprar-ne.

    Estructura de repetici o iteratiu: el bloc dinstruccions sexecuta unnombre finit de vegades, ja sigui un nombre concret o fins que es compleixuna condici. En el cas de lou ferrat, el primer cas daquesta estructuraes veu al pas 6, en qu cal repetir les mateixes ordres un cert nombre devegades (dues, una per cada ou). El segon supsit sesdev a les passes 5 i7, en qu cal fer lacci desperar mentre no es doni una condici concreta.

    En un ordinador: obrir un fitxer de text

    Quan executeu un editor de text i seleccioneu obrir un fitxer, de ben segur que lordinadorha de fer un conjunt de tasques una darrere de laltra abans de poder editar el text. Primerus ha de preguntar on es troba el fitxer en qesti. Desprs el busca i el carrega. I finalmentprocessa les dades perqu siguin mostrades correctament a la pantalla. Cada pas pot serms o menys complex, per s clar que han de seguir un ordre i no es pot avanar alsegent fins haver finalitzat lanterior. Es fan de manera seqencial.

    En un ordinador: les opcions dun editor de text

    Quan executeu un editor de text, de ben segur que veureu que hi ha un gran nombredaccions diferents que podeu dur a terme: obrir un document, crear-ne un de nou, desarel document actual, etc. Cadascuna daquestes opcions es veu clarament diferenciada dela resta, ja que solen estar associades a elements grfics independents, dins un men ouna barra deines. El que s clar s que el conjunt dinstruccions que cal executar en cadacas ser diferent, ja que cada opci fa una tasca diferent. Per tant, cal un mecanisme perestablir quin bloc dinstruccions concret sexecuta cada cop que seleccioneu cada opci.

    En un ordinador: les opcions dun editor de text

    A lhora dimprimir un document en un editor de text, sovint podeu demanar quantes cpieses volen enviar a la impressora. Aquest nombre de cpies pot ser des duna fins a un valorqualsevol, fins al lmit dels fulls de paper i tinta de qu disposeu. Dentrada, es pot establirque lacci dimprimir un nic document es basar en un bloc dinstruccions concret. Cadacop que sexecuten aquestes instruccions, lordinador imprimeix una cpia del document.Per tant, una manera senzilla de dur a terme moltes cpies dun document seria simplementrepetir tants cops com cpies vulguem el conjunt dinstruccions que susaria per imprimir-nenoms una.

    Aquests tres tipus destructura, anomenades a escala general estructures decontrol, permeten establir quines instruccions del vostre programa cal executaren cada moment i especificar lordre en qu sexecuten les instruccions i quinscamins segueixen en el procs dexecuci. s a dir, establir quin s el flux decontrol del programa.

    De moment, noms heu tingut contacte amb lestructura seqencial, a la qualcorresponen tots els exemples vistos fins ara. En els apartats segents veureu comcal usar les estructures de selecci i repetici.

  • Programaci bsica (ASX)Programaci (DAM) 13 Programaci estructurada

    1.2.2 Representaci dalgorismes

    Un algoritme pot ser representat mitjanant molts tipus de notacions. Una maneramolt simple s amb una llista de frases expressades amb les vostres paraules(llenguatge natural), tal com sha vist en lexemple de lou ferrat. Aquesta s unaaproximaci suficient per fer-se una idea de les tasques que cal fer. Ara b, tambs un sistema que pot ser ambigu i resultar confs per a algorismes complexos. Hiha altres mecanismes de notaci ms formal, especialment usats quan lalgorismeper descriure formar part dun programa dordinador. Entre aquests hi ha elpseudocodi, els diagrames de flux de control o, directament, els codis font delsdiferents llenguatges de programaci.

    A partir dara, per esquematitzar el funcionament de certes estructures de controlsusaran diagrames de control de flux, mentre que per representar algorismescomplets, susar directament codi font en llenguatge Java.

    Figura 1.1. Aspecte dun diagrama de flux de control

    Pseudocodi

    El pseudocodi s un llenguatgeinformal dalt nivell que usa lesconvencions i lestructura dunllenguatge de programaci, perque est orientat a ser ents pelshumans.

  • Programaci bsica (ASX)Programaci (DAM) 14 Programaci estructurada

    Un diagrama de flux de control consisteix en una subdivisi de passesseqencials, dacord amb les sentncies i estructures de control dunprograma, que mostra els diferents camins que pot seguir un programa alhora dexecutar les seves instruccions. Cada passa sassocia a una figurageomtrica especfica.

    Lusarem exclusivament per aclarir-ne el funcionament. No sexplicar amb detalltot el conjunt de smbols que es poden usar. Tampoc no se seguir el format finsal darrer detall. s suficient que disposeu duns esquemes senzills que serveixinper donar-vos una idea clara del flux de control del programa per a cada estructurausada, representada demanera visual. A ttol merament illustratiu, perqu tingueuun primer contacte de laspecte que tenen, la figura 1.1 mostra el diagrama de fluxde control de part de lalgorisme per fer ous ferrats. Observeu com les figuresgeomtriques especifiquen les instruccions que es van executant i com les fletxesestableixen lordre dexecuci de les instruccions: el flux de control. En el cas dela descripci de lalgorisme dun programa, el contingut de cada figura, lordreque cal seguir, correspondr a les instruccions del programa.

    1.3 Implementaci del programa

    Una vegada heu definit lalgorisme, cal convertir-lo a codi font en un fitxer, dacordamb un llenguatge de programaci concret, per tal dobtenir un fitxer executable.Segons la notaci emprada per representar lalgorisme dissenyat, aix ser msfcil o ms complicat. Evidentment, si lalgorisme sha representat mitjanant lasintaxi dun llenguatge concret, convertir-lo a codi font s molt fcil, ja que s unsenzill exercici denganxar i copiar.

    Durant aquesta etapa, s important que tot el procs estigui ben documentat, pertal que qualsevol altre desenvolupador, fins i tot el programador mateix quan ja hapassat un cert temps, pugui retocar laplicaci si cal. Penseu que en un programainformtic sautomatitza una forma dactuaci, la qual cosa implica reflectir uncert coneixement. Per el coneixement no s nic i, per tant, entendre el queun altre desenvolupador o un mateix va decidir en el passat s molt difcil. Ladocumentaci s lnica manera de garantir aquest coneixement. Per tant, elmnim que es pot demanar quan simplementa un programa s que es comenti elcodi font de manera que sigui ms entenedor. En aquest aspecte, sespera que coma mnim sexpliqui amb comentaris qu fa el programa i els blocs dinstruccionsque es considerin de comprensi difcil.

    1.4 Verificaci i proves

    Abans que un programa es pugui considerar finalitzat i es posi a disposici delclient, caldr detectar possibles errades i comprovar que actua com sespera. Hi

  • Programaci bsica (ASX)Programaci (DAM) 15 Programaci estructurada

    ha moltes estratgies per provar la correcci dun programa, algunes de moltcomplexes. Per a aquest mdul, nhi ha prou amb una aproximaci relativamentsimple per ms que efectiva: usar jocs de proves.

    Un joc de proves s un conjunt de situacions o entrades de dades quepermeten provar lactuaci del programa. Aquest conjunt hauria de sercomplet, en el sentit que ha dabastar totes les possibilitats reals.

    Un comportament erroni clssic: lapantalla blava del sistema operatiuWindows. Imatge de WikimediaCommons

    Primer caldr dissenyar i preparar el joc de proves per executar el programaposteriorment en les diferents situacions preparades. Daquesta manera sen potcomprovar el bon funcionament en tot moment. En cas que sempre funcionin,podeu estar ms o menys segurs de la fiabilitat del programa. Ara b, la realitat sque sempre es produeixen situacions no previstes que sacabaran detectant quan elprograma ja estigui en marxa i essent utilitzat pel client. De ben segur que alguncop us heu trobat amb programes comercials, com alguns sistemes operatius,que tot i estar a la venda i considerats finalitzats, es comportaven anmalamenten condicions normals (es pengen, reinicien lordinador, etc.). En programescomplexos, es fa difcil detectar fins al darrer error possible.

    Normalment, quan un programa no actua correctament, el problema pot estar enel segent:

    El disseny de lalgorisme.

    La codificaci, que s semnticament incorrecta (per amb sintaxi correcta).

    A vegades lerror es troba de manera senzilla amb un simple seguiment delalgorisme dissenyat, observant si les variables es modifiquen correctament iprenen els valors esperats donades unes dades inicials concretes. Per la majoriade les vegades lerror costa de trobar perqu es parteix de la premissa quelalgorisme s correcte, cosa que no necessriament ha de ser certa. En aquestcas, un mecanisme inavaluable per trobar lerrada s dur a terme la depuraci delprograma.

    Un programa depurador (debugger, en angls) s un programa que permet:

    Executar un programa instrucci per instrucci i veure qu passa desprs delexecuci de cadascuna

    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. Sino s el cas, el programador no tindr ms remei que dur a terme la depuracimanualment. Aquest mtode consisteix a intercalar temporalment enmig del codidel programa instruccions que mostrin per pantalla els valors de les variables,

    Disposeu dun annex onus expliquem elfuncionament deldepurador incls en lIDEque usareu al llarg delcurs.

    El terme original debug voldir literalment eliminarcuques.

    Colloquialment, aquestesinstruccions per mostrarvalors de variablessanomenen xivatos.

  • Programaci bsica (ASX)Programaci (DAM) 16 Programaci estructurada

    per tal de fer el seguiment de lexecuci i localitzar la causa del problema. Perfer-ho, es poden usar les instruccions que aporti el llenguatge per mostrar dadesa la pantalla, com System.out.println(...) en Java. Un cop el programafunciona correctament, caldr treure el codi, o si ms no convertir aquestesinstruccions en comentaris.

    1.5 Posada en marxa i manteniment

    Una vegada es t el programa final, suposadament lliure derrors, cal installar-loseguint les instruccions de lentorn de treball i posar-lo en funcionament. Aix sel que formalment sanomena la fase dexplotaci.

    Sembla que arribeu al final del procs, per encara ens queda una acci: formarlusuari. Cal tenir pacincia. Penseu que vosaltres heu estat molt de temps pensanten el problema i treballant en la soluci. Per a vosaltres s la soluci normal,la teniu assumida, per per a lusuari no s necessriament la soluci desitjadao esperada. Per tant, caldr tenir una bona dosi de pacincia per explicar elfuncionament de laplicaci. Aquesta formaci ha destar sempre acompanyadade la guia o manual de lusuari. No ha de ser un llibre de lectura difcil; hauriende ser els apunts que li permetessin moures rpidament per laplicaci, tractanttotes les possibilitats duna manera rpida i clara.

    Arribats a aquest punt ja us disposeu a descansar, per podeu tenir la mala sort queamb ls de laplicaci sarribi a la conclusi que el programa no fa exactamentel que se nespera o es detecten comportaments erronis que han eludit la fase deproves. Des duna perspectiva ms positiva, tamb pot ser que en aquesta fase elclient estigui molt satisfet i detecti que estaria b que, ara que ja t una aplicacifuncional, us torni a contractar per afegir-hi noves funcionalitats. En aquest cas,caldr retrocedir fins a la fase corresponent i fer les modificacions pertinents.Comena una nova iteraci en el cicle de vida de laplicaci.

  • Programaci bsica (ASX)Programaci (DAM) 17 Programaci estructurada

    2. Estructures de selecci

    Entre els diferents tipus destructures de control que permeten establir el flux decontrol dun programa, les ms fcils dentendre sn aquelles que creen bifurca-cions o camins alternatius, de manera que, segons les circumstncies, sexecuti unconjunt dinstruccions o un altre. Daquesta manera, donades diferents execucionsdun mateix codi font, part de les instruccions que sexecuten poden ser diferentsper a cada cas.

    Les estructures de selecci permeten prendre decisions sobre quin conjuntdinstruccions cal executar en un punt del programa. O sigui, seleccionarquin codi sexecuta en un moment determinat entre camins alternatius.

    Tota estructura de selecci es basa en lavaluaci duna expressi que ha de donarun resultat boole: true (cert) o false (fals). Aquesta expressi sanomena lacondici lgica de lestructura.

    El conjunt dinstruccions que sexecutar dependr del resultat de la condicilgica, i actuar com una mena dinterruptor que marca el flux que cal seguirdins del programa. Normalment, aquesta condici lgica es basa en part, o enla seva totalitat, en valors emmagatzemats en variables amb un valor que pot serdiferent per a diferents execucions del programa. En cas contrari, no t sentit usaruna estructura de selecci, ja que mentre sest escrivint el programa ja es potpredir quin ser el resultat de lexpressi. Per tant, com que sempre ser el mateix,sempre sexecutaran les mateixes instruccions sense que hi hagi cap bifurcacipossible.

    Hi ha diferents models de fluxos alternatius a lhora dexecutar instruccions, toti que per a tots susa la mateixa famlia de sentncies i una estructura similar enel codi font. Per tant, tots els aspectes destacats per a un dels models sapliquentamb a tots els altres. Tamb cal dir que, si b els exemples i la sintaxi descritaen aquest mdul se centren en el llenguatge Java, la majoria de les estructures deselecci descrites sn compartides amb els altres llenguatges de programaci, perla qual cosa el concepte general s aplicable ms enll del Java. Noms caldr quecerqueu a la documentaci la sintaxi especfica per al llenguatge triat.

    2.1 Una desviaci temporal del cam: selecci simple

    El cas ms simple dins de les estructures de selecci s aquell en qu hi haun conjunt o bloc dinstruccions que noms voleu que sexecutin sota unescircumstncies concretes. En cas contrari, aquest bloc s ignorat i, des del punt

  • Programaci bsica (ASX)Programaci (DAM) 18 Programaci estructurada

    if

    El nom de la sentncia ifbsicament diu: Si es compleix

    certa condici, fes aix....

    de vista de lexecuci del programa, s com si no exists. Un exemple seria elprograma duna botiga virtual que aplica un descompte al preu final dacord ambun cert criteri (per exemple, si la compra total s com a mnim de 100 AC). Enaquest cas, hi ha un conjunt dinstruccions, les que apliquen el descompte, quenoms sexecuten quan es compleix la condici. En cas contrari, signoren i elpreu final s el mateix que loriginal.

    La selecci simple, una desviacitemporal en el cam dinstruccions.

    Imatge de Wikimedia Commons

    Lestructura de selecci simple permet controlar el fet que sexecuti unconjunt dinstruccions si i noms si es compleix la condici lgica (s adir, el resultat davaluar la condici lgica s igual a true). En cas contrari,no sexecuten.

    2.1.1 Sintaxi i comportament

    Per dur a terme aquest tipus de control sobre les instruccions del programa, calusar una sentncia if (si...). En el cas del Java, la sintaxi s la segent:

    1 instruccions del programa2 if (expressi booleana) {3 Instruccions per executar si lexpressi avalua a true (cert) Bloc if4 }5 resta dinstruccions del programa

    Si entre els parntesis es posa una expressi que no avalua un resultat de tipusboole, hi haur un error de compilaci.

    La figura 2.1 mostra un diagrama del flux de control daquesta sentncia, queestableix els diferents blocs dinstruccions que sexecuten en cada cas, depenentdel resultat davaluar lexpressi booleana.

    Figura 2.1. Diagrama de flux de control per a una selecci simple

  • Programaci bsica (ASX)Programaci (DAM) 19 Programaci estructurada

    Un diagrama de flux de control consisteix en una subdivisi de passesseqencials, dacord amb les sentncies i estructures de control dunprograma, que mostra els diferents camins que pot seguir el programa alhora dexecutar les instruccions. Cada passa sassocia amb una figurageomtrica especfica.

    A partir dara, per esquematitzar el funcionament de les estructures de control su-sar aquesta mena de diagrames. Noms lusarem per aclarir-ne el funcionament,de manera que no sexplicar amb detall tot el conjunt de smbols que es podenusar. A lhora dusar-los, tampoc no se seguir el format fins al darrer detall. ssuficient que disposeu duns esquemes senzills que serveixin per donar-vos unaidea clara del flux de control del programa per a cada estructura usada de maneravisual.

    2.1.2 Exemple: calcular un descompte

    Es vol fer un programa que apliqui un descompte a un preu depenent del seu valor.Per veure clarament que hi ha diferents camins dins de les instruccions, primer detot establirem quines sn les tasques que ha de fer el programa i en quin ordre.

    El programa hauria de fer:

    1. Decidir quin s el valor mnim per optar al descompte i quant es descomp-tar.

    2. Demanar que sintrodueixi el preu inicial, en euros, pel teclat.

    3. Llegir-lo.

    4. Veure si el preu introdut s igual o major que el valor mnim per optar aldescompte.

    (a) Si s aix, saplica el descompte sobre el preu inicial.

    5. Mostrar el preu final.

    En el pas 4 es pot observar que cal prendre una decisi dacord amb una condicii que alguna de les tasques noms es fa si aquesta es compleix (el pas I). Pertant, queda establert que cal una estructura de selecci simple. Partint daqu, unpossible codi font que correspondria a aquest esquema seria el segent. Observeuquines instruccions es corresponen a cadascuna de les passes descrites.

    Tot seguit es mostra el codi font que du a terme aquestes tasques. Compileu-lo,executeu-lo i observeu com el resultat final mostrat per pantalla s diferent segonsel valor que introduu pel teclat.

    Una possible bifurcaci enel cam dun flux de controlsindica amb un rombe quecont una expressi peravaluar.

    Recordeu que pot ser queJava llegeixi els entersintroduts per teclat amb elsdecimals indicats ambcoma, i no punt, segons laconfiguraci local.

  • Programaci bsica (ASX)Programaci (DAM) 20 Programaci estructurada

    1 import java.util.Scanner;2 //Un programa que calcula descomptes.3 public class Descompte {4 //PAS 15 //Es fa un descompte del 8%.6 public static final float DESCOMPTE = 8;7 //Es fa descompte per compres dun mnim de 100 euros.8 public static final float COMPRA_MIN = 100;9 public static void main (String[] args) {

    10 Scanner lector = new Scanner(System.in);11 //PAS 2 i 312 System.out.print("Quin s el preu del producte, en euros? ");13 float preu = lector.nextFloat();14 lector.nextLine();15 //PAS 416 //Estructura de selecci simple.17 //Si lexpressi avalua true, executa el bloc dins lif.18 //En cas contrari, ignoral.19 if (preu >= COMPRA_MIN) {20 //PAS I21 float descompteFet = preu * DESCOMPTE / 100;22 preu = preu descompteFet;23 }24 //PAS 525 System.out.println("El preu final per pagar s de " + preu + " euros.");26 }27 }

    A la figura 2.2 es representa el diagrama de flux de control daquest programa enconcret. A la figura es visualitza a quina part del diagrama correspon cada partdel codi.

    Figura 2.2. Diagrama de flux de control per al programa de clcul dun descompte

    Repte 1: modifiqueu el programa perqu, en lloc de fer un descompte del 8% sila compra s de 100 AC o ms, apliqui una penalitzaci de 2 AC si el preu s inferiora 30 AC.

  • Programaci bsica (ASX)Programaci (DAM) 21 Programaci estructurada

    2.1.3 Aspectes importants de la selecci simple

    La introducci destructures de selecci en un programa complica la sintaxi delcodi font, per la qual cosa cal ser molt acurat a lhora descriure una sentncia if.Si no ho feu, o b el compilador donar error, o b el programa no es comportarcorrectament, i haureu de repassar el codi font per veure on s lerror. Cal dirque el segon cas acostuma a ser molt ms empipador que el primer. Per tant, valla pena fer un reps dels aspectes ms rellevants de la selecci simple. Aquestesqestions afecten en una mesura o altra totes les estructures de selecci.

    Lexpressi booleana que denota la condici lgica pot ser tan complexacom es vulgui, per ha destar sempre entre parntesis.

    Les instruccions que cal executar si la condici s certa estan englobadesentre dues claus ({, }). Aquest conjunt es considera un bloc dinstruccionsassociat a la sentncia if (bloc if ).

    La lnia on hi ha les claus o la condici no acaba mai en punt i coma (;), alcontrari que altres instruccions.

    Tot i que no s imprescindible, s un bon costum que les instruccions delbloc estiguin sagnades.

    Vist aix, val la pena remarcar que amb la introducci destructures de seleccisimple tamb apareix per primer cop codi font amb diferents blocs dinstruccions:el del mtode principal i els associats a la sentncia if. La principal caractersticadaquest fet s que la relaci entre blocs s jerrquica: tots els nous blocsdinstruccions sn subblocs del mtode principal. La figura 2.3 mostra elsdiferents blocs existents en lexemple.

    Figura 2.3. Blocs dinstruccions en el programa dexemple

  • Programaci bsica (ASX)Programaci (DAM) 22 Programaci estructurada

    Com anireu veient, aquesta circumstncia es repetir en totes les estructures decontrol dun programa. Per aix heu de tenir molt clar on comena i acaba cadabloc, i quins blocs sn subblocs dun altre.

    Tamb val la pena fer mfasi que, quan susin estructures que delimiten blocsdinstruccions diferents, identificats per estar escrits entre claus ({, }), s impor-tant sagnar cada lnia. Daquesta manera, es facilita la llegibilitat del codi fonti la identificaci de cada bloc dinstruccions. Si us hi fixeu, veureu que, de fet,aix ja shavia aplicat fins ara a les instruccions dins del mtode principal (tambdelimitades per claus), respecte a la declaraci dinici de la classe. Totes lesinstruccions delmtode principal estan sagnades respecte al marge de la declaracidel mtode principal.

    A mode de resum, la taula 2.1 mostra una petita llista derrors tpics que es podencometre en usar una sentncia if.

    Taula 2.1. Errors tpics en usar una sentncia if

    Missatge derror en compilar Error coms Exemple

    ( expected Expressi no envoltada deparntesis

    if preu >= COMPRA_MIN) {

    ; expected Falta ; en alguna instrucci delbloc if

    preu = preu - descompteFet

    Sempre executa bloc if Sha posat ; a la sentncia if if (preu >= COMPRA_MIN); {

    Noms fa condicionalment laprimerainstrucci del bloc if,la resta les fa sempre

    Falten les claus que handenvoltar el bloc, {...}

    if (preu >= COMPRA_MIN)

    Vinculat al darrer error, cal esmentar que quan el bloc if noms t una nicainstrucci, ls de claus s opcional. De totes maneres, s molt recomanable usar-les sempre, independentment daquest fet. Aix facilita la identificaci del blocde codi associat a la sentncia if quan sest llegint el codi font.

    1 if (preu >= COMPRA_MIN)2 preu = preu (preu * DESCOMPTE / 100);3

    4 s equivalent a5

    6 if (preu >= COMPRA_MIN) {7 preu = preu (preu * DESCOMPTE / 100);8 }

    Ara b, alerta!

    1 if (preu >= COMPRA_MIN)2 float descompteFet = preu * DESCOMPTE / 100;3 preu = preu descompteFet;4

    5 s equivalent a (fixeuvos on estan ubicades les claus)6

    7 if (preu >= COMPRA_MIN) {8 float descompteFet = preu * DESCOMPTE / 100;9 }

    10 preu = preu descompteFet;

  • Programaci bsica (ASX)Programaci (DAM) 23 Programaci estructurada

    2.2 Dos camins alternatius: la sentncia if/else

    La selecci doble, una bifurcaci enel cam. Imatge de WikimediaCommons

    Suposeu que ara voleu fer un programa en qu sha dintentar endevinar un nombreentre 1 i 10. En aquest cas, i a diferncia de lanterior, ara hi ha dos escenarisexcloents: o sha endevinat el nombre, o no sha endevinat. Segons de quin cas estracti, la resposta del programa ha de ser diferent. Per tant, a ms a ms de codicom per a qualsevol cas i dun bloc que especifiqui les accions per dur a termesi es compleix la condici, ara en cal un altre que indiqui qu cal fer noms encas contrari. Per poder fer aix tenim lestructura de selecci doble, la sentnciaif/else (si... si no...).

    Lestructura de selecci doble permet controlar el fet que sexecuti unconjunt dinstruccions, noms si es compleix la condici lgica, i que senexecuti un altre, noms si no es compleix la condici lgica/ Imatge deWikimedia Commons

    s important recordar que els dos blocs de codi sn excloents. Mai no pot passarque tots dos sacabin executant.

    2.2.1 Sintaxi i comportament

    Per dur a terme aquest tipus de control sobre les instruccions del programa, calusar una sentncia if/else (si... si no...). En el llenguatge Java, la sintaxi s lasegent:

    1 if (expressi booleana) {2 Instruccions per executar si lexpressi lavalua a true (cert) Bloc if3 } else {4 Instruccions alternatives per executar si lexpressi lavalua a false (fals)

    Bloc else5 }

    El bloc if t exactament les mateixes caracterstiques que quan susa en unaestructura de selecci simple. Aquestes es compleixen tamb per al cas del blocelse, amb la particularitat que no t cap expressi assignada. Simplement, quanla condici lgica de la sentncia if no es compleix sexecuten les instruccionsdel bloc else. La figura 2.4 en mostra el diagrama del flux de control a escalagenrica.

    if/else

    La sentncia if/elsebsicament diu: Si es compleixcerta condici, fes aix... i si no,aix altre....

  • Programaci bsica (ASX)Programaci (DAM) 24 Programaci estructurada

    Figura 2.4. Diagrama de flux de control duna selecci doble

    Si per algun motiu no es posa cap instrucci dins del bloc else i es deixa unespai buit entre les dues claus, la selecci doble es comporta igual que la seleccisimple. En aquest cas, s millor usar noms la sentncia if en lloc de if/else.

    2.2.2 Exemple: endevina el nombre secret

    Un possible codi dun programa en qu sintenta endevinar un nombre serveix permostrar amb ms claredat com es pot usar una sentncia if/else. Novament,abans de veurel val la pena reflexionar sobre quines sn les tasques que hauria defer el programa i en quin ordre.

    Bsicament, el programa ha de fer:

    1. Decidir quin ser el nombre per endevinar.

    2. Demanar que sintrodueixi un nombre pel teclat.

    3. Llegir-lo.

    4. Veure si el nombre introdut s igual al valor secret:

    (a) Si s igual que el nombre pensat, informa que sha encertat.

    (b) Si no, informa que sha fallat.

    Queda clar que en el pas 4 cal prendre una decisi dacord amb una condici.El programa haur demprendre dues vies dacci diferents segons si la condicies compleix o no. Per tant, cal una estructura de selecci doble. Partint daqu,un possible codi font que correspondria a aquest esquema seria el segent. Denou, observeu quines instruccions es corresponen a cadascun dels passos descrits.Compileu-lo i executeu-lo per veure com funciona.

  • Programaci bsica (ASX)Programaci (DAM) 25 Programaci estructurada

    1 import java.util.Scanner;2 //Un programa en qu cal endevinar un nombre.3 public class Endevina {4 //PAS 15 //El nombre per endevinar ser el 4.6 public static final int VALOR_SECRET = 4;7 public static void main (String[] args) {8 Scanner lector = new Scanner(System.in);9 //PAS 2 i 3

    10 System.out.println("Comencem el joc.");11 System.out.print("Endevina el valor enter, entre 0 i 10: ");12 int valorUsuari = lector.nextInt();13 lector.nextLine();14 //PAS 415 //Estructura de selecci doble.16 //O sendevina o es falla.17 if (VALOR_SECRET == valorUsuari) {18 //PAS I19 //Si lexpressi avalua true, executa el bloc dins lif.20 System.out.println("Exacte! Era " + VALOR_SECRET + ".");21 } else {22 //PAS II23 //Si lexpressi avalua false, executa el bloc dins lelse.24 System.out.println("Thas equivocat!");25 }26 System.out.println("Hem acabat el joc.");27 }28 }

    Tot seguit, la figura 2.5 mostra un esquema de quin s el flux exacte dexecuciquan es posa en marxa el programa i quin paper t cada part del codi dacord ambla definici de la sintaxi.

    Figura 2.5. Esquema del flux de control dun programa per endevinar un nombre

    Repte 2: modifiqueu el programa perqu, en lloc dun nic valor secret, nhi hagidos. Per guanyar, noms cal encertar-ne un dels dos. La condici lgica que uscaldr ja no es pot resoldre amb una expressi composta per una nica comparaci.Ser ms complexa.

  • Programaci bsica (ASX)Programaci (DAM) 26 Programaci estructurada

    ifelse ifelse

    El nom de la sentncia if/elseif/else significa bsicament:Si es compleix certa condici,

    fes aix... Si no, mira si escompleix aix altre... I si no,

    aix altre....

    2.3 Diversos camins: la sentncia if/else if/else

    La selecci mltiple: mltiplescamins alternatius. Imatge de

    Wikimedia Commons

    Finalment, a lhora destablir el flux de control dun programa, tamb hi ha lapossibilitat que hi hagi un nombre arbitrari de camins alternatius, no solamentdos. Per exemple, imagineu un programa que, a partir de la nota numrica dunexamen, ha destablir quina s la qualificaci de lalumne. Per aix caldr veuredins de quin rang es troba el nombre. En qualsevol cas, els resultats possibles snms de dos.

    Lestructura de selecci mltiple permet controlar el fet que en complir-se un cas entre un conjunt finit de casos sexecuti el conjunt dinstruccionscorresponent.

    2.3.1 Sintaxi i comportament

    Aquest tipus de control sobre les instruccions del programa t associada lasentncia if/else if/else (si s el cas, en aquest altre cas, si no s cap cas).Bsicament, es tracta de la mateixa estructura que la sentncia if/else, per ambun nombre arbitrari de blocs if (desprs del primer bloc, anomenats else if).En el cas del Java, la sintaxi s la segent:

    1 instruccions del programa2 if (expressi booleana 1) {3 Instruccions per executar si lexpressi 1 lavalua a true (cert) Bloc if4 } else if (expressi booleana 2) {5 Instruccions per executar si lexpressi 2 lavalua a true (cert) Bloc else

    if6 } else if (expressi booleana 3) {7 Instruccions per executar si lexpressi 3 lavalua a true (cert) Bloc else

    if8

    9 ...es repeteix tant cops com calgui...10

    11 } else if (expressi booleana N) {12 Instruccions per executar si lexpressi N avalua a true (cert) Bloc else

    if13 } else {14 Instruccions alternatives si totes les expressions 1...N avaluen a false (

    fals) Bloc else15 }16 resta dinstruccions del programa

    La figura 2.6 mostra un esquema del flux dexecuci, dacord amb el resultatdanar avaluant cadascuna de les condicions lgiques. En aquest cas s una micams complicat, ja que, com es pot veure, hi ha ms duna condici lgica dins dela sentncia. Cada condici es va avaluant ordenadament, des de la primera finsa la darrera, i sexecutar el codi del primer cas en qu lexpressi avalu com acert. Un cop fet aix, ja no es torna a avaluar cap altra condici restant i signorala resta de blocs. Si en aquest procs es dna el cas que cap de les expressionsavalua a cert, sexecutaran les instruccions del bloc else.

  • Programaci bsica (ASX)Programaci (DAM) 27 Programaci estructurada

    Figura 2.6. Diagrama de flux de control duna selecci mltiple

    El punt important daquesta sentncia s que noms sexecutar un nic bloc detots els possibles. Fins i tot en el cas que ms duna de les expressions booleanespugui avaluar a cert, noms sexecutar el bloc associat a la primera daquestesexpressions dins de lordre establert en la sentncia.

    Tamb s destacable el fet que el bloc else s opcional. Si no volem, no calposar-lo. En aquest cas, si no es compleix cap de les condicions, no sexecuta capinstrucci entre les incloses dins de la sentncia.

    2.3.2 Exemple: transformar avaluaci numrica a text

    La manera dusar la sentncia if/else if/else es pot veure millor mitjanantel codi de lexemple proposat anteriorment. Un cop ms, abans de veure el codies repassaran els passos que ha de fer el programa per dur a terme el seu objectiui lordre que cal seguir.

    1. Demanar que sintrodueixi la nota pel teclat.

    2. Llegir-la.

    3. Mostrar un text o un altre segons el rang de valors dins del qual es troba lanota:

    (a) Si s major o igual que 9 i menor o igual que 10, la nota sdExcellent.

    (b) Si s major i igual que 6,5 per estrictament menor que 9, la nota sNotable.

  • Programaci bsica (ASX)Programaci (DAM) 28 Programaci estructurada

    No oblideu que en unaestructura de selecci la

    condici lgica sempre vaentre parntesis.

    (c) Si s major i igual que 5 per estrictament menor que 6,5, la nota sSuficient.

    (d) Si no s cap dels casos anteriors, la nota s de Susps.

    Aquest cop s el pas 3 el que presenta diferents possibilitats segons si es complei-xen certes condicions. En aquest cas, per, hi hams de dun cam (nhi ha quatre).A ms a ms, cal decidir si es compleix una condici diferent per decidir quin sel cam que cal seguir entre totes les opcions. El darrer es du a terme simplementquan no es compleix cap dels anteriors. Per tant, es tracta duna selecci mltiple.

    Un fet destacat en aquesta descripci de les tasques que ha de dur a terme elprograma, com a mnim respecte als exemples anteriors, s que per a cada paspossible shan de complir dues condicions alhora. El valor de la nota ha destarper sota de cert valor i per sobre dun altre. Lexpressi de tipus boole que calavaluar per veure quin cam cal seguir ha de comprovar totes dues coses: quees compleix una cosa i laltra. O sigui, cal una expressi lgica basada en laconjunci de dues comparacions. Un cop ms, observeu quines instruccions escorresponen a cadascun dels passos descrits. Fixeu-vos en particular en com snles condicions lgiques per a cada cas.

    Compileu i executeu el programa segent per veure com la nota mostrada depndel valor introdut:

    1 import java.util.Scanner;2 //Un programa que indica la nota en text a partir de la numrica.3 public class Avaluacio {4 public static void main (String[] args) {5 Scanner lector = new Scanner(System.in);6 //PAS 1 i 27 System.out.print("Quina nota has tret? ");8 float nota = lector.nextFloat();9 lector.nextLine();

    10 //PAS 311 //Estructura de selecci mltiple.12 //Sentra al bloc on la condici lgica avalu a true.13 //Si cap no ho fa, sentra al bloc else.14 System.out.print("La teva nota final s ");15 if ((nota >= 9)&&(nota = 6.5)&&(nota < 9)) {19 //PAS II20 System.out.println("Notable.");21 } else if ((nota >= 5)&&(nota < 6.5)) {22 //PAS III23 System.out.println("Aprovat.");24 } else {25 //PAS IV26 System.out.println("Susps.");27 }28 System.out.println("Espero que hagi anat b...");29 }30 }

    El diagrama de flux per a aquest programa en concret es mostra tot seguit, a lafigura 2.7. En aquest cas, el codi seguir un entre cinc camins possibles, totsdisjunts.

  • Programaci bsica (ASX)Programaci (DAM) 29 Programaci estructurada

    Figura 2.7. Esquema del flux de control dun programa dassignar la nota

    Una altra possibilitat

    El programa que tot just sha exposat analitza totes les possibilitats a lhoradavaluar les notes de manera molt estricta. Totes les condicions possibles snabsolutament disjuntes. Mai no es pot donar el cas que dues avalun cert, ja quela nota introduda pertanyer a un i noms a un dels rangs establerts. Ara b,la selecci mltiple accepta que les condicions no ho siguin. En cas que sencompleixi ms duna, el bloc dinstruccions que sexecutar ser el de la primeracondici que ha avaluat com a true, per ordre descriptura en el codi.

    Un cop es t una mica dexperincia programant, es pot jugar amb aquest fet, perplantejar aquest programa duna altra manera:

    1. Demanar que sintrodueixi la nota pel teclat.

    2. Llegir-la.

    3. Mostrar un text o un altre segons dins de quin rang de valors es troba la nota:

    (a) Si s major o igual que 9, la nota s Excellent.

    (b) Si s major o igual que 6,5, la nota s Notable.

    (c) Si s major o igual que 5, la nota s Suficient.

    (d) Si no s cap dels casos anteriors, la nota s Susps.

    En aquest plantejament, lordre davaluaci de les condicions s molt ms impor-tant. Per a una nota de 9,5 es compleixen totes i cadascuna de les condicions. Pernoms es dur a terme lacci relativa a la primera de les enumerades (en aquestcas, la I).

    El codi font associat seria el segent, prcticament idntic a lanterior. Compileu-lo i executeu-lo per comprovar que el comportament s el mateix.

  • Programaci bsica (ASX)Programaci (DAM) 30 Programaci estructurada

    1 import java.util.Scanner;2 //Un programa que indica la nota en text a partir de la numrica.3 public class AvaluacioSimplificat {4 public static void main (String[] args) {5 Scanner lector = new Scanner(System.in);6 //PAS 1 i 27 System.out.print("Quina nota has tret? ");8 float nota = lector.nextFloat();9 lector.nextLine();

    10 //PAS 311 //Estructura de selecci mltiple.12 //Sentra al bloc on la condici lgica avalu a true.13 //Les condicions savaluen per ordre daparici.14 //Si cap no ho fa, sentra al bloc else.15 System.out.print("La teva nota final s ");16 if ((nota >= 9)&&(nota = 6.5) {20 //PAS II21 System.out.println("Notable.");22 } else if (nota >= 5) {23 //PAS III24 System.out.println("Aprovat.");25 } else {26 //PAS IV27 System.out.println("Susps.");28 }29 System.out.println("Espero que hagi anat b...");30 }31 }

    Observeu atentament qu passa si la nota s 8. En aquest cas, avaluen com acertes la segona (nota >= 6.5) i la tercera condici (nota >= 5), per el blocdinstruccions que sexecutar s el de la segona. Aix es veu clarament en eldiagrama de la figura 2.8 si aneu seguint ordenadament el flux de control establert.De fet, si us hi fixeu, el diagrama en si s com el de la figura 2.7, i noms varienles condicions lgiques.

    Figura 2.8. Esquema del flux de control del programa alternatiu dassignar la nota

  • Programaci bsica (ASX)Programaci (DAM) 31 Programaci estructurada

    2.4 Combinaci destructures de selecci

    Les sentncies que defineixen estructures de selecci sn instruccions com quals-sevol altres dins dun programa, si b amb una sintaxi una mica ms complicada.Per tant, res no impedeix que tornin a aparixer dins de blocs dinstruccionsdaltres estructures de selecci. Aix permet crear una disposici de bifurcacionsdins el flux de control per tal de dotar al programa dun comportament complex,per comprovar si es compleixen diferents condicions dacord amb cada situaci.

    2.4.1 Exemple: descompte mxim i control derrors

    Per veure un exemple en qu resulta til la combinaci destructures de selecci,imagineu que voleu fer un parell de modificacions a lexemple del clcul dundescompte. Duna banda, que hi hagi un valor mxim de descompte, de maneraque si per algunmotiu correspon fer un descompte per sobre daquest valor, nomssapliqui el mxim establert. Daltra banda, estaria b corregir un comportamentuna mica estrany que ara mateix t el programa: que s capa dacceptar preusnegatius. En aquest cas, com que s evident que lusuari sha equivocat, estariab avisar-lo amb algun missatge.

    Ara el programa hauria de fer el segent:

    1. Decidir quin s el valor mnim per optar al descompte, quant es descomptari el valor mxim possible.

    2. Demanar que sintrodueixi el preu inicial, en euros, pel teclat.

    3. Llegir-lo.

    4. Comprovar que el preu s correcte i no s negatiu:

    (a) Si es compleix, veure si el preu introdut s igual o superior al valormnim per optar al descompte:

    i. Si s aix, calcular el descompte.ii. Comprovar si el descompte supera el mxim permissible:

    A. Si s aix, el descompte es redueix al mxim permissible.iii. Aplicar el descompte sobre el preu inicial.

    (b) Mostrar el preu final.

    (c) Si el preu era negatiu, mostrar un missatge derror.

    Aix, doncs, apareixen dues noves condicions. Abans de fer res cal veure si elpreu s positiu i, immediatament desprs de calcular el descompte, cal veuresi es compleix la nova condici de si el valor s superior al mxim o no. Laparticularitat s que ara les diferents condicions del programa noms es comprovensi les anteriors es van complint, una darrere de laltra.

  • Programaci bsica (ASX)Programaci (DAM) 32 Programaci estructurada

    Recordeu que en Java cadabloc sidentifica per estar

    entre claus: {...}.

    El codi segent fa s duna combinaci destructures de selecci per dur a termeaquesta modificaci. Compileu-lo i executeu-lo. Mitjanant comentaris sassociacada instrucci a cadascun dels passos descrits.

    1 import java.util.Scanner;2 //Un programa que calcula descomptes.3 public class DescompteControlErrors {4 //PAS 15 //Es fa un descompte del 8%.6 public static final float DESCOMPTE = 8;7 //Es fa descompte per compres de 100 euros o ms.8 public static final float COMPRA_MIN = 100;9 //Valor del descompte mxim: 10 euros.

    10 public static final float DESC_MAXIM = 10;11 public static void main (String[] args) {12 Scanner lector = new Scanner(System.in);13 //PASSOS 2 i 314 System.out.print("Quin s el preu del producte, en euros? ");15 float preu = lector.nextFloat();16 lector.nextLine();17 //PAS 4. El preu s positiu?18 if (preu > 0) {19 //PAS I20 if (preu >= COMPRA_MIN) {21 //PAS a22 float descompteFet = preu * DESCOMPTE / 100;23 //PAS b. Si el descompte supera el mxim, cal reduirlo.24 if (descompteFet > DESC_MAXIM) {25 //PAS alfa. Reduir descompte26 descompteFet = DESC_MAXIM;27 }28 //PAS c29 preu = preu descompteFet;30 }31 //PAS II. Es mostra el preu final.32 System.out.println("El preu final per pagar s de " + preu + " euros.");33 } else {34 //PAS III. El preu era negatiu. Cal avisar lusuari.35 System.out.println("Preu incorrecte. s negatiu.");36 }37 }38 }

    La figura 2.9mostra un esquema de com queden distributs els blocs dinstruccionsdins del programa i de com sestructuren jerrquicament en nivells de profunditat.Com es pot apreciar, quan es combinen estructures de control s especialmentimportant sagnar el codi font per fer-lo intelligible i usar sempre claus per poderdistingir clarament on comena i on acaba cada bloc diferent.

    Un dels aspectes ms importants daquest exemple s que el programa ha deser capa de comprovar si les dades que ha introdut lusuari compleixen certescondicions i aix avisar-lo de possibles errors. Moltes vegades, per aconseguir-hocal combinar diferents estructures de selecci, de manera que noms se segueixpel cam que processa les dades si es pot garantir que sn correctes. De fet, tanten lexemple dendevinar un nombre com en el de transformar les notes tambvaldria la pena fer aquesta comprovaci, i veure si el valor introdut est realmententre els valors permissibles (0 i 10).

  • Programaci bsica (ASX)Programaci (DAM) 33 Programaci estructurada

    Les estructures de selecci sn fonamentals per poder comprovar si les dadesque introdueix lusuari sn correctes abans de processar-les.

    Figura 2.9. Blocs dinstruccions en una combinaci destructures de selecci

    Repte 3: modifiqueu els exemples dendevinar un nombre i transformar una notanumrica en textual perqu comprovin, abans de fer res ms, que el valor queha introdut lusuari es troba dins del rang de valors correcte (entre 1 i 10 peral primer cas, entre 1 i 12 per al segon). En algun cas, potser no cal combinardiverses estructures de selecci...

    2.4.2 Mltiples blocs dinstruccions i mbit de variables

    En el moment que el codi font dun programa sorganitza en diferents blocsdinstruccions, uns dins dels altres, a causa de laparici destructures de control,cal anar amb molt de compte de respectar lmbit de la declaraci duna variable.La millor manera de veure qu pot passar si no es t cura daix s seguint unexemple concret.

    Suposeu que ara voleu modificar el programa anterior perqu, a ms del preu final,tamb mostri exactament quants euros shan descomptat sobre el preu inicial.Com es disposa de la variable descompteFet ja declarada, on semmagatzemaprecisament el valor exacte del descompte, noms hauria de ser qesti deconsultar-ne el valor i mostrar-lo per pantalla, tal com ja es fa amb el preu. Pertant, dentrada, una possible modificaci en el codi original seria la que es mostratot seguit. Integreu-la en el programa original i proveu si funciona o no.

    Recordeu que quan es diuusar una variable es vol diren realitat usarlidentificador associat a unavariable.

  • Programaci bsica (ASX)Programaci (DAM) 34 Programaci estructurada

    1 ...2 if (preu > 0) {3 //PAS I4 if (preu >= COMPRA_MIN) {5 float descompteFet = preu * DESCOMPTE / 100;6 if (descompteFet > DESC_MAXIM) {7 descompteFet = DESC_MAXIM;8 }9 preu = preu descompteFet;

    10 }11 System.out.println("El preu final per pagar s de " + preu + " euros.");12 //Modificaci. Ara tamb mostrem el descompte... o no?13 System.out.println("Sha fet un descompte de " + descompteFet + " euros

    .");14 } else {15 System.out.println("Preu incorrecte. s negatiu.");16 }17 ...

    Malauradament, si intenteu compilar el programa modificat amb aquest nou codi,hi haur un error en la nova lnia on sintenta mostrar el valor del descompte.Aquest us informa que lidentificador descompteFet no ha estat declarat (cannotfind symbol) i, per tant, no pot ser usat. Per tot just unes lnies abans, a la primerainstrucci del bloc if, hi ha la declaraci. Com s possible? La resposta s que,ara que ja hi ha ms dun bloc dinstruccions en el codi font del programa, nose nha respectat lmbit. Recordeu que la declaraci duna variable noms tvalidesa des que es declara fins al delimitador de final del bloc on sha declarat(en aquest cas, la clau }).

    Aquesta condici es compleix per a la variable preu, ja que ha estat declarada albloc de codi del programa principal, i per tant pot ser usada fins a la clau que tancael mtode principal (s a dir, a tot el programa). Ara b, la variable descompteFetha estat declarada en el bloc if i, per tant, deixa de tenir validesa en acabar el bloc.Com que es consulta ms enll daquest bloc, s com si no shagus declarat mai.

    Per solucionar aquest problema, la declaraci sha de dur amb anterioritat aintentar mostrar-la per pantalla i, alhora, en el mateix bloc dinstruccions, no dinsdel bloc if. Aix es podria fer com es mostra a continuaci. Incorporeu el canvial codi original i proveu si ara funciona.

    1 ...2 if (preu > 0) {3 //Si es declara aqu, t validesa fins al final daquest bloc if.4 float descompteFet = 0;5 if (preu >= COMPRA_MIN) {6 descompteFet = preu * DESCOMPTE / 100;7 if (descompteFet > DESC_MAXIM) {8 descompteFet = DESC_MAXIM;9 }

    10 preu = preu descompteFet;11 }12 System.out.println("El preu final per pagar s de " + preu + " euros.");13 System.out.println("Sha fet un descompte de " + descompteFet + " euros

    .");14

    15 } else {16 System.out.println("Preu incorrecte. s negatiu.");17 }18 ...

  • Programaci bsica (ASX)Programaci (DAM) 35 Programaci estructurada

    La figura 2.10 mostra quin era lmbit inicial de la variable descompteFet en elprograma original (A) i quin s el que resulta de la modificaci de la lnia on esdeclara (B) per tal de solucionar lerror.

    Figura 2.10. mbits de la variable descompteFet

    Una bona pregunta que us podeu fer s quin sentit t llavors declarar variables dinsde blocs de codi que no siguin el mtode principal. La resposta s que, a escalade funcionament del programa, no hi ha cap diferncia. Es podrien declarar totesa linici del programa principal, per garantir que mai no us trobeu fora del seumbit, i tot funcionaria igual. Ara b, declarar variables tot just en el moment quesusen t sentit amb vista a la llegibilitat del programa. Si declareu una variableprop del codi on sen fa s, s ms senzill per a alg altre que llegeixi el codi fontestablir-ne el valor sense haver de repassar tot el codi des del principi. Aix sespecialment til en programes llargs.

    2.5 El commutador: la sentncia switch

    Hi ha una estructura de selecci una mica especial, motiu pel qual sha deixatper al final. El que la fa especial s que no es basa a avaluar una condici lgicacomposta per una expressi booleana, sin que estableix el flux de control a partirde lavaluaci duna expressi de tipus enter o carcter (per mai real).

    Una sentncia switch s un selectorentre diferents valors.

    La sentncia switch enumera, un per un, un conjunt de valors discrets que esvolen tractar, i assigna les instruccions que cal executar si lexpressi avalua encada valor diferent. Finalment, especifica qu cal fer si lexpressi no ha avaluat encap dels valors enumerats. s com un commutador o una palanca de canvis, en qusassigna un codi per a cada valor possible que cal tractar. Aquest comportamentseria equivalent a una estructura de selecci mltiple en qu, implcitament, totesles condicions sn comparar si una expressi s igual a cert valor. Cada brancacontrolaria un valor diferent. El cas final s equivalent a l`else.

    De fet, en la majoria de casos, aquesta sentncia no aporta res des del punt devista del flux de control que no es pugui fer amb una selecci mltiple. Pers molt til amb vista a millorar la llegibilitat del codi o facilitar la generacidel codi del programa. Ara b, s que hi ha un petit detall en qu aquesta

  • Programaci bsica (ASX)Programaci (DAM) 36 Programaci estructurada

    switch

    El nom de la sentncia switchvol dir bsicament: commutaentre aquestes accions dacord

    amb un valor seleccionat.

    sentncia aporta alguna cosa que la resta destructures de selecci no poden ferdirectament: executar de manera consecutiva ms dun bloc de codi relatiu adiferents condicions.

    2.5.1 Sintaxi i comportament

    La sintaxi de la sentncia switch sajusta al format descrit tot seguit. Novament,es basa en una paraula clau seguida duna condici entre parntesis i un bloc decodi entre claus. Ara b, la diferncia respecte de les sentncies vistes fins ara sque els conjunts dinstruccions assignats a cada cas independent no es distingeixenentre si per claus. Aquests es van enumerant com un conjunt dapartats etiquetatsper la paraula clau case, seguida del valor que es vol tractar i de dos punts. Demanera opcional, es pot posar una instrucci especial que serveix de delimitadorde final dapartat, anomenada break. Al final de tots els apartats sen posa undespecial, anomenat default, que no ha dacabar mai en break.

    1 switch(expressi de tipus enter) {2 case valor1:3 instruccions si lexpressi avalua a valor14 (opcionalment) break;5 case valor2:6 instruccions si lexpressi avalua a valor27 (opcionalment) break;8 ...9 case valorN:

    10 instruccions si lexpressi avalua a valorN11 (opcionalment) break;12 default:13 instruccions si lexpressi avalua a algun valor que no s valor1...valorN14 }

    En executar la sentncia switch savalua lexpressi entre parntesis i immediata-ment sexecuta el conjunt dinstruccions assignat a aquell valor entre els diferentsapartats case. Si no nhi ha cap amb aquest valor entre els disponibles, llavorssexecuta lapartat etiquetat com a default (per defecte).

    Cal dir que els valors numrics no han de seguir cap ordre en concret per definircada apartat. Si b pot ser ms polit enumerar-los per ordre creixent, aix no tcap efecte sobre el comportament del programa.

    La particularitat especial daquesta sentncia la tenim en ls de la instruccibreak. Aquesta indica qu cal fer un cop executades les instruccions de lapartat.Si apareix la instrucci, el programa se salta la resta dapartats i continua amb lainstrucci posterior a la sentncia switch (desprs de la clau que tanca el bloc).En aquest aspecte, si tots els apartats acaben en break, el funcionament de switchs equivalent a fer:

    1 if (expressi == valor 2) {2 instruccions si lexpressi avalua a valor13 } else if (expressi == valor2) {4 instruccions si lexpressi avalua a valor25 ...6 } else if (expressi == valorN) {

  • Programaci bsica (ASX)Programaci (DAM) 37 Programaci estructurada

    7 instruccions si lexpressi avalua a valorN8 } else {9 instruccions si lexpressi avalua a algun valor que no s valor1...valorN

    10 }

    Ara b, si algun dels apartats no acaba en break, en executar la darrera instrucci,en lloc de saltar la resta dapartats, el que es fa s seguir executant les instruccionsde lapartat que ve immediatament desprs. Aix anir fent, apartat per apartat, finstrobar-ne algun que acabi en break. La figura 2.11 mostra aquest comportamenttan particular.

    Figura 2.11. Diagrama de flux de control duna sentncia switch

    2.5.2 Exemple simple: diferents opcions en un men

    La millor manera dentendre com es comporta la sentncia switch s veient unparell dexemples. Per comenar, es mostrar el cas ms senzill, en qu totsels apartats tenen una instrucci break al final i, per tant, s com tenir unaselecci mltiple en qu cada cas correspon directament a una condici claramentdiferenciada amb el seu propi bloc dinstruccions independent dels altres.

    Un s molt tpic de la sentncia switch s per generar de manera senzilla mensen qu lusuari pot triar entre diferents opcions. Segons lopci triada, sexecutendirectament les instruccions associades a cadascuna. Suposeu un programa enqu, a partir dos nombres enters, es demana quina operaci es vol fer entre aquests:sumar, restar, multiplicar o dividir.

    El programa hauria de fer el segent:

    1. Preguntar els dos nombres enters.

    2. Llegir-los.

    3. Mostrar un men amb les quatre opcions possibles, enumerades d1 a 4.

    4. Llegir lopci triada.

    break

    La paraula clau break s com dirtrenca, surt fora daquestasentncia switch.

  • Programaci bsica (ASX)Programaci (DAM) 38 Programaci estructurada

    5. Segons lopci:

    (a) Si s 1 se sumen els dos enters.

    (b) Si s 2 es resten.

    (c) Si s 3 es multipliquen.

    (d) Si s 4 es divideixen.

    (e) Si s cap altra cal informar que lopci s incorrecta.

    6. Finalment es mostra el resultat per pantalla.

    El codi per fer aix mitjanant la sentncia switch podria ser el segent.Compileu-lo, executeu-lo i observeu-ne el comportament.

    1 import java.util.Scanner;2 //Un programa que dna diferents opcions de clcul, usant la sentncia switch.3 public class Opcions {4 public static void main (String[] args) {5 Scanner lector = new Scanner(System.in);6 //PAS 1 i 27 System.out.print("Introdueix un valor enter: ");8 int primerValor = lector.nextInt();9 lector.nextLine();

    10 System.out.print("Introdueixne un altre: ");11 int segonValor = lector.nextInt();12 lector.nextLine();13 //PAS 3 i 414 System.out.println("Quina operaci vols fer? ");15 System.out.println("[1] Sumar");16 System.out.println("[2] Restar");17 System.out.println("[3] Multiplicar");18 System.out.println("[4] Dividir");19 System.out.print("Selecciona lopci [14]: ");20 int opcio = lector.nextInt();21 lector.nextLine();22 int resultat = 0;23 //PAS 524 switch(opcio) {25 //PAS I26 case 1:27 System.out.print("Has triat sumar...");28 resultat = primerValor + segonValor;29 break;30 //PAS II31 case 2:32 System.out.print("Has triat restar...");33 resultat = primerValor segonValor;34 break;35 //PAS III36 case 3:37 System.out.print("Has triat multiplicar...");38 resultat = primerValor * segonValor;39 break;40 //PAS IV41 case 4:42 System.out.print("Has triat dividir...");43 resultat = primerValor / segonValor;44 break;45 //PAS V46 default:47 System.out.println("Opci no prevista.");48 }49 //PAS 650 System.out.println("El resultat s " + resultat + ".");51 }52 }

  • Programaci bsica (ASX)Programaci (DAM) 39 Programaci estructurada

    La figura 2.12 mostra un esquema de les instruccions executades segons algunsvalors dexemple. En lloc dusar un diagrama de flux de control, susa directamentel codi com a referncia per fer la relacims aclaridora. Com es pot veure, lopcidefault s especialment til per controlar valors dentrada no vlids.

    Figura 2.12. Exemple de flux de control del programa dopcions de clcul

    2.5.3 Exemple amb propagaci dinstruccions: els dies dun mes

    s el moment de veure qu succeeix si falten instruccions break en algunsapartats. El primer que podeu provar s treure els break de lexemple anterior.Veureu qu passa. Cada cop que trieu una opci sexecutar aquella opci i totesles posteriors (ho podreu veure, ja que sanir mostrant per pantalla el missatgeper a cada operaci). Per tant, lnic resultat vlid ser el darrer i sempre estareudividint.

    Un altre exemple diferent bastant tpic s el de calcular quants dies t un mes. Agrans trets, el programa faria el segent:

    1. Preguntar el nmero de mes (un valor de tipus enter).

    2. Llegir-lo.

    3. Segons el valor del mes:

    (a) Si s 2 cal dir que el nombre de dies s 28 o 29.

    (b) Si s 4, 6, 9 o 11 cal dir que el nombre de dies s 30.

    (c) Si s 1, 3, 5, 7, 8, 10 o 12 cal dir que el nombre de dies s 31.

    (d) Si s cap altre, cal dir que que sha introdut un nmero de mesincorrecte.

    Ara b, ara es jugar amb la propagaci dinstruccions quan manca el break perestablir dins del codi conjunts de valors que donen el mateix resultat. En triar unvalor, sexecuten les instruccions del cas associat a aquell valor i, mentre no trobi

  • Programaci bsica (ASX)Programaci (DAM) 40 Programaci estructurada

    un break, continua executant la resta de casos consecutivament, lun darrere delaltre. Si un cas est buit, no fa res i salta directament al segent. Com es potveure a lexemple, no cal que els valors per a cada cas estiguin ordenats dacordamb cap ordre numric concret. Un cop ms, el cas default serveix per controlarvalors fora de rang. Comproveu que el programa fa el que se nespera en el vostreentorn de desenvolupament.

    1 import java.util.Scanner;2

    3 //A veure quants dies t un mes...4 public class DiesDelMes {5

    6 public static void main (String[] args) {7 Scanner lector = new Scanner(System.in);8

    9 //PAS 1 i 210 System.out.print("Quin nmero de mes vols analitzar [112]? ");11 int mes = lector.nextInt();12 lector.nextLine();13

    14 //PAS 315 System.out.print("Els dies daquest mes deuen ser...");16 switch(mes) {17 //PAS I18 case 2:19 System.out.println("28 o 29!");20 break;21 //PAS II22 case 4:23 case 6:24 case 9:25 case 11:26 System.out.println("30!");27 break;28 //PAS III29 case 1:30 case 3:31 case 5:32 case 7:33 case 8:34 case 10:35 case 12:36 System.out.println("31!");37 break;38 default:39 System.out.println("Aquest mes no existeix!");40 }41

    42 }43

    44 }

    La figura 2.13 mostra un parell dexemples de quin s el flux de control de lasentncia switch per a certs valors. Tingueu en compte que el programa comenapel valor que coincideix amb el resultat davaluar lexpressi i que, un cop all,va avanant de manera seqencial per tots els casos, hi hagi el que hi hagi, fins atrobar una sentncia break.

  • Programaci bsica (ASX)Programaci (DAM) 41 Programaci estructurada

    Figura 2.13. Exemple de flux de control per al programa dels dies del ms. Una sentnciaswitch amb casos sense break

    Finalment, cal dir que, com ja sha esmentat, no hi ha res que faci la sentnciaswitch que no pugui fer una selecci mltiple. Lelecci de switch se sol ferexclusivament per motius de claredat del codi. Compareu el codi anterior amb elsegent, equivalent. Tot seguit, comproveu que fa el mateix.

    1 import java.util.Scanner;2

    3 //A veure quants dies t un mes...4 public class DiesDelMesIf {5

    6 public static void main (String[] args) {7 Scanner lector = new Scanner(System.in);8

    9 System.out.print("Quin nmero de mes vols analitzar [112]? ");10 int mes = lector.nextInt();11 lector.nextLine();12

    13 System.out.print("Els dies daquest mes deuen ser...");14 if (mes == 2) {15 System.out.println("28 o 29!");16 } else if ((mes == 4)||(mes == 6)||(mes == 9)||(mes == 11)) {17 System.out.println("30!");18 } else if ((mes == 1)||(mes == 3)||(mes == 5)||(mes == 7)||(mes == 8)||(mes

    == 10)||(mes == 12)) {19 System.out.println("31!");20 } else {21 System.out.println("Aquest mes no existeix!");22 }23 }24

    25 }

    Decidir quin s ms prctic s decisi vostra. De totes maneres, no sol ser bonaidea tenir expressions tan llargues que se surtin del camp de visi en leditoremprat.

  • Programaci bsica (ASX)Programaci (DAM) 42 Programaci estructurada

    2.6 Control derrors en lentrada bsica mitjanant estructures deselecci

    Les estructures de selecci sn especialment tils com a mecanisme per controlarsi les dades que ha introdut un usuari sn correctes abans dusar-les dins delprograma. Un cop ja sabeu com funcionen, s un bon moment per ampliarles explicacions sobre lentrada bsica de dades per teclat, de manera que siguipossible controlar si el valor que sha introdut encaixa amb el tipus de dada esperatper a cada instrucci de lectura.

    Si es parteix que lextensi per llegir dades de teclat sha inicialitzat anteriormentcom sempre:

    1 Scanner lector = new Scanner(System.in);

    Abans de llegir qualsevol dada introduda pel teclat, s possible usar les instruc-cions de la taula 2.2 per establir si la dada que tot just sha escrit pel teclat sdun tipus concret o no. Quan susen, lusuari pot introduir dades pel teclat (elprograma satura) i savalua si el que ha escrit pertany a un tipus de dada o unaltre. Aquestes instruccions es consideren expressions booleanes que avaluen coma true si el tipus concorda i com a false si no s el cas.

    Un cop usada aquesta instrucci, noms es podran llegir les dades correctamentusant la instrucci lector.next... corresponent al mateix tipus si ha avaluatcom a true. Si sintenta desprs que hagi avaluat false, lerror dexecuci estgarantit.

    Taula 2.2. Instruccions per a la lectura de dades pel teclat

    Instrucci Tipus de dada controlada

    lector.hasNextByte() byte

    lector.hasNextShort() short

    lector.hasNextInt() int

    lector.hasNextLong() long

    lector.hasNextFloat() float

    lector.hasNextDouble() double

    lector.hasNextBoolean() boolean

    La instrucci associada a una cadena de text no existeix, ja que qualsevol dadaescrita pel teclat sempre es pot interpretar com a text. Per tant, la lectura mai nopot donar error.

    Per exemple, el programa pensat per endevinar un nombre es podria fer tal commostra el codi segent. Pareu atenci al comportament de les combinacionsdestructures de selecci. Fixeu-vos que hi ha tres camins disjunts possiblesfruit daquest fet: si la dada escrita no s un enter, si ho s per no sencertael nombre, i finalment, si ho s i s que sencerta. Compileu-lo i executeu-lo per

  • Programaci bsica (ASX)Programaci (DAM) 43 Programaci estructurada

    veure que, efectivament, ara es pot detectar que les dades introdudes no sn deltipus correcte.

    1 import java.util.Scanner;2 //Un programa en qu cal endevinar un nombre.3 public class EndevinaControlErrorsEntrada {4 //PAS 15 //El nombre per endevinar ser el 4.6 public static final int VALOR_SECRET = 4;7 public static void main (String[] args) {8 Scanner lector = new Scanner(System.in);9 System.out.println("Comencem el joc.");

    10 System.out.print("Endevina el valor enter, entre 0 i 10: ");11 boolean tipusCorrecte = lector.hasNextInt();12 if (tipusCorrecte) {13 //Sha escrit un enter correctament. Ja es pot llegir.14 int valorUsuari = lector.nextInt();15 lector.nextLine();16 if (VALOR_SECRET == valorUsuari) {17 System.out.println("Exacte! Era " + VALOR_SECRET + ".");18 } else {19 System.out.println("Thas equivocat!");20 }21 System.out.println("Hem acabat el joc.");22 } else {23 //No sha escrit un enter.24 System.out.println("El valor introdut no s un enter.");25 }26 }27 }

    Repte 4: apliqueu el mateix tipus de control sobre les dades de lentrada alexemple del clcul del descompte.

  • Programaci bsica (ASX)Programaci (DAM) 44 Programaci estructurada

    2.7 Solucions dels reptes proposats

    Repte 1:

    1 import java.util.Scanner;2 public class Penalitzacio {3 public static final float PENALITZACI = 8;4 //Es fa descompte per compres de 100 euros o ms.5 public static final float COMPRA_MIN = 30;6 public static void main (String[] args) {7 Scanner lector = new Scanner(System.in);8 System.out.print("Quin s el preu del producte en euros? ");9 float preu = lector.nextFloat();

    10 lector.nextLine();11 if (preu < COMPRA_MIN) {12 //PAS I13 float penalitzacioAplicada = preu * PENALITZACI / 100;14 preu = preu penalitzacioAplicada;15 }16 System.out.println("El preu final per pagar s de " + preu + " euros.");17 }18 }

    Repte 2:

    1 import java.util.Scanner;2 public class DosSecrets {3 //PAS 14 //El nombres per endevinar seran el 4 i el 7.5 public static final int VALOR_SECRET_UN = 4;6 public static final int ALTRE_VALOR_DOS = 7;7 public static void main (String[] args) {8 Scanner lector = new Scanner(System.in);9 //PAS 2 i 3

    10 System.out.println("Comencem el joc.");11 System.out.print("Endevina el valor enter, entre 0 i 10: ");12 int valorUsuari = lector.nextInt();13 lector.nextLine();14 //PAS 415 //Estructura de selecci doble.16 //O sendevina o es falla.17 if ((VALOR_SECRET_UN == valorUsuari)||(ALTRE_VALOR_DOS == valorUsuari)) {18 //PAS I19 //Si lexpressi avalua true, executa el bloc dins lif.20 System.out.println("Exacte! Era " + valorUsuari + ".");21 } else {22 //PAS II23 //Si lexpressi avalua false, executa el bloc dins lelse.24 System.out.println("Thas equivocat!");25 }26 System.out.println("Hem acabat el joc.");27 }28 }

  • Programaci bsica (ASX)Programaci (DAM) 45 Programaci estructurada

    Repte 3:

    1 import java.util.Scanner;2 public class AvaluacioControlValors {3 public static void main (String[] args) {4 Scanner lector = new Scanner(System.in);5 System.out.print("Quina nota has tret? ");6 float nota = lector.nextFloat();7 lector.nextLine();8 if ((nota >= 9)&&(nota = 6.5)&&(nota < 9)) {11 System.out.println("La teva nota final s Notable.");12 } else if ((nota >= 5)&&(nota < 6.5)) {13 System.out.println("La teva nota final s Aprovat.");14 } else if ((nota >= 0)&&(nota < 5)) {15 System.out.println("La teva nota final s Susps.");16 } else {17 System.out.println("El valor escrit no est entre 0 i 10!");18 }19 }20 }

    Repte 4:

    1 import java.util.Scanner;2 public class DescompteControlErrorsEntrada {3 //Es fa un descompte del 8%.4 public static final float DESCOMPTE = 8;5 //Es fa descompte per compres de 100 euros o ms.6 public static final float COMPRA_MIN = 100;7 //Valor del descompte mxim: 10 euros.8 public static final float DESC_MAXIM = 10;9 public static void main (String[] args) {

    10 Scanner lector = new Scanner(System.in);11 System.out.print("Quin s el preu del producte en euros? ");12 boolean tipusCorrecte = lector.hasNextFloat();13 //El tipus s correcte?14 if (tipusCorrecte) {15 float preu = lector.nextFloat();16 lector.nextLine();17 if (preu > 0) {18 if (preu >= COMPRA_MIN) {19 float descompteFet = preu * DESCOMPTE / 100;20 if (descompteFet > DESC_MAXIM) {21 descompteFet = DESC_MAXIM;22 }23 preu = preu descompteFet;24 }25 System.out.println("El preu final per pagar s de " + preu + " euros.")

    ;26 } else {27 System.out.println("Preu incorrecte. s negatiu.");28 }29 } else {30 //No sha escrit un enter.31 System.out.println("El valor introdut no s un enter.");32 }33 }34 }

  • Programaci bsica (ASX)Programaci (DAM) 47 Programaci estructurada

    3. Estructures de repetici

    Una estructura de repetici permetexecutar les mateixes instruccionsdiverses vegades. Imatge deWikimedia Commons

    Fins al moment, tots els programes que heu estudiat, ja fossin ms complexos oms senzills, tenien una caracterstica en com. El seu flux de control avanavainexorablement cap a la instrucci final del mtode principal sense possibilitatde recular. Sigui quin sigui el cam alternatiu per on shi ha arribat, un copuna instrucci ha estat executada, ja no es tornar a executar mai ms. Aquestfet contrasta amb el comportament que podeu observar en moltes activitats quefem diriament, com per exemple, quan posem sal al menjar que cuinem. Podemrepetir diverses vegades el procs de posar sal i tastar-ho fins que el gust sigui elque volem (i llavors ja deixem de posar sal i de tastar). Aquest procs es representacom un diagrama de flux de control a la figura 3.1.

    Figura 3.1. Una acci es repeteix mentre es compleixiuna condici

    Aix tamb passa en programes del vostre ordinador, en qu es poden repetiraccions sense problemes: obrir i desar diferents fitxers, connectar-se a diferentspgines web, etc. Aqu s on entra en joc el tipus segent destructura de control,tamb molt important dins el codi dun programa.

    Les estructures de repetici o iteratives permeten repetir una mateixaseqncia dinstruccions diverses vegades, mentre es compleixi una certacondici.

    En el seu aspecte general, tenen molt de semblant a una estructura de selecci.Hi ha una sentncia especial que cal escriure al codi font, unida a una condicilgica i un bloc de codi (en aquest cas, sempre en ser noms un). Per en aquestcas, mentre la condici lgica sigui certa, tota la seqncia dinstruccions es vaexecutant repetidament. En el moment en qu es deixa de complir la condici, esdeixa dexecutar el bloc de codi i ja se segueix amb la instrucci que hi ha desprsde la sentncia de lestructura de repetici.

  • Programaci bsica (ASX)Programaci (DAM) 48 Programaci estructurada

    Bucle infinit

    Un bucle infinit s un errorsemntic de programaci. Si nhi

    ha, el programa compilarperfectament de tota manera.

    Anomenem bucle o cicle el conjunt dinstruccions que sha de repetir uncert nombre de vegades, i anomenem iteraci cada execuci individual delbucle.

    Com passa amb les estructures de selecci, hi ha diferents tipus de sentncies,cadascuna amb les seves particularitats. Normalment, la diferncia principal estvinculada al moment en qu savalua la condici per veure si cal tornar a repetirel bloc dinstruccions o no. Al llarg daquest apartat, les anireu veient amb detall.

    3.1 Control de les estructures repetitives

    Com passava amb les estructures de selecci, les estructures de repetici no tenensentit si no s que la condici lgica depn dalguna variable que pugui veuremodificat el seu valor per a diferents execucions. En cas contrari, la condicisempre valdr el mateix per a qualsevol execuci possible i usar una estructurade control no ser gaire til. En aquest cas, si la condici sempre s false, maino sexecuta el bucle, per la qual cosa s codi intil. Per, per a les estructuresde repetici, si la condici sempre s true el problema s molt ms greu. Comque absolutament sempre que savalua si cal fer una nova iteraci, la condici escompleix, el bucle no es deixa mai de repetir. El programa mai no acabar!

    Un bucle infinit s una seqncia dinstruccions dins dun programaque itera indefinidament, normalment perqu sespera que sassoleixi unacondici que mai no sarriba a produir.

    Quan aix succeeix, el programa no es pot aturar de cap altra manera que no siguitancant-lo directament des del sistema operatiu (per exemple, tancant la finestraassociada o amb alguna seqncia especial descapament del teclat) o usant algunmecanisme de control de lexecuci del vostre programa que ofereixi lIDE usat.

    Tenint en compte el perill que un programa sacabi executant indefinidament,forosament dins de tot bucle hi ha dhaver instruccions que manipulin variablesel valor de les quals permeti controlar la repetici o el final del bucle. Aquestesvariables sanomenen variables de control.

    Garantir lassignaci correcta de valors de les variables de control duna estructurarepetitiva s extremadament important. Quan genereu un programa, s impres-cindible que el codi permeti que, en algun moment, la variable canvi de valor, demanera que la condici lgica es deixi de complir. Si aix no s aix, tindreu unbucle infinit.

    Normalment, les variables de control dins dun bucle es poden englobar dinsdalgun daquests tipus de comportament:

    Comptador: una variable de tipus enter que va augmentant o disminuint,

  • Programaci bsica (ASX)Programaci (DAM) 49 Programaci estructurada

    indicant de manera clara el nombre diteracions que caldr fer.

    Acumulador: una variable en qu es van acumulant directament els clculsque es volen fer, de manera que en assolir cert valor es considera que ja nocal fer ms iteracions. Si b sassemblen als comptadors, no sn ben b elmateix