Esercizio 6
Dato un vettore T[n], già contenente le n=10
temperature giornaliere di una città scrivi un programma che contenga una
procedura che riceve il vettore T[n] e restituisce
la temperatura media, la massima e la minima nel corso dei 10 giorni.
Il programma deve anche contenere una procedura che restituisce il numero
totale dei giorni in cui la temperatura è risultata compresa fra 15° e 25°C.
La prima procedura deve restituire 3 valori il max, il min e la media delle temperature, ma in linguaggio C una funzione può solo restituire un solo valore, a meno che non pensiamo di usare una funzione a void con le tre variabili max, min e med passate per indirizzo che nel programma chiamante saranno inizializzate a 0. Chiameremo tale funzione:valori( ). La seconda procedura non pone problemi; ricevuto il vettore T[n] dovrà solo restituire un valore intero; chiameremo tale funzione: giorni( ).
#include<iostream>
using namespace std;
const int n=10;
int giorni(int Y[n]);//prototipo
void valori(int X[n],float &MED,int &MAX,int &MIN);//prototipo
main(){
int i,T[n]={ 17,26,12,18,19,22,14,20,21,29 };
int max=0,min=0; float med=0;
for(i=0;i < n;i++)
cout << " " << T[i];//stampo a video T
cout << endl;
//chiamata alla f.ne valori( )
valori(T,med,max,min);
cout << max << " " << min << " " << med << endl;
cout << giorni(T); //chiamata alla f.ne giorni( )
}//fine main
void valori(int X[n],float &MED,int &MAX,int &MIN){
int somma=0,j;
//calcolo della media
for(j=0;j < n;j++)somma+=X[j];
MED=(float)somma/n;
//calcolo massimo
for(j=0;j < n;j++)
if(j==0)MAX=X[j];
else if(X[j] > MAX)MAX=X[j];
//calcolo minimo
for(j=0;j < n;j++)
if(j==0)MIN=X[j];
else if(X[j] < MIN)MIN=X[j];
}//fine valori
int giorni(int Y[n]){
int i,g;//i contatore
//g num. giorni con temp.compresa fra 15 e 25
for(i=0;i < n;i++)
if((Y[i] <=25) && (Y[i] >=15))g++; return
g;
}
dovendo passare le tre variabili max, min
e med alla funzione valori( ) per
indirizzo le dichiariamo nel main( ) come variabili
intere.
Notiamo come la funzione void valori() viene chiamata
in modo standard, cioè nello stesso modo del passaggio di parametri per
valore:
valori(T,med,max,min);
Il fatto che le tre variabili max, min
e med siano passate per riferimento lo si deduce
solo da come è scritta la segnatura della funzione valore:
void valori(int X[n],float &MED,int &MAX,int &MIN);
&MED significa che la la funzione riceve l'indirizzo
della cella di memoria della variabile med del programma
principale main( ); la funzione valore(
) può, a questo punto, modificare il contenuto di tale cella attraverso
l'identificatore MED; per la funzione valore(
) quindi:
&MED è l'indirizzo della cella di memoria della variabile
med del main( ).
MED è il contenuto della cella di memoria della variabile
med del main( ).
Le stesse considerazioni valgono per le variabili min
e max.
Per il vettore T queste considerazioni non hanno
senso:in linguaggio C i vettori vengono passati alle funzione sempre per
indirizzo.
Notiamo come la funzione giorni( ) sia dotata (al
contrario di valore( )) dell'istruzione return.
Nel programma principale non è necessario affidare il risultato ritornato
da giorni( ) ad una variabile.L'istruzione:
cout << giorni(T);
dimostra che la funzione giorni( ) (col suo risultato)
può essere usata direttamente come una qualsiasi variabile.