• Nenhum resultado encontrado

Um algoritmo é uma redação que deve descrever,

N/A
N/A
Protected

Academic year: 2022

Share "Um algoritmo é uma redação que deve descrever,"

Copied!
8
0
0

Texto

(1)

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.

(2)

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.

(3)

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."

(4)

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:

a

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:

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

(5)

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.

(6)

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;

(7)

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

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

base altura área

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

base altura área

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

base altura área

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

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?

objetos base, altura, área;

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

5

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

5 8

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

8 5 20

Informe o valor armazenado no objeto área;

(8)

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

Referências

Documentos relacionados

No caso das viaturas com caixa automática inclui modo desportivo para passagens de caixa.. Inclui adicionalmente apresentação dos valores instantâneos de potência e binário em

Mãos para fora, protegendo uma escrita seca de corpo molhado Anfíbio esse lugar.. Ela não obedece a gravidade sobe e toma todo o corpo folhas e

Após 96 horas, houve um aumento no consumo, com o aumento de 100 para 160 ninfas, que não diferiu significativamente da densidade 220; com 280 ninfas disponíveis houve um

17 CORTE IDH. Caso Castañeda Gutman vs.. restrição ao lançamento de uma candidatura a cargo político pode demandar o enfrentamento de temas de ordem histórica, social e política

Sob erro de comunicação, o controlador responde o código de erro e envia o código de função adicionando 80H (o bit mais alto está em 1) para o sistema principal se ocorreu

Por isso, quando a quantidade de Oxigênio Dissolvido na água diminui, os peixes não conseguem compensar esta.. Diminuição, ficando prejudicados e,

Mundo do trabalho Ensino superior (Uni / HES / ES - ET ) Colégio Escola de ensino técnico Escola do comércio Escola de cultura Geral Ensino secun- dário Na escola o tempo

De acordo com estes resultados, e dada a reduzida explicitação, e exploração, das relações que se estabelecem entre a ciência, a tecnologia, a sociedade e o ambiente, conclui-se