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

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

  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)

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