array2D (somma+massimo)

Stato
Discussione chiusa ad ulteriori risposte.

pabloski

Utente Èlite
2,868
916
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.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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
}
 

pabloski

Utente Èlite
2,868
916
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;
}
 

Andretti60

Utente Èlite
6,440
5,091
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"
Post unito automaticamente:

@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?)
 
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
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?
 

pabloski

Utente Èlite
2,868
916
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.
 

toni1705

Nuovo Utente
98
9
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:

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
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]
  }
}
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
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;
}
 

Giacomo Furlan

Utente Attivo
351
87
CPU
AMD Ryzen 5900x
Dissipatore
BeQuiet! SilentLoop 2 360mm
Scheda Madre
Gigabyte X470 AORUS Gaming 7 WIFI AMD X470
HDD
Crucial P5 Plus 2 TB PCIe M.2 2280SS
RAM
Patriot Viper Steel RAM DDR4 3600 Mhz 64GB (2x32GB) C18
GPU
MSI GeForce RTX 2080 Gaming X Trio
Audio
SteelSeries Arctis 9
Monitor
Alienware AW3423DWF
PSU
EVGA SuperNOVA 650 G3, 80 Plus GOLD 650W
Case
Sharkoon TG5
OS
Windows 11, Fedora 36
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.
 

toni1705

Nuovo Utente
98
9
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.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili