Capítol 7

Condicionals

En aquest capítol ensenyem a en Karel a prendre decisions: fer una cosa només si es compleix una condició que li imposem, i una altra cosa diferent si no es compleix.

En Karel ha de decidir

Imagina que el món pot tenir una perla en una casella, o bé no tenir-ne. I que no podem saber-ho, a priori. Si en Karel sempre fa grab() i resulta que no hi ha perla, el programa s'atura amb un error. Necessitem una manera de dir-li: «si hi ha una perla, agafa-la; si no n'hi ha, no facis res».

Això ho aconseguirem amb una instrucció que s'anomena if.

És cert o és fals?

if comprova una condició i executa el bloc indentat de sota només si la condició és certa. Si la condició és falsa, el bloc se salta i en Karel continua amb la línia següent.

if pearl_here():
    grab()

En Karel avança si pot

En l'exemple següent, en Karel intenta avançar cinc vegades. Però hi ha una roca que li bloca el pas. Sense cap comprovació, en Karel xocaria i el programa donaria un error. Gràcies a l'if, en Karel comprova primer si té la via lliure: si és així, avança; si no, simplement no fa res i el for continua amb la iteració següent.

Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:

La instrucció for intenta avançar cinc vegades, però la condició if front_is_clear() actua com un guardià: si hi ha un obstacle davant, el bloc s'ignora i en Karel es queda quiet aquella iteració. El codi no dona cap error gràcies a la comprovació prèvia.

I si no es compleix la condició, fes… una altra cosa

De vegades volem que en Karel faci una acció quan la condició és certa, però que faci una cosa diferent si la condició és falsa. Per això tenim la instrucció anomenada else.

if front_is_clear():
    move()
else:
    turn_left()

En Karel comprova si té la via lliure davant seu. Si això es compleix, avança. Si no es compleix (per exemple, hi ha una roca o bé hi ha paret), llavors gira a l'esquerra.

Regla d'or: el bloc de l'if i el bloc de l'else mai s'executen tots dos alhora. O s'executa l'un, o s'executa l'altre. I sempre n'hi haurà un d'ells que serà el que s'executarà.

En Karel navega al voltant d'un obstacle

En Karel es mou per una graella en la qual hi ha una roca que li bloca el pas. A cada pas del for, comprova si pot avançar: si pot, avança; si no pot, gira a l'esquerra i busca un camí alternatiu:

Atenció: en aquest exemple no pots modificar el codi. Prem ▶ Executa i observa com funciona:

En Karel avança dues caselles, perquè la condició front_is_clear és certa. Llavors, com que troba una roca, la condició és falsa, i per tant salta al pas else, és a dir, gira en sentit antihorari. Tot seguit, amb les iteracions que queden, avança perquè la condició front_is_clear és certa. El programa no dona error perquè en Karel no ha xocat contra la roca: la instrucció else gestiona el cas inesperat de manera elegant.

Resum

Aquestes són totes les condicions que existeixen en el món d'en Karel:

  • pearl_here() — hi ha una perla a la casella actual?
  • front_is_clear() — la casella del davant és lliure?
  • front_is_blocked() — la casella del davant té un obstacle?
  • bag_is_empty() — la motxilla no conté cap perla?
  • bag_is_full() — la motxilla conté, com a mínim, una perla?

Exercici

El món d'en Karel conté una fila de cinc caselles: algunes tenen una perla i d'altres no. En Karel ha de recollir totes les perles que trobi, siguin on siguin. Escriu el codi perquè funcioni independentment de quines caselles tinguin perla.

Pista: usa un for i in range(5):. Dins del for, avança primer i llavors comprova amb if pearl_here(): si has de recollir la perla.