Você está na página 1de 8

ALGORITMOS

1.1. INTRODUÇÃO AO CONCEITO DE ALGORITMO


Um algoritmo é uma redação que deve descrever, de forma lógica e sem
ambigüidades, os passos (ações) a serem seguidos para se resolver um problema específico que
tenha um comportamento padrão em sua solução.
Note que o objetivo de um algoritmo é o de ensinar a resolver problemas, e o
nosso objetivo é o de construir algoritmos, ou seja nós construiremos textos que ensinem a
resolver problemas, mas não estaremos preocupados com o resultado da solução do problema,
desde que o nosso algoritmo esteja correto. Em suma diremos como se resolve o problema, mas
não daremos a solução. Um exemplo clássico deste fato são receitas de bolos ( formas de
algoritmos mais conhecidas). Quando você adquire um livro de receitas de bolos, em seu interior
são descritos os passos a serem seguidos e ingredientes a serem usados por você, para que seja
possível obter o resultado final: o bolo. Nenhum livro de receitas traz o bolo pronto.
O aspecto lógico de um algoritmo se resume na organização seqüencial das
ações pertinentes à solução de um problema específico, ou seja só levaremos o bolo ao forno
quando a massa do mesmo estiver pronta e não antes. Mas a grande exigência da lógica se
encontra nas tomadas de decisões e nos processos de repetição.
O aspecto ambigüidade, está estreitamente ligado com a sintaxe e a
semântica das linguagens naturais (português, inglês,...). A ambigüidade ocorre quando
existe mais de uma interpretação para o mesmo fato. Veja, como exemplo, a seguinte frase:
" O artista produz formas perfeitas "
Neste caso, o artista produz f(ó)rmas ou f(ô)rmas perfeitas?
Certa vez um amigo contou um caso interessante sobre ambigüidade.
"Havia um pirangueiro que vivia na margem do rio Amazonas, e
que um dia acordou com uma senhora dor de dente. Consultando o
dentista, optou-se pela extração do dente ruim. O dentista, com
medo de infeccionar o local da cirurgia, recomendou ao
pirangueiro:
- Por uns dez dias não coma carne de porco, de peixe e nada de
café quente na boca.
Passado três dias chega um amigo do pirangueiro chamando
freneticamente pelo dentista:
- Dotô, dotô é o Jão,... Tá morrendo!. O dentista assustado:
- Ai meu Deus, infeccionou a cirurgia. O amigo:
- Não dotô, é canseira memo....
- canseira, mas como....
- Não dotô é a sua dieta, o Jão levanta todo os dia quando o galo
canta, faz um café bem quente, que sai inté lágrima dos zóio,
coloca uma golada boa na boca e pula dentro do Amazonas. Seu
dotô ele já atravessou umas déiz veiz o rio, só hoje..."
A ambigüidade é um resultado da riqueza de construções das linguagens naturais.
Existem muitas formas de se expressar sobre um mesmo tema, que as vezes, sem querer,
acabamos escolhendo um forma que nos leva à dupla interpretação.

Para evitar ambigüidades em nossos algoritmos, reduziremos drasticamente as


formas de construções de textos, onde cada construção executará uma ação específica e somente
ela. Estas construções serão inseridas no decorrer deste trabalho.

Um algoritmo possui dois aspectos, os quais precisamos distinguir


com clareza: o aspecto estático e o aspecto dinâmico.
O aspecto estático não depende do tempo, mas sim do espaço físico (ex. folha de
papel) e onde está sendo desenvolvido o algoritmo.

O aspecto dinâmico seria as ações que um algoritmo provoca nos projetos nele
relacionados com o passar do tempo. Ou seja, como se comporta a execução de cada ação de um
algoritmo com o passar do tempo.

Note que no aspecto estático estamos preocupados em descrever um algoritmo e


no dinâmico já estamos com o algoritmo pronto só que em fase de execução das ações nele
descritas.
Para um algoritmo ser correto, todas as possíveis execuções do
mesmo devem produzir resultados corretos, além do que ele deve ser finito no
seu aspecto estático e no seu aspecto dinâmico.
A finitude estática se deve ao fato do grau de detalhamento de um algoritmo,
associado ao bom uso de suas estruturas de controle. Ou seja, poderíamos nos delongar o quanto
quiséssemos no detalhamento de um dado evento, mas o ideal seria analisar até onde é necessário
detalhar o evento. Por exemplo: suponha que seu carro esteja falhando, você o leva no mecânico
e simplesmente diz: - "O meu carro está falhando, conserte-o !". O mecânico tomará as
providências necessárias para consertar o seu carro.

Agora vamos supor que você leve o seu carro para um aprendiz de mecânico de
automóvel, você terá que supervisionar o trabalho do pupilo, informando-o das ações que ele
deverá executar:

1. "verificar velas e distribuidor "


2. "limpar carburador e giclês "
3. "verificar platinado"
4. "verificar partes elétricas relacionadas com o motor"
5. "verificar se o combustível não foi adulterado"

Estamos supondo que o aprendiz, sabe como executar essas tarefas ele só não sabe diagnosticar o
defeito.
Agora imagine se tivéssemos que ensinar um leigo que nem sequer viu um motor
de carro, e não tem habilidade com ferramentas para consertar o carro. O nosso grau de
detalhamento teria que ser tão grande que correríamos o risco de nos perder em nossos próprios
detalhes. E onde deveríamos parar o detalhamento? Note que se o nosso detalhamento for
minucioso poderíamos cair num processo infinito tentando explicar os detalhes do detalhe.
A finitude dinâmica é mais fácil de entender. Execute o algoritmo a seguir:

- escolha um número inteiro entre 1 e 9


- enquanto o número que você escolheu for impar
- faça inicio
- cante
"daqui eu não saio
daqui ninguém me tira "
fim

Note que se o número que você escolheu for par você não cantará nenhuma vez o
refrão. Agora, se o número for ímpar você nunca mais irá parar de cantá-lo, pois a instrução diz
enquanto o número for impar cante, e após a escolha do número não existe mais possibilidade de
alterá-lo, logo estaríamos com um algorítmo estaticamente finito, mas dinamicamente infinito
em uma de suas possibilidades.

Já no exemplo a seguir, mesmo que sua primeira escolha seja um número impar,
ainda existe a possibilidade de você sair da execução da estrutura enquanto, pois para cada vez
que você cantar o refrão é aberta a possibilidade de escolha de um novo número o qual poderá
ser impar, você continuará contando, ou par o que provocará o abandono da estrutura enquanto.

- escolha um número inteiro entre 1 e 9;


- enquanto o número que você escolheu for impar
- faça
- cante:
"daqui eu não saio
daqui ninguém me tira "
- escolha um outro número inteiro entre 1 e 9

1.2. SINTAXE X SEMÂNTICA


As linguagens possuem como único objetivo prover uma forma de comunicação.
No caso das linguagens naturais (inglês, português,...) esse objetivo é a comunicação homem-
homem. No caso das linguagens computacionais (Pascal, Fortram, C,...), o objetivo é a
comunicação homem-computador.

Independente da natureza da linguagem, elas devem possuir dois atributos: a


sintaxe e a semântica.
A sintaxe dita as regras de como as frases e cada um dos seus termos devem ser
construídas corretamente (verbo, objeto, sujeito, predicado, artigo). Já a semântica se preocupa
com o significado da frase construída. Podemos construi frase sintaticamente corretas, mas sem
uma semântica definida e da mesma forma,

"Descoloridas idéias verdes


sonham furiosamente "(Chomsky)

podemos construir frases sintaticamente incorretas, mas com uma semântica definida

"Nóis foi, mas já vortemo"


A sintaxe de uma linguagem não permite uma definição completa da mesma. Ela
permite somente escrever frases corretas nesta linguagem. Por exemplo:

"O gato come o rato"


"O rato come o gato"
São frases sintaticamente corretas na nossa linguagem. Mas, essas frases têm
sentido? Isto não pode ser definido pela sintaxe, mas sim pela semântica da linguagem. A
semântica de uma linguagem pode ser definida como sendo um conjunto de regras que permite
dizer se uma frase sintaticamente correta tem ou não sentido.
Não é possível descrever a semântica de uma linguagem de forma tão simples
como a sintaxe. Na frase a definição do
"O rato come o gato"
aspecto semântico é complicado, onde podemos assumir que esta frase não tem validade
semântica, devido aos fato de que a mesma tem um sentido pouco convencional em relação ao
comportamento observado entre os gatos e os ratos.
No decorrer do desenvolvimento do nosso tempo, formalizaremos uma
linguagem, com uma definição sintática que deverá ser respeitada e aceita como um padrão. Os
constructos desta linguagem terão uma única semântica, para evitar textos ambíguos. A sintaxe e
a semântica de cada constructo serão apresentadas na medida em que formos evoluindo em nosso
aprendizado.

1.3. OBJETOS DE UM ALGORITMO

Um algoritmo para fins computacionais é a descrição de ações que


manipulam objetos previamente definidos em função do tempo. Esses objetos descrevem em
qualquer instante o estado computacional ditado pelo algoritmo, ou seja todas as ações de um
algoritmo devem ser direcionadas à objetos específicos, os quais, também deverão ser definidos
como parte integrante do algoritmo. Cada objeto deverá ter uma função específica dentro do
mesmo algoritmo. Assim sendo, para representar estados diferentes deveremos utilizar objetos
diferentes. Vejamos um exemplo

b
Dada a figura ao lado, faça um algoritmo
que calcule o valor área da mesma, sabendo
a que os valores dos lados a e b valem respec-
tivamente 3 e 5.

Solução 1

Podemos simplesmente escolher um objeto chamado área que representará o resultado da área da
figura, dessa forma, poderíamos ter a seguinte descrição:

Algoritmo Area;
objetos área
início das ações:
Calcule 3 x 5 e armazene o resultado no objeto área;
informe o valor armazenado no objeto área;
fim das ações

Solução 2

Uma solução um pouco mais sofisticada seria utilizando todos os objetos fornecidos pelo próprio
problema

Algoritmo Area;
objetos a, b, área
início das ações:
atribua o valor 3 ao objeto a;
atribua o valor 5 ao objeto b;
calcule o produto a.b e armazene o resultado objeto área;
informe o valor armazenado no objeto área
fim das ações

Solução 3

Os algoritmos descritos acima funcionam bem desde que sempre o utilizemos para calcular a
área de um retângulo com valores de altura e base iguais a 3 e 5, respectivamente.
Assim sendo, poderíamos pensar em descrever um algoritmo que funcione de uma
forma mais genérica, isto é, podemos criar um algoritmo que não seja dependente dos valores
iniciais de a e b
Algoritmo Area;
objetos a, b, área
início das ações:
conheça o valor da altura do retângulo e atribua-o ao objeto a;
conheça o valor da base do retângulo e atribua-o ao objeto b;
calcule o produto a.b e armazene o resultado no objeto área;
informe o valor armazenado no objeto área;
fim das ações

Na último solução apresentada, utilizamos um valor hipotético para os objetos a e


b. Os valores reais destes objetos serão conhecidos somente em tempo de execução, os quais
deverão ser fornecidos pela pessoa que estiver executando o algoritmo. Dessa forma, não
estamos preocupados com o valor do resultado que o algoritmo produzirá, a nossa única
preocupação será com a produção de resultados corretos pelo algoritmo. Também, não será
preocupação nossa se a pessoa seguiu ou não corretamente as ações descritas no algoritmo, desde
que tenhamos utilizado uma sintaxe previamente padronizada para a nossa linguagem
algorítmica.

1.4. ARGUMENTOS DE ENTRADA E DE SAÍDA


Todos os valores de objetos que são conhecidos em tempo de execução do
algoritmo, são chamados de argumentos de entrada. Os argumentos de entrada permitem que o
algoritmo tenha um caráter mais genérico dentro do caráter específico do seu comportamento
padrão. Em outras palavras, poderíamos dar o seguinte exemplo: fazer um algoritmo que some
dois números específicos, como por exemplo 5 e 4, tem o mesmo comportamento padrão que o
de somar 3 e 8, só que os resultados produzidos em cada um serão distintos, 9 e 11
respectivamente, e serão os únicos sempre que executarmos esses algoritmos.

Agora, se fizermos um algoritmo que calcule a soma de dois números


hipotéticos, por exemplo x e y, o algoritmo descreverá o mesmo comportamento padrão dos
anteriores, só que o resultado não será mais específico, pois depende dos valores que serão
atribuídos a x e a y. Assim, será possível executarmos este algorítmo várias vezes e produzir a
cada vez um resultado diferente dos obtidos em execuções anteriores.

Nestes termos, os valores de x e y são chamados de argumentos de entrada de


um algoritmo que soma dois números hipotéticos.

Os objetos que armazenam a solução objetivo de um problema são chamados


de argumentos de saída do algoritmo.

Por uma questão de comodidade representaremos o termo argumento de


entrada por ae; e o termo argumento de saída por as.

Vamos ver um outro exemplo, utilizando as novas definições:

Faça um algoritmo que calcule a área de um triângulo retângulo, sabendo que os


valores de sua base e altura serão conhecidos oportunamente.

solução:
Note que para resolver este problema não são dados os valores que necessitamos para efetuar tal
cálculo logo, devemos tratar os valores da base e da altura do triângulo retângulo como valores
hipotéticos, ou seja eles serão argumentos de entrada do nosso algoritmo.

O objetivo desse algoritmo é o de calcular a área de um triângulo retângulo. Logo,


escolhemos o objeto área para ser o argumento de saída do nosso algoritmo.

Algoritmo Area_tri;
ae (base, altura);
as (área);
objetos base, altura, área;
início das ações:
Conheça o valor da altura do triângulo
e o atribua ao objeto altura;
Conheça o valor da base do triângulo
e o atribua ao objeto base;
Calcule a expressão altura.base/2
e armazene o resultado no objeto área;
Informe o valor armazenado no objeto área;
fim das ações

Para executar este algoritmo, basta relacionar todos os objetos que ele utiliza,
executar as ações descritas, uma a uma e na ordem cronológica em que elas foram descritas.
Exemplo:

Vamos supor que tenhamos um triângulo retângulo, cuja altura e base valem 5 e 8
respectivamente.

1o passo - criar os objetos necessários ao algoritmo:

base altura área


objetos base, altura, área;

2o passo - executar a 1ª instrução do algoritmo

base altura área


Conheça o valor da altura do triângulo
5 e o atribua ao objeto altura;

3o passo - executar a 2ª instrução do algoritmo


base altura área
Conheça o valor da base do triângulo
e o atribua ao objeto base;
8 5

4o passo - executar a 3ª instrução do algoritmo

base altura área Calcule a expressão altura.base/2


e armazene o resultado no objeto área;
8 5 20

5o passo - executar a 4ª instrução do algoritmo


Informe o valor armazenado no objeto área;
Resultado final = 20

1.5. EXERCÍCIOS PROPOSTOS


1) Dada uma equação do 2o grau na forma ax2 + bx + c = 0, responda as seguintes questões:
a) Quais são os argumentos de entrada para se calcular as raízes reais dessa equação ?
b) Quais são os argumentos de saída, sabendo que o objetivo é calcular as raízes reais da
equação ?
c) Faça um algoritmo que calcule as raízes reais da equação dada. Utilize objetos auxiliares,
caso julgue necessário, mas não esqueça de discriminar todos os objetos que serão
utilizados em seu algoritmo (utilize o padão do nosso último exemplo resolvido).
d) Execute o algoritmo que você fez para resolver a equação
2x2 + 3x - 2 = 0

2) Faça um algoritmo que calcule o diâmetro, a área e a circunferência de um círculo, sabendo


que o único dado disponível é o seu raio.

Diâmetro = 2.Raio
área = PI.Raio2
Circunferência = 2.PI.Raio

Você também pode gostar