#!/usr/bin/python -tt #======= #Crediti #======= # esercizi corso di python @ifac-cnr # Copyright 2012 Nicola Zoppetti # Licensed under the Apache License, Version 2.0 # http://www.apache.org/licenses/LICENSE-2.0 #==================== #Indicazioni generali #==================== # RIEMPIRE LE FUNZIONI # DOVE COMPARE IL COMMENTO # +++METTI QUI IL TUO CODICE+++ # Seguire le istruzioni riportate nel commento # precedente ciascuna funzione da riempire # Una volta studiata una soluzione ad un esercizio, per verificare se è corretta eseguire QUESTO SCRIPT # per un generico 'esercizio 1', se la soluzione è errata o non data # sullo standard output viene stampato il prefisso KO, il valore restituito e quello atteso # >>> esercizio 1 # >>> KO restituisce: None, risultato atteso: [98, 55, 10, 8, 2] # # Se la soluzione è corretta: # sullo standard output viene stampato OK # >>> esercizio 1 # >>> OK #=============== #INIZIO ESERCIZI #=============== # ------------------------- # forcompleto(num,stringa,stringabreak): # ------------------------- # restituire una lista di stringhe che rapprensentano # i numeri da 0 a num (compreso) e, alla fine, la 'stringa' passata # come secondo parametro # se però il parametro stringabreak è uguale ad una delle stringhe # che rappresenta i numeri terminare con quella anche se # rappresenta un numero più piccolo di num # # Esempi: # >>>forcompleto(5,'fine','xx') # ['0','1','2','3','4','5','fine'] # >>>forcompleto(5,'fine','2') # ['0','1','2'] # # suggerimento: # - usare un ciclo for con else finale per inserire la 'stringa' # - usare break se una delle stringhe con i numeri == stringabreak def forcompleto(num,stringa,stringabreak): ##-INIZIO-SOLUZIONE-## retl=[] for n in range(num+1): s=str(n) retl.append(s) if s == stringabreak: break #esco dal for senza passare dall'else else: retl.append(stringa) return retl ##-FINE-SOLUZIONE-## # ------------------- # saltavocali(parola) # ------------------- # restituisce una stringa in cui si saltano le vocali della # stringa originaria # Esempi: # # >>> saltavocali('Hello') # 'Hll' # >>> saltavocali('MammAluCcO') # 'MmmlCc' # suggerimenti: # - iterare sui caratteri della parola con for e utilizzare # l'istruzione continue quando si trova una vocale # - attenzione alle vocali maiuscole e minuscole def saltavocali(parola): ##-INIZIO-SOLUZIONE-## novocali = '' for c in parola: if c.lower() in 'aeiou': continue #l'else qui è superfluo novocali += c return novocali ##-FINE-SOLUZIONE-## # ---------------------- # saltacommento(stringa) # ---------------------- # data una stringa di programma Python # restituisce una stringa in cui si eliminano gli eventuali commenti # (definiti dal carattere # e tutto ciò che segue) # Esempi: # # >>> saltacommento('a=10 # questo è un comm#ento') # 'a=10 ' # >>> saltacommento('## questo è un comm#ento') # '' # suggerimenti: # - iterare sui caratteri della stringa con for e utilizzare # l'istruzione break quando si trova il carattere # def saltacommento(stringa): ##-INIZIO-SOLUZIONE-## codice = "" for c in stringa: if c == '#': break #l'else qui è superfluo codice += c return codice ##-FINE-SOLUZIONE-## # ------------------------ # sommafinoamaxx(num,maxx) # ------------------------ # somma i numeri da 1 a num fino ad un risultato massimo pari a maxx # se la somma è > di maxx restituire maxx # Esempi: # >>>sommafinoamaxx(5,20) # 15 # >>>sommafinoamaxx(50,10) # 10 # >>>sommafinoamaxx(5,20) def sommafinoamaxx(num,maxx): ##-INIZIO-SOLUZIONE-## tot = 0 i=1 while i<= num and tot < maxx:#la seconda condizione è necessaria per non continuare a contare ... tot += i i += 1 if tot > maxx: #se ho superato maxx return maxx else: return tot ##-FINE-SOLUZIONE-## # ------------------------ # contauno(num) # ------------------------ # conta il numero di volte che la cifra 1 # compare nei numeri da 1 a num (compreso) # Esempi: # >>> contauno(201) # 141 # >>> contauno(101) # 23 # >>> contauno(13) # 6 def contauno(num): ##-INIZIO-SOLUZIONE-## total = 0 i = 1 while i<= num: page_no = str(i) total += page_no.count('1') i += 1 return total ##-FINE-SOLUZIONE-## # ---------------- # numeriprimi(num) # ---------------- # dato un intero positivo num # la funzione restituisce la lista dei numeri primi maggiori o uguali a 2 # e minori o uguali a num # # Esempi: # >>>numeriprimi(5) # [2, 3, 5] # >>>numeriprimi(1) # [] # >>>numeriprimi(50) # [2, 3, 5, 7, 11, 13, 17, 19, 23 , 29, 31 , 37 , 41 , 43, 47 ] # >>>numeriprimi(-1) # [] # suggerimento: # un possibile algoritmo usa due iterazioni: # - una esterna sull'indice i # - una interna sull'indice k che arriva fino a i # nel ciclo interno testo se i è divisibile per k ... def numeriprimi(num): ##-INIZIO-SOLUZIONE-## # algoritmo usato: # - iterare con un indice i che va da due a num (compreso) # - iterare con un indice k da 2 a i (escluso) # * se i è divisibile per k (resto 0) NON è primo # * se i NON è divisibile per nessuno dei k considerati k è primo # - usare una variabile bool che segnala un numero primo # da inizializzare a d ogni iterazione su i primi = [] i = 2 while i <=num : # i va da 2 a num (compreso) k = 2 isPrime = True # per ogni i testo se i è primo while k < i : # k va da 2 a i (escluso) if i%k==0: # se i è divisibile per k NON è primo isPrime = False break # esco dal ciclo while su k tanto ho # già scoperto che i NON è primo ed è inutile # terminare il ciclo k += 1 # aggiorno k if isPrime: primi.append(i) i += 1 # aggiorno i return primi # i solo numeri pari # k fino a sqrt(i) ? ##-FINE-SOLUZIONE-## # -------------------- # fattorizzazione(num) # -------------------- # Dato un numero intero positivo num, scrivere una funzione che calcola # la fattorizzazione in numeri primi di num cioè un sequenza di numeri primi # che moltiplicati danno il numero di partenza # # # suggerimento: # - usare la funzione numeriprimi definita nel precedente esercizio # Esempi # # >>> fattorizzazione(60) # [2, 2, 3, 5] # >>> fattorizzazione(1050) # [2, 3, 5, 5, 7] # >>> fattorizzazione(1) # [] # >>> fattorizzazione(47) # [47] def fattorizzazione(num): ##-INIZIO-SOLUZIONE-## # - iteraro con p sui numeri primi compresi tra 2 e num (restituiti da numeriprimi) # * fino a ché num è divisibile per p aggiungere p alla fattorizzazione ed aggiornare num a num/p #considerare i numeri primi fino a num/2, occhio pari, dispari primi = numeriprimi(num) n = num fact = [] for p in primi: while n%p == 0 and n != 1: fact.append(p) n = n//p return fact ##-FINE-SOLUZIONE-## #============== # FINE ESERCIZI #============== # NON MODIFICARE DA QUI IN POI!!!!!!!! # FUNZIONE test() usata in main() per stampare # cosa restituisce ciascuna funzione vs. cosa dovrebbe restituire quella corretta def test(got, expected): if got == expected: prefix = ' OK ' print(' OK') else: prefix = ' KO ' print(' %s restituisce: %s, risultato atteso: %s' % (prefix, repr(got), repr(expected))) def test_float(got,expected,eps=1.e-6): if got == None: print(' KO restituisce: None, risultato atteso: %s' % (repr(expected))) return if abs(got-expected)< eps: prefix = ' OK ' print(' OK') else: #print('KO') prefix = ' KO ' print('%s restituisce: %s, risultato atteso: %s' % (prefix, repr(got), repr(expected))) # chiama le funzioni-soluzione con argomenti fissati e # confronta i risultati con quelli attesi def main(): print('forcompleto') test(forcompleto(5,'fine','xx'),['0','1','2','3','4','5','fine']) test(forcompleto(5,'fine','2'), ['0','1','2']) print('saltavocali') test(saltavocali('Hello'),'Hll') test(saltavocali('MammAluCcO'),'MmmlCc') print('saltacommento') test(saltacommento('a=10 # questo è un comm#ento'),'a=10 ') test(saltacommento('## questo è un comm#ento'),'') print('sommafinoamaxx') test(sommafinoamaxx(5,20),15) test(sommafinoamaxx(50,10),10) test(sommafinoamaxx(5000,20),20) print('contaunoinpagine') test(contauno(201),141) test(contauno(101),23) test(contauno(13) ,6) print('numeriprimi') test(numeriprimi(5), [2, 3, 5]) test(numeriprimi(1), []) test(numeriprimi(50), [2, 3, 5, 7, 11, 13, 17, 19, 23 , 29, 31 , 37 , 41 , 43, 47 ]) test(numeriprimi(-1), []) print('fattorizzazione') test(fattorizzazione(60),[2, 2, 3, 5]) test(fattorizzazione(1050),[2, 3, 5, 5, 7]) test(fattorizzazione(1), []) test(fattorizzazione(47),[47]) test(fattorizzazione(4764),[2, 2, 3, 397]) # Standard boilerplate to call the main() function. if __name__ == '__main__': main()