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 nel main
  • realizza una funzione leggi_voti all'interno della quale sarà riempito il vettore vet leggendo n 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 funzione chist 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 restituire void (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 chiamare stampa_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 funzione chist 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 chiamare minimo 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 funzione frequenze
  • 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
  • la stampa delle frequenze avvenga con un ciclo for nel main, 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 funzione chist 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 chiamare max_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.