quarta-feira, 12 de junho de 2013

Estruturas de repetição (2)

       Boa noite! Hoje o post é a continuação das estruturas de repetição. Vou falar do "For infinito", do While e aproveitando o gancho, sobre o conceito de programação estocástica (aleatória). Esse tipo de programação consiste na aproximação do resultado ideal, por uma busca aleatória. No final um desafio, que devo postar a resposta em breve...Vou considerar o For infinito uma extrapolação do uso convencional do for convencional. Lembrando, o for convencional tem a seguinte forma : For(inicialização;limite;incremento){Comandos;} . O For infinito pode se dar de algumas formas: 

                       
For( ; ; ){Comandos;}

                       For(inicialização ; ;){Comandos;
                       
For(; ; incremento){Comandos;}

                       For(inicialização ; ; incremento){Comandos;}

       Note: no primeiro caso, nada se estabelece para o For, ou seja, ele irá executar o comando indefinidamente, até que alguma condição seja atendida e o loop seja encerrado, ou até o programa "dar pau". Digo isso, pois não conheço a fundo as implicações desse uso do For, podem haver erros inesperados em sua execução. Já o segundo tipo, possui um início e um padrão de crescimento/decrescimento, porém não possui um limite.

       Para sair de um For infinito, como eu já mencionei, é preciso impor uma condição de saída, com um comando que encerre o loop. Veja a seguir:

Trecho 1
  1. int i;
  2. for(;;){

  3.           i++;
  4.           if(i>50)break; // Condição e comando de saída 
  5.           printf("%d",i);
  6.           
  7.          }
Trecho 2
  1. int i;
  2. for(i;;){

  3.           i++;
  4.           if(i>50)break; // Condição e comando de saída 
  5.           printf("%d",i);
  6.           
  7.          }
Trecho 3
  1. int i;
  2. for(;;i++){

  3.           if(i>50)break; // Condição e comando de saída 
  4.           printf("%d",i);
  5.           
  6.          }
Trecho 4
  1. int i;
  2. for(i;;i++){

  3.           if(i>50)break; // Condição e comando de saída 
  4.           printf("%d",i);
  5.           
  6.          }
      Como você imagina as saídas desses programas? São iguais? A resposta é não. Os trechos 1 e 2 irão fazer uma contagem de 1 a 50, enquanto que os trechos 3 e 4 de 0 a 50.
      
      Quanto ao While: seu uso, como eu disse no post Estruturas de repetição (1), é para algo que você sabe onde irá acabar, ou ao menos para que se atinja um valor esperado. Imagine o seguinte: você tem um problema muito grande de Programação Linear (otimização), que te dá milhões de possibilidades de soluções. Logo, para percorrer todo o cenário de respostas possíveis, o tempo de operação do computador é muito grande, acredite.

      O que você faz? Faz o que chamamos de busca aleatória. Você escolhe pontos por onde procurar a solução, e, por exemplo, com o uso do While, estabelece um pré valor esperado para sua solução, por exemplo Lucro = 5000 Reais. Feito isso, a primeira solução que o programa encontrar que te dê R$ 5000 ou mais de lucro, ele apresenta à você. A ideia é simples assim. Entretanto sua aplicação nem tanto. Conheço vários professores  e alunos daqui da UFJF, que estudam esse estilo de programação, tanto em C,C++,Matlab,etc... é um assunto interessante que irei retomar em um próximo post.

      Basicamente o While se dá assim: While(Condição){Comandos;}. Veja:

Programa 6 - Busca aleatória do lucro em C.
  1. #include <stdio.h>

  2. int main () {

  3. int lucro=0,x=0,y=0,contador=0;
  4. srand(time(NULL)); // Essa linha é responsável pelo rand() abaixo, gerar números diferentes a cada execução.
  5. while(lucro<5000){
  6.                            contador++; // Número de iterações.
  7.                            x=rand(); // x = Número aleatório.
  8.                            x=x%1000; // x = Resto da divisão de x por 1000.
  9.                            y=rand(); // y = Número aleatório.
  10.                            y=y%1000; // y = Resto da divisão de y por 1000.
  11.                            lucro = 2*x + 4*y; // Função Objetivo
  12.                           }
  13. printf("\n\nx=%d\n\ny=%d\n\nLucro=%d\n\nIteracoes=%d\n\n",x,y,lucro,contador);

  14.          
  15. system("pause");
  16. return(0); }
Observações: 

      Nesse post, inseri alguns comandos ( rand e srand ) que você podia não conhecer. São comandos da biblioteca padrão de C. Não se preocupe muito com a forma com que eles funcionam por enquanto, só saiba que eles funcionam e são de grande valia na programação. Num próximo post, irei abordar detalhes destes.

      Também apresentei uma parte do conceito de programação estocástica. Esse é um tema vasto, com inúmeras aplicações reais em problemas da matemática, engenharia, estatística e de empresas. Vários softwares já foram desenvolvidos com base nesse conceito e ainda rola muita pesquisa em universidades à respeito disso. É outro assunto que voltarei a falar numa próxima oportunidade. É uma boa pra se informar.


Proposta: Mexa no Programa 6. Rode várias vezes e observe as variações de solução. Mude as condições, e a equação objetivo do problema. Dificulte o trabalho do programa para achar a solução. Tente algo para que o número de iterações aumente bastante. Tente algo para que o número de iterações caia bastante também. Isso pode ser feito mexendo nas linhas 10 e 12, mudando o divisor da divisão, aumentando o lucro,etc...

Desafio: Esse eu considero realmente um desafio. Não se preocupe se não conseguir. 


Programa 7 - Volume da caixa em C.

Dada uma determinada caixa, de dimensões X, Y e Z;
sua área superficial é descrita por 2(XY+XZ+YZ).
Proposta: Com base em um valor qualquer de área superficial,encontrar o 
máximo volume que pode ser obtido e quais as dimensões da caixa de maior volume.
Ou seja, maximizar a capacidade da caixa, com menos material gasto...

Obs: Faça para áreas superficiais de até 100.000 unidades.

Boa semana à todos!

Nenhum comentário:

Postar um comentário