Memorizzazione in un vettore

Progettare e implementare in linguaggio C un programma che acquisisca da tastiera un numero n. Se n <= 0 o se n > 100 stampi a video il testo

[RISULTATO]
errore

e termini immediatamente.

Se invece n > 0 e n <= 100, allora il programma deve acquisire e memorizzare esattamente n numeri interi inseriti da tastiera. Ogni numero corrisponde al voto di un esame universitario. Il valore di un voto è considerato valido se è contenuto nell'intervallo [18, 30]. I voti non validi eventualmente immessi devono essere scartati e non contribuiscono al conteggio dei voti inseriti.

Una volta letti i voti, si utilizzino i valori memorizzati per rispondere alle richieste presentate di seguito.

NOTA: in fondo a questa pagina sono fornite le indicazioni per il test automatico con l'uso di pvcheck.

Suggerimenti

  • Dal momento che l'operazione di lettura deve essere svolta per almeno n volte, va utilizzato un ciclo per ripetere le istruzioni necessarie (i cicli sono presentati in S4.6, S4.7 e S4.8).

DOMANDA: perché il ciclo di lettura deve essere eseguito per almeno n volte?

Scopri perché »
  • Benché possano essere usati tutti e tre i tipi di ciclo del C, tieni presente che il ciclo for (S4.6) viene usato tipicamente quando si conosce il numero di iterazioni da svolgere, pertanto in questo caso è meglio optare per un ciclo while (S4.7) o do-while (S4.8).
  • Utilizza un vettore per memorizzare i valori letti (i vettori sono spiegati in S5.9).

DOMANDA: ogni volta che si dichiara un vettore bisogna dichiararne la dimensione, cioè il numero massimo di elementi memorizzabili; quanti elementi dovrà contenere al massimo il vettore necessario per risolvere questo esercizio?

Verifica la risposta esatta »
  • Dichiara una variabile intera da usare come contatore per memorizzare quanti valori validi sono stati letti; usa un costrutto condizionale (S4.3) per verificare le condizioni per l'incremento
  • il valore del contatore verrà incrementato solo se viene inserito un voto valido
  • La variabile contatore può essere opportunamente utilizzata come indice del vettore, cioè per contenere la posizione del vettore nella quale inserire il voto valido appena letto.
  • É possibile utilizzare le macro (#define, vedi S3.1)) per definire i termini che rappresentano dei numeri significativi nel programma, per esempio i limiti relativi al massimo numero di voti inseribili, oppure i limiti dell'intervallo dei voti validi, evitando l'introduzione di numeri magici nel programma

Richieste

1) Valori memorizzati

Il programma stampi a video i voti memorizzati usando il seguente formato:

[VALORI]
19
28
24

assumendo che i voti validi inseriti siano stati 19, 28 e 24.

Suggerimenti

  • Si può utilizzare un ciclo for per stampare tutti i valori memorizzati nel vettore (il ciclofor è spiegato in S4.6).
  • Utilizzare la variabile contatore del ciclo per indicizzare l'elemento del vettore da stampare.
  • Si ricordi che i vettori vanno indicizzati partendo da zero (vedi S5.9.1).

2) Minimo

Il programma stampi a video il minimo dei voti memorizzati usando il formato:

[MINIMO]
19

Suggerimenti

  • Per calcolare il minimo si devono esaminare tutti i valori del vettore.
  • Utilizza una variabile (es. min) che tenga traccia del valore minimo corrente durante il ciclo.
  • Un ciclo for (S4.6) può essere usato per scorrere tutti i valori memorizzati nel vettore.
  • L'algoritmo migliore per calcolare il minimo è
    • assegnare a min il valore del primo elemento del vettore
    • per ciascuno dei valori seguenti elementi nel vettore, indicando con vet[i] l'i-esimo elemento, se vet[i] < min allora si assegna min = vet[i], altrimenti di prosegue ad esaminare l'elemento successivo; per effettuare queste operazioni servirà l'uso di un costrutto if, presentato in S4.3.

3) Frequenze

Il programma stampi a video le frequenze di occorrenza dei voti memorizzati usando il formato:

[FREQUENZE]
0
1
0
0
0
0
1
0
0
0
1
0
0

Nella prima riga si riporti le frequenze dei 18, nella seconda le frequenze dei 19, ecc.

Suggerimenti

  • Le frequenze (o istogramma) sono il conteggio di quante volte compaiono i numeri 18, 19, ..., 30.
  • Per poter memorizzare questo conteggio, l'ideale è usare un vettore di numeri interi (chiamalo per esempio freq), in cui ciascun elemento memorizza il conteggio per uno specifico valore.

DOMANDA: quale dimensione dovrà avere il vettore freq per memorizzare le frequenze dei voti?

Verifica la risposta esatta »
  • l'uso del vettore è tale per cui freq[0] conterrà il conteggio del voto 18, freq[1] quello dei 19, ... e freq[12] il conteggio dei 30
    • pertanto, se il voto corrente è contenuto nella variabile voto, l'elemento giusto del vettore freq da incrementare è freq[voto - 18], che si incrementa di uno con freq[voto - 18]++
    • infatti:
      • se voto vale 18, si incrementa freq[18 - 18], cioè freq[0]
      • se voto vale 19, si incrementa freq[19 - 18], cioè freq[1]
      • ...
      • se voto vale 30, si incrementa freq[30 - 18], cioè freq[12]

ATTENZIONE: ricorda che un vettore di 13 elementi può essere indicizzato da 0 a 12 compresi (vedi S5.9)

  • un esempio di calcolo delle frequenze è riportato in S6.8

    • ATTENZIONE: l'esempio indicato è applicato ad una stringa, ed è riportato nel capitolo relativo alle funzioni; pertanto occorre isolare opportunamente il codice che gestisce l'istogramma dal resto
  • attenzione all'inizializzazione dei valori del vettore

    • come tutte le variabili, un vettore non inizializzato contiene elementi i cui valori sono aleatori
    • l'inizializzazione dei vettori è illustrata in S5.9.2

4) Massima frequenza

Il prgramma stampi a video il voto con la massima frequenza usando il formato:

[MAXFREQ]
19

In caso più voti abbiano la stessa frequenza, si stampi il primo trovato.

Suggerimenti

  • Per trovare la massima frequenza bisogna trovare il valore massimo nel vettore utilizzato per calcolare l'istogramma.
  • Per il metodo che può essere impiegato per calcolare il massimo valore presente in un vettore, fare riferimento alla soluzione del punto (2) dove, invece di tenere traccia del minimo valore, si calcola il massimo.
  • Il metodo si applicherà al vettore delle frequenze, invece che a quello dei valori, ma l'algoritmo non cambia.

Verifica automatica

Utilizza pvcheck per testare il corretto funzionamento del programma (maggiori informazioni circa l'uso di pvcheck sono disponibili qui).

Il file contenente i test, da scaricare per utilizzare pvcheck, è vettori.test.

Il comando da eseguire per il test è il seguente:

pvcheck -f vettori.test ./a.out

Il riepilogo dovrà essere come il seguente:

SUMMARY
<program>:   4 successes,   0 warnings,   0 errors
FREQUENZE:   3 successes,   0 warnings,   0 errors
MAXFREQ  :   3 successes,   0 warnings,   0 errors
MINIMO   :   3 successes,   0 warnings,   0 errors
RISULTATO:   1 successes,   0 warnings,   0 errors
VALORI   :   3 successes,   0 warnings,   0 errors

Nella prossima pagina potrai esaminare un esempio di soluzione dell'esercizio.