Esercizio: Calcolo della Media e della somma degli elementi di un Array

Esercizio

Vogliamo realizzare una funzione chiamata media_somma.

Questa funzione ha come tipo di ritorno void e prende in ingresso i seguenti parametri:

  • Un array a di tipo double con i valori su cui operare;
  • Un intero n contenente il numero di elementi dell'array;
  • Un puntatore ad un double che conterrà la media degli elementi dell'array: media;
  • Un puntatore ad un double che conterrà la somma degli elementi dell'array: somma.

La firma della funzione sarà:

void media_somma(double a[], int n, double *media, double *somma);

Implementazione

Proviamo ad implementare la funzione.

Dai requisiti descritti sopra la funzione utilizza due puntatori per restituire i risultati di somma e media dell'array.

Una possibile implementazione è la seguente:

void media_somma(double a[], int n, double *media, double *somma) {
    int i;

    /* Inizializza la somma al primo elemento dell'array */
    *somma = a[0];

    for (i = 1; i < n; ++i) {
        *somma += a[i];
    }

    *media = *somma / ((double) n);
}

Da notare che abbiamo ottimizzato l'implementazione in quanto la media è pari alla somma fratto il numero di elementi dell'array. Per cui la somma viene calcolata una sola volta mentre la media viene calcolata solo dopo il ciclo.

Programma completo

Proviamo adesso a scrivere un programma completo che legge 10 valori double da console e ne calcola somma e media.

#include <stdio.h>

void media_somma(double a[], int n, double *media, double *somma);

int main() {
    const int n = 10;
    int i;

    double a[n];

    double media, somma;

    /* Legge i valori da tastiera */
    for (i = 0; i < n; ++i) {
        printf("Inserisci il %d° valore: ", i + 1);
        scanf("%lf", &a[i]);
    }

    /* Calcola la media e la somma */
    media_somma(a, n, &media, &somma);

    /* Stampa i risultati */
    printf("La media è: %lf\n", media);
    printf("La somma è: %lf\n", somma);

    return 0;
}

void media_somma(double a[], int n, double *media, double *somma) {
    int i;

    /* Inizializza la somma al primo elemento dell'array */
    *somma = a[0];

    for (i = 1; i < n; ++i) {
        *somma += a[i];
    }

    *media = *somma / ((double) n);
}

Una possibile esecuzione del programma è la seguente:

Inserisci il 1° valore: 3.2
Inserisci il 2° valore: 1.2
Inserisci il 3° valore: 3.5
Inserisci il 4° valore: 6.7
Inserisci il 5° valore: 8.2
Inserisci il 6° valore: 5.6
Inserisci il 7° valore: 4.22
Inserisci il 8° valore: 5.1
Inserisci il 9° valore: 5.2
Inserisci il 10° valore: 9.4
La media è: 5.232000
La somma è: 52.320000