domingo, 16 de junho de 2013

Resposta do problema da caixa


Programa 7 - Volume da caixa em C
  1. #include <stdio.h>

  2. // Programa que procura o volume máximo de uma caixa, restrito à uma dada área superficial..

  3. int main(){
  4.            int c=0,a=0;
  5. //"c" é o limite de iterações do While da linha 28; a é o auxiliar para diminuir o tempo de busca.

  6.            float area=0,x=0,y=0,z=0,v=0,vs=0,xs=0,ys=0,zs=0;
  7. // "area" é o valor que irá ser digitado. As variáveis x,y,z,v irão ser usadas na busca da solução. As variáveis xs,ys,zs,vs  irão armazenar o valor das melhores soluções.
  8.            
  9.            srand(time(NULL)); // Faz o rand() gerar valores distintos a cada execução.
  10.            
  11.            printf("Digite o valor da area superficial da caixa.\n");
  12.            scanf ("%f",&area);
  13.            
  14.            //area = 255,45; // Para testar a capacidade de achar uma solução ótima, define-se um valor arbitrário e executa o programa n vezes
  15.            
  16.            if(area<=1){a=1;}
  17.            if(area<=10){a=10;}
  18.            if(area<=100){a=100;}
  19.            if(area<=1000){a=1000;} // Otimizando o gasto computacional
  20.            if(area<=10000){a=10000;}
  21.            if(area<=100000){a=100000;}

  22.            while(c<1000){ // Quanto maior o limite de c, maior o gasto computacional, porém melhor é o resultado.
  23.                           x=rand()%a;
  24.                           y=rand()%a;
  25.               
  26.                           while(x>area){x=rand()%a;} // "a" reduz o tempo de busca pois limita a busca a valores próximos do esperado..
  27.                           while (2*x*y>area){y=rand()%a;}
  28.                           z=( (area/2)-(x*y) )/(x+y);  // Lembrar que Área superficial = 2(xy+xz+yz)
  29.               
  30.                           v=x*y*z; // Cálculo do volume..
  31.                           if(v>vs){vs=v;xs=x;ys=y;zs=z;} // Se a solução é melhor, substitui valores..
  32.                           c++;
  33.                          }// Fim While
  34.               
  35.            printf ("\n\nVolume maximo: %f \n\nAs medidas sao x=%.2f\ty=%.2f\tz=%.2f\n\n",vs,xs,ys,zs);
  36. //Nessa linha, o código %.2f ordena imprimir até as 2 primeiras casa decimais do resultado.
  37.            
  38.            system("pause");
  39.            }// Fim Main

       Nesse programa é interessante observar a tática usada para diminuir o tempo de busca do computador. Nas linhas 19 até 24, "a" é determinado de acordo com cada área superficial dada. Ou seja, quando nas linhas 27 e 28 efetua-se  x=rand()%a e  y=rand()%a obtemos valores menores que a área superficial, e ainda, provavelmente mais próximos da solução ideal. Lembrar que esse programa é aleatório. Se você executá-lo várias vezes, poderá obter resultados diferentes, entretanto satisfatórios em sua maioria. Esse é o princípio da busca aleatória, que é feita em programas de otimização.

       Novamente vemos as linhas rand () e srand(time(NULL)). Ambas são funções e fazem parte da biblioteca padrão de C. A linha rand() gera um número randômico qualquer. A linha srand(time(NULL)) faz com que esse número seja diferente a cada execução do programa, pois estabelece uma relação com o relógio do computador.

       Bem, por hoje é só. No próximo post, alguns exercícios de C, do estilo dos que eu fiz quando fazia a disciplina de algoritmos no IFET, e que podem cair em provas. Para quem está fazendo a disciplina, é uma boa.

Boa semana à todos!

Nenhum comentário:

Postar um comentário