Visualizzazione dei risultati da 1 a 2 su 2

Discussione: media elementi matrice

  1. #1

    media elementi matrice

    Buon giorno a tutti, mi sono imbattuto nel seguente problema:
    codice:
    Media aritmetica tra elementi adiacenti in una matrice
    ------------------------------------------------------
    
    Scrivere un programma che:
    1. legga da terminale una matrice quadrata di numeri reali mat_in
       di dimensione predefinita MAX
    2. calcoli una seconda matrice (mat_med) in cui ciascun elemento
       (i, j) è un numero reale uguale alla media aritmetica dei valori
       presenti nella prima matrice nelle otto caselle adiacenti
       all'elemento (i, j).
     
    Per gli elementi sui "bordi" della matrice la media va fatta
    utilizzando solo gli elementi adiacenti che appartengono alla
    matrice. 
    La soluzione utilizzi due funzioni:
    1. media: per il calcolo del valore medio degli elementi adiacenti
       a ciascun elemento della matrice
    2. dentro: richiamata dalla funzione media per verificare se un
       certo elemento è interno alla matrice oppure no.
    
    Esempio
    -------
    
    Se la matrice di ingresso è la seguente:
    
    1  2  3
    4  5  6
    7  8  9
    
    la matrice prodotta sarà:
    
    3.66  3.80  4.33
    4.60  5.00  5.40
    5.66  6.20  6.33
    e nella seguente soluzione:
    codice:
    #include <stdio.h>
    #define MAX 3
    #define TRUE 1
    #define FALSE 0
    
    int dentro(int x, int y);
    float media(int x, int y);
    
    float mat[MAX][MAX],mat_med[MAX][MAX];
    main()
    {
       
       int x,y;
       
       for (x=0; x<MAX; x++){
           for (y=0; y<MAX; y++){
              printf("mat[%d][%d] = ",x+1,y+1);
              scanf("%f",&mat[x][y]);
           }
       }
    
    printf("\n\n");
       
    //Calcolo della media
       for (x=0; x<MAX; x++)
           for (y=0; y<MAX; y++)
               mat_med[x][y] = media(x,y);
    
    // visualizza risultato
    for (x=0; x<MAX; x++)
       {
       for (y=0; y<MAX; y++)
          printf ("%6.2f", mat_med[x][y]);
       printf ("\n");
       }
    
    
       
    getch();
    }
    
    int dentro(int x, int y)
    {
      if (x<0 || x>=MAX)
         return FALSE;
      if (y<0 || y>=MAX)
         return FALSE;
      else
         return TRUE;
    }
          
    
    float media(int x, int y)
    {
      int i, j, conta=0;
      float somma=0;  
    
      
      for (i=-1; i<2; i++)
       for (j=-1; j<2; j++)
    
          /* scandisce gli elementi interni alla matrice
             tranne l'elemento stesso */
          if ( ((i!=0)||(j!=0)) && dentro (x+i, y+j) == TRUE )
             {
             conta++;
             somma += mat[x+i][y+j];
             }
             
    return (somma/conta);
    }
    ora vi chiederete di che altro hai bisogno?

    Non sono riuscito a capire l'ultima funzione cioè dove calcola la media che stratagemma è stato utilizzato perchè i contatori partono da -1? e così via.. perchè è stato risolto in questo modo? e perchè sono così scemo da non arrivarci

    grazie

  2. #2
    x e y è l'elemento della matrice in esame, i e j sono degli offset rispetto al punto in esame. Devi considerare tutti gli otto elementi adiacenti a questo quindi se parti dal primo in alto a sinistra devi partire ad esaminare il punto x-1, y-1 , poi ti muovi a x, y-1, e quindi a x+1,y-1. Quindi passi alla riga successiva x-1,y x,y (ma lo escludi perchè è il punto in esame), e x+1, y. Infine l'ultima riga x-1,y+1 , x, y+1 e l'ultimo x+1, y+1.
    Per ciascun punto prima verifichi che questo si trovi all'interno della matrice.
    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.