Introdução aos Algoritmos Quando temos que fazer uma determinada tarefa e não sabemos muito bem como fazê-la, podemos fazer perguntas para nos esclarecer a respeito do que deve ser feito e como deve ser feito. Isso porque temos inteligência e habilidade racional. Ao contrário de nós, o computador não tem senso próprio, portanto ele deve receber instruções explícitas a respeito do que ele deve fazer. Se quisermos que o computador resolva algum problema, desde o mais simples ao mais complexo, devemos instruí-lo para fazer tal tarefa. Os problemas, por mais simples que possam parecer, quando visualizados sob o aspecto computacional, ficam um tanto mais complexos. Em razão disso, quando temos um problema para o computador resolver, devemos conhecer bem esse problema e pensar em todas as variáveis e dados que interferem no problema. Em seguida, devemos dividir o problema em partes mais simples e lógicas. Antes de passar as instruções do problema ao computador, podemos detalhar o problema no papel para obtermos uma solução correta e otimizada. Uma maneira de fazer isso é elaborar um algoritmo. Algoritmo é uma seqüência de passos que visa atingir um objetivo bem definido. Os algoritmos são muito freqüentes em nosso dia-a-dia, por exemplo: receita para cozinhar algum prato; instruções para preenchimento dos formulários para fazer o passaporte; instruções de como se faz ligação local, a cobrar e internacional; e muitos outros. Como já foi descrito, as instruções (também denominadas de comandos) que compõem um algoritmo, devem ser claras, coerentes e lógicas. Se não forem assim, e dependendo de quem as executa, podem ocorrer problemas que impeçam chegar ao resultado final. Um algoritmo correto deve possuir 3 qualidades: z z z cada passo do algoritmo deve ser uma instrução que possa ser realizada; a ordem dos passos deve ser precisamente determinada; e, o algoritmo deve ter fim. Um exemplo Vamos fazer um algoritmo para trocar o pneu de um carro e representá-lo através de um diagrama. Inicialmente vamos pensar em uma solução bem geral, como a da figura abaixo. Quem for executar esse algoritmo basta começar do início e ir seguindo as setas até chegar ao fim. O algoritmo representado na figura abaixo é bem simples, contém apenas a instrução trocar o pneu. Mas vamos pensar na possibilidade do estepe estar vazio. Isso requer uma decisão entre dois casos: quando o estepe está vazio ou quando o estepe não está vazio. Antes de trocarmos o pneu, podemos averiguar se o estepe está vazio ou não. A figura abaixo mostra o nosso algoritmo modificado para fazer essa verificação. Repare que há dois caminhos a seguir partindo do losango vermelho. Se o estepe estiver vazio, deve-se seguir para o caminho da esquerda e executar a instrução chamar o borracheiro e ir para o fim do algoritmo. Se o estepe não estiver vazio, deve-se seguir para o caminho da direita e executar a instrução mudar o pneu e ir para o fim do algoritmo. A instrução mudar o pneu pode ser detalhada em várias outras ações que estão envolvidas quando vamos mudar o pneu. Por exemplo, antes de mudar o pneu temos que levantar o carro, desparafusar o pneu, etc. A figura abaixo mostra o nosso algoritmo modificado para incluir essas ações. Quando o algoritmo é executado, começando do início, seguimos até o losango e se o estepe não estiver vazio, seguimos para a direita e vamos executar as instruções nessa ordem: z z z z z z levantar o carro desparafusar o pneu remover o pneu colocar o estepe parafusar o estepe abaixar o carro Por último, seguimos para o fim. Caso o estepe esteja vazio, seguimos o caminho da esquerda e somente será executada a instrução chamar o borracheiro, seguindo depois para o fim do algoritmo. Observe a instrução desparafusar o pneu, ela ainda pode ser detalhada nas instruções: z z z z desapertar o primeiro parafuso desapertar o segundo parafuso desapertar o terceiro parafuso desapertar o quarto parafuso O mesmo acontece com a instrução parafusar estepe, que pode ser detalhada em: z z z z apertar o primeiro parafuso apertar o segundo parafuso apertar o terceiro parafuso apertar o quarto parafuso Mas essas repetições são muito incovenientes, imagine se existissem 20 parafusos! Para solucionar esse problema podemos utilizar uma estrutura de repetição. A figura abaixo mostra o nosso algoritmo modificado para incorporar essa estrutura. Quando o algoritmo é executado, começando do início e seguindo para o losango, se o estepe não estiver vazio, segue-se o caminho da direita e a instrução levantar o carro será executada. A seguir vem a estrutura de repetição e enquanto houver parafuso para desapertar a instrução desapertar parafuso será executada. À cada vez que a instrução desapertar parafuso é executada, o controle do algoritmo volta para verificar se existe parafuso para desapertar. Caso ainda tenha parafuso para desapertar, novamente a instrução desapertar parafuso será executada, caso não tenha parafuso para desapertar a próxima instrução a ser executada é remover o pneu e logo em seguida colocar estepe. Nesse ponto, seguindo a seta, há novamente uma estrutura de repetição e a instrução apertar parafuso será executada enquanto houver parafuso para apertar. Neste caso essa instrução será executada 4 vezes, porque são 4 parafusos. A seguir a instrução abaixar o carro será executada, e por último, seguindo a seta, chega-se ao fim do algoritmo. Agora sim, temos um algoritmo completo para trocar o pneu de um carro. Para chegar a esse algoritmo começamos de uma solução bem geral do problema e prosseguimos até o algoritmo final, sempre aumentando o nível de detalhamento. Mas, será que esse nível de detalhe que chegamos é suficiente? A resposta a essa pergunta é que depende de quem vai executar esse algoritmo. Se for uma pessoa, certamente ela conseguirá trocar o pneu seguindo esses passos. Mas se for, por exemplo, um robô? Dificilmente um robô conseguirá trocar o pneu seguindo os passos do nosso algoritmo. Os nossos algoritmos serão escritos em linguagem algorítmica. Essa linguagem será formalizada nas próximas aulas, por agora, vamos transformar o nosso algoritmo de trocar pneu, representado por um diagrama anteriormente, na língua portuguesa mesmo. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | início | se o estepe estiver vazio então | chamar o borracheiro | senão | levantar o carro | enquanto houver parafuso para desapertar faça | desapertar parafuso | fim do enquanto | remover pneu | colocar estepe | enquanto houver parafuso para apertar faça | apertar parafuso | fim do enquanto | abaixar carro | fim do se | fim O algoritmo acima funciona da mesma maneira descrita anteriormente. Os números no início de cada linha do algoritmo é somente para ficar mais fácil de comentá-lo aqui nesse texto. O algoritmo começa na linha 01, mas como só existe a palavra início para indicar o início do algoritmo nada é executado. Na linha 02 há uma decisão a ser tomada. Se o estepe estiver vazio, então a instrução chamar o borracheiro, que está na linha 03, será executada. Mas, se o estepe não estiver vazio, então a instrução levantar o carro, que está na linha 05, será executada. Em seguida passa-se para a próxima instrução na linha 06. Enquanto houver parafuso para desapertar a instrução da linha 07 desapertar parafuso será executada. Nesse caso, ela será executada 4 vezes por causa dos 4 parafusos do pneu. Quando não houver mais parafuso para desapertar, passase para a linha 09 e a instrução remover pneu será executada. Em seguida, a instrução da linha 10, colocar estepe, será executada. Na linha 11 há uma estrutura de repetição e enquanto houver parafuso para apertar, a instrução apertar parafuso, da linha 12, será executada. Essa instrução também será executada 4 vezes. Quando não houver mais parafuso para apertar, passa-se à linha 14 e a instrução abaixar o carro será executada. Na linha 15 nada será executado, fim do se, é só para indicar o final da estrutura condicional. Por último, na linha 16, o algoritmo termina. Exercícios z z Faça um algoritmo para fazer pipoca. Faça um algoritmo para fazer uma ligação telefônica.