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.
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
Trecho 1
- int i;
- for(;;){
- i++;
- if(i>50)break; // Condição e comando de saída
- printf("%d",i);
- }
Trecho 2
- int i;
- for(i;;){
- i++;
- if(i>50)break; // Condição e comando de saída
- printf("%d",i);
- }
Trecho 3
- int i;
- for(;;i++){
- if(i>50)break; // Condição e comando de saída
- printf("%d",i);
- }
Trecho 4
- int i;
- for(i;;i++){
- if(i>50)break; // Condição e comando de saída
- printf("%d",i);
- }
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.
- #include <stdio.h>
- int main () {
- int lucro=0,x=0,y=0,contador=0;
- srand(time(NULL)); // Essa linha é responsável pelo rand() abaixo, gerar números diferentes a cada execução.
- while(lucro<5000){
- contador++; // Número de iterações.
- x=rand(); // x = Número aleatório.
- x=x%1000; // x = Resto da divisão de x por 1000.
- y=rand(); // y = Número aleatório.
- y=y%1000; // y = Resto da divisão de y por 1000.
- lucro = 2*x + 4*y; // Função Objetivo
- }
- printf("\n\nx=%d\n\ny=%d\n\nLucro=%d\n\nIteracoes=%d\n\n",x,y,lucro,contador);
- system("pause");
- 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