Matrice quadrata

peppe051
Matrici 4x4
Ho iniziato da poco a programmare con c++
Non riesco nella somma delle le diagonali della matrice qualcuno può dirmi come fare a sommare nei modi diversi?

Risposte
Conte_De_Saint_venant
guarda è semplice, non ho ben capito il tuo problema, però se vuoi sommare qualsiasi parte della matrice basta che trovi la legge analitica che descrive la posizione degli elementi in termini di i e j.
Cioè , esempio somma degli almenti della diagonale principale

....
int traccia=0;
for (int i=0; i<4; i++)
for(int j=0; j<4; j++)
if i==j traccia+=matrice[j];

in " if i==j" viene fuori dal fatto che la diagonale principale sta sulla retta x=y......
vediamo ad esempio la diagonale secondaria:
la retta sulla quale stanno gli elementi la ottieni imponendo che passi per (dim,0) e (0,dim):
(i-dim)/(0-dim)=(j-0)/(dim)

dim - i=j


questa è la condizione che accomuna gli elementi ulla diagonale secondaria....quindi:

....
int traccia=0;
for (int i=0; i<=dim; i++)
for(int j=0; j<=dim; j++)
if j==(dim-i) traccia+=matrice[j];

Andrea691
Il metodo che ti ha suggerito il Conte è concettualmente corretto.
Posso solo aggiungere un esempio di implementazione efficiente, e sperabilmente comprensibile.

/* Esempio compilato con Borland C/C++ 5.5.1 */

#include <stdio.h>
#include <stdlib.h>

const unsigned int ASIZE = 4;

int main()
{
    int my_array[ASIZE][ASIZE];
    unsigned int i, j;
    int dp, ds;
    
    srand(time(NULL)); 
    
    /* Popolazione dell'array */
    for (i = 0; i < ASIZE; ++i)
    {
        for (j = 0; j < ASIZE; ++j)
        {
            /* Si genera arbitrariamente un valore in  [10, 99] */
            my_array[i][j] =  rand() % 90 + 10;
        }
    }
    
    /* Somma diagonale principale */
    dp = 0;
    for (i = 0; i < ASIZE; ++i)
    {
        /* Notare l'indicizzazione */ 
        dp += my_array[i][i];
    }

    /* Somma diagonale secondaria */
    ds = 0;
    for (i = 0; i < ASIZE; ++i)
    {
        /* Anche qui, notare l'indicizzazione */ 
        ds += my_array[i][ASIZE -i -1];
    }

    /* Visualizzazione risultati */
    for (i = 0; i < ASIZE; ++i)
    {
        for (j = 0; j < ASIZE; ++j)
        {
            printf("%2d ", my_array[i][j]);
        }
        printf("\n");
    }
    
    printf("> Somma diagonale principale = %d\n", dp);
    printf("> Somma diagonale secondaria = %d\n", ds);

    return (0);    
}


Nota per l'eventuale lettore un po' meno smaliziato: questo è solo un esempio. Per ottenere numeri realmente random, mai fidarsi troppo del generatore lineare congruenziale implementato nelle RTL C dei compilatori standard. Provate a cercare qualcosa sugli iperpiani di Marsaglia, ad esempio...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.