Ho seguito il consiglio di @loopunrolling e penso che ora il programma vada decisamente meglio.
Ho solo un piccolo dubbio: come posso sommare anche i valori intermedi tra un raggio e un'altro?
Per esempio
Per R=2 il file di uscita scritto dal programma sarà:
3 4
40 54 48 42
21 24 15 18
24 30 24 25
Questo è il programma attuale
#include <stdio.h>
#include <stdlib.h>
#define RMAX 20
#define CMAX 20
#define CMAS 60
#define RMAS 60
int main()
{
int matr[RMAX][CMAX],risul[RMAX][CMAX],matr2[RMAS][CMAS]={0};
int nr,nc,i,j,R,w,q;
FILE *fin=fopen("matrice.txt","r");
FILE *fout=fopen("risultato.txt","w");
fscanf(fin,"%d %d",&nr,&nc);
printf("Digitare il valore del raggio R: ");
scanf("%d",&R);
printf("Matrice presa da file:\n");
printf("%d %d",nr,nc);
for(i=0;i<nr;i++)
{
for(j=0;j<nc;j++)
{
fscanf(fin,"%d",&matr[i][j]);
if(j%nc==0)
{
printf("\n");
}
printf("%d ",matr[i][j]);
}
}
printf("\n\n");
for(i=R,w=0;i<R+nr && w<nr;i++,w++)
{
for(j=R,q=0;j<R+nc && q<nc ;j++,q++)
{
matr2[i][j]=matr[w][q];
}
}
printf("La matrice nel FILE di uscita sara':\n");
printf("%d %d\n",nr,nc);
for(q=0,i=R;i<R+nr && q<nr;i++,q++)
{
for(j=R,w=0;j<R+nc && w<nc;j++,w++)
{
risul[q][w]=matr2[i][j+R]+matr2[i-R][j+R]+matr2[i-R][j]+matr2[i][j-R]+matr2[i-R][j-R]+
matr2[i+R][j+R]+matr2[i+R][j]+matr2[i+R][j-R];
printf("%d ",risul[q][w]);
if(w==nc-1)
{
printf("\n");
}
}
}
fclose(fin);
fclose(fout);
return 0;
}