edutecnica

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.