Você está na página 1de 8

Fundamentos de Programação em C: Uma Abordagem Algorítmica

Capítulo
2 Construção de Algoritmos
“ O que destrói a sociedade? Política sem princípios; Prazer sem compromisso; Riqueza sem trabalho;
Sabedoria sem carácter; Negócios sem moral; Ciência sem humildade; Oração sem caridade. ”

- Mahatma Gandhi –

2.1 O Computador
Segundo Von Neuman, todo computador digital é constituído por três partes: a
unidade central de processamento, a memória e os dispositivos de entrada e
saída.

A unidade central de processamento, também conhecida por CPU (Central


Processing Unit) é responsável pela execução dos programas, e pelo
comportamento das restantes partes do computador. Ela é formada por duas
componentes: A unidade de aritmética e lógica e a unidade de controle.

A unidade de aritmética e lógica, tem por finalidade, efectuar as operações


aritméticas, relacionais e lógicas.

A unidade de controle, tem por finalidade, ler as instruções, alimentar a unidade


de aritmética e lógica, e enviar os resultados desses cálculos, para a memória
ou para os dispositivos de entrada e saída.

Desde a década de 80, que a unidade de aritmética e lógica e a unidade de


controle, estão inseridas num único círcuito integrado, denominado por
microprocessador.

Existem vários fabricantes de microprocessadores. Os mais importantes são: a


Intel que fabrica o Pentium, a AMD que fabrica o Athlon e a IBM que produz o
PowerPC. Todos microprocessadores possuim um conjunto finito de instruções
que são executados numa determinada frequência. Actualmente as frequências
estão entre 1 a 4 GHz (Giga Hertz).

A memória pode ser representada por gavetas. Cada gaveta possui oito regiões
e cada região é chamada de bit. Os oito bits de uma região formam um byte e
cada byte está associado à uma identificação numérica que é denominada por
endereço. Em cada endereço pode ser armazenada uma informação, que pode
ser uma instrução que diz ao computador o que fazer, ou um dado que será
utilizado para algum processamento.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 12


Fundamentos de Programação em C: Uma Abordagem Algorítmica

As memórias estão classificadas em dois grupos: as voláteis e as permanentes.


As memórias voláteis RAM (Randon Access Memory) necessitam de energia
para guardar informações, isto quer dizer, que elas só podem funcionar quando
o computador estiver ligado. Quando desligamos o computador, há informações
importantes que devem ser armazenadas em dispositivos de memórias
permanentes. Os dispositivos de memórias permanentes mais comuns são os
discos duros, as fitas magnéticas e as pendrives.

Os dispositivos de memória volátil (RAM) são mais caros, de menor capacidade


e muito mais rápidos do que os dispositivos de memória permanente. Por esse
facto, os computadores são muito eficientes no processamento de grandes
volumes de informação.

Os dispositivos de entrada/saída, definem como o computador comunica-se


com o mundo exterior. Os dispositivos de entrada mais comuns são: o teclado,
o mouse, o scanner, o microfone e a câmera, enquanto os dispositivos de saída
mais comuns são: o monitor (tela) e a impressora.

Um programa pode ser definido como uma sequência de instruções que resolve
um determinado problema. Os programas ficam armazenados em dispositivos
de memória permanente, vulgarmente denominados por memória secundária.

Para executar um programa é necessário transferí-lo para a memória principal


ou RAM. A esse processo de transferência dá-se o nome de carregamento do
programa.

Contudo, os programas são executados pelo computador numa linguagem de


baixo nível, denominada por linguagem máquina ou assembler.

Mas, os programadores desenvolvem os seus programas numa linguagem de


alto nível, como o Pascal, o C, o Java, etc. Esses programas só podem ser
executados pelo computador, se tivermos uma ferramenta que os converta para
a linguagem máquina.

Esta conversão é feita por um programa especial, Mas existem duas maneiras
de a realizar: a interpretação e a compilação.

Os interpretadores são programas de computador que executam um programa


numa linguagem de alto nível, como se estivesse escrito numa linguagem de
baixo nível. Esta tradução é feita linha por linha, e o programa é executado à
medida que a tradução é realizada. Sempre que necessitarmos de executar o
programa, temos de voltar a efectuar essa tradução.

Ao contrário, os compiladores são programas, que produzem a partir de um


programa escrito numa linguagem de alto nível, um outro programa equivalente,
escrito numa linguagem de baixo nível. Esta tradução é feita uma única vez e o
programa traduzido pode ser executado sempre que for necessário.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 13


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Desse modo, podemos concluir que um compilador é um programa que traduz


um programa escrito numa linguagem de alto nível (chamado por código fonte),
para um programa escrito numa linguagem de baixo nível (chamado por código
objecto).

2.2 Conceito de Algoritmos


Os algoritmos fazem parte do dia-a-dia das pessoas. As indicações para chegar
à uma rua, uma planta de uma casa, as instruções para montar um
electrodoméstico, uma receita de cozinha, são alguns exemplos de algoritmos.

Um algoritmo é uma descrição passo a passo da resolução de um determinado


problema. A sua descrição deve ser finita, os passos devem estar bem definidos,
lógicos, sem ambiguidade, e podem ser executados por um computador ou por
um ser humano, num determinado intervalo de tempo.

De facto, um algoritmo não é a solução de um problema, mas um esquema, um


raciocínio lógico, uma sequência de acções para sua resolução. Isto quer dizer,
que podemos ter mais do que um algoritmo que resolve o mesmo problema. As
diferenças entre eles residem na estratégia de resolução e na qualidade da
resposta.

A título ilustrativo, veremos um exemplo de natureza humana: vestir uma calça,


calçar os sapatos e as meias.

A maior parte das pessoas resolve este problema com os seguintes passos:

1º- Vestir as calças;


2º- Colocar as meias;
3º- Calçar os sapatos;

mas, existem algumas pessoas, que resolvem este problema da seguinte


maneira:

1º- Colocar as meias;


2º- Vestir as calças;
3º- Calçar os sapatos;

Contudo, existem muito poucas pessoas, casos raros, que resolvem no


problema da seguinte forma:

1º- Colocar as meias;


2º- Calçar os sapatos;
3ª- Vestir as calças;

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 14


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Nas duas primeiras opções, para qualquer tipo de calça, meia ou sapato, o ser
humano consegue realizar essa tarefa com o mínimo de esforço, mas para a
terceira opção isso não acontece.

Um algoritmo é uma descrição passo a passo da resolução de um problema,


que produz um resultado sempre correcto, para qualquer entrada de dados.

Queremos com isso dizer que as duas primeiras opções são algoritmos, mas a
terceira não é, porque os seus passos não produzem um resultado correcto para
qualquer calça, meia e sapato.

2.3 Metodologia de Resolução de Problemas


Infelizmente, os computadores só executam as operações que mandamos e não
as operações que queremos. Por esse facto, as instruções de um programa
devem ser lógicas e não podem dar a possibilidade de interpretações duvidosas,
porque o computador sempre executará uma acção.

É necessário ter muito cuidado e ser muito preciso, para garantir que o
computador execute as acções que realmente pretendemos. Por exemplo, a
instrução “calcular a média das notas de uma turma”, é muito imprecisa, apesar
de exprimir o que queremos. Muitos detalhes foram omitidos. Para que essa
instrução possa ser executada por um computador é necessário detalhar as
seguintes acções: onde estão as notas, quantos alunos são, quantas notas por
aluno, se os ausentes devem ser incluídos, se o cálculo da média baseia-se na
média aritmética ou ponderada, se for a média ponderada qual o valor dos pesos,
etc. Esta é a essência da programação.

A programação de computadores é uma tarefa muito difícil e complexa. Mas,


para contornar essa complexidade é necessário dividir o problema em partes
mais simples.

Em primeiro lugar é necessário separar a resolução do problema em duas fases:


A fase de especificação e a fase de implementação. A fase de especificação
consiste na construção de um algoritmo. Quando tivermos a certeza que esse
algoritmo resolve o problema, passamos para a fase de implementação. A fase
de implementação consiste na tradução do algoritmo para uma linguagem de
programação, ou seja, na elaboração de um programa. Se o algoritmo for
suficientemente preciso, a sua codificação para o programa, consiste, em alguns
casos, numa mera tradução.

2.4 Metodologia de Construção de Algoritmos

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 15


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Para construir um algoritmo utilizaremos neste livro a metodologia de


refinamento sucessivo, que caracteriza-se por:

a) Numa primeira abordagem, a solução do problema deve ser muito abstracta;

b) refinar essa solução em várias versões. Em cada versão, descrever os


detalhes que foram omitidos na versão anterior.

c) quando chegarmos à uma solução cujas acções são simples e sem


ambiguidade o processo de refinamento termina.

Esta metodologia, também denominada por top down, foi desenvolvida pelos
cientistas da computação, Milles Harlan, Dijkastra Edsger Wybe e Wirth Niklaus,
e permite que o programador tenha uma melhor compreensão do problema no
seu todo, porque não considera inicialmente os detalhes da implementação, e
para além disso, gera uma documentação mais clara e compreensível dos
algoritmos.

A título ilustrativo, vamos desenvolver um algoritmo para resolver um problema


não numérico: trocar um pneu de um carro.

Numa primeira abordagem, a solução do nosso problema pode ser descrita


pelos seguintes passos:

1- Remover o pneu furado;


2- Colocar o pneu de socorro;

Suponhamos que queremos instruir um robô doméstico, que realiza apenas


operações elementares, para executar esses passos. Como esses passos não
são precisos e não são simples, o nosso robô não tem condições de executa-
los. Por esse facto, vamos detalhar essa versão.

Em primeiro lugar, é necessário conhecer as operações que caracterizam o


passo “Remover o pneu furado”. Para remover um pneu de um carro,
necessitamos de um macaco, uma chave de rodas e um pneu de socorro. Vamos
admitir que temos essas ferramentas. Agora, a nossa preocupação é saber onde
elas estão guardadas. Sabemos que as ferramentas encontram-se no porta-
bagagem. Retiramos as ferramentas do porta-bagagem e iniciamos a remoção
do pneu. Essa operação consiste nas seguintes acções: levantar o carro,
desenroscar as porcas e retirar o pneu furado. Então, o passo “remover o pneu
furado” será expandido para:

1- Retirar o macaco, chaves de rodas e pneu de socorro;


2- Desenroscar as porcas;
3- Levantar o carro;
4- Retirar o pneu furado;

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 16


Fundamentos de Programação em C: Uma Abordagem Algorítmica

Vamos analisar em seguida o passo “Colocar o pneu de socorro”. Nesse


instante, o pneu de socorro e o pneu furado encontram-se no chão. Logo,
podemos fixar o pneu de socorro na roda, enroscar as porcas, baixar o carro,
guardar as ferramentas e o pneu furado. Então o passo “Colocar o pneu de
socorro” será expandido para:

1- Colocar o pneu de socorro na roda;


2- Enroscar as porcas;
3- Baixar o carro;
4- Guardar a ferramenta e o pneu furado;

Com esse refinamento, o nosso algoritmo para trocar o pneu de um carro tem
agora oito passos:

1- Retirar o macaco, as chaves de rodas e o pneu de socorro


2- Desenroscar as porcas
3- Levantar o carro
4- Retirar o pneu furado
5- Colocar o pneu de socorro
6- Enroscar as porcas
7- Baixar o carro
8- Guardar a ferramenta e o pneu furado

Observe que as acções são executadas de forma sequencial, ou seja,


executamos uma acção, e apôs o seu término, executamos a acção seguinte.
Com isso, introduzimos um conceito muito importante de programação. A
capacidade de o computador executar várias instruções de forma sequencial.

Mas, esta versão não pode ser executada pelo nosso robô doméstico, porque
algumas acções são realizadas por várias operações mais simples. Por exemplo:
levantar o carro, consiste em:

Enquanto a roda não estiver no ar


Girar a manivela do macaco no sentido horário;

Com essa acção, introduzimos mais um conceito importante de programação. A


capacidade de o computador repetir uma ou várias instruções, até que aconteça
algum evento.

Em função desse novo conceito, vamos detalhar as seguintes acções:


desenroscar as porcas, enroscar as porcas e baixar o carro. O nosso algoritmo
agora terá treze passos:

1- Retirar o macaco, as chaves de rodas e o pneu de socorro;


2- Para cada porca
3- Desenroscar até ficar solta;
4- Enquanto a roda não estiver no ar faça
5- Girar a manivela do macaco no sentido horário;

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 17


Fundamentos de Programação em C: Uma Abordagem Algorítmica

6- Retirar o pneu furado;


7- Colocar o pneu de socorro;
8- Para cada porca
9- Início
10- Fixar a porca;
11- Enroscar a porca até ficar presa;
12- Fim
13- Enquanto a roda não estiver no chão faça
14- Girar a manivela do macaco no sentido anti-horário;
15- Guardar a ferramenta e o pneu furado;

Mas, o que acontece se o pneu de socorro estiver furado? O que acontece se o


macaco estiver estragado? O que acontece se houver alguma coisa que não
esteja nesse roteiro? A resposta é muito simples, o algoritmo não funciona.

Com estas perguntas, iremos introduzir mais um conceito importante de


programação. A capacidade de o computador executar uma operação num
conjunto de várias alternativas possíveis.

Para não tornar o problema muito complexo, vamos supor que o macaco e a
chave de rodas estão em condições.

Antes de levantar o carro é necessário verificar se o pneu de socorro está em


condições. Se não estiver, levá-lo a reparação. Então, a versão anterior pode ser
detalhada com esta condição.

1- Retirar o macaco, as chaves de rodas e o pneu de socorro


2- Se o pneu socorro está vazio então
3- Levar o pneu para a recauchutagem
5- Senão
6- trocar o pneu do carro;

onde a acção

5- trocar o pneu de um carro;

foi descrita anteriormente.

Facilmente se constata, que esse processo de refinamento pode continuar de


forma quase indefinida. Contudo, este exemplo mostra como os algoritmos
devem ser construídos e expressos. As operações devem ser simples, claras e
sem ambiguidade. As acções devem ser escritas no imperativo (coloque, fixe,
guarde, etc) ou no transitivo (colocar, fixar, guardar, etc.).

Como é que sabemos que um determinado nível de detalhe é suficiente? A


resposta a essa questão é muito discutível, ela depende do nível e da
experiência do programador que vai implementar o algoritmo.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 18


Fundamentos de Programação em C: Uma Abordagem Algorítmica

2.5 Representação de Algoritmos


Existem muitas formas de representar algoritmos. As mais comuns são:

Linguagem Natural: os algoritmos são expressos na língua materna do


programador. A principal vantagem é que não há necessidade de conhecer uma
notação especial. Mas, a principal desvantagem, reside no facto desta
metodologia poder dar vazão às várias interpretações, se o algoritmo não estiver
bem detalhado, e com isso, dificultar o processo de transcrição do algoritmo para
o programa.

Fluxograma: é uma representação gráfica que emprega formas geométricas,


para indicar as diversas acções, e decisões que devem ser executadas para
resolver um problema. A principal vantagem reside no facto de ser mais fácil
entender a resolução gráfica do que a resolução textual. Mas as principais
desvantagens residem nos seguintes factos: os dados não são descritos com o
detalhe suficiente. Essa restrição dificulta o processo de transição do algoritmo
para o programa; necessitamos de conhecer e dominar a simbologia; para
programas muito extensos a construção de fluxogramas torna-se uma tarefa
muito árdua e inviável.

Pseudocódigo: esta forma de desenvolvimento de algoritmos, procura utilizar


uma língua materna o mais próximo possível de uma linguagem de programação
de alto nível, com poucas regras sintácticas. Normalmente estas linguagens são
versões reduzidas do Pascal ou do C. A principal vantagem, reside no facto da
passagem do algoritmo para qualquer linguagem de programação, ser quase
imediata, enquanto a principal desvantagem reside no facto de termos a
necessidade de conhecer as regras do pseudocódigo.

Em função das vantagens e desvantagens desses métodos de representação de


algoritmos, optamos pela linguagem natural, também denominada por
programação imperativa, por ser mais fácil de entender e utilizar.

Manuel Menezes- Faculdade de Engenharia da Universidade Católica de Angola 19

Você também pode gostar