Programma con matrice

di Anonimizzato7811 il
17 risposte
Dovevo svolgere in un programma, data la matrice, la somma dei valori di tutte le sue diagonali destre, mi hanno suggerito di scrivere in questo modo , ma non ho avuto tempo di farmi spiegare il perchè
Codice sorgente - presumibilmente C++
void somma_diagonale(int r, int M[][10], int v[]) // r è la dimensione della matrice che puo' essere max10
{
int somma = 0
for(int i=0; i<r; i++)
{ for (int j=0; j<r; j++)
somma += m[j][(i+j) % (r)];
v = somma;
somma = 0;
}}


ciò che non capisco è la scritta :
Codice sorgente - presumibilmente Plain Text
somma += m[j][(i+j) % (r)];

so il significato di % ma non capisco come lo usino in questo contesto

17 Risposte

  • Ti spiego la parte + difficile da capire.
    (i+j) % r -> significa (fai in modo che la somma di i+j cadi sempre nello spazio d 0 a r-1. Questo spazio non a caso è la dimensione delle colone della tua matrice. Quindi si fa x essere certi che venga pescato un elemento valido all'interno della matrice. Ti faccio un esempio coi numeri.
    Prendi r = 8
    i = 5 e j = 6;
    M[(i+j) % (r)] = M[5][(5+6) % (8)]
    (5+6) % (8) = 11 % 8 = 3;
    quindi il risultato sarà:
    somma += M[5][3];
    Chiaro?
  • Sì il meccanismo l'avevo capito, infatti ho visto che riporta, è che io non ci sarei mai arrivata a scriverlo così!:) adesso sto vedendo come fare per le diagonali sinistre, volevo scrivere una cosa del genere:for ( int j = 0, j<d ; j--) && for ( int i = 0; i<d; i++), perchè ho visto che nelle diagonali sinistre j diminuisce di un punto a ogni casella mentre i aumenta di un punto a ogni casella, ma naturalmente a me dà errore
  • Non disperarti
    
    for ( int j = 0, j<d ; j--) && for ( int i = 0; i<d; i++)
    
    non è un metodo valido.
    perche non provi così?
    
    int i = 0;
    int j = 0;
    for (j = d - 1, j>= 0 ; j--) 
        for (i = 0; i<d; i++)
    ....
    
    oppure così dipende da ciò che vuoi fare
    for(i = 0, j = d-1; i < d && j >= 0; i++, j--)
    
  • Come hai scritto tu non mi dà errore ma non porta poi!
  • Non ho la palla di vetro per sapere in anticipo le tue mosse. Dimmi cosa hai intenzione di fare?
  • Volevo scrivere la somma dei valori di tutte le diagonali sinistre della matrice, ad esempio, se ho la matrice di dimensione 3:
    1 2 3
    4 5 6
    7 8 9 vorrei scrivere:
    2+4
    3+5+7
    6+8
  • Ma anche il primo esempio non riporta. quello del calcolo delle diagonali destre. Non è che è un algoritmo sbagliato?
  • No quello dovrebbe portare, ho fatto il calcolo a mano, poi l'ha scritto il prof
  • Allora l'hai scritto tu male perche a me da 15 x ogni v.
    Questo è il tuo codice
    
    for(i=0; i<r; i++)
    	{ 
    		for (j=0; j<r; j++)
    			somma += m[j][(i+j) % (r)];
    		v[i] = somma;
    		somma = 0;
    	}
    
    è questo è il risultato:
    
    v[0] = 15
    v[1] = 15
    v[2] = 15
    
  • Caso i = 0;
    j = 0;
    somma += m[0][0+0 % 3]; = 1
    j = 1;
    somma += m[1][0+1 % 3]; = 1+5 = 6
    j = 2
    somma += m[2][0+2 % 3]; = 1+5+9 = 15
    v[0] = 15;

    caso i = 1
    j = 0;
    somma += m[0][1+0 % 3]; = 2
    j = 1;
    somma += m[1][1+1 % 3]; = 2+6 = 8
    j = 2
    somma += m[2][1+2 % 3]; = 2+6+7 = 15
    v[1] = 15

    caso i = 2
    j = 0;
    somma += m[0][2+0 % 3]; = 3
    j = 1;
    somma += m[1][2+1 % 3]; = 3+4 = 7
    j = 2
    somma += m[2][2+2 % 3]; = 3+4+8 = 15
    v[2] = 15
  • No è proprio così:
    void somma_diagonale_destra(int r, int M[][10], int v[])
    {
    int somma = 0
    for (int i = 0; i<r;i++){
    for (int j=0; j<r;j++)
    somma += M[j][(i+j)%(r)];
    v= somma;
    somma = 0;
    }}
    è esattamente come ha scritto lui,comunque anche a me dà come te
  • Secondo me devi fare un po di ripasso al capitolo 1. Sono due modi di scrittura identiche. Nei for se non metti le parentesi significa che dentro il ciclo ci sta solo l'istruzione sottostante quindi
    
    void somma_diagonale_destra(int r, int M[][10], int v[])
    {
    int somma = 0
    for (int i = 0; i<r;i++){
    for (int j=0; j<r;j++)
    somma += M[j][(i+j)%(r)];
    v[i]= somma;
    somma = 0;
    }}
    
    è identico a questo
    
    void somma_diagonale_destra(int r, int M[][10], int v[])
    {
    for(i=0; i<r; i++)
    	{ 
    		for (j=0; j<r; j++)
    			somma += m[j][(i+j) % (r)];
    		v[i] = somma;
    		somma = 0;
    	}
    }
    
    che è identico a questo
    
    void somma_diagonale_destra(int r, int M[][10], int v[])
    	{
    
    		for(i=0; i<r; i++)
    		{ 
    			for (j=0; j<r; j++)
    			{
    				somma += m[j][(i+j) % (r)];
    			}
    			v[i] = somma;
    			somma = 0;
    		}
    	}
    
  • R è la variabile che usa lui,noi avevamo scelto d mentre lui usa una variabile r
  • Sì ma infatti è la stessa cosa che avevo scritto all'inzio della domanda , l'ho riscritta per farti vedere che non ho sbagliato io a ricopiare ma proprio il prof ha scritto così e anche a me dà 15 15 15
Devi accedere o registrarti per scrivere nel forum
17 risposte