Buon giorno a tutti, mi sono imbattuto nel seguente problema:
codice:
Media aritmetica tra elementi adiacenti in una matrice
------------------------------------------------------

Scrivere un programma che:
1. legga da terminale una matrice quadrata di numeri reali mat_in
   di dimensione predefinita MAX
2. calcoli una seconda matrice (mat_med) in cui ciascun elemento
   (i, j) è un numero reale uguale alla media aritmetica dei valori
   presenti nella prima matrice nelle otto caselle adiacenti
   all'elemento (i, j).
 
Per gli elementi sui "bordi" della matrice la media va fatta
utilizzando solo gli elementi adiacenti che appartengono alla
matrice. 
La soluzione utilizzi due funzioni:
1. media: per il calcolo del valore medio degli elementi adiacenti
   a ciascun elemento della matrice
2. dentro: richiamata dalla funzione media per verificare se un
   certo elemento è interno alla matrice oppure no.

Esempio
-------

Se la matrice di ingresso è la seguente:

1  2  3
4  5  6
7  8  9

la matrice prodotta sarà:

3.66  3.80  4.33
4.60  5.00  5.40
5.66  6.20  6.33
e nella seguente soluzione:
codice:
#include <stdio.h>
#define MAX 3
#define TRUE 1
#define FALSE 0

int dentro(int x, int y);
float media(int x, int y);

float mat[MAX][MAX],mat_med[MAX][MAX];
main()
{
   
   int x,y;
   
   for (x=0; x<MAX; x++){
       for (y=0; y<MAX; y++){
          printf("mat[%d][%d] = ",x+1,y+1);
          scanf("%f",&mat[x][y]);
       }
   }

printf("\n\n");
   
//Calcolo della media
   for (x=0; x<MAX; x++)
       for (y=0; y<MAX; y++)
           mat_med[x][y] = media(x,y);

// visualizza risultato
for (x=0; x<MAX; x++)
   {
   for (y=0; y<MAX; y++)
      printf ("%6.2f", mat_med[x][y]);
   printf ("\n");
   }


   
getch();
}

int dentro(int x, int y)
{
  if (x<0 || x>=MAX)
     return FALSE;
  if (y<0 || y>=MAX)
     return FALSE;
  else
     return TRUE;
}
      

float media(int x, int y)
{
  int i, j, conta=0;
  float somma=0;  

  
  for (i=-1; i<2; i++)
   for (j=-1; j<2; j++)

      /* scandisce gli elementi interni alla matrice
         tranne l'elemento stesso */
      if ( ((i!=0)||(j!=0)) && dentro (x+i, y+j) == TRUE )
         {
         conta++;
         somma += mat[x+i][y+j];
         }
         
return (somma/conta);
}
ora vi chiederete di che altro hai bisogno?

Non sono riuscito a capire l'ultima funzione cioè dove calcola la media che stratagemma è stato utilizzato perchè i contatori partono da -1? e così via.. perchè è stato risolto in questo modo? e perchè sono così scemo da non arrivarci

grazie