Calcolo valori pari della matrice
salve, sapete dirmi come faccio a calcolare la somma dei numeri pari delle colonne di una matrice??
se faccio r=A[j]%2 non funziona. codifica in C
se faccio r=A[j]%2 non funziona. codifica in C
Risposte
1) cambia titolo: quello che hai scritto viola un buon numero di regole del regolamento del forum
(scrivilo minuscolo e togli "urgentissimooooo!")
2) qual è il linguaggio? Matlab? C++?
(scrivilo minuscolo e togli "urgentissimooooo!")
2) qual è il linguaggio? Matlab? C++?
Domanda preliminare stupida: i valori sono tutti numeri interi, giusto?
Per prima cosa valuterei se il numero in posizione $(i,j)$ è pari, poi lo aggiungerei alla somma.
Per prima cosa valuterei se il numero in posizione $(i,j)$ è pari, poi lo aggiungerei alla somma.
if (A[i][j]%2==0) s=s+A[i][j];
bhè io ho fatto così ma non funziona l' esercizio
Puoi scriverlo tutto? usando i tag "code", così si capisce...
Allora l' esercizio chiede di sommari i valori pari delle colonne di una matrice. Questa è la codifica in C che ho realizzato:
#include
#include
#define MIN 1
#define R_MAX 100
#define C_MAX 100
int main()
{
int righe,colonne,i,j;
int r,somma;
int A[R_MAX][C_MAX];
do
{
printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX);
scanf("%d",&righe);
}while(righe=R_MAX);
do
{
printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX);
scanf("%d",&colonne);
}while(colonne=R_MAX);
for(i=0;i
{
for(j=0;j
{
printf("\nInserire un valore A [%d,%d]= ",i,j);
scanf("%d",&A[j]);
}
}
for(i=0;i
{
if(A[j]%2==0)
{
somma=somma+A[j];
}
}
printf("somma valori pari= %d",somma);
getch();
}
#include
#include
#define MIN 1
#define R_MAX 100
#define C_MAX 100
int main()
{
int righe,colonne,i,j;
int r,somma;
int A[R_MAX][C_MAX];
do
{
printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX);
scanf("%d",&righe);
}while(righe
do
{
printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX);
scanf("%d",&colonne);
}while(colonne
for(i=0;i
for(j=0;j
printf("\nInserire un valore A [%d,%d]= ",i,j);
scanf("%d",&A[j]);
}
}
for(i=0;i
if(A[j]%2==0)
{
somma=somma+A[j];
}
}
printf("somma valori pari= %d",somma);
getch();
}
Ci manca il ciclo per $j$:
for(i=0;i<righe;++i) for(j=0;j=colonne;++j) if(A[i][j]%2==0) somma=somma+A[i][j];
mi fa inserire i valori della matrice ma poi non funziona il resto dell' esercizio

Questo perchè hai fatto altri errori. Soprattutto uno è molto grave, e ti rovina tutto.
Tu definisci la matrice $A$ all'inizio, dicendo che deve avere $text{R_MAX}$ righe e $text{C_MAX}$ colonne.
Ma non deve essere così: prima ti fai dire quante righe e quante colonne deve avere la matrice, e dopo definisci $A$.
Ho riscritto il tuo codice con dei commenti:
Tu definisci la matrice $A$ all'inizio, dicendo che deve avere $text{R_MAX}$ righe e $text{C_MAX}$ colonne.
Ma non deve essere così: prima ti fai dire quante righe e quante colonne deve avere la matrice, e dopo definisci $A$.
Ho riscritto il tuo codice con dei commenti:
#include<stdlib.h> #include<stdio.h> #define MIN 1 #define R_MAX 100 #define C_MAX 100 int main() { int righe,colonne,i,j; // inutile mettere anche i e j. Toglili int r,somma; // r non serve a nulla, toglilo. // Inoltre meglio scrivere "int somma=0;" int A[R_MAX][C_MAX]; // questo non va qui, ed è sbagliatissimo. Levalo do{ printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX); scanf("%d",&righe); } while(righe<MIN || righe>=R_MAX); do{ printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX); scanf("%d",&colonne); } while(colonne<MIN || colonne>=R_MAX); // qui devi mettere "int A[righe][colonne];" for(i=0;i<righe;i++) { for(j=0;j<colonne;j++) { printf("\nInserire un valore A [%d,%d]= ",i,j); scanf("%d",&A[i][j]); } } for(i=0;i<righe;i++) // manca il ciclo for, come ho detto prima { if(A[i][j]%2==0) { somma=somma+A[i][j]; } } printf("somma valori pari= %d",somma); getch(); // Io aggiungerei "return0;" }
Prova ad apportare le modifiche che mi hai detto e poi ne riparliamo....
Io scriverei una cosa del genere:
#include<stdlib.h> #include<stdio.h> #define MIN 1 #define R_MAX 100 #define C_MAX 100 int main(){ int righe=0,colonne=0,somma=0; do{ printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX); scanf("%d",&righe); } while(righe<MIN || righe>=R_MAX); do{ printf("Inserire un valore compreso tra %d e %d=",MIN,R_MAX); scanf("%d",&colonne); } while(colonne<MIN || colonne>=R_MAX); int A[righe][colonne]; for(i=0;i<righe;i++) for(j=0;j<colonne;j++){ printf("\nInserire un valore A [%d,%d]= ",i,j); scanf("%d",&A[i][j]); if (A[i][j]%2==0) somma=somma+A[i][j]; } printf("La somma dei valori pari e' %d",somma); getch(); return 0; }
La dimensione degli array deve essere una espressione costante. Quindi il modo corretto è o il suo oppure quello di usare l'allocazione dinamica. Sinceramente non mi sembra che quello sia l'errore più grave.
Tra l'altro il tuo codice non compila. Inoltre se non hai bisogno della matrice per fare altro allora probabilmente tanto vale non memorizzarla affatto.
Tra l'altro il tuo codice non compila. Inoltre se non hai bisogno della matrice per fare altro allora probabilmente tanto vale non memorizzarla affatto.
@vict85: dici a me o a mircosam? Io non ho provato il codice, quindi non so se ci sono errori di compilazione.
Il codice
Di fatto, se si volesse fare una versione completa e corretta andrebbe usata l'allocazione dinamica. Ma siccome l'inesperienza ti farebbe usare un mostro del tipo
X mircosam: getch() non è standard, sostituiscilo con un getchar() o un getc(stdin). Abbiamo già fatto notare precedentemente in altri post che codifica, per quanto vada di moda ultimamente tra i neofiti del C che partecipano a questa sezione del forum, ha generalmente altri significati in informatica e quindi andrebbe evitato in questo contesto.
------------------------------------------- ANNOTAZIONI -------------------------------------------------------------
¹ : gcc per esempio lo fa, ma ogni altro compilatore che conosco ti insulta aspramente se lo fai.
² : il modo corretto sarebbe usare un array dinamico del tipo
int A[righe][colonne];non compila su un compilatore C++ (a meno di qualche estensione non standard del compilatore¹). In C penso possa compilare ma i VLA sono una aggiunta del C99 molto criticata (non permette di sapere se l'allocazione ha avuto successo) e poi relegati come opzionali nell'ultimo standard. Nel C andrebbero usati solo nel caso di array di dimensione sconosciuta, ma di cui si sa che è molto piccoli (un esempio che ho trovato su un libro è il numero di thread di un sistema ma può andare bene anche per filtri e cose di questo genere).
Di fatto, se si volesse fare una versione completa e corretta andrebbe usata l'allocazione dinamica. Ma siccome l'inesperienza ti farebbe usare un mostro del tipo
int **A;io eviterei di usarla².
X mircosam: getch() non è standard, sostituiscilo con un getchar() o un getc(stdin). Abbiamo già fatto notare precedentemente in altri post che codifica, per quanto vada di moda ultimamente tra i neofiti del C che partecipano a questa sezione del forum, ha generalmente altri significati in informatica e quindi andrebbe evitato in questo contesto.
------------------------------------------- ANNOTAZIONI -------------------------------------------------------------
¹ : gcc per esempio lo fa, ma ogni altro compilatore che conosco ti insulta aspramente se lo fai.
² : il modo corretto sarebbe usare un array dinamico del tipo
int *A;e accedere all'array usando
i*numcols + joppure
j*numRows + i(a seconda se si voglia usare una matrice row-major o column-major (esistono altri modi per mappare una matrice ad un array ma questi sono i più comuni).
Avevo fatto riferimento al fatto che non fosse necessario inizializzare una matrice per risolvere l'esercizio. Ecco come si può fare:
#include<stdlib.h> #include<stdio.h> #define R_MAX 100 #define C_MAX 100 //Versione senza inizializzazione int main() { /* * Dal C99 in poi, non è più richisto di definire le cose all'inizio della funzione. E' quindi buona pratica farlo solo quando servono. * Inoltre è pericoloso usare gli stessi i e j per tutti i cicli a meno che non ti servano in altri settori. */ int righe, colonne; int somma = 0; // SEMPRE inizializzare questo tipo di variabile. Se non lo fai rischi che ti dia problemi in seguito. do { printf("Inserire il numero di righe (tra 1 e %d)\t", R_MAX); scanf("%d",&righe); } while(righe < 1 || righe>=R_MAX); // usare define ha senso solo per valori che ha senso modificare. do { printf("Inserire il numero di righe (tra 1 e %d)\t", R_MAX); scanf("%d",&colonne); } while(colonne < 1 || colonne>=R_MAX); // usare define ha senso solo per valori che ha senso modificare. for(int i=0; i != righe; ++i) // questa è solo una mia preferenza stilistica { for(int j=0; j != colonne; ++j) { int value; printf("Inserire un valore A [%d,%d]= ",i,j); scanf("%d", &value); putc('\n', stdin); if(value%2 == 0) somma += value; // se non metti la parentesi il C dà per scontato che il blocco e' di una sola istruzione. } } printf("somma valori pari= %d", somma); // Il getchar o qualsiasi cosa per lui non serve. return 0; // non sono sicuro sia strettamente necessario negli ultimi standard ma tanto vale metterlo. }
"vict85":Infatti io ho gcc e non mi dà problemi di alcun genere. Per questo non me n'ero mai accorto.
Il codice "int A[righe][colonne];" non compila su un compilatore C++ (a meno di qualche estensione non standard del compilatore¹)....
¹ : gcc per esempio lo fa, ma ogni altro compilatore che conosco ti insulta aspramente se lo fai....
Comunque ti ringrazio per la spiegazione... Erano cose che non sapevo.
"Gi8":Infatti io ho gcc e non mi dà problemi di alcun genere. Per questo non me n'ero mai accorto.
[quote="vict85"]Il codice "int A[righe][colonne];" non compila su un compilatore C++ (a meno di qualche estensione non standard del compilatore¹)....
¹ : gcc per esempio lo fa, ma ogni altro compilatore che conosco ti insulta aspramente se lo fai....
Comunque ti ringrazio per la spiegazione... Erano cose che non sapevo.[/quote]
Perché GCC di default non compila in modalità standard. Devi dirglielo esplicitamente, e sono necessarie entrambe le opzioni -std= e -pedantic (o -pedantic-errors):
gcc -std=c99 -pedantic -Wall -Wextra a.c -o a.exe g++ -std=c++98 -pedantic -Wall -Wextra a.cpp -o a.exe
Nella pratica comunque, probabilmente, avresti più che altro bisogno di chiamare questa funzione:
il "somma += ..." è solo un modo per compattare l'if e l'assegnazione.
int somma_pari(int const * const mat, int const numRows, int const numCols) { int const numElem = numRows * numCols; int somma = 0; for(int i=0; i != numElem; ++numElem) somma += (mat[i]%2 ? 0 : mat[i]); return somma; }
il "somma += ..." è solo un modo per compattare l'if e l'assegnazione.