Le funzioni
Realizzare un programma in linguaggio C che acquisisca da tastiera un numero n
.
Se n <= 0
o se n > 100
stampi a video la stringa:
[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. Si implementi il programma scrivendo una funzione per risolvere ciascun punto dell'esercizio.
NOTA: in fondo a questa pagina sono fornite le indicazioni per il test automatico con l'uso di pvcheck
.
Suggerimenti
Alcuni suggerimenti per l'impostazione dell'esercizio sono illustrati tra quelli forniti per il tutorial sui vettori. Di seguito sono riportati i suggerimenti specifici per l'uso delle funzioni.
Realizza una funzione dedicata per calcolare il risultato di ciascuno dei punti richiesti.
Le funzioni devono solo svolgere il compito strettamente indispensabile; la stampa dei risultati (tranne casi specifici) deve avvenire nella funzione chiamante, ovvero nel main
.
Può essere utile realizzare anche una funzione per la lettura dei voti:
- il numero di voti
n
che verranno inseriti va letta nelmain
- realizza una funzione
leggi_voti
all'interno della quale sarà riempito il vettorevet
leggendon
valori; la dichiarazione può essere come segue:
void leggi_voti(int vet[], int n);
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
Per suggerimenti relativi al codice da inserire nella funzione si può fare riferimento alla domanda corrispondente nel tutorial sui vettori.
Per quanto riguarda la realizzazione della funzione:
- implementare una funzione (es.
stampa_vettore
) che prenda in input un vettore di interi e ne stampi i valori, uno per riga (un esempio di passaggio di un vettore ad una funzione è usato nella funzionechist
in S6.8) - per creare una funzione generica, è bene che il numero di elementi del vettore sia passato come argomento alla funzione, oltre al vettore di elementi; per esempio:
void stampa_vettore(int vet[], int n);
- non è necessario che la funzione
stampa_vettore
ritorni alcun valore; può quindi restituirevoid
(vedi S6.2) - la funzione dovrà solo stampare l'elenco dei numeri;
- non stampare il marcatore all'interno della funzione: questo rende la funzione più generale e riutilizzabile per la stampa di altri vettori, se necessario
- il marcatore venga stampato nella funzione
main
prima di chiamarestampa_vettore
2) Minimo
Stampi a video il minimo dei voti memorizzati usando il formato:
[MINIMO]
19
Suggerimenti
Per suggerimenti relativi al codice da inserire nella funzione si può fare riferimento alla domanda corrispondente nel tutorial sui vettori.
Per quanto riguarda la realizzazione della funzione:
- implementare una funzione (es.
minimo
) che prenda in input un vettore di interi e restituisca il minimo dei valori presenti nel vettore (un esempio di passaggio di un vettore ad una funzione è usato nella funzionechist
in S6.8) - per creare una funzione generica, è bene che il numero di elementi del vettore sia passato come argomento alla funzione, oltre al vettore di elementi; per esempio:
int minimo(int vet[], int n);
- per restituire il valore desiderato si usi l'istruzione
return
(S6.3) - la funzione dovrà solo restituire il valore minimo; la stampa del valore venga fatta nel
main
- non stampare il marcatore all'interno della funzione: questo rende la funzione più generale e riutilizzabile per la stampa di altri vettori, se necessario
- il marcatore venga stampato nella funzione
main
prima di chiamareminimo
e di stamparne il valore restituito
3) Frequenze
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
Per suggerimenti relativi al codice da inserire nella funzione si può fare riferimento alla domanda corrispondente nel tutorial sui vettori.
Per quanto riguarda la realizzazione della funzione:
- un esempio di calcolo delle frequenze è riportato in (S6.8)
- creare una funzione
frequenze
che riceve tre parametri: i numeri di cui calcolare la frequenza, il numero di elementi del vettore, e il vettore delle frequenze; esempio;
void frequenze(int vet[], int n, int freq[]);
- tutti i parametri devono essere dichiarati nel
main
che chiama la funzionefrequenze
- attenzione all'inizializzazione dei valori del vettore
- va fatta nel
main
- come tutte le variabili, un vettore non inizializzato contiene elementi i cui valori sono aleatori
- l'inizializzazione dei vettori è illustrata in S5.9.2
- va fatta nel
- la stampa delle frequenze avvenga con un ciclo
for
nelmain
, dopo aver stampato il marcatore
4) Massima frequenza
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 suggerimenti relativi al codice da inserire nella funzione si può fare riferimento alla domanda corrispondente nel tutorial sui vettori.
Per quanto riguarda la realizzazione della funzione:
- implementare una funzione (es.
max_indice
) che prenda in input un vettore di interi e restituisca l'indice del primo valore massimo tra i valori presenti nel vettore (un esempio di passaggio di un vettore ad una funzione è usato nella funzionechist
in S6.8) - per creare una funzione generica, è bene che il numero di elementi del vettore sia passato come argomento alla funzione, oltre al vettore di elementi; per esempio:
int max_indice(int vet[], int n);
- per restituire il valore desiderato si usi l'istruzione
return
(S6.3) - la funzione dovrà solo restituire l'indice del valore massimo; la stampa del valore venga fatta nel
main
- non stampare il marcatore all'interno della funzione: questo rende la funzione più generale e riutilizzabile per la stampa di altri vettori, se necessario
- il marcatore venga stampato nella funzione
main
prima di chiamaremax_indice
e di stamparne il valore restituito
Verifica automatica
Si utilizzi il tool pvcheck
di verifica automatica per testare il corretto funzionamento del programma (maggiori informazioni circa l'uso di pvcheck
sono disponibili qui).
Dal momento che le richieste sono le medesime, il file contenente i test è vettori.test, lo stesso utilizzato per il tutorial sui vettori.
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.