Corso Online per Potenziare le Competenze Digitali
Mara, la professoressa di Marta, è molto precisa, e ama fare statistiche sull’andamento della classe.
Dopo ogni verifica calcola il voto medio della classe, una grandezza da lei inventata e definita dal seguente algoritmo:
- prima vengono raccolti tutti i voti assegnati ai compiti;
- successivamente Mara esclude i due compiti migliori e i due compiti peggiori;
- viene calcolata la media dei voti dei compiti rimanenti, arrotondata eventualmente per difetto all’intero più vicino.
Aiuta Mara ad automatizzare questo calcolo.
Dati di input
Una lista di N interi a1, a2, …, aN rappresentanti i voti attribuiti ai compiti.
Dati di output
Stampare il voto medio della classe.
Assunzioni
- Ogni voto è un intero compreso tra 3 e 10, estremi inclusi.
- I voti non sono dati necessariamente in ordine crescente.
Esempi di input/output
| Input | Output | |
|---|---|---|
| 1° | 3 7 8 4 4 9 6 8 7 6 | 6 |
| 2° | 4 4 5 5 3 3 | 5 |
Soluzione 1
Si tratta di una media troncata.
Si scorre la lista di voti e per ogni voto
- si somma al totale
- si decide se è più basso di uno dei 2 minimi attuali
- si decide se è più alto di uno dei 2 massimi attuali
Dal totale si sottraggono i 2 voti più bassi e i 2 voti più alti prima di calcolare la media.
Complessità dell’algoritmo: ![]()
VOTI = [3, 7, 8, 4, 4, 9, 6, 8, 7, 6]
VMIN = 3
VMAX = 10
min1 = min2 = VMAX+1
max1 = max2 = VMIN-1
totale = 0
for voto in VOTI:
totale += voto
if(voto < min1):
min2 = min1
min1 = voto
elif(voto < min2):
min2 = voto
if(voto > max1):
max2 = max1
max1 = voto
elif(voto > max2):
max2 = voto
totale = totale-(min1+min2+max1+max2)
N = len(VOTI)
media = totale//(N-4)
print(media)
Soluzione 2
I voti da elaborare non sono più di 1000, non è strettamente necessario utilizzare il primo algoritmo.
Se i voti sono ordinati è sufficiente escludere dalla somma i primi 2 e gli ultimi 2.
Complessità dell’algoritmo: ![]()
VOTI = [3, 7, 8, 4, 4, 9, 6, 8, 7, 6]
VOTI.sort()
N = len(VOTI)
totale = 0
for i in range(2,N-2):
voto = VOTI[i]
totale += voto
media = totale//(N-4)
print(media)
Soluzione 3
Usa la funzione predefinita sum() applicata alla sottolista
VOTI = [3,7,8,4,4,9,6,8,7,6]
VOTI.sort()
N = len(VOTI)
totale = sum(VOTI[2:N-2])
media = totale//(N-4)
print(media)
Versione OII
f = open("input.txt", "r")
sDati = f.readlines()
f.close()
N = int(sDati[0])
sVoti = sDati[1].split()
VMIN = 3
VMAX = 10
min1 = min2 = VMAX+1
max1 = max2 = VMIN-1
totale = 0
for i in range(N):
voto = int(sVoti[i])
totale += voto
if(voto < min1):
min2 = min1
min1 = voto
elif(voto < min2):
min2 = voto
if(voto > max1):
max2 = max1
max1 = voto
elif(voto > max2):
max2 = voto
totale = totale-(min1+min2+max1+max2)
media = totale//(N-4)
ris = str(media)
f = open("output.txt", "w")
f.write(ris)
f.close()