Soluzioni prima lezione

Esercizio 1

** è l'elevamento a potenza.

(3+8/2**2)*3 = 15

Esercizio 2

nome = input("Inserisci il tuo nome: ")
print("Ciao " + nome + "!")

Esercizio 3

Il primo codice dà errore perché non è permesso di sommare stringhe e interi; usando le funzioni di conversione si può ottenere così 27 dal codice:

a = 3
b = "24"
print(a+int(b))

Esercizio 4

Serve creare una nuova variabile per effettuare lo scambio:

a = int(input())
b = int(input())
tmp = a
a = b
b = tmp
print(a)
print(b)

Riflettere sul perché la soluzione "intuitiva", riportata sotto, non può funzionare:

a = int(input())
b = int(input())
a = b
b = a
print(a)
print(b)

In python si possono scambiare facilmente due variabili con una forma di assegnamento speciale, chiamato unpacking assignment:

a, b = b, a

Esercizio 5

cateto1 = float(input("Inserisci il primo cateto: "))
cateto2 = float(input("Inserisci il secondo cateto: "))

ipotenusa = (cateto1 ** 2 + cateto2 ** 2) ** 0.5

print("L'ipotenusa vale: " + str(ipotenusa))

Esercizio 7

Si sfrutta il fatto che la divisbilità per 2 è equivalente ad avere resto nullo quando si divide per 2.

n = int(input("Inserisci un numero: "))

if n % 2 == 0:
    print(str(n) + " è pari")
else:
    print(str(n) + " è dispari")

Eserczizio 8

media = int(input("Inserisci la tua media attuale: "))
n_voti = int(input("Inserisci il numero di voti ricevuti: "))
goal = int(input("Inserisci la media che vuoi raggiungere: "))

voto_da_prendere = goal * (n_voti + 1) - media * n_voti
if voto_da_prendere >= 0 and voto_da_prendere <= 10:
    print("Devi prendere: " + str(voto_da_prendere))
else:
    print("Impossibile")

Esercizio 9

print("Menu--------------------")
print("0) Somma")
print("1) Prodotto")

opzione = int(input("Inserisci l'operazione desiderata: "))
n1 = int(input("Inserisci il primo numero: "))
n2 = int(input("Inserisci il secondo numero: "))
print("----------------------")
print("Risultato: ")
if opzione == 1:
    print(n1 + n2)
if opzione == 2:
    print(n1 * n2)

Divisione e sottrazione si aggiungono in modo analogo. Per mantenere il programma attivo, si usa un while loop.

stop = False
while not stop:
    print("Menu--------------------")
    print("0) Somma")
    print("1) Prodotto")
    print("9) Termina")

    opzione = int(input("Inserisci l'operazione desiderata: "))
    n1 = int(input("Inserisci il primo numero: "))
    n2 = int(input("Inserisci il secondo numero: "))
    print("----------------------")
    print("Risultato: ")
    if opzione == 1:
        print(n1 + n2)
    if opzione == 2:
        print(n1 * n2)
    if opzione == 9:
        stop = True

Esercizio 10

saldo = 400.35

anno = 0
while anno < 10:
    saldo = saldo*0.01 - 10
    anno += 1

Esercizio 11

n = int(input("Inserisci n: "))
risultato = 0
i = 1
while i <= n:
    risultato += i
    i += 1
print("La somma dei primi " + str(n) + " numeri è: " + str(risultato))

Esercizio 12

Se si calcola il resto della divisione per 10 di un numero si ottiene la sua ultima cifra: ad esempio 423 / 10 è 42 con resto di 3. Quindi 423 % 10 = 3.

Per ottenere le altre cifre si può dividere il numero per 10 e ripetere l'operazione finché non si ottiene 0 nell'ultima divisone.

Purtroppo 423/10 in Python fa 42.3 e non possiamo più utilizzare il remainder operator su numeri decimali.

Per aggirare il problema ci sono due modi:

Usando il primo:

n = int(input("inserisci un numero: "))

while n > 0:
    print(n%10)
    n = int(n/10)

La funzione di conversione str, nel caso degli interi, si basa su un metodo analogo per effettuare la conversione:

def simple_str(n):
    result = ""
    sign = ""
    if n == 0:
        result = "0"
    if n < 0:
        sign = "-"
        n = -n

    while n > 0:
        result = str(n%10) + result
        n //= 10

    return sign + result

Esercizio 13

Soluzione 1:

i = 1
res = 0
while i < 1000:
    if i % 3 == 0 or i % 5 == 0:
        res += i
    i += 1

print(res)

Soluzione 2:

res = 0
# calcolo tutto i multipli di tre e li aggiungo
limit = int(1000/3)
i = 1
while i < limit:
    res += i*3
    i += 1
# stessa cosa per i multipli di cinque
limit = int(1000/5)
i = 1
while i < limit:
    res += i*5
    i += 1

# I multipli sia di 3 che di 5 sono stati contati due volte e vanno tolti
limit = int(1000/15)
i = 1
while i < limit:
    res -= i*15
    i += 1
print(res)

Esercizio 14

Soluzione molto poco efficiente: si testa la divisibilità per tutti i numeri maggiori di 1 e minori del numero considerato.

n = int(input('Inserisci un numero: '))

i = 2
prime = True
if n == 1 or n == 0:
    prime = False
else:
    while i < n:
        if n % i == 0:
            prime = False
        i += 1

if prime:
    print('Primo')
else:
    print('Non primo')

Si può fare un piccolo miglioramento: quando la variabile prime diventa False, non è più necessario continuare il ciclo. Si può quindi modificare così la condizione del while:

while i < n and prime:

Un secondo miglioramento è dato dal fatto che se un numero x non divide n, allora nemmeno il numero n/x (se intero) può dividere n

Per fare un esempio, 100 è divisibile per 2 e 5, quindi è inutile controllare 100/2 = 50 e 100/5=2. Una volta sorpassato il 10, 100/i sarà minore di 10 quindi sarà come controllare di nuovo la divisbilità per i numeri prima del 10.

Ragionando e facendo un po' di prove ci si rende conto che basta controllare i divisori fino a sqrt(n).

n_sqrt = int(n**0.5) # salviamo il risultato per non doverlo ricalcolare ad ogni ciclo
while i <= n_sqrt and prime:
    # ...

C'è un <= e non un < perché altrimenti i quadrati di numeri primi non verrebbero identificati correttamente (ad esempio 7² = 49).