Salve a tutti, innanzitutto mi presento, mi chiamo Davide e sono un programmatore alle prime armi..mi ritrovo alle prese con un programma che qui di seguito espongo:
Scrivere un programma in linguaggio C che dopo aver acquisito da tastiera una matrice A di interi verifichi, per ogni elemento a[i][j], se è un divisore della somma s degli elementi ad esso adiacenti e, in caso affermativo, sostituisca a[i][j] con s/a[i][j]. La scansione della matrice deve quindi continuare nell'ordine stabilito e ripartire dall'inizio finchè nessun elemento verifichi la condizione sopra detta o comunque dopo un fissato numero massimo di iterazioni. Si visualizzi, ad ogni sostituzione, la matrice come risulta prima e dopo la sostituzione stessa.
Sono riuscito ad elaborare il seguente codice:
#include <stdio.h>
# define nmax 10
# define mmax 10
void visualizza(int[][mmax],int,int);
void carica(int[][mmax],int *,int *);
void calcola_somma(int[][mmax],int,int,int [][mmax]);
int calcola_somma_up(int v[][mmax],int,int,int,int);
int calcola_somma_down(int v[][mmax],int,int,int,int);
int calcola_somma_left(int v[][mmax],int,int,int,int);
int calcola_somma_right(int v[][mmax],int,int,int,int);
void confronto(int[][mmax],int[][mmax],int,int);
int main(){
int v[nmax][mmax];
int n,m,s,p[nmax][mmax];
carica(v,&n,&m);
visualizza(v,n,m);
calcola_somma(v,n,m,p);
confronto(v,p,n,m);
getchar();
getchar();
}
void carica(int v[][mmax],int *n,int *m){ //caricamento matrice
int i,j;
do{
printf("\ninserisci numero righe: ");
scanf("%d",n);
}while(*n<=0 || *n>nmax);
do{
printf("\ninserisci numero colonne: ");
scanf("%d",m);
}while(*m<=0 || *m>mmax);
for(i=0;i<*n;i++)
for(j=0;j<*m;j++){
printf("\ninserisci matrice[%d][%d]: ",i,j);
scanf("%d",&v[i][j]);}
}
void visualizza(int v[][mmax],int n,int m){ //visualizzazione matrice
int i,j;
printf("\n\n");
for(i=0;i<n;i++){
printf("\n");
for(j=0;j<m;j++)
printf("%4d",v[i][j]);
}
}
void confronto(int v[][mmax], int p[][mmax],int n,int m){
int i,j,k=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
if(p[i][j]%v[i][j]==0){
k++;
printf("\n\nmatrice prima della %d^ sostituzione:",k);
visualizza(v,n,m); //matrice prima della sostituzione
printf("\n\n");
v[i][j]=p[i][j]/v[i][j];
printf("matrice dopo la %d^ sostituzione:",k);
visualizza(v,n,m);}} //matrice dopo la sostituzione
confronto(v,p,n,m); //fa ripartire la scansione (e provoca l'errore)
}
int calcola_somma_up(int v[][mmax],int n,int m,int i,int j){ //se i=0
int s;
if(j=0)
s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
if(j=m-1)
s=s+v[i+1][j]+v[i+1][j-1]+v[i][j-1];
if(0<j<m-1)
s=s+v[i][j-1]+v[i+1][j-1]+v[i+1][j]+v[i+1][j+1]+v[i][j+1];
return s;
}
int calcola_somma_down(int v[][mmax],int n,int m,int i,int j){ //se i=n
int s;
if(j=0)
s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1];
if(j=m-1)
s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
if(0<j<m-1)
s=s+v[i][j+1]+v[i-1][j+1]+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
return s;
}
int calcola_somma_left(int v[][mmax],int n,int m,int i,int j){ //se j=0
int s;
if(i=0)
s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
if(i=n-1)
s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1];
if(0<i<n-1)
s=s+v[i-1][j]+v[i-1][j+1]+v[i][j+1]+v[i+1][j+1]+v[i+1][j];
return s;
}
int calcola_somma_right(int v[][mmax],int n,int m,int i,int j){ //se j=m
int s;
if(i=0)
s=s+v[i+1][j]+v[i+1][j-1]+v[i][j-1];
if(i=n-1)
s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1];
if(0<i<n-1)
s=s+v[i-1][j]+v[i-1][j-1]+v[i][j-1]+v[i+1][j-1]+v[i+1][j];
return s;
}
void calcola_somma(int v[][mmax],int n,int m,int p[][mmax]){
int i,j,s;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
s=0;
{if(i=0)
s=calcola_somma_up(v,n,m,i,j);
if(i=n-1)
s=calcola_somma_down(v,n,m,i,j);
if(j=0)
s=calcola_somma_left(v,n,m,i,j);
if(j=m-1)
s=calcola_somma_right(v,n,m,i,j);
else s=s+v[i][j+1]+v[i+1][j+1]+v[i+1][j]+v[i+1][j-1]+v[i][j-1]+v[i-1][j-1]+v[i-1][j]+v[i-1][j+1];}
p[i][j]=s;}
}
Però quando lo mando in esecuzione non da i risultati giusti, da dei numeri enormi..se non chiedo troppo potrei sapere perchè?
Inoltre non capisco perchè (durante l'esecuzione)quando arriva il momento in cui dovrebbe essere richiamata ricorsivamente la funzione "confronto" appare l'errore di windows..(io uso Dev C++)
Ringrazio anticipatamente chiunque voglia darmi una mano e complimenti per il forum!
![]()