Type to search…

Algoritme

Un algoritme és un conjunt de sentències que resolen una tasca.

Introducció

Per podre resoldre una tasca, s’ha d’executar un conjunt instructions de manera:

  • Sequencial. Una a continuació de l’altre
  • Condicional. Si és compleix o no una condició.
  • Iterativa. Diverses vegades el mateix conjunt d’instruccions mentre es compleixi una condició.

Pots veure que un algoritme està format per condicions que determinen quines instruccions s’executen i quantes vegades s’executen.

A Computació vas coneixer els tipus int, float i string.

Ara toca presentar el tipus bool.

Obre un terminal tal com s’explica a de Introducció.

Inicia l’intèrpret de Python en mode interactiu:

shell
uv run python

Condició

Una condició consisteix en una comparació dos valors (o dues variables).

El resultat d’aplicar una condició a un cas concret és un valor de tipus bool que indica si la condició es compleix o no es compleix.

Per representar el resultat d’una condició utilizes una variable de tipus bool perquè en el món de Python una condició es compleix o no es compleix.

El tipus bool només té dos valors: True i False.

python
>>> type(True)
<class 'bool'>
>>> type(False)
<class 'bool'>

Una variable pot tenir un valor de tipus bool.

python
>>> a = True
>>> a
True

==

Pots comparar sí dos valors són iguals amb l’operador ==.

python
>>> 100 == 100
True
python
>>> 50 == 100
False
python
>>> "hola" == "hola"
True
Note

En matemàtiques fas servir = per comparar números o definir equacions, però en Python = es fa servir per assignar valors a les variables.

És un error bastant comú tal com pots provar a continuació:

python
>>> 3 = 3
File "stdin", line 1
3 = 3
^
SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?

Python ja et diu que: "Maybe you meant '==' instead of '='?"

Task

Primer pensa 😺, i després verifica quin és el resultat de les condicions que es mostren a continuació:

python
200 == 200
200 == 100
"rosa" == "rossa"
"flor" == "flor"
2 == 2.0
2 == 2.1
"3" == 3
"hola" == "hello"
"Hola" == "hola"
Show solution
python
200 == 200         # True
200 == 100         # False
"rosa" == "rossa"  # False
"flor" == "flor"   # True
2 == 2.0           # True
2 == 2.1           # False
"3" == 3           # False
"hola" == "hello"  # False
"Hola" == "hola"   # False

Pots veure que per Python una majúscula i una minúscula són lletres diferents.

Per tant "A" no és igual a "a".

!=

Pots comparar sí dos valors no són iguals amb l’operador !=.

python
>>> 2.0 != 2.1
True
>>> 2.0 != 2.0
False

Pots veure que el resultat sempre és el contrari de l’operador ==.

On l’operador == diu True, l’operador != diu False.

Task

És molt important que llegeixis el codi amb el teu llenguatge natural:

python
3 == 3              # 3 és igual a 3? Si!
3 != 3              # 3 no és igual a 3? No!
"hola" != "hola"    #
2 != 2.0            #
"hola" != "hello"   #

>

L’operador > serveix per comparar si el número de l’esquerra és major que el de la dreta

python
>>> 50 > 40
True
Task

Quin és el resultat de les condicions que es mostren a continuació?

python
300 > 100
300 > 300
100 > 300
200 > 200.0
25.2 > 25.1
"hello" > "bye"
"bye" > "hello"
Show solution
python
300 > 100        # True
300 > 300        # False
100 > 300        # False
200 > 200.0      # False
25.2 > 25.1      # True
"hello" > "bye"  # True
"bye" > "hello"  # False

PENDENT

python
x > y      # x és major que y
x < y      # x és menor que y
x >= y     # x és major o igual que y
x <= y     # x és menor o igual que y

Un altre error és enlloc d’escriure >= o <=, escriure => o =<:

python
>>> 3 => 3
  File "<stdin>", line 1
    3 => 3
    ^
SyntaxError: cannot assign to literal

Execució sequencial

Crea un projecte amb uv init:

ps
uv init algo

Instal·la PyCharm.

Obre el projecte amb pycharm:

ps
pycharm algo

Si recordes de Computació, per defecte l’intèrpret de Python executava totes les sentències d’un script.

A continuació modifica el codi de main.py (borra el que hi ha).

Per exemple, tens la variable name:

python
name = "Elena"

A continuació escriu una condició que el name és igual a "Laura".

python
name = "Elena"
name == "Laura"

I saluda a Laura amb una 🦋 si name és igual a "Laura":

python
name = "Elena"
name == "Laura"
print(f"Hola {name}! 🦋")
print("👻")

Executa el codi:

El resultat és:

ps
Hola Elena! 🦋
👻

Sort que el missatge no era f"Hola {name}! ❤️❤️❤️" 😅

En aquest codi, hi ha una condició, però cap element que avalui la condició i executi diferents sentències en funció de la condició.

Per tant, només té un únic flux d’execució.

Execució condicional

Una execució condicional només s’executa si es compleix una condició …

Per tant, en una execució condicional l’intèrpret de Python no executa totes les sentències.

if

Una expressió condicional comença amb la paraula if seguit de la condició i finalitza amb ::

python
if <condition> :

A continuació de la sentència condicional hi ha un bloc de codi que només s’executarà si la condició és True.

python
name = "Elena"
if name == "Laura":
    print(f"Hola {name}! 🦋")
print("👻")

L’intèrpret de Python reconeix les sentències que formen part d’aquest bloc perquè estan sagnades amb el mateix nombre d’espais en blanc.

Task

Quines sentències formen part del bloc que s’executarà si name és igual a "Laura"?

Show solution
python
print(f"Hola {name}! 🦋")

Tal com està el codi, s’executaran aquestes sentències?

Show solution

Executes el codi … i no!

ps
👻

Ara l’script té dos fluxos d’execució possibles en funció del valor de la variable name:

Una sentència if sempre crea dos fluxos possibles d’execució.

Per qué possibles? Per exemple, en aquest codi sempre s’executarà el mateix flux d’execució perquè el valor de la variable name és fix.

Per tal que aquest script tingui utilitat el valor de la variable name ha de ser indeterminat.

python
name = input("Con et dius? ")
if name == "Laura":
    print("Hola Laura! 🦋")
print("👻")

Ara ja pots executar el codi:

Task

A continuació tens un diagrama de flux d’un algoritme que permet comprar un iPhone per un preu de 600 € (o més 👻):

Escriu el codi Python corresponent:

Show solution
python
money = int(input("Euros: "))
iphone = 600
if money >= iphone:
    print("You have a new iPhone!")
print("Bye!")

else

Amb la sentència condicional if creas un flux d’execució de sentències que s’executaran si la condició és True.

Però si la condició és False, i vols executar un conjunt de sentències si la condició és False, has d’utilitzar l’expressió else com pots veure a continuació.

Modifica el codi de main.py:

python
donation = int(input("Donatiu? "))
if donation > 5:
    print("Generós 😀")
else:
    print("Garrepa 🤨")
print("🦋")

Ara els dos fluxos d’execució executen codi específic a cada condició:

Task

Abans has escrit un script que permet comprar un iPhone per un preu de 600 € (o més 👻).

Modifica l’script de tal manera que informi a l’usuari del preu que ha de pagar si no ofereix prou diners.

Show solution
python
money = int(input("Euros: "))
iphone = 600
if money >= iphone:
    print("You have a new iPhone!")
else:
    print(f"iPhone cost {iphone} euros!")
print("Bye!")

Ara si volem comprar l’iPhone per menys diners del que costa ens avisa que no pot ser perquè l’iPhone val 600 €.

shell
$ uv run main.py
Euros: 34
iPhone cost 600 euros!
Bye!

Imbricació

Mitjançant una estructura if-else pots crear un o dos blocs de codi imbricats en el bloc de codi principal.

I aquests blocs al seu torn també poden tenir blocs de codi imbricats mitjançant estructures if-else dins d’ells.

En la tasca anterior vas crear un script que permet compra un iPhone.

Però aquest script no torna el canvi, i això al comprador no li deu fer gens de gràcia 🤨.

Pots modificar el codi de main.py per tal que torni el canvi:

python
money = int(input("Euros: "))
iphone = 600

if money >= iphone:
    print("You have a new iPhone!")
    if money > iphone:
        print(f"Your change is {money - iphone} euros")
    print("Great buy!")
else:
    print(f"The iPhone costs {iphone} euros!")

print("Bye!")

Si ara compres un iPhone per mes de 600 euros, l’script torna el canvi:

shell
$ uv run shop.py
Euros: 800
You have a new iPhone!
Your change is 200 euros
Great buy!
Bye!

Blocs de codi

Python pot distingir els diferents blocs en què està estructurat l’script perquè totes les sentències d’un mateix bloc estan sagnades amb el mateix nombre d’espais en blanc:

Pots veure que hi ha quatre blocs d’execució, un de principal i els altres imbricats dins del principal o dins d’un altre.

Això s’anomena programació estructurada:

  • Un programa és una estructura de blocs uns dins dels altres, que s’executen de manera condicional.

  • Cada bloc és un conjunt de sentències que s’executa una després de l’altre.

Fluxes d’execució

Cada expressió if introdueix un nou flux d’execució!

Com que l’script té dos expression if, el programa té 3 fluxos d’execució possibles.

A continuació tens el diagrama de flux:

Execució iterativa

En moltes ocasions, ens interessa executar una mateixa sentència moltes vegades mentre es compleixi una condició.

L’expressió while repeteix un bloc de codi sempre que una condició es compleix.

És com dir-li a Python: “Repeteix això mentre alguna cosa sigui veritat”.

python
while <condició>:
    # codi a repetir

Vegem-ho amb un exemple senzill: per exemple, mostrar els números de l’1 al 5.

python
i = 1
while i <= 5:
    print(f"El número és {i}")
    i += 1
print("Adeu!")
python
El número és: 1
El número és: 2
El número és: 3
El número és: 4
El número és: 5
Adeu!

Igual que passa amb l’expressió if, l’expressió while introdueix un flux alternatiu.

La diferència és que aquest nou flux genera un bucle que finalitza quan la condició ja no és compleix.

A continuació tens el diagrama de flux corresponent.

A continuació tens un programa que demana a l’usuari números fins que introdueixi un 0.

python
result = 0
number = None

print("Anem a sumar números!")
while number != 0:
    number = int(input())
    result += number
    print(f"{result} + ", end="")

A continuació tens un exemple d’execució de l’script:

Anem a sumar números!
45
45 + 56
101 + 88
189 + 0
189 +
Task

Crea un script guess.py que ha d’endevinar un número entre 1 i 100.

python
import random
number = random.randint(1, 100)
guess = None

print("Guess a number: ", end="")
while ...
Show solution
python
import random

number = random.randint(1, 100)
guess = None

print("Guess a number: ", end="")
while number != guess:
    guess = int(input())
    if guess < number:
        print("Too low! ", end="")
    elif guess > number:
        print("Too high! ", end="")
    else:
        print("Just right! ", end="")

Condicions complexes

Una condició complexa està formada per la unió de condicions simples mitjançant operadors lògics.

Obre una sessió interactiva amb l’intèrpret de Python:

ps
uv run python

and

L’operador and compara dos bool i torna True només si els dos valors són True.

python
>>> True and True
True
>>> True and False
False

Completa la taula de la veritat:

a b a and b
TrueTrueTrue
TrueFalseFalse
FalseTrue
FalseFalse

Per exemple, tens un script que només permet treballar a aquelles persones majors de 15 anys i menors de 68.

Si només utilitzes condicions simples has d’escriure el programa amb if imbricats:

python
age = int(input("Age? "))
if age > 15:
    if age < 68:
        print("Pots treballar!")
    else:
        print("No pots treballar")
else:
    print("No pots treballar")

La condició “majors de 15 anys i menors de 68” es pot escriure literalment en Python:

python
>>> age = 30
>>> age > 15 and age < 68
True

Es tracta d’una condició complexa formada per dos condicions simples:

python
>>> age = 30
>>> age > 15
True
>>> age < 68
True
>>> True and True
True

Per tant, pots reescriure l’script amb una condició complexa:

python
age = int(input("Age? "))
if age > 15 and age < 68:
    print("Pots treballar!")
else:
    print("No pots treballar")

Segur que la IDE et fa el suggeriment que pots simplificar l’expressió condicional:

python
age = int(input("Age? "))
if 15 < age < 68:
    print("Pots treballar!")
else:
    print("No pots treballar")

or

L’operador or compara dos bool i torna True si algún valor és True.

python
>>> True and True
True

Completa la taula de la veritat:

a b a or b
TrueTrueTrue
TrueFalse
FalseTrue
FalseFalse

A continuació tens un exemple amb or:

python
answer = input('Do you...? (yes/no): ')
if answer == 'yes' or answer == 'y':
    print('Yes!')

Es tracta d’una condició complexa formada per dos condicions simples:

python
>>> answer = "yes"
>>> answer == "yes"
True
>>> answer == "y"
False
>>> True or False
True

not

L’operador not nega la condició:

python
>>> not True
False

Completa la taula de la veritat:

a not a
TrueFalse
False

Activitats

PENDENT