Media dei voti

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

InputOutput
1°3 7 8 4 4 9 6 8 7 66
2°4 4 5 5 3 35

Soluzione 1

Si tratta di una media troncata.

Si scorre la lista di voti e per ogni voto

  1. si somma al totale
  2. si decide se è più basso di uno dei 2 minimi attuali
  3. 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: O(n)

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: O(n \log n)

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()