sexta-feira, 29 de março de 2013

Computador X Humanos.

Computador X Humanos.

O computador é uma maquina incrivelmente idiota. Ele pode fazer qq coisa que eu digo a ele (dentro do razoável), mas ele faz "exatamente" o que lhe é dito - nada mais e nada menos.

Sendo que é tão importante, e consideravelmente mais difícil, entender o que não foi dito. Neste aspecto, o computador é quase o oposto de um ser humano, pois nós, os humanos, respondemos intuitivamente (bem, quase todos...)

Por exemplo: 
Se eu digo: Lave os pratos! São instruções claras, mas a grande maioria das informações contidas em tal frase esta "implícita" e não dita.

Vou utilizar um modelo que acho ser bastante ilustrativo e intuitivo, retirado do livro Começando a Programar em C++ para Leigos, de Stephen R. Davis.

"Como Programar um Computador Humano".

O Algoritmo.
#Dica. Um algoritmo é uma descrição das etapas a serem executadas, normalmente a um alto nível de abstração.

1. Erga o carro.
2. Remova as porcas.
3. Remova o pneu.
4. Coloque um novo pneu.
5. Instale as porcas.
6. Abaixe o carro.

Para passar estas instruções ao computador, precisamos falar com ele em uma linguagem que ele conheça.
Para nos ajudar, vou seguir a mesma linguagem de modelo utilizada por Stephen no livro, a TCL - Tire Changing Language ou Linguagem de Troca de Pneu :)

TCL tem substantivos como:
carro
pneu
porca
macaco
caixa de ferramentas
pneu sobressalente
chave inglesa

TCL também tem os verbos:
agarrar
mover
soltar
girar

TCL também precisa saber contar e tomar decisões simples.

Bom, basicamente é tudo que o nosso robô trocador pneu entende. QQ outro comando e ele não faz nada.

O Programa.
Agora vamos converter o algoritmo para o programa necessariamente.

Vc diz: "remova a porca". Para iniciar a troca, certo? Errado. O robô não entende  desta forma, aliás, por mais completa que a frase seja, não contem nenhuma das palavras do nosso TCL que o robô entende.

Vamos realizar esta primeira tarefa utilizando nossa TCL e os passos necessário para o entendimento da máquina.

1. agarre a chave inglesa ;
2. mova a chave inglesa para a porca ;
3. gire a chave inglesa cinco vezes no sentido anti-horário ;
4. mova a chave inglesa para a caixa de ferramentas ;
5. solte a chave inglesa.

Até aqui, podemos dizer que o fluxo do programa flui da etapa 1 até a 5.

Uma dúvida: E se não houver porca?
Não teria problema se a chave inglesa girar sem uma porca. Porém, gastaria tempo e energia, e nosso programa precisa ser funcional, econômico e rápido.

A TCL precisa de uma extensão para tomada de decisões simples, escolhendo o que fazer de acordo com a situação encontrada. Vamos adicionar uma declaração IF (se).

1. agarre a chave inglesa ;
2. Se houver porca ;
3. {
4.    Mova a chave inglesa para a porca ;
5.    Gire a chave inglesa cinco vezes no sentido anti-horário ;
6. }   
7. mova a chave inglesa para a caixa de ferramentas ;
8. solte a chave inglesa.

O programa incia normalmente, se houver porca, o fluxo continua a execução de todas as etapas. Se não houver porca, o programa pula para a etapa 7 e 8.
Neste ponto, o programa executa uma expressão lógica que retorna um valor verdadeiro ou falso. Sim, a porca esta presente - verdadeiro. Não, a porca não esta aqui - falso.

Ainda nos resta um problema. Como o robô vai saber quantas voltas precisa girar a chave inglesa para soltar a porca?
Existe porcas diferentes, certo? Se informa um número médio para ter a certeza de que atenderia a todas as porcas, naquelas que precisam de menos voltas para soltar gastaria tempe e energia novamente, pois o robô continuaria rodando a chave onde a porca já esta solta. Vamos solucionar este ponto.

1. agarre a chave inglesa ;
2. Se houver porca ;
3. {
4.  Mova a chave inglesa para a porca ;
5.  Enquanto (porca anexada ao carro)
6.  {
7.    Gire a chave inglesa uma vez no sentido anti-horário ;
8.  }  
9. }
10. mova a chave inglesa para a caixa de ferramentas ;
11. solte a chave inglesa.

Agora o robô toma uma decisão.
Encontra a porca encaixada e executa a etapa 7.
Retorna a etapa 5 e, como a porca ainda encaixada, ou seja, verdadeiro, repete a etapa 7.
Até que a porca esta solta, como o retorno é falso, o robô então passa para a etapa 9 e segue o fluxo.

Mas ainda temos um problema (nossa que saco!) Os diferente tipos de carros tem diferentes números de porcas. Para continuar com a boa prática de economia de tempo e energia, vamos adicionar uma melhoria no código.

1. agarre a chave inglesa ;
2. Para cada porca na roda
3. {
4.   Se houver porca ;
5.   {
6.     Mova a chave inglesa para a porca ;
7.     Enquanto (porca anexada ao carro)
8.     {
9.       Gire a chave inglesa uma vez no sentido anti-horário ;
10.    }
11.   }
12. }
13. mova a chave inglesa para a caixa de ferramentas ;
14. solte a chave inglesa.

As etapas 7 até 10 ainda são repetidas para cada roda.
Isto é um loop nested (aninhado).
As etapas de 7 até 10 são o loop interno, enquanto as etapas de 2 até 12 são o loop externo.

Eu sei, o program é simples e ainda tem diversas situações que podem surgir, como por exemplo, uma porca faltando. Afinal, não "ensinamos" o robô o que deve ser feito nesta situação.

Mas veja onde começamos e de que forma o código ficou no final.
Disposto a continuar? Então vamos.

 <a href="https://plus.google.com/u/0/109289031165722699327/about/p/pub?rel=author">Google</a>






Nenhum comentário:

Postar um comentário