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?
- 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 ciclowhile
(S4.7) odo-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, sevet[i] < min
allora si assegnamin = vet[i]
, altrimenti di prosegue ad esaminare l'elemento successivo; per effettuare queste operazioni servirà l'uso di un costruttoif
, presentato in S4.3.
- assegnare a
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?
- l'uso del vettore è tale per cui
freq[0]
conterrà il conteggio del voto18
,freq[1]
quello dei19
, ... efreq[12]
il conteggio dei30
- pertanto, se il voto corrente è contenuto nella variabile
voto
, l'elemento giusto del vettorefreq
da incrementare èfreq[voto - 18]
, che si incrementa di uno confreq[voto - 18]++
- infatti:
- se
voto
vale18
, si incrementafreq[18 - 18]
, cioèfreq[0]
- se
voto
vale19
, si incrementafreq[19 - 18]
, cioèfreq[1]
- ...
- se
voto
vale30
, si incrementafreq[30 - 18]
, cioèfreq[12]
- se
- pertanto, se il voto corrente è contenuto nella variabile
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.