Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

di il
4 risposte

Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

Salve ragazzi!! Vi posto questo codice, data una matrice N*N dovrebbe sommare gli elem. della diagonale principale e secondaria e salvare tali somme all'interno di un vettore di cardinalità N!! La somma degli elm. della diagonale principale viene eseguita mentre quella della diagonale secondaria no!! Potreste darmi un piccolo aiuto??

#include<iostream>
using std::cout;
using std::cin;
#include<cstdlib>
#include<iomanip>
using std::setw;

void Leggi_mat( int *a, int N){
	
	
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			cout<<"\nInserisci elemento a["<<i<<"] ["<<j<<"] : ";
			cin>>a[i*N+j];
		}
	}
	
	cout<<"\nLa matrice caricata vale: \n";
	
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++)
			cout<<setw(5)<<a[i*N+j];
			cout<<"\n";
}

return;
}

void Somma_vet(int *a,int *vettore, int N){

	for(int i=0;i<N;i++){
		for(int nc=0;nc<N;nc++){
		
			if(i==nc){
			
			
			vettore[nc]+=a[i*N+nc];
		}
	else if(i==N-1-nc){
			vettore[nc]+=a[i*N-1+nc];
		}
}

}
	cout<<"Il vettore vale: \n";
	for(int i=0;i<N;i++){
		cout<<setw(5)<<vettore[i];
	}
	return;
}

int main() {
	int N;
	cout<<"Digita numero di righe ecolonne: ";
	cin>>N;
	int *a1;
	a1=(int*)malloc(N*N*sizeof(int));
		Leggi_mat(a1,N);
	int *vettore;
	vettore=(int*)calloc(N,sizeof(int));
	Somma_vet(a1,vettore,N);
	
	free(a1);
	free(vettore);
}

4 Risposte

  • Re: Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

    Scusa, magari ho capito male io, ma perchè fai 2 for:
       for(int i=0;i<N;i++){
          for(int nc=0;nc<N;nc++){
    
    secondo me ti basta fare solo un ciclo per i da 0 a N-1 prendendo in considerazione due elementi:
    - ovvero [i*N+i]
    - [N-1-i] ovvero [i*N+N-1-i]
    Ripeto, magari ho capito male io...
  • Re: Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

    Come dici tu va bene....io facevo due for perché nella mia idea c'era sempre quel proposito di far scorrere sia i(le righe) che NC(le colonne) per poi aggiustare il tiro all'interno del vettore!! La soluzione che proponi tu mi fa riflettere che potrei fare for(int i=0;i<=N-1;i++)
  • Re: Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

    C'é poco da riflettere, scusa, la soluzione te l'ho già data. Inoltre, é molto meglio analizzare 2 * N elementi piuttosto che N * N. Buon lavoro!
  • Re: Esercizio in C++ / Salvare in un vettore la somma degli elementi della diag. princ e second.

    Ho preferito fare così e funziona grazie per il tuo interessamento
    
    #include<iostream>
    using std::cout;
    using std::cin;
    #include<cstdlib>
    #include<iomanip>
    using std::setw;
    
    void Leggi_mat( int *a, int N){
    	
    	
    	for(int i=0;i<N;i++){
    		for(int j=0;j<N;j++){
    			cout<<"\nInserisci elemento a["<<i<<"] ["<<j<<"] : ";
    			cin>>a[i*N+j];
    		}
    	}
    	
    	cout<<"\nLa matrice caricata vale: \n";
    	
    	for(int i=0;i<N;i++){
    		for(int j=0;j<N;j++)
    			cout<<setw(5)<<a[i*N+j];
    			cout<<"\n";
    }
    
    return;
    }
    
    void Somma_vet(int *a,int *vettore, int N){
    	for(int nc = 0; nc < N; nc++)
    	{
    		int lim_sup = 0; // la clessidra delimita una parte della colonna
    		int lim_inf = 0;
    		// ne calcolo gli estremi in base all'indice della colonna stessa
    		if(nc<N/2) // se operiamo su una colonna con indice minore della metà del numero di colonne
    		{
    			lim_sup = nc; // l'estremo superiore è uguale all'indice della colonna 
    			lim_inf = N-1 - nc; // l'estremo inferiore è uguale all'indice dell'ultima riga meno l'estremo superiore (nc)
    
    
    vettore[N]+=a[lim_sup*N + nc];
      vettore[N+1]+=a[lim_inf*N + nc];
    
    
    		} else { // se operiamo su una colonna con indice maggiore o uguale alla metà del numero di colonne è il contrario
    			lim_inf = nc; // l'estremo inferiore è uguale all'indice della colonna 
    			lim_sup = N-1 - nc; // l'estremo superiore è uguale all'indice dell'ultima riga meno l'estremo inferiore (nc)
    vettore[N]+=a[lim_inf*N + nc];
      vettore[N+1]+=a[lim_sup*N + nc];
    
    		}
    		
    	}
    			
    	cout<<"\nLa somam degli elem.delle due diagonali vale: ";
    			cout<<"\nPrima diag: "<<vettore[N];
    			cout<<"\nSeconda diag: "<<vettore[N+1];
    	
    
    return;}
    
    
    int main() {
    	int N;
    	cout<<"Digita numero di righe ecolonne: ";
    	cin>>N;
    	int *a1;
    	a1=(int*)malloc(N*N*sizeof(int));
    		Leggi_mat(a1,N);
    	int *vettore;
    	vettore=(int*)calloc(N+2,sizeof(int));
    	Somma_vet(a1,vettore,N);
    
    	free(a1);
    	free(vettore);
    }
    
    
Devi accedere o registrarti per scrivere nel forum
4 risposte