[C] Problema massimo tra le somme in colonna di una matrice

Pubblicità

Vincenzo Santopietro

Nuovo Utente
Messaggi
6
Reazioni
0
Punteggio
24
Salve a tutti,ho riscontrato questo problema e ci sto su da ore ma senza mai riuscire a trovare un errore che mi risolva il tutto.
la traccia è questa:
Sviluppare una function C che, dati come parametri di input un array 2D di interi, il
numero delle righe e il numero delle colonne, determina e restituisce come parametro di
output il massimo tra le somme degli elementi di ogni colonna.
Ad esempio avendo una matrice
1 2
1 2 il massimo deve risultare 4..(2+2).

il mio codice è il seguente:

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

int maxsomma_col(int [][10],int,int);
int main()
{ int i,j,n,m,matrice[10][10];

printf("inserisci il numero di righe: ");
scanf("%d",&n);
printf("inserisci il numero di colonne: ");
scanf("%d",&m);
//riempimento
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("inserisci l'elemento di posto : %d %d ",i,j);
scanf("%d",&matrice[j]);
}
}
//visualizzo
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf(" %d ",matrice[j]);

}
printf("\n");}

printf("\n il massimo è = %d ",maxsomma_col(matrice,n,m));
}

int maxsomma_col(int matrice[][10],int n,int m)
{ int somma=0,i,j,max=0,tmp;

for(j=0; j<m; j++)
{somma=0;

for(i=0; i<n; i++)
{somma=somma+matrice[j];
if(somma >= max){
// scambiare(max,somma);
tmp = max;
max = somma;
somma = tmp;}
}}

return max;

}

Dove sbaglio?:(
 
Codice:
[COLOR=#333333]if(somma >= max){[/COLOR]
[COLOR=#333333]// scambiare(max,somma);[/COLOR]
[COLOR=#333333]tmp = max;[/COLOR]
[COLOR=#333333]max = somma;[/COLOR]
[COLOR=#333333]somma = tmp;}
Perché in questo punto scambi max e somma? dovresti fare semplicemente max = somma;
Comunque ti consiglio di scrivere il codice con più pulizia, di usare intelligentemente l'indentazione e non chiudere le graffe alla rinfusa. Semplicissime regole per tenere ordinato il codice evitano tantissimi bug.[/COLOR]
 
Codice:
[COLOR=#333333]if(somma >= max){[/COLOR]
[COLOR=#333333]// scambiare(max,somma);[/COLOR]
[COLOR=#333333]tmp = max;[/COLOR]
[COLOR=#333333]max = somma;[/COLOR]
[COLOR=#333333]somma = tmp;}[/COLOR]

Perché in questo punto scambi max e somma? dovresti fare semplicemente max = somma;
Comunque ti consiglio di scrivere il codice con più pulizia, di usare intelligentemente l'indentazione e non chiudere le graffe alla rinfusa. Semplicissime regole per tenere ordinato il codice evitano tantissimi bug.

Perchè mi chiedeva di trovare la somma massima.(avrei anche potuto inizializzare max alla somma della prima colonna direttamente,ma il programma anche se volessi eliminare l'opzione di mostrare la somma massima,non esegue la somma colonna per colonna...)
 
Io ti consiglierei di rivedere l'algoritmo magari scrivendolo su un pezzo di carta in pseudocodice, tenendoti piuttosto astratto, e dopo di rivedere il codice.
Comunque se effettui la modifica che ti ho descritto sopra quel codice fa quello che deve.
 
L'errore te lo ha già fatto notare lumo, non serve a nulla quella condizione all'interno del 2° ciclo :)

Pensala in questo modo: hai 2 cicli, con il primo ti posizioni su di una colonna e con il secondo, per ogni colonna calcoli la somma delle sue componenti, quindi:
Codice:
int i, j   //indici usati per ciclare
int max, sum   //rispettivamente la variabile per trovare il massimo tra le somme di colonna e quella per sommare gli elementi

//inizializzazione delle varibili
sum=0;
max=sum;

//ciclo le colonne
for(j=0; j<m; j++){

       //ciclo gli elementi per ogni colonna
       for(i=0; i<n; i++){
              sum+=mat[i][j];     //aggiungo alla somma gli elementi della colonna
       }

       //a questo punto in sum ho la somma degli elementi della colonna
       //in max ho la somma degli elementi della colonna precedente, o di quella che fino ad ora aveva la somma maggiore

       //confronto max e sum
       if(sum>max) max=sum;

       //azzero sum per il successivo ciclo
       sum=0;

}
All'uscita del primo ciclo avrai in max la massima somma tra quelle di ogni colonna (se ti serve sapere la colonna dovrai anche salvare l'indice j in una var apposita quando confronti max e sum e verifichi la condizione) :)

Il tuo ciclo non funziona perché scambi la somma con il massimo, cosa che non devi fare... Se provi a fare anche solo un esempio di interazione del ciclo che hai fatto (anche solo la prima interazione) vedrai subito l'errore; per farti un esempio, con il ciclo che hai proposto:
-inizio il primo ciclo
-j=0
-somma=0
-inizio il secondo ciclo
-i=0
-somma viene incrementata con mat[j]
-somma>=max ? -> si perché max l'hai giustamente inizializzato prima del primo ciclo a 0
-tmp=max (ricorda che max ora vale 0, siamo alla prima iterazione)
-max=somma
-somma=tmp
...
Senza procedere oltre, quanto vale ora somma? 0!!!
In sostanza ogni volta che esegui questo ciclo, per ogni colonna perdi almeno il primo elemento (sempre, indipendentemente da come è inizializzata la matrice, se non hai numeri negativi). Se poi il primo elemento è minore del secondo, allora perderai anche il secondo, e così via...

Se ci pensi, non serve a niente scambiare somma con massimo, perché somma deve sempre essere incrementata con gli elementi della colonna, mentre max serve soltanto quando sai già quanto vale la somma di tutti gli elementi di una colonna!
Di conseguenza non ti serve neanche testare il valore di max all'interno del secondo ciclo, dove non sai ancora la somma degli elementi della colonna che stai ciclando...
Il secondo ciclo (dato appunto che cicla gli elementi di una singola colonna) serve solo per salvare temporaneamente la somma degli elementi della singola colonna; non coinvolge in nessun modo max, che invece ti serve per testare valori tra colonne; quindi sarà giusto testare max con somma alla fine del secondo ciclo, ma non serve a nulla cambiare il valore di somma con quello di max (sicuramente in questo caso non darà problemi perché poi somma verrà azzerata, ma è cmq computazione in più che non ti serve) :)
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top