RISOLTO somma colonne di una matrice

Stato
Discussione chiusa ad ulteriori risposte.

Andrea :)

Nuovo Utente
3
1
Salve, sto cercando di completare un codice contente delle matrici la cui funzione sta nel:
-caricamento
-stampa
-somma delle righe
-somma delle colonne
di una matrice.
Sono riuscito a completare tutte le parti, però dopo che esegue la stampa del contenuto inserito nelle matrici, e delle somme svolte, o notato che il risultato dato a riguardo della
somma delle colonne della matrice non è coretto. Qualcuno potrebbe darmi una mano a capire quale potrebbe essere il problema?
Grazie in anticipo

CODICE IN LINGUAGGIO C
C:
#include <stdio.h>
#include <stdlib.h>
#define MAXR 10
#define MAXC 10

void Caricamento(int *nR, int *nC, int MAT[MAXR][MAXC]);
void Stampa(int nR, int nC, int MAT[MAXR][MAXC]);
void SommaR(int nR, int nC, int MAT[MAXR][MAXC]);
void SommaC(int nR, int nC, int MAT[MAXR][MAXC]);

int main()
{
    int NR,NC,Mat[MAXR][MAXC];

    Caricamento(&NR,&NC,Mat);
    Stampa(NR,NC,Mat);
    SommaR(NR,NC,Mat);
    SommaC(NR,NC,Mat);
    return 0;
}

void Caricamento(int *nR, int *nC, int MAT[MAXR][MAXC])
{
    int i,j;
    do
    {
        printf("Inserisci numero di righe:");
        scanf("%d", nR);
        if(*nR>10)
        {
            printf("ERRORE");
        }
    }while(*nR>10);
    do
    {
        printf("Inserisci numero di colonne:");
        scanf("%d", nC);
        if(*nC>10)
        {
            printf("ERRORE");
        }
    }while(*nC>10);

    for(i=0;i<*nR;i++)
    {
        for(j=0;j<*nC;j++)
        {
            printf("MATRICE(%d, %d) ",i, j);
            scanf("%d", &MAT[I][j]);
        }
    }
}

void Stampa(int nR, int nC, int MAT[MAXR][MAXC])
{
    int i,j;
     for(i=0;i<nR;i++)
    {
        for(j=0;j<nC;j++)
        {
            printf("%d\t", MAT[I][j]);
        }
        printf("\n");
    }
}

void SommaR(int nR, int nC, int MAT[MAXR][MAXC])
{
    int VR[MAXR],i,j;
    for(i=0;i<nR;i++)
    {
        VR[I]=0;
        for(j=0;j<nC;j++)
        {
            VR[I]=VR[I]+MAT[I][j];
        }
    }
    printf("SOMMA RIGHE:\n");
        for(i=0;i<nR;i++)
        {
            printf("riga %d = %d\n",i+1, VR[I]);
        }
}

void SommaC(int nR, int nC, int MAT[MAXR][MAXC])
{
    int i,j,VC[MAXC];
    for(i=0;i<nC;i++)
    {
            VC[I] = 0;

    for(j=0;j<nC;j++)
    {
        for(i=0;i<nR;i++)
            {
                VC[j]=VC[j]+MAT[I][j];
            }
    }
    }
    printf("SOMMA DELLE COLONNE:\n");
    for(i=0;i<nC;i++)
    {
        printf("colonna %d = %d\n",i+1,VC[I]);
    }

}
 
Ultima modifica da un moderatore:

Andretti60

Utente Èlite
5,618
4,237
Per favore usa la formattazione, leggi le regole di sezione.

Non ho letto con attenzione, ma in tutto il tuo codice usi sempre la variabile MAT specificando solo un indice (solo una coppia di parentesi quadre), ne devi usare due, uno per le righe e uno per le colonne. Il linguaggio C te lo lascia fare perché il C interpreta MAT come un puntatore (che è sia una forza che una debolezza del linguaggio)
 

Andrea :)

Nuovo Utente
3
1
Per favore usa la formattazione, leggi le regole di sezione.

Non ho letto con attenzione, ma in tutto il tuo codice usi sempre la variabile MAT specificando solo un indice (solo una coppia di parentesi quadre), ne devi usare due, uno per le righe e uno per le colonne. Il linguaggio C te lo lascia fare perché il C interpreta MAT come un puntatore (che è sia una forza che una debolezza del linguaggio)
Scusa se non ho usato la formattazione, lo farò.
Comunque non sono riuscito a trovare la variabile MAT segnata con una sola coppia di parentesi, ho controllato diverse volte e credo di averla sempre segnata con 2 parentesi (quindi come una matrice
e non come un contatore).
 

DispatchCode

Moderatore
Staff Forum
1,490
1,150
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Scusa se non ho usato la formattazione, lo farò.
Comunque non sono riuscito a trovare la variabile MAT segnata con una sola coppia di parentesi, ho controllato diverse volte e credo di averla sempre segnata con 2 parentesi (quindi come una matrice
e non come un contatore).

Probabilmente è stato tratto in inganno dai problemi dovuti alla formattazione. 😉

Non l'ho ancora provato, ma a occhio il tuo problema penso sia qui:
Codice:
 = 0;

    for(j=0;j<nC;j++)
    {
        for(i=0;i<nR;i++)
            {
                VC[j]=VC[j]+MAT[I][j];
            }
    }
    }

stai usando due volte la variabile i, è un errore. Il ciclo interno deve usare una variabile con un nome differente; ma oltretutto, perchè non usate C99? Dichiarando direttamente la variabile nell'inizializzazione del ciclo, non avresti avuto questo problema (il compilatore avrebbe visto la doppia inizializzazione).

Al di là di questo, puoi anche cambiare l'impostazione. Non ho capito perchè utilizzi 3 cicli innestati, ne bastano due, come giustamente fai già nelle righe.
Quindi una cosa tipo:

C:
int sumCol[MAXR] = {0}; // inizializzi MAXR elementi a 0
for(int i=0; i<nC; i++) {
    for(int j=0; j<nR; j++) {
        sumCol[i] += MAT[j][i];
    }
}

Se non puoi usare C99 come non detto, dichiara pure le variabili prima del ciclo.
 
  • Mi piace
Reazioni: Andretti60

Andrea :)

Nuovo Utente
3
1
Probabilmente è stato tratto in inganno dai problemi dovuti alla formattazione. 😉

Non l'ho ancora provato, ma a occhio il tuo problema penso sia qui:
Codice:
 = 0;

    for(j=0;j<nC;j++)
    {
        for(i=0;i<nR;i++)
            {
                VC[j]=VC[j]+MAT[I][j];
            }
    }
    }

stai usando due volte la variabile i, è un errore. Il ciclo interno deve usare una variabile con un nome differente; ma oltretutto, perchè non usate C99? Dichiarando direttamente la variabile nell'inizializzazione del ciclo, non avresti avuto questo problema (il compilatore avrebbe visto la doppia inizializzazione).

Al di là di questo, puoi anche cambiare l'impostazione. Non ho capito perchè utilizzi 3 cicli innestati, ne bastano due, come giustamente fai già nelle righe.
Quindi una cosa tipo:

C:
int sumCol[MAXR] = {0}; // inizializzi MAXR elementi a 0
for(int i=0; i<nC; i++) {
    for(int j=0; j<nR; j++) {
        sumCol[i] += MAT[j][i];
    }
}

Se non puoi usare C99 come non detto, dichiara pure le variabili prima del ciclo.
Sicuramente :D
Comunque grazie mille hai notato subito il problema e dopo aver provato la tua soluzione posso
dire che ora funziona, quindi era sicuramente un problema nell'inizializzare gli elementi a 0
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
1,490
1,150
CPU
Intel 1200 I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10Gb DDR6
Audio
Integrata 7.1 HD audio
Monitor
AOC C27g2u 165Hz
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
30Mbps/3Mbps con Eolo
OS
Windows 10 64bit
Sicuramente :D
Comunque grazie mille hai notato subito il problema e dopo aver provato la tua soluzione posso
dire che ora funziona, quindi era sicuramente un problema nell'inizializzare gli elementi a 0
Prego!
I problemi erano 2 in realtà: l'inizializzazione e il fatto che usavi la medesima variabile. Molto probabilmente c'erano anche problemi nell'accedere al ciclo più interno a causa del valore di 'i'.
 
  • Mi piace
Reazioni: Andrea :)
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando