Esercizio No. 6 Funzioni

Esercizio No. 6 Funzioni

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 voidvalori() 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.

Commento all'articolo