quarta-feira, 15 de agosto de 2012

Algoritmos, uma introdução.

O que é um algoritmo? Como é construído? Para que servem? Desde eventos mais elaborados no RPG Maker, até na criação de programas de computador, passando pela programação de microcontroladores, criação de planos de defesa de aquartelamentos e métodos matemáticos tudo o que precisa de informações claras e ordenadas usa algoritmos. Por isso, nesse blog, vou começar uma série de postagens-aula sobre o assunto, para ajudar futuros "game designer", programadores, ou apenas hobbistas a darem seus primeiros passos na programação.


Definição:

Algoritmo é um sequencia de passos bem definidos que seguidos ordenadamente descrevem uma tarefa, ou operação. É importante salientar que um algoritmo não é necessariamente um programa de computador, apesar destes serem feitos por algoritmos. Muitas pessoas lidam pela primeira vez com essa palavra quando estão estudando algo que envolve programação, mas é um erro achar que algoritmos só existem no mundo computacional... na verdade é bem capaz da sua mãe ter lhe passado alguns algoritmos e você nem ter notado...

"Guri! Arrume seu quarto! Depois se tiver tarefa de casa, faça-a, se não, estude!"

Passos ordenados e definidos, um algoritmo. A forma de resolver uma equação de segundo grau também é um algoritmo:

1º Se a equação não estiver igualada à 0, faça com que fique.
2º Extraia os coeficientes a, b e c.
3º Resolva o delta.
4º Use Bhaskara.

Instruções de montagem de produtos, manuais de máquinas, existem muitos outros exemplos de algoritmos que não se destinam à programas de computadores. É importante frisar isso porque parece que existe uma "barreira psicológica" em muitas pessoas, que ao associar algoritmos à programas de computador, acham que o mesmo tem que ser escrito em uma linguagem "x", que tem que ser complicado e por isso ficam apavoradas e não conseguem aprender o mesmo... Notei isso tanto com meus irmão de arma, em 2007, na academia, quanto com meus colegas de turma na disciplina de algoritmos no curso de engenharia do instituto. Inclusive, nessa última, consegui ajudar um colega meu a passar na prova final justamente obrigando ele fazer algoritmos "não computacionais". Por isso tirem da cabeça qualquer preconceito ou medo com relação ao tema dessa postagem, acreditem, vocês seguem e fazem mais algoritmos do que imaginam.

Um algoritmo simples:

Provavelmente você já viu esse "algoritmo" na porta de muitas instalações de segurança:

Pare;
Desligue os faróis;
Ligue a luz interna;
Identifique-se;

Não há outro caminho a seguir, o individuo que estiver entrando de carro num quartel tem que seguir essas quatro etapas e tem que seguir na ordem dada! Se ele passar correndo na guarita, berrando sua identificação provavelmente terá problemas.

Testes Lógicos:

O que torna os algoritmos interessantes, no entanto, são os testes lógicos. Eles ajudam a definir os procedimentos a serem tomados em diferentes situações. Veja esse exemplo:

Retirado da Wikipédia
Há dois testes lógicos ali: SE a lâmpada está enroscada e SE a lâmpada está fundida. A resposta dada à eles definirá que passos deverão ser tomados.

Um teste lógico simples envolve um questionamento que só pode dar dois resultados: verdadeiro ou falso. Em seguida ao teste temos as operações executadas SE o resultado foi verdadeiro e as executadas SE o teste foi falso.

Podemos no entanto ter testes complexos, com vários resultados. Um "atendimento telefônico automático" é um bom exemplo disso: Você tem um problema, liga para uma central de atendimento e ouve o conhecido "tecle 1 para isso, tecle 2 para aquilo... tecle 0 se não for nenhuma das alternativas", você identifica qual dos números atende seu problema e então segue essa opção (e morre com a espera...).

Esse tipo de teste de "vários casos" é chamado aqui de "complexo" porque ele pode ser transformado em vários testes simples "SE você tem isso tecle 1 SE NÃO, SE você tem aquilo tecle 2 ... SE NÃO tecle 0".

Ciclos:

Ciclos ocorrem quando queremos (teoricamente) que algumas instruções sejam repetidas até que uma condição seja atingida.

Nas diversas linguagens de programação, nós podemos encontrar dois tipos de ciclos, um que é interrompido quando uma condição é atingida e outro que é interrompido depois de um número de vezes, mas no fundo são a mesma coisa e um pode ser conseguido pelo outro. O que interessa no entanto é onde o teste de quebra do ciclo vai ficar, se for no início, as instruções dentro dele vão ser todas repetidas até que a condição de quebra seja satisfeita. Depois disso, quando voltar ao topo do ciclo este não será mais executado. Se o teste estiver no final, assim que a condição de quebra for alcançada, depois de executar todas as instruções ele vai sair do ciclo.

Um exemplo é um sujeito no supermercado com a (estranha) instrução de encher o carrinho com um saco de açúcar, arroz, feijão e café até que o carrinho fique cheio. Ele ir colocando os sacos nessa ordem e se a condição estiver no início ele vai parar para olhar o nível do carrinho ANTES de colocar novos sacos, Se estiver no final, ele vai olhar o nível DEPOIS de colocar os sacos. Não parece fazer muita diferença, mas se ele começar com um carrinho cheio, no primeiro caso ele não vai tentar colocar nenhum saco, já no segundo ele vai colocar os 4 antes de notar que foi perda de tempo.

Variáveis:

São os fatores de valor incerto que podem decidir o rumo a ser levado pelo algoritmo. Apesar do conceito lembrar as variáveis de equações matemáticas , não são exatamente a mesma coisa. Por exemplo: no algoritmo para resolver uma equação de segundo grau "ax²+bx+c = 0" os coeficientes a,b e c é que são as variáveis e não o "x"! Sim, pois é o "a,b e c" variam de equação para equação e é com eles que você trabalha para achar o "x".

No caso do algoritmo do candeeiro quebrado as variáveis são "lâmpada enroscada", "lâmpada fundida", que podem assumir os valores verdadeiro ou falso. No estranho sujeito com sua estranha lista no supermercado,  uma variável que vemos de cara é o "nível do carrinho".

É visível que existem diversos tipos de variáveis e cada qual tem sua função num algoritmo.

Entrada e Saída:

Uma entrada é uma operação na qual um valor (não necessariamente numérico) é fornecido à uma variável do algoritmo. Por exemplo no caso do candeeiro, o sujeito olha o candeeiro e de cara já vê se tem uma lâmpada enroscada e se ela está boa, podendo atribuir um verdadeiro/falso para as variáveis em questão.

Já uma saída é quando um algoritmo "devolve" um resultado. Ainda no caso do candeeiro, quando o sujeito tem um falso na "lâmpada enroscada" e após o primeiro teste percebe que tem que enroscar uma. O Ato de enroscar é uma saída.

Lógica:

É visível que o bom entendimento de algoritmos está intimamente ligado ao bom entendimento de lógica, na próxima postagem desse "curso", darei uma aprofundada em conceitos de lógica clássica.

Até mais ver!








Nenhum comentário:

Postar um comentário