Esercizio C

di il
10 risposte

Esercizio C

Sono di nuovo io e mi sa che chiederò ancor spesso il vostro aiuto dato che mi sto cimentando a fare diversi esercizi in C

Esercizio:
Progettare un programma principale che legge le dimensioni di una matrice di max [100][100],
chiama una routine per la lettura per riga e una per la somma degli elementi per riga.

Il codice:

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

void sommariga(int n, int m, float a[100][100])
{
    int j,i;
    float somma=0;
    float sr[i];
    for(i=0 ; i<n ; i=i+1)
    {
     somma = 0.0 ;
     for(j=0; j<m; j=j+1)
      {
        somma = somma + a[i][j] ;
        sr[i] = somma ;
      }
     }
     for(i=0; i<n; i=i+1)
     {
         printf("Somma riga %d = %f\n", i+1, sr[i]) ;
     }
}

int main()
{
    int righe,colonne,i,j,n,m;
    float matrice[100][100];
    printf("Inserisci rispettivamente numero di righe e numero di colonne: ");
    scanf("%d %d",&n,&m);
    printf("Inserisci gli elementi della matrice: ");
    
    for(i=0;i<n;i++)
    {
     printf("\n");
      for(j=0;j<m;j++)
       {
         scanf("%lf",&matrice[i][j]);
       }
    }
    
    sommariga(righe,colonne,matrice);
    
    system("pause");
    
    return 0;
}
Inserisci righe e colonne, inserisco i vari valori ma la somma è sempre sbagliata quindi evidentemente bisogna modificare qualcosa nella somma..qualche consiglio?

Grazie in anticipo!

10 Risposte

  • Re: Esercizio C

    A parte il fatto che gli array non sono dichiarati bene (sr è proprio sbagliato mentre la matrice di lunghezza 100x100 è inutile) ti faccio notare che nell'inserimento degli elementi il ciclo for più interno è quello di j, quindi delle colonne. Significa che stai riempiendo la matrice per colonne. Forse è per questo che non ti veniva. Comunque correggi anche gli altri errori perchè potrebber o causare malfunzionamenti.
  • Re: Esercizio C

    Perchè sono sbagliati? sr avevo pensato che fosse inutile ma gli altri?
    In realtà ho messo 100x100 perchè nell'esercizio dice massimo 100x100..come posso fare altrimenti?

    Per quanto riguarda il for, quindi, per fare la somma delle righe, devo portare come indice più interno la i indicando che sto inserendo gli elementi (e quindi sommandoli) per riga?
  • Re: Esercizio C

    Inanzitutto butta via dev-c++ e scaricati code::block o altro editor.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void sommariga(int nr, int nc, float a[100][100])
    {
        int r,c;
        float somma;
    
        for(r=0 ; r < nr ;r++)
        {
            for(c=0 ,somma=0.0; c < nc; c++)
            {
                somma += a[r][c];
            }
             printf("Somma riga[%d] = %f\n", r, somma) ;
         }
    }
    
    int main()
    {
        int r,c,nr,nc;
        float matrice[100][100];
    
        printf("Inserisci rispettivamente numero di righe e numero di colonne: ");
            scanf("%d %d",&nr,&nc);
        printf("Inserisci gli elementi della matrice:\n");
    
        for(r=0; r < nr ;r++)
        {
            for(c=0; c < nc ;c++)
            {
                printf("[%d][%d]::",r,c);
                scanf("%f",&matrice[r][c]);
            }
        }
    
        sommariga(nr,nc,matrice);
    
        return 0;
    }
    
  • Re: Esercizio C

    La somma praticamente l'abbiamo fatta uguale ma non capisco perchè a me non va!
    Perchè devo cambiare editor? Cosa cambia tra dev-c++ e code::block?
  • Re: Esercizio C

    Dev c++ è un progetto vecchio e perdipiu abbandonato e per finire presenta infiniti bug.
    Code::Block invece è tuttora aggiornato (11/2012) ultima release ,e se proprio non se ne può far a meno si possono integrare i plug-in del dev c++.
    Scaricando Code::Block se vuoi puoi scaricare insieme anche l'ultima versione del MinGW.
    Penso che scrivendo codice sul notepad si facciano meno errori che con il dev-c++,o almeno si capiscano!
    Dimenticavo il debugger implementato in code::block almeno funziona!


    Del resto controlla bene i codice e cerca di capirne le differenze,ciao vado di fretta.
  • Re: Esercizio C

    In passato ho sempre usato code block, è dagli ultimi tempi che sto usando dev-c++ e devo dire che non avevo problemi ma comunque mi fido dei tuoi consigli e quindi provvedo a cambiare editor

    Nel frattempo cerco di capire perchè la mia somma non avviene!
    Non mi piace fare copia/incolla, se le cose non riesco a capirle non le faccio
    quindi a costo di starci 24 ore su ma dovrà riuscirmi

    EDIT: Che stupido! Ho scritto "%lf" nell'inserimento della matrice, anzichè "%f" essendo float e non double

    EDIT 2: Ancora non funziona Mi somma la prima riga ma alla seconda riga, come somma, assegna la somma di tutta la matrice! Esempio:

    Matrice 2x2
    1 2
    3 4

    Somma riga 1= 3 //calcola 1+2
    Somma riga 2= 10 //calcola 1+2+3+4

  • Re: Esercizio C

    Scaricati l'ultimo code::block con minGW incorporato cosi hai anche un pò di warning incorporati che non fanno mai male
  • Re: Esercizio C

    PierIzzle ha scritto:


    EDIT 2: Ancora non funziona Mi somma la prima riga ma alla seconda riga, come somma, assegna la somma di tutta la matrice!
    Dopo aver stampato la somma di una riga, questa somma va azzerata...
  • Re: Esercizio C

    Ora ho due secondi....
    Che stupido! Ho scritto "%lf" nell'inserimento della matrice, anzichè "%f" essendo float e non double
    Se avevi avuto un buon compilatore+ide ti avrebbe segnalato l'errore! e...forse non avresti neppure postato una domanda se magari spuntasti qualche clausula di compilazione.

    Ora Fase 1:scaricati Code::Block con il compilatore MinGW incorporato.
    Fase 2:Prova
    Fase 3:Torna a postare il codice,pulito,identato e vedrò di aiutarti a cpire meglio.

    ultima cosina,dato che il c/c++ sono linguaggi,a volte complessi,una corretta "grammatica" può aiutare lo sviluppatore.
    Se quindi vogliamo scorrere una matrice(Mappa) che rappresenta una tabella di righe e colonne la soluzione grammaticalmente piu corretta è
    
    #define MAX_MAPPA 100
    float Mappa[MAX_MAPPA][MAX_MAPPA];
    unsigned int righe;
    unsigned int colonne;
    for (righe=0; righe < MAX_MAPPA ; righe++)
    {
        for (colonne=0; colonne < MAX_MAPPA ; colone++)
        {
            Mappa[righe][colonne]=.......;
        }
    }
    
    io per semplicità ho usato r per righe e c per colonne cosi da non perdersi in inutili iteratori da nomi troppo usuali quali i,k,j.

    cosicchè per una mappa di pixel avrei preferito usare:
    
    #define MAX_MAPPA_W 100
    #define MAX_MAPPA_H 100
    char Mappa[MAX_MAPPA_H][MAX_MAPPA_W];
    unsigned int x;
    unsigned int y;
    for (y=0; y < MAX_MAPPA_H ; y++)
    {
        for (x=0; x < MAX_MAPPA_W ; x++)
        {
            Mappa[y][x]=.......;
        }
    }
    
    Ultima considerazione fondamentale,prima scrivilo in italiano poi in c/c++
    Uso il tuo metodo con array anche se superfluo:

    -Scorro tutte le righe
    -Per ogni riga:
    --ciclo e sommo ogni valore della colonna
    -memorizzo valore somma
    -
    -visualizzo dati memorizzati

    Ora lo traduco:
    
    for (righe=0;  righe < MAX_MAPPA ; righe++) //-per ogni riga
    {
        somma=0.0;
        for (colonne=0; colonne < MAX_MAPPA ; colonne++) //ciclo
        {
            somma+=Mappa[righe][colonne];//sommo ogni valore della colonna
        }
        sr[righe] = somma ;//memorizzo valore somma
    }
    
    for (i=0; i < MAX_MAPPA ; i++)//uso i come iteratore,come dire "itero ogni valore del vettore"
    {
        printf("Somma riga %d = %f\n", i, sr[i]) ;//-visualizzo dati memorizzati
    }
    
  • Re: Esercizio C

    Grazie per la pazienza innanzitutto!
    Si mi rendo conto che far capire agli altri cosa si ha in mente non è facile soprattutto quando non ci si parla da vicino. Ad ogni modo io utilizzo sempre fare una sorta di "guida" scritta molto semplicemente, per ogni programma, prima di mettere su codice ma in questi ultimi casi, su questo forum, ho postato direttamente quello che avevo scritto nel compilatore.
    Nel caso in cui dovessi postare ancora per qualche altro problema, farò in questo modo:

    1)Scriverò il testo dell'esercizio
    2)Scriverò una sorta di guida in italiano da poter trasformare in codice (la mia idea insomma)
    3)Posterò il codice tradotto

    Ancora mille grazie
Devi accedere o registrarti per scrivere nel forum
10 risposte