[RISOLTO]Somma tutte le diagonali di una matrice?

di il
28 risposte

[RISOLTO]Somma tutte le diagonali di una matrice?

Salve, ho un problema nel calcolare la somma delle diagonali di una matrice (che vanno da sinistra verso destra in questo caso), ad esempio:
Data la matrice
3 5 4
2 7 8
1 2 3

Dovrei avere 3+7+3=13; 5+8=13; 2+2=4. Io ho provato così, ma ero già sicuro che non andasse e infatti mi calcola bene solo la diag. principale , poi stampa valori spropositati (probabilmente perchè con K invado altre celle di memoria, ma non so come gestirla).

int somma = 0;
for(int i=0; i<r; i++)
{ for (int j=0; j<c; j++)
{
    for(int k=1;k<=r-1-i;k++)
    {
        if(k==1)
        {
            somma=somma+mat[i][j]+mat[i+k][j+k];
        }
        else{
             somma=somma+mat[i+k][j+k];
        }
    }
    printf("%d ",somma);
    somma=0;
}
}

28 Risposte

  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Spiega bene bene

    Nella matrice che dai come esempio tu vuoi avere 5 risultati?
    Ovvero
    4
    5+8 13
    3+7+5 13
    2×2 4
    1

    O qualcosa di differente?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    StandardOil ha scritto:


    Spiega bene bene

    Nella matrice che dai come esempio tu vuoi avere 5 risultati?
    Ovvero
    4
    5+8 13
    3+7+5 13
    2×2 4
    1

    O qualcosa di differente?
    Si,esatto . Avevo tralasciato il 4 e l'1
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Io rifletterei sul seguente output:
    #include <stdio.h>
    
    #define R 4
    #define C 7
    
    int main()
    {
        for(int i = 0; i < R; ++i)
        {
            for(int j = 0; j < C; ++j)
            {
                printf("%d\t", j - i);
            }
            printf("\n");
        }
        return 0;
    }
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    La risposta, allora, è molto più semplice di quello che sembra. Prendendo la somma di tutti gli elementi che si trovano su tutte le diagonali sinistra-destra alto-basso ci sono elementi che non prendi? Quante volte prendi un elemento? Non sarebbe la stessa cosa fare un'altra operazione, che se ne frega delle diagonali?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    silente ha scritto:


    La risposta, allora, è molto più semplice di quello che sembra. Prendendo la somma di tutti gli elementi che si trovano su tutte le diagonali sinistra-destra alto-basso ci sono elementi che non prendi? Quante volte prendi un elemento? Non sarebbe la stessa cosa fare un'altra operazione, che se ne frega delle diagonali?
    Non prendo quelli che non hanno un "successore" altrimenti vado fuori memoria, però appunto non so come gestire ciò
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    OK, quindi il titolo è fuorviante
    tu vuoi N*2-1 somme delle N*2-1 possibili diagonali, anche non complete.

    naturalemte la matrice è quadrata e di dimensione N

    non è difficile
    semmai difficile sarebbe imporre un ben preciso ordine alle somme, ti serve?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Credo di aver risolto nel seguente modo:
    
    int somma = 0;
    for(int i=0; i<r; i++)
    { for (int j=0; j<c; j++)
    {
        for(int k=1;k<=r-1-j-i;k++)
        {
                 if(k==1)
                 {
                     somma=somma+mat[i][j]+mat[i+k][j+k];
                 }
                else  somma=somma+mat[i+k][j+k];
        }
        printf("%d ",somma);
        somma=0;
    }
    }
    
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Ma un minimo di main() per poter provare le tue funzioni non ne metti mai?

    la tua funzione mi "suona strana", ma non mi ci metto a provarla senza un main()

    tu la hai provata? funziona anche su casi di matrici di ordine 4 o 5?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    StandardOil ha scritto:


    Ma un minimo di main() per poter provare le tue funzioni non ne metti mai?

    la tua funzione mi "suona strana", ma non mi ci metto a provarla senza un main()

    tu la hai provata? funziona anche su casi di matrici di ordine 4 o 5?
    Per ordini superiori non mi fa la somma di tutte .PS: in effetti si, solo che non commentando si potrebbe non capire, perciò non lo posto,comunque ecco qui
    
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 16
    void leggi(int mat[MAX][MAX],int *r,int *c);
    void stampa(int mat[MAX][MAX],int r,int c);
    void somma(int mat[MAX][MAX],int r,int c);
    int main()
    {
        int mat[MAX][MAX],r,c;
    
    
       leggi(mat,&r,&c);
       stampa(mat,r,c);
       printf("\n\n");
       somma(mat,r,c);
        return 0;
    }
    void leggi(int mat[MAX][MAX],int *r,int *c)
    {
        FILE *fp=fopen("input.txt","r");
        if(fp!=NULL)
        {
            fscanf(fp,"%d",r);
            fscanf(fp,"%d",c);
            for(int i=0;i<*r;i++)
                for(int j=0;j<*c;j++)
                fscanf(fp,"%d",&mat[i][j]);
    
            fclose(fp);
        }
    }
    void stampa(int mat[MAX][MAX],int r,int c)
    {
        for(int i=0;i<r;i++)
        {
            printf("\n");
            for(int j=0;j<c;j++)
                printf(" %d \t",mat[i][j]);
        }
    }
    void somma(int mat[MAX][MAX],int r,int c)
    {
    
     int somma = 0;
    for(int i=0; i<r; i++)
    { for (int j=0; j<c; j++)
    {
        for(int k=1;k<=r-1-j-i;k++)
        {
                 if(k==1)
                 {
                     somma=somma+mat[i][j]+mat[i+k][j+k];
                 }
                else  somma=somma+mat[i+k][j+k];
        }
        printf("%d ",somma);
        somma=0;
    }
    }
    }
    
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Ultimo00 ha scritto:



    Per ordini superiori non mi fa la somma di tutte .PS: in effetti si, solo che non commentando si potrebbe non capire, perciò non lo posto,comunque ecco qui
    ma va o non va?
    non si capisce, dalle tue parole
    e senza il file di ingresso cosa devo provare?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    StandardOil ha scritto:


    Ultimo00 ha scritto:



    Per ordini superiori non mi fa la somma di tutte .PS: in effetti si, solo che non commentando si potrebbe non capire, perciò non lo posto,comunque ecco qui
    ma va o non va?
    non si capisce, dalle tue parole
    e senza il file di ingresso cosa devo provare?
    Alcune somme non sono corrette, però le fa tutte. Eh perciò non passavo il main perchè leggo da file, come lo passo? I valori inseriti nel file sono
    4 4 // dimensiosi matrice
    1 2 3 3
    4 5 6 3
    7 8 9 3
    2 2 2 2
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Aspetta aspetta, non ho ben capito
    ma tu passi alle tue funzioni una matrice 16x16 per poi leggerne/scriverne/sommarne solo una parte, chesso' 5x5?

    secondo me non ti tornano i conti degli indici
    se vuoi fare una cosa "universale" che accetta ogni possibile ordine di matrice non puoi passare matrici dichiarate int nome[numero][numero]
    il prototipo della funzione si aspetta di conoscere il secondo indice della matrice che gli passi
    ne abbiamo già discusso in precedenza, ti ricordi?
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Nippolo ha scritto:


    Io rifletterei sul seguente output:
    #include <stdio.h>
    
    #define R 4
    #define C 7
    
    int main()
    {
        for(int i = 0; i < R; ++i)
        {
            for(int j = 0; j < C; ++j)
            {
                printf("%d\t", j - i);
            }
            printf("\n");
        }
        return 0;
    }
    Dal momento che il mio input è passato completamente inosservato, giusto per chiarezza mi riferivo ad una soluzione del genere:
    #include <stdio.h>
    
    #define R 3
    #define C 4
    
    int main()
    {
        int m[R][C] = {{1, 2, 3, 4},
                       {5, 6, 7, 8},
                       {9, 0, 5, 2}};
        int v[R + C - 1] = {0};
    
        unsigned int k;
        for(unsigned int i = 0; i < R; ++i)
        {
            for(unsigned int j = 0; j < C; ++j)
            {
                if(j >= i)
                {
                    k = j - i;
                }
                else
                {
                    k = C + i - j - 1;
                }
                v[k] += m[i][j];
            }
        }
    
        for(unsigned int i = 0; i < R + C - 1; ++i)
        {
            printf("%d ", v[i]);
        }
    
        return 0;
    }
  • Re: [RISOLTO]Somma tutte le diagonali di una matrice?

    Non capisco:
    trattandosi di diagonali di matrici le matrici sono quadrate
    cosa vuol dire:
    #define R 3
    #define C 4
Devi accedere o registrarti per scrivere nel forum
28 risposte