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