C - Somma degli elementi sui bordi della matrice

di il
8 risposte

C - Somma degli elementi sui bordi della matrice

Ciao a tutti, ho un dubbio su questo esercizio. Ho guardato anche dalla soluzione del prof e online, e ovunque mi danno la stessa soluzione che ho applicato io durante il codice, ma non so per quale motivo la somma degli elementi sui bordi non mi da come risultato il valore giusto.

Il codice è questo:

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

/*
  Scrivere un programma che genera una matrice con N righe ed M colonne
  contenente una serie di numeri casuali tra 0 e 10.
  Il programma, dopo aver generato la matrice, deve visualizzarla a video,
  quindi sommare gli elementi sui bordi della matrice.
*/

//costanti
#define N 5
#define M 7
#define MINRAND 0
#define MAXRAND 20

//prototipi
void matrice_genera(unsigned righe, unsigned colonne, int mat[][colonne]);
void matrice_visualizza(unsigned righe, unsigned colonne, int mat[][colonne]);
void matrice_bordi(unsigned righe, unsigned colonne, int mat[][colonne], int *s);

void matrice_genera(unsigned righe, unsigned colonne, int mat[][colonne]){
  unsigned i, j;
  for(i=0; i<righe; i++){
    for(j=0; j<colonne; j++){
      mat[i][j] = rand() % (MAXRAND-MINRAND+1)+MINRAND;
    }
  }
}

void matrice_visualizza(unsigned righe, unsigned colonne, int mat[][colonne]){
  unsigned i, j;
  for(i=0; i<righe; i++){
    for(j=0; j<colonne; j++){
      printf("%d\t", *(*mat+i)+j);
    }
    printf("\n\n");
  }
}

void matrice_bordi(unsigned righe, unsigned colonne, int mat[][colonne], int *s){
  unsigned i, j;
  for(i=0; i<righe; i++){
    for(j=0; j<colonne; j++){
      if(i==0 || j==0 || i==righe-1 || j==colonne-1){
        *s = *s + *(*(mat+i)+j);
      }
    }
  }
}

int main(){
  int matrice[N][M];
  int somma = 0;

  srand(time(NULL));

  printf("\n*** Inizio programma ***\n\n");
  printf("\n*** Matrice 5 x 7 generata ***\n\n");

  matrice_genera(N, M, matrice);
  matrice_visualizza(N, M, matrice);

  matrice_bordi(N, M, matrice, &somma);
  printf("\nSomma degli elementi sui bordi:\t%d", somma);
  printf("\n\n*** Fine programma ***\n");
  return 0;
}
Per esempio la soluzione che mi da il programma è questa:

8 Risposte

  • Re: C - Somma degli elementi sui bordi della matrice

    
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    /*
      Scrivere un programma che genera una matrice con N righe ed M colonne
      contenente una serie di numeri casuali tra 0 e 10.
      Il programma, dopo aver generato la matrice, deve visualizzarla a video,
      quindi sommare gli elementi sui bordi della matrice.
    */
    
    //costanti
    #define N 5
    #define M 7
    #define MINRAND 0
    #define MAXRAND 20
    
    //prototipi
    void matrice_genera(unsigned int righe, unsigned int colonne, int mat[][colonne]);
    void matrice_visualizza(unsigned int righe, unsigned int colonne, int mat[][colonne]);
    int matrice_bordi(unsigned int righe, unsigned int colonne, int mat[][colonne]);
    
    void matrice_genera(unsigned int righe, unsigned int colonne, int mat[][colonne]){
      unsigned int i, j;
      for(i=0; i<righe; i++)
        for(j=0; j<colonne; j++)
          mat[i][j] = rand() % (MAXRAND-MINRAND+1)+MINRAND;
    }
    
    void matrice_visualizza(unsigned int righe, unsigned int colonne, int mat[][colonne]){
      unsigned int i, j;
      for(i=0; i<righe; i++){
        for(j=0; j<colonne; j++)
          printf("%d\t", mat[i][j]);
        printf("\n\n");
      }
    }
    
    int matrice_bordi(unsigned int righe, unsigned int colonne, int mat[][colonne]){
      unsigned int i, j;
      int s = 0;
      
      for(j=0; j<colonne; j++)
        s += mat[0][j];
        
      for(i=1; i < righe - 1; i++){
        s += mat[i][0]; 
        s += mat[i][colonne - 1];
      }
      
      for(j=0; j<colonne; j++)
        s += mat[righe - 1][j];
        
      return s;
    }
    
    int main(){
      int matrice[N][M];
      int somma;
    
      srand(time(NULL));
    
      printf("\n*** Inizio programma ***\n\n");
      printf("\n*** Matrice %d x %d generata ***\n\n", N, M);
    
      matrice_genera(N, M, matrice);
      matrice_visualizza(N, M, matrice);
    
      somma = matrice_bordi(N, M, matrice);
      printf("\nSomma degli elementi sui bordi:\t%d", somma);
      printf("\n\n*** Fine programma ***\n");
      return 0;
    }
    
  • Re: C - Somma degli elementi sui bordi della matrice

    Grazie mille .
    L'unica cosa, nell'esercizio mi chiedeva espressamente che non potevo usare l'accesso diretto della matrice mat [ ] [j], ma usare i puntatori *(*mat +i) +j), non penso che questo cambia moltissimo vero? Cambia solo il modo di "approccio"?.
    Comunque grazie ancora per la risposta
  • Re: C - Somma degli elementi sui bordi della matrice

    Perché non provi a risolverlo tu?

    Dichiara una funzione matrice_bordi_bis() e vedi se ti torna il risultato corretto dato da matrice_bordi()
  • Re: C - Somma degli elementi sui bordi della matrice

    Ho provato, ma visto che devo usare i puntatori e non l'accesso diretto della matrice, ho fatto in questo modo, ma il risultato mi da lo stesso sbagliato, non capisco se in questo caso l'errore sia dove faccio le somme in cui scrivo
    *s += *(*(mat+i)+(colonne-1));
    *s += *(*(mat+(righe-1))+j);

    Il codice è questo:
    
    void matrice_bordi(unsigned righe, unsigned colonne, int mat[][colonne], int *s){
      unsigned i, j;
    
      for(j=0; j<colonne; j++)
        *s += *(*(mat+0)+j);
    
      for(i=1; i<righe-1; i++){
        *s += *(*(mat+i)+0);
        *s += *(*(mat+i)+(colonne-1));
      }
    
      for(j=0; j<colonne; j++)
        *s += *(*(mat+(righe-1))+j);
    }
  • Re: C - Somma degli elementi sui bordi della matrice

    Ma perché void e non int come return value? Va bene farti esercitare con i puntatori, ma non ci credo che l'esercizio ti chieda di inizializzare una somma fuori dalla funzione.

    Sì fai le chiamate errate. Studia bene l'argomento e prova a risolvere
  • Re: C - Somma degli elementi sui bordi della matrice

    Lo so, infatti volevo fare una funzione int in cui ritornava la somma, però nell'esercizio c'è scritto void, la soluzione del prof è stata fatta con void, non capisco il motivo.
    Comunque grazie ancora per le risposte, adesso provo a risolvere
  • Re: C - Somma degli elementi sui bordi della matrice

    Comunque ho risolto il problema, l'errore era anche fin troppo stupido ahaha.
    Praticamente avevo fatto giusto, la somma usando l'if era corretto, avevo sbagliato a scrivere qua
    
    printf("%d\t", *(*mat +i ) + j);
    
    Quindi sommava correttamente, ma stampava una matrice completamente sbagliata, ti chiedo scusa se ti ho "rotto" per questo esercizio, dove avevo fatto un errore cosi stupido.
  • Re: C - Somma degli elementi sui bordi della matrice

    Gli errori 'stupidi' sono facili da trovare

    Le rogne iniziano con gli errori 'intelligenti'
Devi accedere o registrarti per scrivere nel forum
8 risposte