Differenza dei valori nella colonna di una matrice

di il
10 risposte

Differenza dei valori nella colonna di una matrice

Ciao a tutti, stavo facendo questo esercizio ma non riesco a capire come funziona esattamente
metto anche il codice che ho scritto e che non funziona:

Scrivere un sottoprogramma che ricevuta in ingresso una matrice di valori interi di dimensione NxN
(con N pari a 5) calcola e restituisce l’indice della colonna in cui la massima differenza (in valore
assoluto) ottenuta tra due suoi elementi, sia massima. Nel caso ci sia più di una colonna con uguale
differenza massima, restituire l'indice della prima colonna trovata. Ad esempio, se il sottoprogramma
riceve la matrice:
2 5 10 15 18
11 7 7 20 15
5 5 7 11 22
6 1 3 16 19
7 1 2 10 18
Il sottoprogramma restituirà l’indice 3: tale colonna ha come massima differenza 10 (diff. tra 20 e 10),
ed è maggiore della differenza massima delle altre quattro colonne, rispettivamente 9, 6, 8 e 7.

#include <stdio.h>
#define N 3
int main(){
	
int matrice[N][N];	
int i;
int j;
int differenza=0;
int n[N];

	for(i=0;i<N;i++){
		for(j=0;j<N;j++){
		scanf("%d", &matrice[i][j]);
		}
	}
	
	for(i=0;i<N;i++){
	differenza=0;
		for(j=1;j<N;j++){
			differenza=matrice[i][i]-matrice[j][i];
			if(differenza<0){
				differenza=differenza*(-1);
				printf("%d ", differenza);
			}else{
			printf("%d ", differenza);
		}	
		}
	
	}
	
	return 0;
	
}

ho provato a fare un printf dopo la stringa:" differenza=matrice-matrice[j];"
per vedere che risultati mi dava, ed ovviamente ho sbagliato ed ho capito anche il problema...in pratica fa la differenza del primo termine con il secondo e poi di nuovo il primo con il terzo( fin qui giusto) poi però invece di fare la differenza del secondo con il terzo il programma passa alla colonna successiva e da li fa la differenza del secondo termine con il terzo e così via...
il problema è che non riesco a capire come fare a fare la differenza tra ogni termine della matrice, come dovrei ragionare?

ps. ho ridotto la grandezza della matrice a un 3x3 appositamente per vedere se funzionasse, so che dovrebbe essere una 5x5.

10 Risposte

  • Re: Differenza dei valori nella colonna di una matrice

    1) trova il massimo di ogni colonna i e memorizzalo in max[ i ]
    2) trova il minimo di ogni colonna i e memorizzalo in min[ i ]
    3) differenza_massima[ i ] = max[ i ] - min[ i ]
    4) trova l'indice i corrispondente al valore massimo di differenza_massima[]
  • Re: Differenza dei valori nella colonna di una matrice

    Non ci avevo ragionato o.o provo subito a lavorarci e ti faccio sapere, grazie mille per l'aiuto
  • Re: Differenza dei valori nella colonna di una matrice

    Weierstrass ha scritto:


    1) trova il massimo di ogni colonna i e memorizzalo in max[ i ]
    2) trova il minimo di ogni colonna i e memorizzalo in min[ i ]
    3) differenza_massima[ i ] = max[ i ] - min[ i ]
    4) trova l'indice i corrispondente al valore massimo di differenza_massima[]
    piccolo aggiornamento, con un problema:
    
    #include <stdio.h>
    #define N 3
    int main(){
    	
    int matrice[N][N];	
    int i;
    int j;
    int differenza=0;
    int massimo[N];
    int minimo[N];
    int max;
    int min;
    
    	for(i=0;i<N;i++){
    		for(j=0;j<N;j++){
    		scanf("%d", &matrice[i][j]);
    		}
    	}
    	
    	for(i=0;i<N;i++){
    		for(j=1;j<N;j++){
    		max=matrice[j][i];
    		if(max<matrice[j+1][i]){
    			max=matrice[j+1][i];
    				}
    		massimo[i]=max;
    		}
    	}
    
    	for(i=0;i<N;i++){
    		for(j=1;j<N;j++){
    		min=matrice[j][i];
    		if(matrice[j+1][i]<min){
    			min=matrice[j+1][i];
    				}
    		minimo[i]=min;
    		
    			}
    		}
    	for(i=0;i<N;i++){
    		printf("%d ", minimo[i]);
    	}
    
    	return 0;	
    }
    quando ricerco il minimo della colonna i valori che escono fuori sono sbagliati... e non riesco a capire il perché, non mi pare sia sbagliato il codice.
    per esempio quando inserisco:
    1 2 3 4 5 6 7 8 9
    il valore che esce è :
    -1 1 0

    sbaglio in qualche punto? il valore massimo me lo trova correttamente per ogni colonna...
  • Re: Differenza dei valori nella colonna di una matrice

    
    min = matrice[0][i];
    for(j=1;j<N;j++){
    [... continua tu...]
    }
    
    Perché non usi un debugger? Hai bisogno di vedere passo passo quello che succede per chiarirti le idee
  • Re: Differenza dei valori nella colonna di una matrice

    Perché non ho mai imparato ad utilizzarne uno, non mi è chiaro il funzionamento anche se ho provato a cercare online...

    comunque ho proseguito con il programma ma ora sorge un errore alla fine...
    #include <stdio.h>
    #define N 3
    int main(){
    	
    int matrice[N][N];	
    int i;
    int j;
    int differenza[N];
    int massimo[N];
    int minimo[N];
    int max;
    int min;
    int risultato;
    
    
    	for(i=0;i<N;i++){
    		for(j=0;j<N;j++){
    		scanf("%d", &matrice[i][j]);
    		}
    	}
    	
    	for(i=0;i<N;i++){
    		
    		max=matrice[0][i];
    		
    		for(j=1;j<N;j++){
    		
    		if(max<=matrice[j][i]){
    			max=matrice[j][i];
    				}
    		massimo[i]=max;
    		}
    	}
    	
    	for(i=0;i<N;i++){
    		min = matrice[0][i];
    		for(j=1;j<N;j++){
    			if(matrice[j][i]<=min){
    				min=matrice[j+1][i];
    			
    					}
    		minimo[i]=min;
    		
    			}
    		}
    	
    	for(i=0;i<N;i++){
    		differenza[i]=massimo[i]-minimo[i];
    	}
    	for(i=0;i<N;i++){
    		printf("%d ", differenza[i]);
    	}
    	
    
    		risultato=differenza[0];
    		
    	for(i=1;i<N;i++){
    		if(risultato<=differenza[i]){
    			risultato=differenza[i];
    		}
    	}
    	
    	printf("%d", risultato);
    	
    	return 0;
    	
    }
    se utilizzo i numeri:
    1 2 3 4 5 6 7 8 9

    il valore risultato mi compare come:
    6 6 6 6

    perché mi restituisce 4 numeri?


    edit: scusa mi sono appena accorto di aver inserito una printf e di non averla cancellata... ecco perché comparivano altri 3 sei, scusa sono fuso
  • Re: Differenza dei valori nella colonna di una matrice

    #include <stdio.h>
    #define N 5
    int main(){
    	
    int matrice[N][N];	
    int i;
    int j;
    int differenza[N];
    int massimo[N];
    int minimo[N];
    int max;
    int min;
    int risultato;
    
    
    	for(i=0;i<N;i++){
    		for(j=0;j<N;j++){
    		scanf("%d", &matrice[i][j]);
    		}
    	}
    	
    	for(i=0;i<N;i++){
    		
    		max=matrice[0][i];
    		
    		for(j=1;j<N;j++){
    		
    		if(max<=matrice[j][i]){
    			max=matrice[j][i];
    				}
    		massimo[i]=max;
    		}
    	}
    	
    	
    	for(i=0;i<N;i++){
    		min = matrice[0][i];
    		for(j=1;j<N;j++){
    			if(matrice[j][i]<=min){
    				min=matrice[j+1][i];
    			
    					}
    		minimo[i]=min;
    		
    			}
    		}
    	
    	
    	for(i=0;i<N;i++){
    		differenza[i]=massimo[i]-minimo[i];
    	}
    
    
    		risultato=differenza[0];
    		
    	for(i=1;i<N;i++){
    		if(risultato<differenza[i]){
    			risultato=differenza[i];
    		}
    	}
    	
    	for(i=0;i<N;i++){
    		if(differenza[i]==risultato){
    			printf("%d", i);
    			return 0;
    		}
    		
    	}
    	
    	return 0;
    	
    }
    programma completo, per chi è interessato questa è la soluzione.

    weierstrass posso chiederti una cosa? in questo punto del codice:
    for(i=0;i<N;i++){
    		if(differenza[i]==risultato){
    			printf("%d", i);
    			return 0;
    		}
    		
    	}
    	
    	return 0;
    	
    }
    utilizzo un return 0; per concludere il programma dopo che mi ha trovato la colonna in cui c'è il valore di differenza più alto... è corretto fare una cosa del genere? il programma funziona, ma ho l'impressione che sia un po' un "cheat".
    un "break;" sarebbe stato meglio?
  • Re: Differenza dei valori nella colonna di una matrice

    Va benissimo usare il return al posto del break per accorciare l'esecuzione
  • Re: Differenza dei valori nella colonna di una matrice

    Salve,
    a scopo esercitativo ci ho provato anch'io. Ho provato con tre cicli for annidati. Sembra funzionare.
    
    
    for(k=0; k<5; k++){
    	max[k]= abs(matrice[0][k] - matrice[1][k]);
    for(j=0; j<5; j++)		
    for(i=0; i<5; i++){
    		if (abs(matrice[j][k]- matrice[i][k])> max[k])  max[k] =abs(matrice[j][k] - matrice[i][k]);	
    					
    			}		printf("\nDifferenza massima (assoluta) della riga %d e' %d:", k, max[k]); 
    			}		
    E' una soluzione corretta? O cmq da scartare? Manca il confronto tra il max delle varie colonne.
  • Re: Differenza dei valori nella colonna di una matrice

    Va bene a parte il fatto che non puoi usarla nel caso 1x1 così come l'hai scritta (dovresti inizializzare max[k]=0; ).

    La controindicazione è che il tempo di computazione diventa cubico invece che quadratico, ma questo è un argomento avanzato e comunque incide per N molto grandi
  • Re: Differenza dei valori nella colonna di una matrice

    Ok, grazie.
Devi accedere o registrarti per scrivere nel forum
10 risposte