Esercizi di Programmazione (compito a casa della lezione dell'8 Maggio)

Da aptiva.

Ogni studente deve provare a svolgerne uno per la lezione del 15 maggio.


Indice

1

1. Scrivere un programma che verifichi se la stringa data in input e' palindroma (i.e. se letta da sinistra a destra o da destra a sinistra risulta la stessa stringa es. 'anna'(svolto da Melissa) Commenti alle soluzioni (rd)

a="melissa"
>>> b="assilem"
>>> c=a[::-1]
>>> if b==c:print"melissa"
melissa

"""Esercizio svolto da Anna """ Commenti alle soluzioni (rd)


stringa = raw_input("Inserisci una parola per verificare se e' a palindroma:\n")
stringa2 = stringa[::-1]
if stringa == stringa2:
   print "La parola e' palindroma"
else:
   print "La parola non e' palindroma"

2

2. Scrivere un programma che presa in input una stringa metta in output il codice morse del testo inserito. Es. "renzo" diventa "._. .. _. __.. ___" Estensione (un po' piu' difficile!), scrivere un programma che faccia l'operazione inversa: preso in input il morse mostri la stringa corrispondente.

Esercizio svolto da Marta Breda Commenti alle soluzioni (rd)

MorseEncoding = {}
MorseEncoding[" "] = "......."
MorseEncoding["A"] = ".-"
MorseEncoding["B"] = "-..."
MorseEncoding["C"] = "-.-."
MorseEncoding["D"] = "-.."
MorseEncoding["E"] = "."
MorseEncoding["F"] = "..-."
MorseEncoding["G"] = "--."
MorseEncoding["H"] = "...."
MorseEncoding["I"] = ".."
MorseEncoding["J"] = ".---"
MorseEncoding["K"] = "-.-"
MorseEncoding["L"] = ".-.."
MorseEncoding["M"] = "--"
MorseEncoding["N"] = "-."
MorseEncoding["O"] = "---"
MorseEncoding["P"] = ".--."
MorseEncoding["Q"] = "--.-"
MorseEncoding["R"] = ".-."
MorseEncoding["S"] = "..."
MorseEncoding["T"] = "-"
MorseEncoding["U"] = "..-"
MorseEncoding["V"] = "..-"
MorseEncoding["W"] = "...-"
MorseEncoding["X"] = "-..-"
MorseEncoding["Y"] = "-.--"
MorseEncoding["Z"] = "--.."
MorseEncoding["1"] = ".----"
MorseEncoding["2"] = "..---"
MorseEncoding["3"] = "...--"
MorseEncoding["4"] = "....-"
MorseEncoding["5"] = "....."
MorseEncoding["6"] = "-...."
MorseEncoding["7"] = "--..."
MorseEncoding["8"] = "---.."
MorseEncoding["9"] = "----."
MorseEncoding["0"] = "-----"

parola = raw_input('Inserire la parola da codificare in alfabeto morse: ')
result = ""
i = 0
while i < len( parola ):
	result += MorseEncoding[ parola[ i ].upper() ]
	i += 1
	
print result

3

3. Scrivere un programma che dato n e m fornisca in output il valore del coefficiente binomiale n su m (quello del triangolo di Tartaglia).(svolto da Franca) Commenti alle soluzioni (rd)

'''Calcolo del coefficiente binomiale (n k) Esercizio n.3 (autore:
franca)'''
import math
def binomio (n,k):
    return math.factorial(n)/(math.factorial(k)*math.factorial(n-k))
print("Coefficiente binomiale")
print("")
print("Inserire i numeri di riga e colonna del coefficiente binomiale")
print("")
n=-1
while n<0 or k<0 or k>n:
    n=int(input("Numero di riga (grado del binomio) n "))
    k=int(input("Numero di colonna k "))
    print("")  
print("Il valore del coefficiente binomiale è ",binomio(n,k))

Esercizio svolto da Silvia

def factorial (n):
    if n<2
    return 1
return n*factorial (n-1)
def tartaglia (n,m)
return factorial (n)/(factorial(m)*factorial (n-m)
                      n=input ("n=")
                      m=input ("m=")
                      print tartaglia (m,n)
                      

4

4. Scrivere un programma che prese in input un numero imprecisato di stringhe ponga in output la statistica della frequenza delle lettere che compaiono (cioe' quale e' la frequenza della 'a', della 'b' etc.) Il conteggio deve aver luogo senza tenere in considerazione se le lettere sono maiuscole o minuscole. Svolto da Carmela e Francesca17 (Carmosina) Commenti alle soluzioni (rd)

lista=[]
parola=""

while parola!="no":
    parola=input("inserisci il testo, quando vedi no fermati")
    
    if parola=="no":
        pass
    else:
       lista.append(parola)
a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
i=0
l=0
m=0
n=0
o=0
p=0
q=0
r=0
s=0
t=0
u=0
v=0
z=0
for elemento in lista:
    a=a+elemento.count("a")
    b=b+elemento.count("b")
    c=c+elemento.count("c")
    d=d+elemento.count("d")
    e=e+elemento.count("e")
    f=f+elemento.count("f")
    g=g+elemento.count("g")
    h=h+elemento.count("h")
    i=i+elemento.count("i")
    l=l+elemento.count("l")
    m=m+elemento.count("m")
    n=n+elemento.count("n")
    o=o+elemento.count("o")
    p=p+elemento.count("p")
    q=q+elemento.count("q")
    r=r+elemento.count("r")
    s=s+elemento.count("s")
    t=t+elemento.count("t")
    u=u+elemento.count("u")
    v=v+elemento.count("v")
    z=z+elemento.count("z")
if a>0:
    print("Occorrenze di a: ",a)
if b>0:
    print("Occorrenze di b: ",b)
if c>0:
    print("Occorrenze di c: ",c)
if d>0:
    print("Occorrenze di d: ",d)
if  e>0:
    print("Occorrenze di e: ",e)
if f>0:
   print("Occorrenze di f: ",f)
if g>0:
   print("Occorrenze di g: ",g)
if h>0:
   print("Occorrenze di h: ",h)
if i>0:
   print("Occorrenze di i: ",i)
if l>0:
   print("Occorrenze di l: ",l)
if m>0:
    print("Occorrenze di m: ",m)
if n>0:
    print("Occorrenze di n: ",n)
if o>0:
    print("Occorrenze di o: ",o)
if p>0:
    print("Occorrenze di p: ",p)
if q>0:
    print("Occorrenze di q: ",q)
if r>0:
    print("Occorrenze di r: ",r)
if s>0:
    print("Occorrenze di s: ",s)
if t>0:
    print("Occorrenze di t: ",t)
if u>0:
    print("Occorrenze di u: ",u)
if v>0:
    print("Occorrenze di v: ",v)
if z>0:
    print("Occorrenze di z: ",z)


5

5. Scrivere un programma che risolva equazioni di secondo grado, controllando i casi che si vengono a creare a seconda del valore del Delta. (estensione: fornire anche le soluzioni complesse coniugate in caso di Delta negativo)

6

6. Scrivere un programma che calcoli la differenza in giorni fra due date del presente anno (estensione: generalizzare alla differenza fra date arbitrarie... del calendario Gregoriano)risolto da Cati, ma senza estensione Commenti alle soluzioni (rd)

#prima data
print"Programma per calcolare la  differenza tra due  date dello stesso anno"
print""
gg1 = input("Inserisci il giorno della data piu' recente: ")
mm1 = input("Inserisci il mese della data piu' recente: ")
if mm1==11 or 4 or 6 or 9:
    mese1=mm1*30
elif mm1==1 or 3 or 5 or 7 or 8 or 10 or 12:
    mese1=mm1*31
elif mm1==2:
    mese1=mm1*28
aaaa1 = input("Inserisci l'anno della data piu' recente: ")
print "hai scritto la seguente data ", gg1, ".", mm1, ".", aaaa1
print""
#seconda data
print "Inserisci la data precedente"
gg2 = input("Inserisci il giorno: ")
mm2 = input("Inserisci il mese: ")
if mm2==11 or 4 or 6 or 9:
    mese2=mm2*30
elif mm2==1 or 3 or 5 or 7 or 8 or 10 or 12:
    mese2=mm2*31
elif mm2==2:
    mese2=mm2*28
aaaa2 = input("Inserisci l'anno: ")
print "hai scritto la seguente data ", gg2, ".", mm2, ".", aaaa2
print""
#calcolo e visualizzo i giorni trascorsi
print gg1, ".", mm1, ".", aaaa1," - ",gg2, ".", mm2, ".", aaaa2
#ciascun mese e' considerato di 30 giorni mentre un anno per (30 * 12) giorni
    
giorni_trascorsi = gg1 - gg2 + (mese1-mese2)
print "Numero di giorni trascorsi:",giorni_trascorsi

7

7. Scrivere una funzione che calcoli il prodotto scalare fra vettori e un programma che ne provi il funzionamento. Domenico Commenti alle soluzioni (rd)

print"Scrivere una funzione che calcoli il prodotto scalare fra vettori e un programma che ne provi il funzionamento"
print"inserire le componenti del vettore a(es.a=[2,3,4])"
a=input("a=")
print"a=",a
print"inserire le componenti del vettore b(es.b=[2,3,4])"
b=input("b=")
print"b=",b
prod=a[(0)]*b[(0)]+a[(1)]*b[(1)]+a[(2)]*b[(2)]
print"il prodotto scalare tra i vettori a e b vale"
print"a*b=",prod

Domenico (02/06/2014 - Ore 18:32). Altro metodo. Commenti alle soluzioni, anche a questo metodo (rd)

def prodotto_scalare(Ax,Ay,Az,Bx,By,Bz): #definisco la funzione che calcola il prodotto scalare fra due vettori
    return Ax*Bx+Ay*By+Az*Bz

Ax = input("Dammi la componente x del vettore A") #chiedo in ingresso le tre componenti del vettore A
Ay = input("Dammi la componente y del vettore A")
Az = input("Dammi la componente z del vettore A")

Bx = input("Dammi la componente x del vettore B")  #chiedo in ingresso le tre componenti del vettore B
By = input("Dammi la componente y del vettore B")
Bz = input("Dammi la componente z del vettore B")

risultato = prodotto_scalare(Ax,Ay,Az,Bx,By,Bz)  #metto nella variabile risultato il valore che mi restituisce la funzione prodotto_scalare

print risultato  #stampo il contenuto della variabile risultato

8

8. Scrivere un programma che prenda in input n stringhe della stessa lunghezza e ponga in output l'output trasposto: la prima riga deve essere composta dai primi caratteri di tutte le stringhe, la seconda riga contiene tutti i secondi caratteri delle stringhe e cosi' via. (estensione: se le stringhe in input hanno lunghezza diversa, portarle tutte ad avere la lunghezza di quella massima aggiungendo spazi in coda alle stringhe piu' corte). Svolto da Carmela (senza estensione). Commenti alle soluzioni (rd)

lista=[]
i=0
n=1
parola=""
while i<n:
    i+=1
    n+=1
    parola=input("scrivi una parola oppure no per uscire")
    if (parola!="no"):
        lista.append(parola)
        lunghezzaparola=len (parola)
    else:
        break

nuovalista=[]
x=0
contacarattere=-1
while x<lunghezzaparola:
    x+=1
    posizioneparolalista=0
    nuovaparola=""
    word=""
    contacarattere+=1
    for y in lista:
        word=lista[posizioneparolalista]
        primocarattere=word[contacarattere]
        nuovaparola=nuovaparola+primocarattere
        posizioneparolalista+=1
    nuovalista.append(nuovaparola)
contanuovaparolalista=0

for z in nuovalista:
    nuovaparola=nuovalista[contanuovaparolalista]
    contanuovaparolalista+=1
    print (nuovaparola)

9

9. Facendo uso della sola funzione _nand(x,y) cosi' definita: def _nand(x,y): return 0 if x and y else 1 implementare le funzioni _not, _and, _or, _xor

10

10. Scrivere le funzioni capaci di calcolare il minimo comune multiplo e il massimo comun divisore fra due numeri. Gaetana propone questa soluzione. Commenti alle soluzioni (rd)


def MCD(a, b):
    while b>0: #calcola il massimo comun divisore di due interi usando il metodo di Euclide
        resto=a%b
        a=b
        b=resto
    return a


def mcm(a,b):
    return a*b/MCD(a,b) #il mcm ? uguale al prodotto dei due numeri diviso il loro massimo comune divisore


n1=input("Dammi il primo numero")
n2=input("Dammi il secondo numero")

mass_com_div = MCD(n1,n2)
min_com_mult = mcm(n1,n2)

print "Il MCD = ", mass_com_div
print "Il mcm = ",min_com_mult

11

11. Scrivere una funzione che dato un numero restituisce vero/falso a seconda che il numero introdotto sia o meno un numero triangolare. Risolto da Cati, ma solo fino al numero 3003 Commenti alle soluzioni (rd)

print "Ricerca dei numeri triangolari compresi tra 1 e 3003"
numeri_triang=[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 

231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 

820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, 1485, 1540, 1596, 

1653, 1711, 1770, 1830, 1891, 1953, 2016, 2080, 2145, 2211, 2278, 2346, 2415, 2485, 2556, 2628, 

2701, 2775, 2850, 2926, 3003]
numero= input("digita un numero minore o uguale a 3003 ")
if numero in numeri_triang:
    print "Bene ",numero," e' un numero triangolare"
else:
    print "No, mi spiace il numero  ",numero," non e' un numero triangolare."

esercizio svolto da Silvia:

print"questo programma stabilisce se il numero inserito è triangolare o meno"
n=input("inserisci il numero N=")
importh math
n=math.sqrt(1+8*N)
n_int=round(n)
ifn-n_int==0:
    print"vero,il numeroinserito N=",N"è triangolare"
    else:
        print"FALSO, il numero inserito N=",N,"NON è triangolare"

12

12. Scrivere una funzione che conti quante cifre occorrono per rappresentare il numero

intero in base 10 (e.g. numdigit(12345) sia 5, numdigit(24) sia 2).

Esercizio svolto da Runa Denes

def numdigit ():
    return len(str(numero))

numero = raw_input("Inserire il numero da analizzare\n")
print "il numero ha ", numdigit(), " cifre decimali"

13

13. Scrivere una funzione che preso in input un numero e una base converta il numero in quella base (es. 10 in base 3 e' 31, 3 volte 3**1 + 1. 93 in base 3 e' 312)

14

14. Scrivere una funzione che data una stringa, elimini da essa tutte le vocali. es novowels("Bologna e' turrita") -> "Blgn ' trrt" (svolto a lezione. trascritto da Arianna Miriam Fiumefreddo)

def novowels (string):
    vocali={'a','e','i','o','u','A','E','I','O','U'}
    t=""
    for c in string:
        if c not in vocali:
            t+=c
    return t

15

15. Scrivere una funzione che faccia la somma fra vettori (i vettori siano memorizzati come liste). (Estensione: fare una seconda funzione che sommi matrici) (Altra estensione, se le matrici o i vettori non hanno la stessa dimensione interpretare tutti i valori mancanti come zeri). Svolto da Cati, senza estensioni. Commenti alle soluzioni (rd)

print "Calcolo della somma di due vettori"
#uso il metodo della punta corda - teorema di pitagora
import math

def DistanzaVettori (x1,y1,x2,y2):
    V1=(x2-x1)**2
    V2=(y2-y1)**2
    distQuad=V1+V2
    risultato = math.sqrt(distQuad)
    print "la distanza tra i due vettori con il metodo punto-corda e' ", risultato
    
x1=input("inserici la coordinata x del primo vettore ")
y1=input("inserici la coordinata y del primo vettore ")
x2=input("inserici la coordinata x del secondo vettore ")
y2=input("inserici la coordinata y del secondo vettore ")
DistanzaVettori(x1,y1,x2,y2)
a=[(x1,y1)]
b=[(x2,y2)]
c=a+b
print "la lista della coppia di vettori e' ", c

riprovo a correggere:

print "Calcolo della somma di due vettori"
import math

def DistanzaVettori (x1,y1,x2,y2):
    V1=x1+x2
    V2=y1+y2
    risultato=V1,V2
    print "la distanza tra i due vettori e' ", risultato
    
x1=input("inserici la coordinata x del primo vettore ")
y1=input("inserici la coordinata y del primo vettore ")
x2=input("inserici la coordinata x del secondo vettore ")
y2=input("inserici la coordinata y del secondo vettore ")
DistanzaVettori(x1,y1,x2,y2)

16

16. Scrivere una funzione che dato un valore ed una lista di valori ordinati in modo non decrescente inserisca il nuovo elemento nella lista mantenendola ordinata. es: ninsert(10,[1,3,4,5,15,22])->[1,3,4,5,10,15,22]) Svolto da Cati: Commenti alle soluzioni (rd)

print "Aggiungi un numero alla lista 1,2,3,8,21 "
def agglista(a,b):
    a.append(b)
    a.sort()
    print a
a=[1,2,3,8,21]
b=input("inserisci un numero= ")
agglista(a,b)

17

17. Scrivere una funzione che data una tupla, fornisca in output una lista di tuple che comprenda tutte le possibili rotazioni della tupla stessa, es. rott((1,2,3,4))->[(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)] svolto da Alice B. Commenti alle soluzioni (rd)

s = ""
l = list()
s = input("Inserire la tupla (es: t1, t2, t3, t4). -> ")
l = s.split(",")
lenght = len(l)
i = 0
while(i < lenght):
    l[i] = l[i].strip()
    i = i + 1
i = 0
while(i < lenght):
    j = 0
    sTemp = ""
    while(j < lenght):
        sTemp = sTemp + l[j]
        j = j + 1
    print(sTemp)
    item = l.pop(0)
    l.append(item)
    i = i + 1

18

18. Scrivere un programma che prese in input una sequenza imprecisata di coppie di valori che rappresentano ascissa e ordinata di punti in un piano, stampi la coppia che ha distanza minima.

19

19. Scrivere una funzione che (senza usare la eval!) faccia semplici calcoli numerici. In input riceve un solo parametro: una stringa contenente 2 numeri e, fra loro, un simbolo di operazione che puo' essere '+' '-' '*' o '/'. Il risultato (intero) della operazione deve essere il valore di ritorno. (es di input "23 + 44" oppure "55 / 3" o ancora "400 - 123" Estensione: scrivere il programma in modo che gli spazi fra i numeri e i simboli di operazione possano essere omessi).

20

20. Scrivere una funzione che fonda (merge) due liste ordinate. La lista in output deve contenere tutti gli elementi di entrambe le liste, essere ordinata (scrivere l'algoritmo di fusione, non usare sort o altre funzioni gia' presenti) merge([1,3,5],[0,2,4,42])->[0,1,2,3,4,5,42] Commenti alle soluzioni (rd)

>>> l1=[1,3,5]

>>> l2=[0,2,4,42]

>>> def merge_liste(l1,l2):

            lista_ordinata=[]

	    l1=l1[:]

	    l2=l2[:]

	            while(l1 and l2):

		           if(l1[0]<=l2[0]):

			          item=l1.pop(0)

			          lista_ordinata.append(item)

                           else:

			          item=l2.pop(0)

			          lista_ordinata.append(item)

	   lista_ordinata.extend(l1 if l1 else l2)

	   return lista_ordinata

21

21. Scrivere un programma che prenda in input stringhe contenenti ognuna un numero imprecisato di numeri. L'input termina quando viene inserita una stringa vuota. A quel punto i numeri devono essere posti in output correttamente incolonnati in modo da utilizzare il numero minimo di caratteri necessari (ogni colonna deve essere esattamente in grado di ospitare il numeri piu' grande, i.e. quello composto da piu' cifre) Input

1 12 333 1 3 44 1
555 22 3 3 3
24 1234 23 3 33 555

Output:

  1   12 333 1  3  44 1
555   22   3 3  3
 24 1234  23 3 33 555

Esercizio svolto da Runa Denes consapevole che si poteva fare anche con meno righe di programma... Commenti alle soluzioni (rd)

def LeggiMatrice():
    '''Legge la Matrice di stringhe e la trasforma in una lista liste di elementi'''
    rigaScritta = True
    matrice = []

    while rigaScritta:
        stringa = raw_input()
        
        if stringa:
            matrice.append(stringa)
        else:
            rigaScritta = False


    for i in range(len(matrice)):
          matrice[i]= matrice[i].split()         
   
    return matrice

def UniformaRighe(matrice):
    '''crea una matrice con lo stesso numero di elementi per ogni lista'''
    dimMaxRiga = 0
    
    for i in range(len(matrice)):
        if (dimMaxRiga<len(matrice[i])):
            dimMaxRiga = len(matrice[i])
            
    for i in range (len(matrice)):
        differenza = dimMaxRiga-len(matrice[i])
        
        for j in range (differenza):         
            matrice[i].append(' ')
    return matrice 

def ArrayAppoggio():
    '''creo una lista contenente la dimensione massima di ogni colonna della matrice'''
    dimMaxColonna = []
    
    for colonna in range(len(matrice[0])):
        maxValue = 0
        
        for riga in range(len(matrice)):
            if (len(matrice[riga][colonna])>maxValue):
                maxValue=len(matrice[riga][colonna])
                
        dimMaxColonna.append(maxValue)
    return dimMaxColonna

def StampaMatrice(matrice):
    dimMaxColonna = ArrayAppoggio()
    for riga in range (len(matrice)):
        stringaA = ""
        for colonna in range (len(matrice[0])):
            nrSpazi= dimMaxColonna[colonna]-len(matrice[riga][colonna])
            stringaA+='  '*nrSpazi+ matrice[riga][colonna]+' '
        print (stringaA)
    

print ("Inserisci la matrice che vuoi riordinare\n\n")
matrice=LeggiMatrice()
matrice=UniformaRighe(matrice)
StampaMatrice(matrice)

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti