Advertisement
Mazamin

Sottomatrici

Jan 19th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.72 KB | None | 0 0
  1. /* PROVA DI FONDAMENTI DI INFORMATICA 24.02.2016
  2.  * TRACCIA C1
  3.  *
  4.  * Scrivere un programma C che letta da file una matrice di dimensione (n,m)
  5.  * di interi positivi, individui la sottomatrice quadrata di ordine "o" la cui somma
  6.  * degli elementi sulla diagonale principale è massima.
  7.  * La sottomatrice individuata deve essere stampata su file di output insieme al
  8.  * valore massimo calcolato.
  9.  *
  10.  * Un esempio di file di input e' il seguente:
  11.  
  12.   4   4
  13.   3   1   2   1
  14.   1   8   7   9
  15.   4   7   8   7
  16.   2   7   1   5
  17.  
  18.  Un esempio di esecuzione e':
  19.  
  20.  Digitare il nome del file contenente la matrice: input.txt
  21.  
  22.  Digita l'ordine della sottomatrice quadrata: 3
  23.  
  24.  Sottomatrice di ordine 3 con somma massima
  25.  
  26.  8   7   9
  27.  7   8   7
  28.  7   1   5
  29.  
  30.  Somma diagonale prinpipale: 21
  31.  
  32.  */
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36.  
  37. #define DIMR 20
  38. #define DIMC 20
  39. #define NCAR 100
  40.  
  41. /* Prototipi delle funzioni  */
  42. FILE *ApriFile(char *);
  43. void LeggiMatrice(FILE *, int [][DIMC], int *, int *);
  44. int SommaSottoMatMax(int [][DIMC],int, int, int, int *, int *);
  45. void ScriviSottoMatMax(FILE *, int [][DIMC], int, int, int, int);
  46. void StampaMatrice(int [][DIMC], int, int);
  47.  
  48. /* Funzione main */
  49. int main() {
  50.     FILE *fp;
  51.     int M[DIMR][DIMC];
  52.     int r, c, ordine, x, y, max;
  53.  
  54.     /* Apre il file di input */
  55.     fp = ApriFile("r");
  56.  
  57.     /* Legge la matrice da file */
  58.     LeggiMatrice(fp, M, &r, &c);
  59.  
  60.     /* Chiude il file */
  61.     fclose(fp);
  62.  
  63.     /* Stampa Matrice a video */
  64.     StampaMatrice(M, r, c);
  65.  
  66.     printf("Digita l'ordine della sottomatrice quadrata: ");
  67.     scanf("%d", &ordine);
  68.  
  69.     /* Calcola la sottomatrice di ordine "ordine" con diagonale principale massima */
  70.     max = SommaSottoMatMax(M, r, c, ordine, &x, &y );
  71.     printf("max: %d\n", max);
  72.     if(max == -1)
  73.         printf("Non esiste sottomatrice dell'ordine specificato.");
  74.     else {
  75.         /* stampa gli indici di inzio della sottomatrice */
  76.         printf("indice riga: %d indice colonna: %d\n",x, y);
  77.  
  78.         /* Apre il file di output */
  79.         fp = ApriFile("w");
  80.  
  81.         /* Stampa la sottomatrice e la somma della diagonale principale */
  82.         ScriviSottoMatMax(fp, M, x, y, ordine, max);
  83.         fclose(fp);
  84.     }
  85.     return (EXIT_SUCCESS);
  86. }
  87.  
  88. /*
  89.  La funzione ApriFile apre il file il cu nome e' fornito in input
  90.  dall'utente nella modilità  specificata dal parametro formale mode
  91.  e ritorna il puntatore al file
  92.  */
  93. FILE *ApriFile(char* mode)
  94. {
  95.     FILE * fp;
  96.     char filename[NCAR];
  97.     printf("Insert %s filename: ", (mode[0]=='r')?("input"):("output"));
  98.     scanf("%s", filename);
  99.     if ((fp=fopen(filename, mode))==NULL)
  100.         abort();
  101.     else
  102.         return fp;
  103. }
  104.  
  105. /*
  106.  La funzione LeggiMatrice riceve il puntatore al file di input, la matrice dove memorizzare
  107.  i valori letti e 2 puntatori a intero per memorizzare le dimensioni delle matrice letta
  108.  mediante passaggio per riferimento.
  109. */
  110. void LeggiMatrice(FILE *fpin, int M[][DIMC], int *n, int *m )
  111. {
  112.     int i, j;
  113.     fscanf(fpin, "%d %d", n, m);
  114.     for(i=0;i<*n;i++)
  115.         for(j=0;j<*n;j++)
  116.             fscanf(fpin, "%d", &M[i][j]);
  117. }
  118.  
  119. /*
  120.  La funzione SommaSottoMatMax riceve come parametro la matrice e le sue dimensioni;
  121.  l'ordine della sottomatrice quadrata da individuare e 2 puntatori a intero dove
  122.  memorizzare le coordinate del punto iniziale della sottomatrice.
  123.  Restituisce il valore della somma degli elementi della diagonale principale della
  124.  sottomatrice individuata o "-1" in caso non esista una sottomatrice dell'ordine specificato.
  125.  */
  126. int SommaSottoMatMax(int M[][DIMC], int n, int m, int o, int *x, int *y ) {
  127.     int i, j, k, sum, dmax=0;
  128.     if ((n-o+1)*(m-o+1)<1)
  129.         return -1;
  130.     for(i=0;i<n-o+1;i++)
  131.         for(j=0;j<m-o+1;j++){
  132.             for(k=0, sum=0;k<o;k++)
  133.                 sum+=M[i+k][j+k];
  134.             if(sum>dmax){
  135.                 dmax=sum;
  136.                 *x=i;
  137.                 *y=j;
  138.             }
  139.         }
  140.     return dmax;
  141. }
  142.  
  143. /*
  144.  La funzione scriviSottoMatMax scrive su file di output la somma calcolata e la sottomatrice individuata.
  145.  Riceve come parametri il puntatore al file di output, la matrice completa, le coordinate del punto di
  146.  origine della sottomatrice individuata e il valore massimo. */
  147. void ScriviSottoMatMax (FILE *fpout, int M[][DIMC], int x, int y, int o, int max)
  148. {
  149.     int i, j;
  150.     fprintf(fpout, "Submatrix o-%d with max sum (%d)\n", o, max);
  151.     for(i=0;i<o;i++)
  152.         for(j=0;j<o;j++)
  153.             fprintf(fpout, "%d%c", M[i+x][j+y], (j==(o-1))?('\n'):('\t'));
  154. }
  155.  
  156. void StampaMatrice(int M[][DIMC], int r, int c)
  157. {
  158.     int i, j;
  159.  
  160.     for(i = 0; i < r; i++) {
  161.     for(j = 0; j < c; j++) {
  162.             printf("%d ", M[i][j]);
  163.         }
  164.         printf("\n");
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement