Você está na página 1de 8

CAPÍTULO 2 - ALGORITMOS

2.1 - INTRODUÇÃO

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 especifico
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 dos exemplos clássicos deste fato são as 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.

A ambigüidade é um resultado da riqueza de construções das linguagens naturais.


Existem muitas formas de se expressar sobre um mesmo tema, que às vezes, sem querer
acabamos escolhendo uma forma que nos leva à dupla interpretação.
CAPÍTULO 2 - ALGORITMOS 31

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 (por exemplo,
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.
CAPÍTULO 2 - ALGORITMOS 32

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 ímpar
- faça - cante
"daqui eu não saio
daqui ninguém me tira"

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 ímpar cante, e após a escolha do número não existe mais
possibilidade de alterá-lo, logo estaríamos com um algoritmo estaticamente finito, mas
dinamicamente infinito em uma de suas possibilidades.

Já no exemplo a seguir, mesmo que sua primeira escolha seja um número ímpar, 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
ímpar, você continuará contando, ou par o que provocará o abandono da estrutura enquanto.

- escolha um numero inteiro entre 1 e 9;


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

2.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, Fortran, 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 construir frases sintaticamente
corretas, mas sem uma semântica definida e da mesma forma, podemos construir frases
sintaticamente incorretas, mas com uma semântica definida.

Exemplos:

Frase com sintaxe correta: "Descoloridas idéias verdes sonham furiosamente." (Chomsky)

Frase com semântica definida: "Nóis foi, mas já vortemo."


CAPÍTULO 2 - ALGORITMOS 33
A sintaxe de uma linguagem não permite uma definição completada 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

"O rato come o gato"

a definição do aspecto semântico é complicado, onde podemos assumir que esta frase não
tem validade semântica, devido ao 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.

2.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:

Dada a figura ao lado, faça um


algoritmo que calcule o valor área da
a mesma, sabendo que os valores dos
lados a e b valem respectivamente 3 e 5.
b

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:
CAPÍTULO 2 - ALGORITMOS 34

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:

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 no 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:

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 última 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.
CAPÍTULO 2 - ALGORITMOS 35

2.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 algoritmo 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 objetiva 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.

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;
CAPÍTULO 2 - ALGORITMOS 36
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 - método
do teste de mesa.

Exemplo:

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

1º. Passo - criar os objetos necessários ao algoritmo:

base altura área


objetos base, altura, área;

2°. Passo - executar a lª. instrução do algoritmo

base altura área


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

3°. Passo - executar a 2ª. instrução do algoritmo

base altura área


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

4°. Passo - executar a 3ª. instrução do algoritmo

base altura área


Calcule a expressão
8 5 20 altura.base/2 e armazene
o resultado no objeto área;

5°. Passo - executar a 4ª. Instrução do algoritmo

Informe o valor armazenado no objeto área;


Resultado final = 20

2.5. EXERCÍCIOS PROPOSTOS

1) Dada uma equação do 2º. 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?
CAPÍTULO 2 - ALGORITMOS 37
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 padrã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 sabendo que o


único dado disponível é o seu raio.

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