Double confusione

di il
27 risposte

Double confusione

#include <stdio.h>
#define R 100
#define C 100

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

  /* 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]);
  }}
printf("%lf",a[i][j]);
 max=array2D(a,r,c);
 printf("\nil massimo:%d",max);



}
double array2D( double a[][100],int  r ,int  c)
{
    int i,j,somma,max;
    somma=0;
    max=a[0][0];
    /* facciamo la somma*/
  for (j=0; j<c; j++)
    {
        somma=0;
        for (i=0; i<r;i++)
        {
        somma+=a[i][j];
        }
        printf("\nla somma:%d",somma);
        if(somma>max)
            max=somma;
        }

return max;
}

27 Risposte

  • Re: Double confusione

    Ovviamente
  • Re: Double confusione

    Nelle operazioni generalmente sì, ma per il risultato puoi usare il cast nell'assegnazione a una variabile di comodo.

    Nel tuo caso però nel printf hai un %d quindi si aspetta un valore intero per l'argomento corrispondente. Generalmente questo fa crashare il programma. O cambi %d in %lf oppure se per qualche strano e bizzarro motivo ti serve solo la parte intera lasci %d ma l'argomento deve essere (int)max. Inutile dire che se va molto bene è una pecionata, se va meno bene e hai un overflow in max stamperà qualcosa di inservibile. il formattatore per l'intero mi fa pensare che ti interessi l'indice della colonna e in questo caso la funzione array2D va modificata. Inoltre max nella funzione è dichiarato intero, insomma, sicuramente perché sono molto di fretta ma sospetto che qualche problema ci potrebbe essere.

    EDIT: vedo che anche nel main "max" è intero... insomma, dovresti fare un po' di ordine
  • Re: Double confusione

    
    #include <stdio.h>
    #define R 100
    #define C 100
    
    double array2D( double a[][100],int,int);
    main()
    {
     int i,j,r,c;
     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]);
      }}
     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;
        max=a[0][0];
        /* facciamo la somma*/
      for (j=0; j<c; j++)
        {
            somma=0;
            for (i=0; i<r;i++)
            {
            somma+=a[i][j];
            }
            printf("\nla somma:%lf",somma);
            if(somma>max)
                max=somma;
            }
    
    return max;
    }
    
    come mai se inserisco i numeri mi riporta sempre 0.0000
    https://ibb.co/cONf7
  • Re: Double confusione

    Il codice che mostri qui non è quello che ti dà quel risultato. A parte il fatto che a me funziona e fa i calcoli, tu hai uno
    0.0000
    visualizzato prima del totale che io non ho
  • Re: Double confusione

    oregon ha scritto:


    Il codice che mostri qui non è quello che ti dà quel risultato. A parte il fatto che a me funziona e fa i calcoli, tu hai uno
    0.0000
    visualizzato prima del totale che io non ho
    #include <stdio.h>
    #define R 100
    #define C 100
    
    double array2D( double a[][100],int,int);
    main()
    {
     int i,j,r,c;
     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]);
      }}
     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;
        max=a[0][0];
        /* facciamo la somma*/
      for (j=0; j<c; j++)
        {
            somma=0;
            for (i=0; i<r;i++)
            {
            somma+=a[i][j];
            }
            printf("\nla somma:%lf",somma);
            if(somma>max)
                max=somma;
            }
    
    return max;
    }
    
    oregon se provi questo codice da 0.0000
    https://ibb.co/kixjH
  • Re: Double confusione

    Ho fatto copia e incolla e (dopo aver aggiunto int prima del main, perchè altrimenti non compilava) ho testato il programma inserendo la matrice

    1 2 3
    4 5 6
    7 8 9

    e ""sembrava"" funzionare. Sottolineo "sembra", perchè poi leggendo il codice mi sono accorto che la logica della funzione è sbagliata. Infatti inserendo la matrice

    9 2 3
    -3 1 2
    -4 5 1

    come previsto ottengo un risultato errato (mi dice che il max è uguale a 9 e non ad .
    L'errore è nell'inizializzazione max=a[0][0].

    Cmq ho riscritto il tuo codice rendendolo (a mio parere) un po' più chiaro e leggibile (per esempio rispettando la spaziatura, l'indentazione, ecc...).
    #include <stdio.h>
    
    #define R 100
    #define C 100
    
    double calcola_max(double a[][C], int r , int c)
    {
        double somma;
        double max = a[0][0];
        for(unsigned int j = 0; j < c; ++j)
        {
            somma = a[0][j];
            for(unsigned int i = 1; i < r; ++i)
            {
                somma += a[i][j];
            }
            if(somma > max)
            {
                max = somma;
            }
        }
        return max;
    }
    
    int main()
    {
        unsigned int r;
        unsigned int c;
        double m[R][C];
        printf("RIGHE( <=100 ): ");
        scanf("%d", &r);
        printf("COLONNE( <=100 ): ");
        scanf("%d", &c);
        for(unsigned int i = 0; i < r; ++i)
        {
            for(unsigned int j = 0; j < c; ++j)
            {
                printf("m[%d][%d]: ", i, j);
                scanf("%lf", &m[i][j]);
            }
        }
        printf("MAX: %lf", calcola_max(m, r, c));
    }
    Ragiona sull'inizializzazione della variabile "max" e prova a correggere il programma.

    Per quanto riguarda il fatto che ti mostra sempre 0.000 non saprei dirti... non so se come ipotesi stanno in piedi, ma magari è un problema dovuto al fatto che non hai scritto "int main" o all'utilizzo dei double?! Inoltre noto che il valore di ritorno del programma è 20! Magari prova a mettere "int main" e ad usare i float al posto dei double e fammi sapere.

    EDIT: al posto della faccina ci sarebbe un 8, peccato che 8+) restituisca l'emoticon!
  • Re: Double confusione

    Se converto tutto a float funziona
    ma a me serve a double :/
    come possiamo venirne a capo.

    ho fatto un ripristino nelle impostazioni del complilatore
    ora funziona .____.
    #include <stdio.h>
    #define R 100
    #define C 100
    
    double array2D( double a[][100],int,int);
    main()
    {
     int i,j,r,c;
     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]);
      }}
      for(i=0; i<r; i++){
            printf("\n");
      for (j=0; j<c; j++){
        printf(" %2lf",a[i][j]);}}
        printf("\n");
     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;
        max=a[0][0];
        /* facciamo la somma*/
      for (j=0; j<c; j++)
        {
            somma=0;
            for (i=0; i<r;i++)
            {
            somma+=a[i][j];
            }
            printf("\nla somma:%lf",somma);
            if(somma>max)
                max=somma;
            }
    
    return max;
    }
    
  • Re: Double confusione

    Hai messo "int" prima del main?

    Il resto del mio precedente post l'hai completamente ignorato?
  • Re: Double confusione

    Era un errore del compilatore leggi sopra .-.
  • Re: Double confusione

    Mi fa piacere che tu abbia risolto la questione "double", ma:
    - devi mettere "int" prima del main;
    - noto che continui a non rispettare la spaziatura e l'indentazione;
    - e soprattutto il programma NON FUNZIONA, la logica della funzione è SBAGLIATA!
  • Re: Double confusione

    Nota di servizio : per programmi così banali l'esistenza di un bug nel compilatore va esclusa categoricamente a priori.
    spesso i programmatori novizi tendono a 'incolpare' il compilatore di tutto e di più.
    normalmente capita 2 o 3 volte in trenta anni di programmazione di trovare veri bug nei compilatori.
  • Re: Double confusione

    Nippolo ha scritto:


    Mi fa piacere che tu abbia risolto la questione "double", ma:
    - devi mettere "int" prima del main;
    - noto che continui a non rispettare la spaziatura e l'indentazione;
    - e soprattutto il programma NON FUNZIONA, la logica della funzione è SBAGLIATA!

    +m2+ ha scritto:


    Nota di servizio : per programmi così banali l'esistenza di un bug nel compilatore va esclusa categoricamente a priori.
    spesso i programmatori novizi tendono a 'incolpare' il compilatore di tutto e di più.
    normalmente capita 2 o 3 volte in trenta anni di programmazione di trovare veri bug nei compilatori.
    https://ibb.co/n6Vqc
    ho semplicemente ricopiato il codice scritto sopra e aggiunta la stampa dell'array.
    a me funziona >.<
    nono non ho ignorato i tuoi post scritti sopra solo che da quando ho fatto settato i valori a defaul del compilatore funziona
  • Re: Double confusione

    +m2 ha scritto:


    Nota di servizio : per programmi così banali l'esistenza di un bug nel compilatore va esclusa categoricamente a priori.
    spesso i programmatori novizi tendono a 'incolpare' il compilatore di tutto e di più.
    normalmente capita 2 o 3 volte in trenta anni di programmazione di trovare veri bug nei compilatori.
    Sì, ma se non entri nel merito resta solo una frase ad effetto buttata lì a caso...
    Non essendo un esperto non so dire se l'utilizzo di "main" al posto di "int main" possa causare qualche genere di problema, ma escluso questo il programma postato da toni1705 non presentava alcun errore che giustificasse il problema riscontrato coi double. Sbaglio?
    Inoltre toni1705 dice che dopo aver resettato i parametri del compilatore, il problema è sparito, come te lo spieghi? Che poi a creare danni con le impostazioni sia stato probabilmente stesso lui è un'altra questione.

    toni1705 ha scritto:


    nono non ho ignorato i tuoi post scritti sopra solo che da quando ho fatto settato i valori a defaul del compilatore funziona
    A questo punto o non l'hai letto proprio il mio precedente messaggio o l'hai fatto in modo mooooolto superficiale...
    prova a lanciare il programma con la seguente matrice:

    9 2
    -1 3

    Che risultato ti dà? E' corretto?
  • Re: Double confusione

    Nippolo ha scritto:


    Sì, ma se non entri nel merito resta solo una frase ad effetto buttata lì a caso...
    Purtroppo restano tutte frasi buttate lì a caso.
    Non essendo un esperto non so dire se l'utilizzo di "main" al posto di "int main" possa causare qualche genere di problema,
    Avere questo dubbio palesa il livello della tua conoscenza dell'argomento.
Devi accedere o registrarti per scrivere nel forum
27 risposte