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
Nella prima riga del file input.txt è presente l’intero N, il numero di studenti che hanno sostenuto il compito.
Nella seconda riga si trovano invece N interi a1, a2, …, aN rappresentanti i voti attribuiti ai compiti.
Dati di output
Stampare sulla prima riga del file output.txt il voto medio della classe.
Assunzioni
- 5 ≤ N ≤ 1000.
- 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.txt | output.txt |
+----+---------------------+------------+
| 1° | 10 | 6 |
| | 3 7 8 4 4 9 6 8 7 6 | |
+----+---------------------+------------+
| 2° | 6 | 5 4 |
| | 4 4 5 5 3 3 | |
+----+---------------------+------------+
Si tratta di una media troncata.
Soluzione 1
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)
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()
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)