Introdução à programação e aos algoritmos
2.2 Algoritmos
Uma diferença importante é que a versão 3 compreende caracteres acentuados do português no comando de impressão, enquant
vamos usar caracteres acentuados. Se traduzirmos o programa anterior para o português:
print (“Olá, mundo!”)
■ Programa 2.2: ola.py.
Ao executá-lo no ambiente de Python 2, vamos obter a seguinte mensagem de erro:
$ python3 ola.py
File “ola.py”, line 1
SyntaxError: Non-
ASCII character ‘\xc3’ in file ola.py on line 1, but no encoding declared; see http
0263/ for details
Isso signi ca que Python não sabe qual é a codi cação do caractere acentuado. Para corrigir isso, basta inserir uma linha
#encoding: utf-8
no início do arquivo para informar ao interpretador que a codi cação é UTF-8 (se for essa a codi cação de caracteres usada pelo seu ed
2.2 ALGORITMOS
Antes de programar com uma linguagem específica, seja C, Python ou Java, você deve entender como trabalhar em um nível mais abstrato. Neste capítulo vou apresentar o conceito de algoritmos e como usar algoritmos na programação de computadores.
Se você procurar no dicionário, vai achar alguma definição genérica para a palavra “algoritmo”.
Pode ser algo assim: “Qualquer método utilizado para a solução de determinado problema.”
Convenhamos, esta definição não diz muita coisa. Precisamos de algo mais preciso. Uma definição
melhor para algoritmos poderia ser: “Uma sequência ordenada e sem ambiguidade de passos para a resolução de um problema.”
O que isto quer dizer? Vamos analisar as palavras da definição. Primeiro, foi dito que um algoritmo
deve ser uma “sequência ordenada ... de passos”. Cada passo deve contribuir para se chegar mais perto da solução final de um problema, ou seja, cada passo deve avançar em direção à solução. Em suma, cada passo deve ser efetivo. Também foi dito que esses passos devem ser “sem ambiguidades”. Não deve haver dúvidas sobre o que cada passo significa para a resolução do problema.
Outra consequência dessa definição é que a solução de um problema deve vir por “passos”, ou
seja, para problemas reais não existe atalho. Não adianta tentar resolver um problema computacional indo direto à solução como um programa. Antes de programar, você deve pensar em uma solução na
forma de algoritmo, sem as amarras que a linguagem de programação impõe. A Figura 2.1 mostra que a solução implementada diretamente como programa de computador pode ser bastante difícil. Na maioria das vezes, para problemas complexos, uma solução assim terá muitos erros e não irá atender aos requisitos da solução desejada. Somente problemas muito simples podem ser implementados diretamente em uma linguagem sem uma reflexão sobre a solução.
Podemos, desta forma, elencar algumas propriedades comuns aos algoritmos computacionais
[TBP83]:
1. Cada operação deve ser bem definida. Não deve haver dúvida sobre o seu significado, isto é, a
operação não pode, em hipótese alguma, conter ambiguidades.
Figura 2.1 Algoritmos e programas. Fonte: Adaptada de [TBP83].
2. Cada operação deve ser efetiva: deve contribuir para a solução do problema. A retirada de uma
operação efetiva prejudica a solução.
3. Teoricamente, uma pessoa munida de papel e lápis deve poder seguir os passos do algoritmo.
Popularmente chamamos isso de “fazer o chinês”, quer dizer, se tivermos tempo e paciência
suficientes, devemos ser capazes de anotar em um papel cada passo de um algoritmo e encontrar a
solução para o problema.
4. O algoritmo deve terminar em um tempo finito.
A partir de alguma entrada de informações, um algoritmo deve processar essas informações e, em
um tempo finito, fornecer uma saída como solução de algum problema.
Computadores são máquinas para processar informações, mas precisam ser programados para tal.
Possuem uma linguagem própria por meio da qual podemos passar instruções sobre o que deve ser feito.
É útil fazer um paralelo entre algoritmos computacionais e não computacionais. Nós lidamos com
algoritmos não computacionais o tempo todo em nosso cotidiano. Uma receita culinária é uma espécie de algoritmo; no caso, um algoritmo não computacional. Digamos que você queira fazer um pão. Podemos ser bem genéricos e vagos na receita:
1. coloque meio quilo de farinha em um recipiente adequado; 2. adicione 10 gramas de sal;
3. adicione 10 gramas de fermento;
4. adicione 350 ml de água;
5. misture o conjunto e sove a massa até que fique bem elástica; 6. deixe crescer por 2 horas;
7. sove mais um pouco a massa e faça o formato de pão; 8. coloque em uma forma adequada, deixando crescer por 1 hora; 9. asse no forno a 220 ºC por 30 minutos.
A receita do pão funciona, mas é bem superficial. Diversos detalhes foram deixados de lado. O que
é um recipiente adequado? O que significa “bem elástica”?
As instruções, ou seja, o algoritmo da receita de pão, é adequado para um padeiro experiente, mas
não seria para um padeiro novato. Um padeiro novato precisaria de mais detalhes para fazer um pão corretamente. E se fôssemos criar um robô padeiro, uma máquina que fizesse pão? Neste caso, deveríamos criar um algoritmo mais detalhado. Nossas instruções teriam de ser particularizadas de acordo com o nível de entendimento da máquina, isto é, com seu nível de inteligência. Certamente, um computador seria o guia dessa máquina de fazer pão. Como os computadores têm uma inteligência limitada, o programa precisaria ser bastante extenso.