Appello di Laboratorio di programmazione dell’8 febbraio 2021

Alcune osservazioni

Osservazioni

Leggete queste e quelle dell’appello scorso (qui), avete ripetuto errori già segnalati la volta scorsa. Se avete dubbi o non capite, chiedete, siete qui per imparare (e se non volete imparare, investite meglio il vostro tempo).

Test e oracoli

     +++ Output:
     required integer value
     +++ Expected output:
     required integer value
     
      \>>> FAIL!

Opzione ritirato.txt

Per chi pensa che serva a qualcosa “provare” un esame, è una gran perdita di tempo, e non solo per voi, ma anche per noi e per i vostri compagni, pensateci due volte prima di farlo (di nuovo).

Se lo fate per allenarvi, avete già abbastanza materiale a disposizione; se lo fate nella speranza di passare (impreparati) un esame che è propedeutico ad altri, non state pretendendo da voi stessi e da noi quello per cui state pagando e incontrerete difficoltà con gli esami successivi.

Detto questo, se proprio non riuscite a resistere alla tentazione, investite bene il vostro tempo: meglio pochi esercizi ben fatti che tutti NC/TESTNC/TESTFAIL (davvero troppi a questo appello) e optate per ritirarvi quando è il caso. Non ci dovrebbe essere nessun esito SNF né S, che indicano non solo impreparazione ma anche inconsapevolezza della propria impreparazione.

Alcuni chiarimenti

Calcolo di min e/o max

Cose da evitare

for i = ... {
    a, _ = strconv.Atoi(os.Args[i])
    b, _ = strconv.Atoi(os.Args[i+1])
    ...
}

In questo modo ogni elemento della sequenza (tranne il primo) viene converito due volte: una prima come elemento i+1-esimo, e di nuovo al ciclo successivo, quando è l’elemento i-esimo. Infatti si convertono 0-esimo e primo, poi primo e secondo, e così via.

if frequenza > max {
    max = frequenza
} else if { // <--qui ci va else poiché la frequenza NON può essere contemporaneamente > max e < min
    frequenza < min 
    min = frequenza
}

Ovviamente occorre aver inizializzato correttamente min e max.

if len(os.Args)!=2 {
    fmt.Println("too few arguments")
  }

senza break/exit/return!

for i:=0; i<n; i++ {
   if i==0 || i==n-1 { //<--- blocco 1 solo per la prima e/o ultima iterazione
       blocco 1
   } else {
       blocco 2
   }
}

E allora si può scrivere codice più efficiente e leggibile, evitando n-2 controlli inutili:

    blocco 1
    for i:=1; i<n-1; i++ { //tolgo la prima e l'ultima iterazione
       blocco 2
    }
    blocco 1

Ci sono tante varianti, ma l’idea è sempre la stessa, l’uso dell’if per gestire tendenzialmente solo il primo e/o l’ultimo caso può essere evitato.

Aspetti fuori (mio) controllo

Per concludere, evitiamo che questa vignetta vi riguardi.

I requisiti per passare l’esame di programmazione (e in generale un esame) sono, oltre alle conoscenze disciplinari dell’esame, alcune conoscenze di base:

A questo appello ad esempio abbiamo dato per scontato che sapeste (scuola del I ciclo)