Estructures condicionals
Ja sabeu que són les expressions booleanes. En aquesta lliçó aprendreu a utilitzar-les per a fer programes amb estructures condicionals.Una expressió booleana no és més que una condició, el resultat de la qual té dues possibilitats: la condició pot ser certa o falsa.
L’estructura de control if permet escollir un camí diferent si una condició és certa, o expressat d’una altra manera, si el resultat d’una expressió booleana que conté una condició és True.
El repte d’aquesta lliçó consistirà a fer els primers programes utilitzant les estructures condicionals. En el primer apartat aprendreu a utilitzar les estructures condicionals simples i en el segon les estructures condicionals niades.
Estructures condicionals simples
Com no pot ser de cap altra manera, s’aplicarà la metodologia apresa per a resoldre el primer programa condicional.
Pas 1: enunciat
El primer programa que fareu aplicant estructures condicionals serà un programa “porter de discoteca”. L’única dada d’entrada d’aquest programa serà l’edat, i el programa contestarà “Benvingut” o “ets menor d’edat”, segons el cas.
Pas 2: fer exemples a mà
Són molt simples. Heu d’utilitzar l’intèrpret interactiu i fer operacions del tipus:
>>> 12 >= 18 False >>> 18 >= 18 True
Aquests serien els casos per edat igual a 12, i per edat igual a 18. La resposta és l’esperada: si es té 12 anys és fals que es pugui entrar, i si se’n té 18, ja és cert que es pugui entrar.
Pas 3: joc de proves i especificacions d’entrada
El més habitual quan es parla d’edats és pensar en nombres enters. Es podria arribar a parlar de 15 anys i mig, però en el llenguatge parlat segur que mai es diu que algú té 20.25 anys quan la persona en qüestió té 20 anys i 3 mesos. Es podria debatre si acceptar o no l’edat de 0 anys, però és més raonable començar amb l’edat de 0 anys que amb 1 any.
De manera que les especificacions d’entrada seran: 1 nombre enter (edat) major o igual a 0.
El joc de proves el teniu recollit a la taula:
| Núm. execució | Entrada | Sortida |
|---|---|---|
| 1 | 16 | Ets menor d’edat |
| 2 | 18 | Benvingut |
| 3 | 87 | Benvingut |
| 4 | 0 | Ets menor d’edat |
És suficient el joc de proves? Quan heu fet els exemples a mà, heu observat que hi ha dos casos: ser benvingut o no. En el joc de proves heu inclòs un exemple de cada possibilitat, el cas límit en què canvia (el 18), i el cas límit en què comença (el zero). Es pot assegurar que s’han contemplat tots els casos possibles.
Passos 4 i 5: refinar
El refinament d’aquest programa també és senzill. Els refinaments successius no calen. Ja podeu crear un nou fitxer amb l’editor de text i copiar i omplir la capçalera amb les dades necessàries (entre elles la descripció del programa i les especificacions d’entrada).
El fitxer, en aquests moments, hauria d’estar així:
# Administració de Sistemes informàtics # IOC # # Autor: Antonia # Data: 23-08-2058 # # Versió: 23.2 # # Descripció: Determinació si és major d'edat # Especificacions d'entrada: 1 nombre enter major o igual a 0 # llegir l'edat edat = int(input()) # si és major d'edat # instruccions True #si no # instruccions False
Pas 6: codificar
Així quedarà el programa una vegada codificat:
# Administració de Sistemes informàtics
# IOC
#
# Autor: Antonia
# Data: 23-08-2058
#
# Versió: 23.2
#
# Descripció: Determinació si és major d'edat
# Especificacions d'entrada: 1 nombre enter major o igual a 0
# llegir l'edat
edat = int(input())
# si és major d'edat
if edat >= 18:
# instruccions True
print('Benvingut')
#si no
else:
# instruccions False
print( 'Ets menor d\'edat')
La figura mostra el codi com es mostra a l’editor, amb els números de línia i amb les paraules reservades mostrades amb un color que les identifica.
Aquestes són les novetats del programa:
Observeu que en la cadena de la línia 32 hi ha un símbol \: ets menor d’\edat . El símbol \ s’utilitza perquè no es tinguin en compte les propietats d’un altre símbol. En aquest cas, es fa servir per indicar que la ' que el segueix no vol dir final de cadena sinó que s’ha de llegir com un literal.
- En la línia 25 apareix una expressió booleana, que és el mateix que una condició.
- En la mateixa línia 25 apareix la paraula reservada
if. Introdueix una condició i una bifurcació en el camí. És a dir, si la condició és certa (si el resultat de l’expressió booleana que representa la condició ésTrue) es faran unes instruccions, i en cas contrari (else), se’n faran unes altres. - La mateixa línia on hi ha el
ifi la condició ha de finalitzar amb el caràcter:. - Les línies 26 i 27 només s’executaran en cas que la resposta de la condició de la línia 25 sigui
True. - En la línia 30 apareix una altra paraula reservada:
else. Significa “sinó”, i sempre ha d’anar precedida per alguna instrucció anterior amb elifi una condició. En elelseno s’avalua cap condició (s’ha avaluat en la línia delif), i també ha de finalitzar amb el caràcter :. - Les línies 31 i 32 només s’executaran si el resultat de l’expressió booleana ha estat
False.
El Python és un llenguatge que s’estructura mitjançant la indentació. Això vol dir que les instruccions que s’han d’executar amb l’ if són les que estan escrites en les línies posteriors, més endins. S’han d’escriure després d’un tabulador.
En el Python la posició de la instrucció respecte a la primera columna (la indentació) fa la mateixa funció que en altres llenguatges, com el C o el Java, fan els caràcters { i }: determinen els blocs.
Després de la condició i després de l’ else hi ha el símbol :.Defineix que el codi posterior s’ha d’indentar. Per a Python, un tabulador o un espai en blanc són el mateix. La recomanació és fer servir sempre el tabulador. Ara, cal escriure el programa i aconseguir executar-lo.
Pas 7: verificació
S’ha de verificar el joc de proves per assegurar que el programa funciona:
videoioc@debian-xtec:~/Documents/progamacio$ python3 porter_discoteca.py 16 Ets menor d'edat videoioc@debian-xtec:~/Documents/progamacio$ python3 porter_discoteca.py 18 Benvingut videoioc@debian-xtec:~/Documents/progamacio$ python3 porter_discoteca.py 87 Benvingut videoioc@debian-xtec:~/Documents/progamacio$ python3 porter_discoteca.py 0 Ets menor d'edat
Ja podeu assegurar que, si el joc de proves és correcte, el programa funciona adequadament.
Pas 8: debugar
Si el programa no s’executa o el joc de proves no s’acompleix, cal trobar l’error i resoldre’l. Això ho fareu amb l’ajuda dels refinaments i afegint impressions per pantalla, print entre el codi fins a localitzar la instrucció que no té el resultat que s’esperava. En aquest cas no ha calgut.
Jocs de proves en les diferents estructures condicionals simples
Hi ha dues estructures condicionals en què es pot presentar un condicional simple: el cas de l’ if / else (que acabeu de veure), i l’ if (sense else). Es presentarà un exemple per a cada cas i se’n farà un seguiment. Cal que editeu el fitxer d’exemple, l’executeu, comproveu que el joc de proves que es proporciona és correcte i en feu el seguiment en els casos proposats.
L’objectiu dels pròxims programes és determinar si un nombre és positiu, zero o negatiu, però amb variacions.Cada fragment correspon a un joc de proves (que s’ha escrit abans de fer el programa) que coincideix amb el resultat de l’execució. En aquest cas heu de fer a la inversa i escriure el joc de proves que s’adiu amb el programa mostrat.
Cal tenir en compte que cap programa està bé o malament, simplement són programes que responen a interessos diferents. El que determina que estigui bé o no és que el joc de proves coincideix amb les execucions.
Condicional if/else
L’estructura if / else correspon al si / sinó. És a dir, que si la condició és True s’executen unes instruccions i en cas que sigui False unes altres.
La instrucció posterior a cada if (la de sota) està indentada (és a dir, un tabulador més cap a la dreta). Totes les instruccions en el mateix nivell d’<indentació de sota del if son les que s’han d’executar si la resposta és True. I el mateix amb les que estan indentades després del else quan la resposta és False.
L’estructura if / else correspon al codi següent:
if condicio:
#Instruccions True
else:
#Instruccions False
#S'uneixen els dos camins
Partireu del següent codi exemple que implementa un if / else:
a = int(input()) if a >= 0: print(“positiu o zero”) else: print(“negatiu”) print(“Fi execució”)
Per a fer el joc de proves, cal que trobeu un exemple de cada camí i especificar què passa en el cas límit. Necessitareu un cas amb un nombre positiu, un altre amb un nombre negatiu i per últim, el cas del zero.
Especificacions d’entrada: 1 nombre enter qualsevol.
Joc de proves: detallat a taula
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 5 | positiu o zero Fi execució |
| 2 | 0 | positiu o zero Fi execució |
| 3 | -3 | negatiu Fi execució |
Què fa el processador en el moment que apareix una instrucció amb un condicional? En el seguiment per al codi que estem estudiant, veureu com actua. Hi ha un seguiment per a cada entrada del joc de proves.
La figura mostra el codi com del programa if/else amb els números de línia.
A la taula teniu el seguiment del programa quan l’entrada és el valor 5.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 5 | ||
| 15 | True | ||
| 16 | positiu o zero | ||
| 19 | Fi execució |
Us heu de fixar en el següent:
- En la línia 13 entra el valor 5, com a enter, i s’assigna a la variable
a. - La línia 14 està en blanc i no fa res. Podríeu escriure el número de la línia i deixar les accions en blanc, però millor no posar-la, ja que és transparent per al processador.
- En la línia 15 s’avalua el resultat d’una condició. En la taula del refinament heu d’afegir una columna per mostrar-lo. Encara que al llarg del programa hi hagi diverses condicions, es posen tots els resultats en una única columna per simplificar.
- Com que la condició és
True, “entrem” l’ifi s’executen les instruccions indentades a “sota”. Per això s’escriu el que passa en la línia 16. - No s’executen (i, per tant, NO estan en el seguiment) ni la línia del
elseni les instruccions que s’han de fer si entra a l’else, és a dir, si la condició ésFalse. - Una vegada s’han acabat les instruccions del condicional, les dues branques s’ajunten i es fa el mateix en tots els casos. Això se sap perquè en la línia 19 torna a haver-hi una instrucció que no està indentada.
Podeu comprovar que la sortida del seguiment és la mateixa que es produeix si executeu el programa i entreu el nombre 5.
A continuació fareu el seguiment per al cas en que el valor d’entrada és 0. Ho teniu recollit a la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 0 | ||
| 15 | True | ||
| 16 | positiu o zero | ||
| 19 | Fi execució |
La taula de seguiment per al nombre 0 és exactament igual que per al nombre 5. Com que el resultat de la condició és el mateix (True), el camí recorregut també.
En el cas de que el valor d’entrada sigui -3, el seguiment que tindríeu és el que us mostra la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | -3 | ||
| 15 | False | ||
| 17 | |||
| 18 | negatiu | ||
| 19 | Fi execució |
Aquest seguiment ja és substancialment diferent:
- El resultat de l’expressió booleana de la línia 15 és
False. - Això provoca que se salti la línia 16 i totes les posteriors fins a trobar el
else. - El processador entra a l’
else, i per això és necessari escriure la línia 17 en el seguiment, tot i que no es modifiqui cap variable. - S’executen les instruccions de l’
else(línia 18). - Finalment, s’ajunten les dues branques i se segueix l’execució en comú.
Condicional if (sense else)
Un if no sempre ha d’anar acompanyat d’un else. En aquest cas, si la condició és certa, s’efectuen unes instruccions que no es fan quan és falsa.
L’estructura if correspon al codi següent:
if condicio:
#Instruccions True
#S'uneixen els dos camins
El següent codi és un exemple d’ if (sense else).
a = int(input()) if a >= 0: print(“positiu”) print(“Fi execució”)
Especificacions d’entrada: 1 nombre enter qualsevol
Un joc de proves corresponent a aquest programa és que podeu trobar a la taula.
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 5 | positiu Fi execució |
| 2 | 0 | positiu Fi execució |
| 3 | -3 | Fi execució |
Per fer els seguiments necessitem el codi amb el número de línia, ho teniu a la figura.
Si a l’entrada (l’input de la línia 13), introduïm el valor 5, la taula de seguiment és la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 5 | ||
| 15 | True | ||
| 16 | positiu | ||
| 18 | Fi execució |
Fent el seguiment pas a pas, podeu interpretar què farà el processador:
- En la línia 13 entra el valor 5.
- La condició de la línia 15 és certa, per tan s’han d’executar les instruccions del
True. - En la línia 16 es mostra una cadena per pantalla.
- El flux del programa torna al camí comú i s’executa la línia 18.
La taula de seguiment per un valor d’entrada 0 seria gairebé la mateixa (exceptuant el valor de la a en la línia 13 que valdria 0). Vegeu la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 5 | ||
| 15 | True | ||
| 16 | positiu | ||
| 18 | Fi execució |
Si a l’entrada (l’input de la línia 13), introduïm el valor -3, la taula de seguiment és la que detalla la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | -3 | ||
| 15 | False | ||
| 18 | Fi execució |
Si analitzeu pas per pas el que fa el processador, trobareu els següents casos:
Només es poden afegir instruccions extra en la banda del True. Si necessiteu afegir-les en el cas que una condició sigui falsa, serà necessari modificar el resultat de la condició (amb un not davant) per poder-les executar.
- En la línia 13 es llegeix el valor 0, que s’assigna a la
a. - En la línia 15 s’avalua la condició. Com que és falsa, no hem d’entrar a les instruccions indentades (i no han d’aparèixer els números de les línies en la taula de seguiment).
- En la línia 18 s’ajunten les dues branques i se segueix amb les instruccions comunes.
Fixeu-vos que en aquest cas no s’ha executat cap instrucció que no s’hagi fet en el camí del True. Simplement, si la condició és certa s’executen unes instruccions extra.
Estructures condicionals niades
El primer programa que fareu amb una estructura condicional niada té el següent enunciat:
“Feu un programa que llegeixi un enter i digui si és positiu, si és el nombre zero o si és negatiu. En tots els casos, abans de finalitzar sortirà la frase: Fi execució.”
Les especificacions d’entrada i el joc de proves seran els següents:
Especificacions d’entrada: un nombre enter qualsevol. Joc de proves: vegeu la taula
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 5 | positiu Fi execució |
| 2 | 0 | zero Fi execució |
| 3 | -3 | negatiu Fi execució |
Podeu pensar que d’entrada, s’ha de seguir la mateixa estructura que el primer programa if/else. En el moment en què hem aïllat el cas que el nombre és positiu o zero, cal que feu una segona pregunta. En aquest exemple és difícil escriure el refinament, ja que és quasi el mateix que el mateix codi. Compareu-lo amb aquest altre (el primer exemple if/else):
La figura mostra el codi del programa if/else.
El codi que ho implementa és:
a = int(input()) if a > 0 : print(“positiu o zero”) else: print(“negatiu”) print(“Fi execució”)
Si en la línia 16, en comptes de mostrar directament una frase, torneu a fer una pregunta, obtindreu una nova bifurcació segons si és cert (el nombre serà positiu), o fals (en aquest cas serà 0, ja que en aquesta branca només s’hi ha entrat si s’era major o igual a zero). El programa ja codificat tindrà l’aspecte que podeu veure a la figura.
El codi que ho implementa és:
a = int(input())
if a >= 0 :
if a == 0 :
print(“zero”)
else:
print(“positiu”)
else:
print(“negatiu”)
print(“Fi execució”)
La diferència és que en el cas que la condició sigui True, la instrucció que segueix en el primer programa és un nou condicional. Aquest és un exemple de condicionals niats.
Es diu que és una estructura condicionals niada quan les instruccions que s’han d’executar en alguna de les branques d’una estructura condicional contenen més condicionals.
Condicional niat bàsic
A continuació seguirem l’exemple d’ if niat bàsic
a = int(input()) if a >= 0: if a == 0: print(“zero”) else: print(“positiu”) else: print(“negatiu”) print(“Fi execució”)
La figura mostra el codi del programa if niat.
Aquest és el seguiment del programa dels if niats en cada cas del joc de proves.
La taula recull el seguiment quan el valor d’entrada és 5.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 14 | 5 | ||
| 16 | True | ||
| 17 | False | ||
| 19 | |||
| 20 | positiu | ||
| 24 | Fi execució |
Fixeu-vos què fa les següents línies:
- En la 14 llegeix el valor 5.
- En la 16 avalua la condició. El resultat és
Truei entra a la 17. - En la línia 17 ha d’avaluar una nova condició. En aquest cas, el valor 5 dona el resultat
False. El flux ha d’anar a buscar la partículaelse, i per això salta fins a la línia 19 (va alelseque està indentat amb elifde la línia 17). - Executa la instrucció de la línia 20 (les corresponents a l’
else). - Quan surt, a la línia 21, troba l’
elsecorresponent a l’ifde la línia 16. Com que la condició havia donatTrue, s’ha de saltar les línies fins a trobar el camí comú, en la línia 24.
Ara veureu quin seria el seguiment amb el valor d’entrada 0. Ho teniu recollit a la taula taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 14 | 0 | ||
| 16 | True | ||
| 17 | True | ||
| 18 | zero | ||
| 24 | Fi execució |
Si feu el seguiment del programa, trobareu que el processador farà el següent:
- En la línia 14 es llegeix el valor de la
a. - La condició de la línia 16 (la del primer
if) és certa, de manera que segueix cap avall. - A la línia 17 troba una nova condició, que torna a ser certa: ha de seguir “baixant”.
- Entra a la línia 18 i executa la instrucció.
- S’ha de saltar el
elsede la línia 17, corresponent alifde la línia 17 (el que es troba en la mateixa indentació), ja que la resposta eraTrue. - S’ha de saltar també l’
elsede la línia 21 (corresponent alifde la línia 16). - Torna a la branca comuna a partir de la línia 24. La instrucció està indentada a la primera columna, el que significa que s’executarà sempre.
Finalment, quen el valor d’entrada és -3, tindreu el seguiment recollit a la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 14 | -3 | ||
| 16 | False | ||
| 21 | |||
| 22 | negatiu | ||
| 24 | Fi execució |
Si analitzeu pas a pas què fa el processador en executar el programa, trobareu el següent:
- En la línia 14 s’assigna a la variable
a. - El resultat d’avaluar la condició a la línia 16 és
False. - Ha de saltar les instruccions del
Truei anar a buscar elelse. - Passa per la línia 21 perquè “torna a entrar” en el
else. Per aquest motiu s’ha d’escriure la línia 21 - En la línia 22 executa les instruccions del
else. - Torna a la trajectòria comuna en la línia 24.
Condicional elif
En l’exemple anterior sembla més lògic enfocar el problema pensant en el fet que cal escollir una alternativa entre tres possibles (positiu, zero o negatiu). En comptes d’optar primer entre dues opcions, i després distingir entre si és positiu o zero. La partícula elif us ajudarà a guanyar en llegibilitat en aquests casos.
Quan heu de fer diverses comparacions que són de la mateixa importància, el programa queda més clar i més llegible utilitzant l’estructura elif que diferents if niats. El resultat final és el mateix.
La instrucció elif s’utilitza quan hem d’escollir una d’entre tres o més alternatives. La primera condició s’avalua amb la paraula if i les posteriors amb elif. Al final, i segons el cas, pot haver-hi o no un else.
if condicio1:
#Instruccions 1
elif condicio2:
#Instruccions 2
# es poden afegir la quantitat d'instruccions elif que es necessitin
# es pot afegir o no la clàusula else:
#S'uneixen els camins
Amb exemples concrets s’entén millor.
El resultat de l’exemple dels if niats i l’ elif d’aquest exemple és exactament el mateix. Per llegibilitat, es considera millor utilitzar l’ elif, ja que es reforça el fet que les 3 possibilitats tenen el mateix pes.
Exemple de condicional if / elif/ else
El següent codi implementa l’estructura que estudiarem:
a = int(input()) if a > 0 : print(“positiu”) elif a == 0: print(“zero”) else: print(“negatiu”) print(“Final execució”)
El joc de proves és exactament el mateix que en el programa anterior, vegeu lataula.
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 5 | positiu Final execució |
| 2 | 0 | zero Final execució |
| 3 | -3 | negatiu Final execució |
La figura mostra el codi del programa que implementa l’estructura if/elif/else.
Vegem ara com es fan els seguiments en aquest cas. El seguiment del programa quan l’entrada és el valor 5, ho teniu recollit a la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 5 | ||
| 15 | True | ||
| 16 | positiu | ||
| 22 | Final execució |
El recorregut que fa el processador (el que anomenem flux del programa) és el següent:
- En la línia 13 es llegeix el valor 5, que s’assigna a la
a. - En la línia 15 s’avalua la condició del
if. En aquest cas ésTrue, de manera que s’entra i s’executen les instruccions posteriors. - S’executa la línia 16.
- Quan ha acabat, salta totes les altres instruccions relatives al condicional i retorna al “camí comú”.
- La primera instrucció després del condicional és la línia 22. S’executa i s’acaba el programa.
Quan el valor d’entrada és 0, el seguiment del programa serà el següent, vegeu la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | 0 | ||
| 15 | False | ||
| 17 | True | ||
| 18 | zero | ||
| 22 | Final execució |
Si analitzeu pas a pas que fa el processador quan executa el programa i el valor d’entrada és 0, trobareu el següent:
- Entra a la línia 13.
- La primera condició, corresponent al
ifde la línia 15, ésFalse. - Se salta les instruccions del
Truei va a buscar la següent condició delelif, a la línia 17. En aquest cas el resultat ésTruei entra a les instruccions de sota. - Executa la instrucció de la línia 18.
- Se salta els següents casos del condicional (tant l’else com si hi hagués més condicions amb
elif). - Torna a la branca comuna a partir de la línia 22.
Finalment, si el valor entrat és -3, el seguiment del programa seria el que podeu observar a la taula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 13 | -3 | ||
| 15 | False | ||
| 17 | False | ||
| 19 | |||
| 20 | negatiu | ||
| 22 | Final execució |
En aquest cas, el programa farà el següent:
- En la línia 13 s’assigna el -3 a la variable
a. - El resultat de l’avaluació de la condició del
ifen la línia 15 ésFalse. Ha de saltar a la següent branca delelif. - En la línia 17, avalua la condició del
elif, amb resultatFalse. Ha de saltar a la següent branca. - En la línia 19 troba el
else, que indica que ha d’entrar. - Executa la instrucció de la línia 20
- En la línia 22 torna al camí comú.
En un condicional del tipus if/elif/else el flux del programa entra en la primera condició que sigui True, executa les instruccions corresponents i “salta” la resta de l’estructura condicional. Si en cap de les condicions es dona el resultat True, entra a la clàusula else (que mai porta condició).
Condicional if/elif
A continuació estudiarem un exemple de if/elif (sense else):
a = int(input()) if a >= 0: print(“positiu”) elif a == 0: print(“zero”) print(“Final execució”)
Especificacions d’entrada: 1 nombre enter qualsevol. La taula de seguiment la teniu recollida a la taula.
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 5 | positiu Final execució |
| 2 | 0 | zero Final execució |
| 3 | -3 | Final execució |
En aquest cas, farem el seguiment només per al valor -3. Els altres són similars a l’exemple anterior. La figura mostra el codi del programa que implementa l’estructura if/elif.
El seguiment per al -3, ho teniu recollit a lataula.
| Línia | a | Condició | Sortida |
|---|---|---|---|
| 15 | -3 | ||
| 17 | False | ||
| 19 | False | ||
| 22 | Final execució |
Així doncs, el programa farà el següent:
- En la línia 15 s’assigna el -3 a la variable
a. - El resultat de l’avaluació de la condició del
ifen la línia 17 ésFalse. Ha de saltar a la següent branca delelif. - En la línia 19, avalua la condició del
elif, amb resultatFalse. Ha de buscar la següent branca. - S’acaba el condicional i no ha entrat en cap branca, de manera que no ha executat cap instrucció. En la línia 22 torna al camí comú.
En un condicional del tipus if/elif (sense else), el flux del programa entra en la primera condició que sigui True, executa les instruccions corresponents i “salta” la resta de l’estructura condicional. Si en cap de les condicions es dona el resultat True, no s’executa cap instrucció i es torna al camí comú.
Condicionals independents
Per acabar, cal estudiar un últim cas. Es pot donar la situació en què s’utilitzin diversos condicionals sense que estiguin niuats, sinó un darrere l’altre.
S’han d’utilitzar estructures condicionals independents quan les condicions no estan lligades entre si. És a dir, quan el fet que se n’acompleixi una no implica que no es puguin acomplir les altres.
Suposem que hem de fer un fragment de programa en el qual entrin dos nombres enters qualsevol, a i b. El programa haurà d’agafar el valor absolut dels dos nombres d’entrada i, en el cas que cap dels dos sigui zero, mostrar els valors. Si alguna de les entrades és zero, el programa dirà “Hi ha zeros”. Aquest programa podria servir, per exemple, per comprovar nombres abans de fer una divisió.
A la taula teniu recollit el seguiment del programa.
| Execució | Entrada | Sortida |
|---|---|---|
| 1 | 2,3 | 2,3 |
| 2 | -2,3 | 2,3 |
| 3 | 2,-3 | 2,3 |
| 4 | -2,-3 | 2,3 |
| 5 | 2,0 | Hi ha zeros |
| 6 | 0,-3 | Hi ha zeros |
| 7 | 0,0 | Hi ha zeros |
Que la primera dada sigui positiva o no, no té res a veure amb el fet que ho sigui la segona. D’aquí es dedueix que hauran de ser dues condicions independents. El codi del programa podria ser aquest:
a = int(input())
b = int(input())
if a < 0:
a = -a
if b < 0:
b = -b
if a == 0 or b == 0:
print('Hi ha zeros')
else:
print(a, b)
L’estructura consta de 3 condicionals simples i independents. Els dos primers són if i el tercer és un if/else. Són els tres independents i no es pot crear cap estructura niuada.
Aspectes fonamentals d'estructures condicionals
Una estructura condicional és simple quan té una única condició. Es parla d’estructures condicionals niades quan en una branca d’un condicional apareix una nova condició (que porta a una nova bifurcació del flux).
Un condicional és una bifurcació en l’execució del codi. Quan hi ha un if, vol dir que segons el resultat de la condició es faran unes instruccions diferents, abans de tornar a reunir el flux i continuar amb el camí comú.
Podem utilitzar, segons les nostres necessitats, les següents estructures:
- Sentència
if
if condicio: instrucions si la condició és True
- Sentència
if/else
if condicio: instrucions si la condició és True else: instruccions si la condició és False
La partícula else mai va acompanyada d’una condició.
- Sentència
elif
if condicio1: instrucions si la condició1 és True elif condicio2: instruccions si la condició2 és True #Podem utilitzar els elif que considerem necessaris else: #Pot no ser-hi instruccions si totes les condicions anteriors son false
Una sentència elif sempre té un if que avalua la primera condició. Les següents condicions van precedides de la partícula elif. En últim lloc, pot existir o no la partícula else (segons si volem recollir els casos restants o no). La partícula else mai va acompanyada d’una condició.
- Altres estructures condicionals niades. No sempre que hi hagi una estructura condicional niada es pot resumir utilitzant l’estructura
elif. Hi haurà programes en què aniran apareixent branques sense capelif. - Condicionals independents.En realitat no és una estructura diferent, sinó que és la unió de diverses de les estructures anteriors.S’ha de vigilar perquè de vegades es confon una estructura condicional niada amb dos o més estructures condicionals independents. El resultat no és el mateix.









