array2D (somma+massimo)

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Vedo già un errore di fondo, ovvero tu accetti le dimensioni m e n in input, ma l'array può al massimo essere di 20x20. Per cui o poni un limite a n e m, oppure allochi l'errore dinamicamente.

Inoltre la funzione array2d è completamente sbagliata. Lui ti chiede di calcolare la somma di tutte le colonne per ogni singola riga e tra queste somme tirare fuori il massimo.

Tu invece sommi, ad ogni chiamata di array2d, tutti gli elementi dell'array, cioè tutte le colonne di tutte le righe. Ma non è questo che l'esercizio chiede.
 
immagino intendesse dire dire che i singoli elementi di ogni riga fanno parte di un (indice di) colonna;
facciamo un esempio pratico, se hai la seguente matrice 3x4
2, 5, -6, 18 --> somma = 19
3, 7, -3, -2 --> somma = 5
4, 5, -11, 10 --> somma = 8

la max somma è 19 (1° riga)
se scandisci la matrice per riga userai, ad esempio, un indice i per le righe e un indice j per le colonne quindi qualcosa come
C:
for(int i=0; i<numRighe; i++)
  for(int j=0; j<numColonne; j++) {
      //corpo del ciclo
}
 
sisi errore di distrazione il primo

Occhio che non l'hai risolto. Nemmeno m'impedisce di porre r e c a 1000 e far scoppiare l'array.

se chiede il massimo tra le somme degli elementi di ogni riga.

certo, ma come hai fatto tu, a partire dalla seconda riga in poi, somma conterrà la somma di tutti gli elementi delle righe precedenti + la somma degli elementi della riga corrente

e quel if (somma>max) fuori da entrambi i cicli for ovviamente non fa il suo dovere

la somma è relativa ad ogni singola riga, alla successiva va riazzerata

la soluzione corretta è questa

C:
int array2d(int a[][100],int r,int c)
{
    int i,j,somma,max;

    max=a[0][0];

    for (i=0; i<r; i++){
        somma=0;

        for(j=0; j<c; j++) {
            somma = somma + a[i][j];
        }
    
        if(somma>max) max=somma;
    }
    
    return max;
}
 
Occhio che non l'hai risolto. Nemmeno m'impedisce di porre r e c a 1000 e far scoppiare l'array.



certo, ma come hai fatto tu, a partire dalla seconda riga in poi, somma conterrà la somma di tutti gli elementi delle righe precedenti + la somma degli elementi della riga corrente

e quel if (somma>max) fuori da entrambi i cicli for ovviamente non fa il suo dovere

la somma è relativa ad ogni singola riga, alla successiva va riazzerata

la soluzione corretta è questa

C:
int array2d(int a[][100],int r,int c)
{
    int i,j,somma,max;

    max=a[0][0];

    for (i=0; i<r; i++){
        somma=0;

        for(j=0; j<c; j++) {
            somma = somma + a[i][j];
        }
    
        if(somma>max) max=somma;
    }
    
    return max;
}
Attento, hai sbagliato a inizializzare la variabile "somma"
--- i due messaggi sono stati uniti ---
@toni1705 devi chiamare la funzione dopo avere inizializzato tutta la matrice, non dopo ogni riga. Edit: sorry ho sbagliato, non riuscivo a leggere la tua indentazione (devo ripetermi?)
 
rimane il problema delle dimensioni della matrice

r e c va controllato che non superino R e C rispettivamente
 
rimane il problema delle dimensioni della matrice

r e c va controllato che non superino R e C rispettivamente
l'ho scritto nel controllo che deve essere minore o uguale a 100
potrei anche utilizzare una bella if o una while cioè
while(r>=1 && r<=100) do....
oppure if(rr>=1 && r<=100)
.....
else printf("mi dispiace il limite è 100")
C:
#include <stdio.h>
#define R 100
#define C 100

double array2D( double a[][100],int ,int);
main()
{
int r,c,i,j;
double a[R][C],max;

  /* quante righe */
  printf("quante righe vuoi? (<=100): ");
  scanf("%d",&r);

  /* quante colonne*/
  printf("\nquante colonne vuoi? (<=100): ");
  scanf("%d",&c);

  /*carichiamo la matrice*/
  printf("\ncarica la matrice\n\n");
  for(i=0; i<r; i++){
  for (j=0; j<c; j++){
  printf("inserire valore %d riga %d colonna: ",i+1,j+1);
  scanf("%lf",&a[i][j]);
            }
        }

}
double array2D( double a[][100],int r ,int c)
{
    int i,j;
    double somma,max;
    max=a[0][0];
    /* facciamo la somma*/
    for (j=0 ;j<r; j++){
        somma=0;
        for (i=0; i<r; i++)
        {
            somma+=a[i][j];
        }
        printf("la riga vale:%lf",somma);
}}
come mai in double non mi somma nulla?
 
l'ho scritto nel controllo che deve essere minore o uguale a 100
potrei anche utilizzare una bella if o una while cioè
while(r>=1 && r<=100) do....
oppure if(rr>=1 && r<=100)

E dovresti. Specificarlo all'utente non gli impedisce di scrivere 1000 e il programma allegramente continua, generando un buffer overflow. Questo genere di problemi è una delle porte che gli hacker usano per penetrare i sistemi.

Riguardo il resto, vedo che hai letteralmente storpiato il codice. Dove sta la chiamata ad array2d dopo aver letto la matrice?

E l'if all'interno di array2d? E il return max?

I for j e i sono invertiti ed entrambi vanno da 1 a r...ti sei perso c per strada.
 
C:
#include <stdio.h>
#define R 100
#define C 100

double array2D( double a[][100],int,int);
main()
{
 int i,j;
 double a[R][C],max,r,c;

  /* quante righe */
  printf("quante righe vuoi? (<=100): ");
  scanf("%lf",&r);

  /* quante colonne*/
  printf("\nquante colonne vuoi? (<=100): ");
  scanf("%lf",&c);

  /*carichiamo la matrice*/
  printf("\ncarica la matrice\n\n");
  for(i=0; i<r; i++){
  for (j=0; j<c; j++){
  printf("inserire valore %d riga %d colonna: ",i+1,j+1);
  scanf("%lf",&a[i][j]);
  }}
 max=array2D(a,r,c);
 printf("\nil massimo:%lf",max);



}
double array2D( double a[][100],int  r ,int  c)
{
    int i,j;
    double somma,max;
    somma=0;
    /* facciamo la somma*/
  for (j=0; j<c; j++)
    {
        somma=0;
        for (i=0; i<r;i++)
        {
        somma+=a[i][j];
        }
        printf("la somma:%lf",somma);
        if(somma>max)
            max=somma;
        }
return max;
}
in questo caso mi serve la somma delle colonne.
 
Ultima modifica:
Proviamo ad estrapolare un po' il problema dal contesto. A me piace "vedere" i problemi, ma è una cosa personale.

Ti ritrovi una matrice di numeri:
Codice:
[01] [32] [47] [52]
[99] [02] [27] [36]
[-3] [-5] [08] [07]
[42] [22] [68] [15]

Come si viaggia all'interno di una matrice in programmazione? Solitamente con due cicli innestati di for
Codice:
for col = 0; col < numCols; col++ {
  for row = 0; row < numRows; row++ {
    num = matrix[row][col]
  }
}

Quindi se vuoi prenderti i valori colonna per colonna basta iterare per colonna -> riga e non vice versa. Per ogni colonna avrai una variabile (o un indice di un array) contenente il valore della somma.

Codice:
sum = int[numCols]
for col = 0; col < numCols; col++ {
  for row = 0; row < numRows; row++ {
    sum[col] += matrix[row][col]
  }
}
 
Quando hai un dubbio sulla funzionalità di qualcosa, fai degli esempi che possano facilmente dimostrare o confutare la tua teoria:

C:
#include <stdio.h>

int main()
{
    double a = 3;
    double b = 7;
    
    a = a + b;
    printf("%.2f", a); // 10.00

    return 0;
}
 
Allora semplifica il problema (è sempre così che si risolvono le cose). Sembra che la funzione array2D non si stia comportando come dovrebbe. Siamo sicuri che sia così?

Potresti effettuare questa fase (chiamata di "debugging") in più modi, il più comodo usando gdb (qui un video in inglese che ne spiega le basi di funzionamento:
). Se non conosci bene l'inglese e/o non vuoi mettere altra carne al fuoco (e ti capirei!), puoi sempre printare un po' ovunque.

Come prima cosa quindi controllerei che i dati passati alla funzione siano quelli che ti stai aspettando, quindi... ciclicherei l'array in parametro e stamperei i valori: in questo modo sapremo se è l'input ad essere sbagliato, oppure l'elaborazione della funzione stessa.
 
ma per il tipo type posso utilizzare anche la float scanf" %f"o esclusivamente la double?scanf ("%fl)
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità

Ci sono discussioni simili a riguardo, dai un'occhiata!

Pubblicità

Discussioni Simili

Indietro
Top