Don't like ads? PRO users don't see any ads ;-)
Guest

RA045528 _ teste _ pontosdesela

By: a guest on Aug 10th, 2012  |  syntax: None  |  size: 3.45 KB  |  hits: 13  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. int **copy_matrix(int *ordem); //encontra a ordem da matriz e armazena em *ordem, e copia os dados de entrada
  7. void fprint_sela(int **m, int ordem, int col_max[ordem], int line_min[ordem]); //calcula e imprime os pontos de sela da matriz armazenada em **m
  8.  
  9.  
  10. int main()
  11. {
  12.         int i, j, n, col_max[n], line_min[n];
  13.         int **m;
  14.        
  15.         m=copy_matrix(&n);                   
  16.        
  17.         fprint_sela(m, n, col_max, line_min);  
  18.         for (i=0; i<n; i++)                    //libera os vetores alocados na função copy_matrix
  19.                 free(m[i]);
  20.        
  21.         free(m);
  22.        
  23.         return 0;
  24. }
  25.  
  26.  
  27. int **copy_matrix(int *ordem)              
  28. {
  29.         int  n, i, j, x;  //n = ordem; demais são variáveis auxiliares.
  30.         int **m;          //vamos armazenar os dados de entrada da matriz nesse apontador duplo
  31.         char aux[100], line[100], *coment;    //string auxiliar
  32.        
  33.         fscanf(stdin, "%d", ordem);         //pega o primeiro dado da primeira linha - ou seja, a ordem da matriz
  34.        
  35.         n=*ordem;
  36.        
  37.         if(n>20)
  38.         {
  39.                 printf("Dados Inválidos\n");   //Só permite armazenamento de matrizes de ordem máxima = 20
  40.                 exit(0);
  41.         }
  42.        
  43.         fgets(aux, 99, stdin);             //Para pular os comentários da primeira linha
  44.        
  45.         m = (int **) malloc(n*sizeof(int *));
  46.        
  47.         if(!m)
  48.         {
  49.                 printf("FALHA ALOCAÇÃO MEMÓRIA");
  50.                 exit(0);
  51.         }
  52.        
  53.        
  54.         for (i=0; i<n; i++)
  55.         {
  56.                 m[i] = (int *) malloc(n*sizeof(int));
  57.                 if(!m[i])
  58.                 {
  59.                         printf("FALHA ALOCAÇÃO MEMÓRIA");
  60.                         exit(0);
  61.                 }
  62.         }              
  63.        
  64.         i=0;
  65.        
  66.         while(fgets(line, 100, stdin))
  67.         {
  68.                 scanf("%d ", &m[i][0]);
  69.                 for (j=1; j<n; j++)
  70.                 {
  71.                         x = scanf( "%d ", &m[i][j]);  
  72.                         if (x==0)                            //acusa a falta de dados, caso em que scanf retorna EOF
  73.                         {
  74.                                 printf("Dados Inválidos");
  75.                                 exit(0);                            
  76.                         }
  77.                 }
  78.                 scanf("%[^\n]", coment);
  79.                 i++;
  80.         }
  81.        
  82.         /*
  83.         for (i=0; i<n; i++)
  84.         {
  85.                 for (j=0; j<n; j++)
  86.                 {
  87.                         x = scanf( "%d ", &m[i][j]);  
  88.                         if (x==0)                            //acusa a falta de dados, caso em que scanf retorna EOF
  89.                         {
  90.                                 printf("DADOS INVALIDOS");
  91.                                 exit(0);                            
  92.                         }
  93.                        
  94.                 }
  95.                 scanf("%[^\n]", coment);    //para pular comentários nas linhas
  96.         }
  97.         */
  98.        
  99.         return m;
  100. }
  101.  
  102.  
  103. void fprint_sela(int **m, int ordem, int *col_max, int *line_min)  //calcula e imprime os pontos de sela
  104. {
  105.         int i, j, n, count=0;   //variáveis auxiliares
  106.  
  107.        
  108.         n=ordem;
  109.        
  110.         fprintf(stdout, "\nOs pontos de sela são:\n");
  111.        
  112.         for(j=0; j<n; j++)                     //encontra o maior elemento de cada coluna
  113.         {
  114.                 col_max[j] = m[0][j];
  115.                 for(i=1; i<n; i++)
  116.                 {
  117.                         if(m[i][j] > col_max[j])
  118.                                 col_max[j] = m[i][j];  
  119.                 }      
  120.         }
  121.        
  122.        
  123.         for(i=0; i<n; i++)                     //encontra o menor elemento de cada linha
  124.         {
  125.                 line_min[i] = m[i][0];
  126.                 for(j=1; j<n; j++)
  127.                 {
  128.                         if(m[i][j] < line_min[i])
  129.                                 line_min[i] = m[i][j];  
  130.                 }
  131.         }
  132.        
  133.        
  134.        
  135.                
  136.         for(i=0; i<n; i++)
  137.         {
  138.                 for(j=0; j<n; j++)
  139.                 {
  140.                         if(m[i][j] == col_max[j] && m[i][j] == line_min[i])        //testa se um elemento m[i][j] é o máximo de sua linha (i)    
  141.                         {                                                          //e de sua coluna (j) - ou seja, se é um ponto de sela.
  142.                                 fprintf(stdout, "%4d %4d %4d \n", i, j, m[i][j]);
  143.                                 count++;
  144.                         }
  145.                 }
  146.                
  147.         }
  148.        
  149.         if (count==0)                 //se a condição do if não for satisfeita nenhuma vez, count ==0 e não temos pontos de sela.
  150.                 fprintf(stdout, "nenhum\n");
  151.        
  152.        
  153. }