Você está na página 1de 12

Algoritmos e Programao

Teoria e Prtica
Marco Medina
Cristina Fertig
Novatec Editora
13
Captulo 1
Introduo
Neste captulo, faremos uma introduo geral sobre algoritmos, suas aplicaes e alguns
exemplos reais. Mostraremos as diferenas entre algoritmo e programa e tambm explica-
remos o que so compiladores e montadores. Em seguida, descreveremos algumas formas
populares de estruturao de algoritmos e apresentaremos a notao que adotaremos.
1.1 Conceituao
Muitas definies podem ser dadas palavra algoritmo. Atualmente, tem-se associado
algoritmo computao, mas este no um termo restrito computao ou que tenha
nascido com ela. Na realidade, a palavra algoritmo vem do nome do matemtico iraniano
Abu Abdullah Mohammad Ibn Musa al-Khawarizmi, nascido em Khawarizm (Kheva), ao
sul do mar Aral, que viveu no sculo XVII. A influncia de Khawarizmi no crescimento
da cincia em geral, particularmente na matemtica, astronomia e geografia, bastante
reconhecida. Tambm considerado o fundador da lgebra, cujo nome derivou de seu
livro Al-Jabr wa-al-Muqabilah. Mais informaes a respeito de al-Khawarizmi podem
ser encontradas na bibliografia (apndice B).
O termo algoritmo tambm utilizado em outras reas, como engenharia, administrao,
entre outras. Vejamos algumas definies de algoritmo:
Um procedimento passo a passo para a soluo de um problema.
Uma seqncia detalhada de aes a serem executadas para realizar alguma tarefa.
Assim, as aes que so necessrias para se fazer um balancete, por exemplo, constituem
um algoritmo. Outro exemplo clssico de algoritmo a receita culinria. Veja o exemplo
a seguir de um bolo de chocolate:
Ingredientes
4 xcaras (ch) de farinha de trigo.
14 Algoritmos e Programao
2 xcaras (ch) de acar cristal.
2 xcaras (ch) de achocolatado.
2 colheres (sopa) de fermento em p.
1 pitada de sal.
3 ovos.
2 xcaras (ch) de gua morna.
1 xcara (ch) de leo.
leo para untar.
Farinha de trigo para polvilhar.
Modo de preparo
Numa vasilha, misture 4 xcaras (ch) de farinha de trigo, 2 xcaras (ch) de acar
cristal, 2 xcaras (ch) de achocolatado, 2 colheres (sopa) de fermento em p e 1
pitada de sal. Junte 3 ovos, 2 xcaras (ch) de gua morna e 1 xcara (ch) de leo.
Misture bem. Unte uma forma retangular de 25 cm x 37 cm com leo e polvilhe
farinha de trigo e despeje a massa. Asse em temperatura mdia (de 170C a 180C)
por 30 minutos.
A receita tem todas as caractersticas de um algoritmo. Ela tem uma seqncia de-
talhada de passos, descrita no modo de preparo. Apresenta a tarefa a ser realizada,
que no caso o bolo de chocolate. Alm disto, podemos identificar na receita
entradas (no caso os ingredientes) e uma sada, que o prprio bolo.
Poderamos, ento, nos perguntar por que a palavra algoritmo ficou to associada
computao? Para compreendermos melhor os motivos, preciso entender,
mesmo que superficialmente, o funcionamento dos computadores.
1.2 Programas de computador
Nesta seo, veremos o processo necessrio para se criar um programa e execut-lo.
Primeiramente introduziremos os principais conceitos para a melhor compreenso de
como um programa visto pelo computador. Depois nos aprofundaremos nos detalhes
de como um programa transformado em um cdigo que pode ser executado pelo
computador.
1.2.1 O que um programa
Os computadores das mais variadas arquiteturas tm funcionamento similar. A figura 1.1
apresenta a arquitetura simplificada de um computador.
15 Captulo 1 Introduo
UCP Unidade
Central de
Processamento
Memria
Dispositivos
Entrada/Sada
Teclado
Mouse
Monitor
Impressora
etc.
Conexes
externas
Barramento
Figura 1.1 Arquitetura simplificada de um computador.
A parte fsica do computador chamada de hardware, que formado basicamente por
uma Unidade Central de Processamento (UCP), pela memria e pelos dispositivos de
entrada e sada. O barramento faz a ligao desses componentes.
A UCP (ou processador) contm um conjunto relativamente pequeno de instrues que
capaz de executar. Cada processador contm um conjunto diferente de instrues,
apesar de similares entre si. As instrues que o processador executa so buscadas da
memria. Essas instrues podem ser desde operaes matemticas a interaes com
os dispositivos de entrada e sada. Chamamos de programa de computador um conjunto
de instrues que ser executado pelo processador em uma determinada seqncia.
Esse programa leva o computador a executar alguma tarefa.
Como podemos perceber, um programa nada mais que um tipo de algoritmo. Sua
particularidade que suas operaes so especficas para o computador e restritas ao
conjunto de instrues que o processador pode executar. Podemos considerar esse
conjunto de instrues como a primeira linguagem de programao do computador,
tambm chamada de linguagem de mquina. Classificamos as linguagens de programao
segundo a sua proximidade com a linguagem de mquina. Quanto maior a semelhana
com a linguagem de mquina, mais baixo o nvel da linguagem. As linguagens de pro-
gramao mais semelhantes linguagem de mquina so conhecidas como linguagens
de baixo nvel. Analogamente, linguagens de programao distantes da linguagem de
mquina so conhecidas como linguagens de programao de alto nvel. Linguagens de
programao de alto nvel so mais prximas da linguagem natural e guardam pouca
similariedade com a linguagem da mquina em que sero executadas.
A linguagem de programao que um computador capaz de compreender com-
posta apenas de nmeros. Assim, fazer algoritmos na linguagem de programao do
computador ou em sua linguagem de mquina um processo extremamente compli-
cado para ns, seres humanos, acostumados com a nossa prpria linguagem. Por isso,
para facilitar a programao de computadores, foi necessria a criao de um cdigo
que relacionasse a linguagem de mquina a uma linguagem mais fcil de ser compre-
endida. A linguagem de montagem (ou assembly) um cdigo que tem uma instruo
alfanumrica (ou mnemnica) para cada instruo numrica em linguagem de mquina.
16 Algoritmos e Programao
Para que um programa escrito em linguagem de montagem possa ser executado pelo
computador, necessrio que seu cdigo seja traduzido para o cdigo de mquina. Isto
feito por meio de um programa chamado assembler. A figura 1.2 apresenta o esquema
de traduo feita por um assembler.
Cdigo em
linguagem de
montagem
Cdigo em
linguagem
de mquina
Assembler
Figura 1.2 Traduo para a linguagem de mquina.
A linguagem de montagem muito prxima da linguagem de mquina e, por isso, uma
linguagem de programao de baixo nvel. Para cada processador, h uma linguagem
de montagem j que h uma relao direta entre as instrues em linguagem de mon-
tagem e em linguagem de mquina. Isto faz com que o cdigo tenha que ser refeito se
quisermos executar um programa em um processador no compatvel com o qual ele
foi escrito inicialmente. Neste caso, dizemos que o cdigo no portvel.
A implementao de programas nesse tipo de linguagem ainda muito complexa e
dependente do conhecimento das instrues do processador. Para aumentar a produti-
vidade dos programadores e a portabilidade dos programas, foram criadas as linguagens
de programao de alto nvel. Essas linguagens so independentes do processador em
que sero executadas. Suas caractersticas principais so que seu cdigo mais elaborado,
contemplando operaes mais complexas e mais prximas da lgica humana. Para
que possam ser processadas por um computador, os comandos da linguagem precisa-
ro ser traduzidos para a linguagem de mquina. Essa traduo feita por meio de um
compilador ou de um interpretador, dependendo do caso, como veremos a seguir.
1.2.2 Executando um programa
O compilador, a partir do cdigo em linguagem de alto nvel, chamado de cdigo-fonte,
gera um arquivo com o cdigo em linguagem de mquina, conhecido como cdigo-
objeto. Esse cdigo-objeto fica em disco e s carregado em memria no momento
da execuo. O interpretador faz o mesmo trabalho, porm no gera o arquivo em
cdigo-objeto. As instrues so traduzidas para linguagem de mquina em tempo de
execuo, instruo a instruo. A figura 1.3 mostra os passos para a execuo de um
cdigo em linguagem de alto nvel por meio da compilao. A figura 1.4 apresenta o
esquema similar para a interpretao.
Cdigo-fonte em
linguagem de
alto nvel
Cdigo em
linguagem
de mquina
Compilador
Figura 1.3 Compilao de um programa.
17 Captulo 1 Introduo
Memria
Interpretador
Cdigo-fonte em
linguagem
alto nvel
Traduo de cada
instruo na fase
de execuo do
programa
Figura 1.4 Interpretao de um programa.
Podemos notar que programar um computador tornou-se muito mais fcil do que
anteriormente. A introduo de linguagens de alto nvel como Pascal, C, Cobol, Java,
entre outras, aumentou a produtividade dos programadores, permitindo que programas
mais elaborados fossem feitos, atendendo a demandas mais complexas. Alm disso, os
cdigos so portveis, ou seja, independentes da plataforma mediante nova compilao
do cdigo-fonte.
1.2.3 Linguagens de programao e sistemas operacionais
A realizao de determinadas operaes em linguagem de mquina pode ser extre-
mamente complexa. Operaes que necessitem de interface com os dispositivos de
entrada e sada, como gravao ou leitura de dados em disco, so um exemplo. Esse
tipo de operao no importante apenas em linguagens de programao. Este um
dos motivos pelos quais os sistemas operacionais so construdos.
Na realidade, os sistemas operacionais constroem uma camada entre hardware e sof-
tware, facilitando a utilizao dos recursos da mquina real por meio da criao de uma
mquina virtual. Essa mquina virtual muito mais simples de ser utilizada e prov uma
srie de mecanismos ao usurio que facilitam a utilizao dos recursos do computador.
Um exemplo so os arquivos, que permitem a manipulao de dados em disco sem que
seja necessrio o conhecimento dos detalhes do funcionamento dos discos, como trilhas,
setores, velocidade da rotao, posicionamento dos dados no disco e outros mais. Alm
disso, o sistema operacional gerencia os recursos da mquina, evitando a m utilizao
e at mesmo a danificao de seus componentes por um programador.
Alm de os sistemas operacionais implementarem operaes complexas e extremamente
teis ao uso do computador, tambm fornecem uma interface para que outros progra-
mas possam utiliz-las. Essas interfaces so conhecidas como chamadas de sistema, ou
system calls, e o conjunto de operaes disponibilizadas so as bibliotecas do sistema
operacional. Os compiladores utilizam essas interfaces em vez de implementar as ope-
raes complexas por si mesmos. Quando o compilador encontra chamadas ao sistema
operacional no cdigo-fonte em linguagem de alto nvel, transforma-as em referncias
no resolvidas no cdigo-objeto em linguagem de mquina. Para que esse cdigo possa
ser executado, precisa ser ligado ao cdigo do sistema operacional que efetivamente
18 Algoritmos e Programao
implementa a operao. Esta a segunda etapa da compilao. O processo conhecido
como ligao do cdigo ou linking. A figura 1.5 apresenta as etapas da transformao de
um cdigo em linguagem de alto nvel at que este possa ser executado.
Compilador
(etapa I)
Cdigo-fonte Cdigo-objeto
Compilador
(etapa II)
Cdigo-objeto
executvel
Memria
Biblioteca
do sistema
operacional
Figura 1.5 Etapas para a execuo de um programa em linguagem de alto
nvel.
A integrao dos compiladores com os sistemas operacionais permite que o cdigo-
objeto de um programa seja portvel para qualquer mquina que utilize o mesmo sis-
tema operacional, tornando o cdigo-objeto dependente do sistema operacional e no
mais da plataforma do processador, visto que o sistema operacional deixa transparente
as diferenas entre plataformas diversas. Porm, um cdigo-objeto compilado em um
sistema operacional no poder ser executado em um outro sistema operacional. Assim,
um programa executvel em Linux provavelmente no poder ser executado em um
sistema operacional HP-UX, SunOS, AIX ou da famlia Microsoft. Para que esse progra-
ma funcione nesses sistemas operacionais, o cdigo-fonte, em linguagem de alto nvel,
dever ser compilado neste sistema operacional.
A linguagem de programao Java tem uma arquitetura diferente, o que fornece a seus
programas mais portabilidade que outras linguagens de programao de alto nvel. A
compilao do cdigo Java no gera cdigo executvel em nenhum sistema operacional.
Em vez disso, gera um cdigo pseudo-executvel, chamado bytecode. Esse cdigo
uma espcie de cdigo de baixo nvel que, porm, no uma linguagem de mquina
de algum processador, nem faz interface especfica com algum determinado sistema
operacional. Para que esse cdigo possa ser executado em algum (e ao mesmo tempo
em qualquer) sistema operacional, necessrio que mais uma camada de software es-
teja a instalada. A camada funciona como um sistema operacional genrico, deixando
transparentes as particularidades do sistema operacional real. Essa camada de software
chamada de Mquina Java Virtual, ou Java Virtual Machine (JVM). A JVM faz a traduo
dos bytecodes para cdigo executvel naquele sistema operacional. Isto faz com que
um programa escrito em Java e que seja compilado para bytecode possa ser executado
em qualquer mquina que tenha a JVM adequada instalada. Durante a execuo, esse
19 Captulo 1 Introduo
cdigo ser traduzido em tempo real para a linguagem proprietria e executado. A tra-
duo em tempo real pode ser entendida como uma espcie de interpretao. Portanto,
difcil afirmar que a linguagem de programao Java seja uma linguagem puramente
compilada ou interpretada.
Essa caracterstica da linguagem Java faz com que esta seja extremamente interessante
para o uso na Internet, visto que o cdigo Java que esteja presente em um site poder
ser executado em qualquer plataforma que contenha a JVM instalada. Normalmente,
os browsers j contm uma JVM para que possam trabalhar com sites que contenham
programas Java. A figura 1.6 apresenta as etapas necessrias para a execuo de um
programa Java.
Compilador
Cdigo-fonte
Java
Bytecode
M
a
q
u
i
n
a

A
M
a
q
u
i
n
a

8
Java Virtual Machine Memria
Traduo de cada
instruo na fase
de execuo do
programa
Figura 1.6 Processo de execuo de programas Java.
1.3 Estruturao de algoritmos
1.3.1 Linguagem natural
Vimos a evoluo na portabilidade dos programas de alto nvel e o quanto tais linguagens
de programao se afastaram da linguagem de mquina e se aproximaram da lgica
humana. Porm, para um iniciante, mesmo a linguagem de programao de alto nvel
pode ser um tanto complexa. Claro que muito mais simples do que programar em
linguagem de mquina ou em linguagem de baixo nvel, mas o verdadeiro problema
que as pessoas, em geral, no esto acostumadas a fazer algoritmos.
Diferentemente da linguagem natural, a linguagem de programao dirigida a orien-
tar uma mquina e no pessoas. Mquinas no podem tomar decises com base em
premissas. Mquinas no podem escolher alternativas, mesmo que estas nos paream
bvias. Mquinas no podem corrigir comandos mal redigidos. Mquinas no podem
descobrir a inteno do programador, mesmo que ela seja (ou pelo menos parea) clara
20 Algoritmos e Programao
no contexto. Pessoas fazem tudo isso (pelo menos na maior parte das vezes) sem sequer
notar. Por isso, a linguagem de programao precisa ter algumas caractersticas que a
linguagem natural no tem. Veja-as a seguir:
Rigidez sinttica: O compilador um tradutor relativamente limitado, que s consegue
fazer as tradues sobre um idioma bastante limitado, com construes muito bem
definidas. Apesar de encontrarmos palavras pertencentes linguagem natural, elas
no sero usadas com a mesma liberdade.
Rigidez semntica: O computador definitivamente no pode lidar com ambigidades.
Por isso, no adianta o programador ter uma inteno se no conseguir exprimi-la
de forma exata. Podemos dizer que o computador um timo cumpridor de ordens,
porm no tem idia de quais ordens est cumprindo, nem o contexto em que essas
aes esto inseridas. Diferentemente da linguagem de programao, a linguagem
natural apresenta ambigidades. Veja o exemplo:
A velhinha ouviu o barulho da janela.
Essa frase curta pode ser interpretada de pelo menos trs maneiras:
1. A velhinha ouviu o barulho produzido pela janela.
2. A velhinha estava junto janela e ouviu o barulho.
3. A velhinha ouviu o barulho que veio atravs da janela.
Qualquer mquina seria incapaz de interpretar o que realmente est acontecendo, mesmo
que o contexto pudesse ajudar. Por isso, a rigidez semntica to crucial e conseqen-
temente a linguagem natural no pode ser utilizada como ferramenta para a construo
de algoritmos para computador.
A necessidade desses quesitos faz com que a linguagem natural no seja a escolha
adequada para a escrita de algoritmos para computador. A segunda alternativa seria
escrever o algoritmo diretamente na linguagem de programao. Porm, a rigidez sin-
ttica e a semntica tornam a escrita de algoritmos diretamente em uma linguagem de
programao real, mesmo de alto nvel, uma tarefa bastante difcil, pois as pessoas no
esto acostumadas a essas exigncias para expressar ordens. Muitas vezes, mesmo em
linguagem natural, esta no uma tarefa trivial.
Realmente chegamos a um dilema: a linguagem natural no adequada porque no tem
rigidez sinttica e semntica e a linguagem de programao no adequada justamente
por ter essas caractersticas. Parece claro que teremos de encontrar uma terceira alter-
nativa para expressarmos algoritmos para computador.
Na realidade, j existem algumas alternativas. Apresentaremos duas delas: fluxograma
e pseudocdigo.
21 Captulo 1 Introduo
1.3.2 Fluxograma
Os fluxogramas apresentam os algoritmos de forma grfica. So formados de caixas que
contm as instrues a serem executadas. Tais caixas so ligadas por setas que indicam
o fluxo das aes. Algumas caixas especiais indicam a possibilidade de o fluxo seguir
caminhos distintos, dependendo de certas situaes que podem ocorrer durante a
execuo do algoritmo. Tambm h representaes para o incio do algoritmo e para o
seu final, para que o fluxo do algoritmo possa ser determinado do seu princpio at o
seu trmino. A figura 1.7 apresenta o exemplo de um algoritmo na forma de fluxograma
para a escolha e apresentao do maior valor entre dois nmeros distintos introduzidos
pelo usurio.
De fato, a representao de algoritmos por meio de fluxogramas tem uma srie de van-
tagens. A primeira a facilidade proporcionada para a compreenso do funcionamento
do algoritmo, mesmo para os leigos. Algumas pessoas tambm se adaptam bem ao
desenvolvimento de algoritmos sob essa representao.
Entretanto, a representao grfica no prtica. A correo de uma linha de pensa-
mento pode implicar a reconstruo de muitas instrues. Alm disso, a construo de
algoritmos mais complexos e longos pode se tornar extremamente trabalhosa, ocupando
vrias pginas. Essas caractersticas acabam tornando a utilizao do fluxograma desa-
conselhvel como ferramenta principal para o desenvolvimento de algoritmos. Todavia,
a utilizao de fluxogramas continua sendo til para apresentao de algoritmos em um
nvel de abstrao alto, sem entrar nos detalhes de sua implementao.
num1 > num2
maior num1 maior num2
escreva maior
fim
incio
leia num1, num2
Sim No
Figura 1.7 Fluxograma para a escolha do maior de dois nmeros distintos.
22 Algoritmos e Programao
1.3.3 Pseudocdigo
Algoritmos podem ser representados em cdigo diretamente em linguagem de progra-
mao. Como j vimos no item 1.3.1, a implementao de algoritmos diretamente em
uma linguagem de programao apresenta algumas desvantagens. Porm, fato que
temos algumas vantagens como o cdigo pronto para a execuo (mesmo que seja aps
a compilao) e, o mais importante, a rigidez sinttica e a semntica, que so imprescin-
dveis para que o algoritmo possa ser lido e executado pelo computador.
O pseudocdigo visa a trazer o mximo possvel desses benefcios, tentando diminuir
o nus da utilizao da linguagem de programao. Abre-se mo do cdigo compilvel
para se ter um cdigo menos rgido, menos dependente das peculiaridades que todo
compilador tem. Ao contrrio da linguagem de programao, o pseudocdigo tem um
grau de rigidez sinttica intermediria entre as linguagens natural e de programao.
Alm disso, podemos utilizar o idioma nativo. Em geral, linguagens de programao
so construdas utilizando palavras reservadas em ingls, uma espcie de padro de
mercado.
Porm, o pseudocdigo deve manter, tanto quanto possvel, a rigidez semntica. A idia
que o pseudocdigo seja um passo intermedirio entre a linguagem natural, a que os
iniciantes esto acostumados, e a linguagem de programao de alto nvel.
Aps a construo do algoritmo em pseudocdigo, necessrio que mais um passo seja
executado para que o algoritmo possa ser compilado e posteriormente executado. a
transformao do pseudocdigo em cdigo de alguma linguagem de programao real.
O pseudocdigo independente do compilador e pode ser traduzido de uma forma
quase direta para uma gama de linguagens de programao.
Um pseudocdigo bastante conhecido no Brasil o Portugol, que apresenta uma acei-
tao grande e tem suas razes para isso. bastante simples e atende s caractersticas
necessrias no que concerne rigidez semntica e sinttica. Entretanto, o Portugol
opta por algumas construes em detrimento de outras que consideramos interessantes
para o passo posterior, que a transformao do pseudocdigo em programa. A ques-
to principal a ausncia de blocos genricos de comandos, que veremos no captulo
2. Tais construes esto presentes na maior parte das linguagens de programao de
alto nvel e so importantes para que o programador iniciante fique acostumado com
esse tipo de estruturao.
Para representarmos nossos algoritmos, utilizaremos uma adaptao do Portugol, que
incluir algumas construes e mecanismos que julgamos adequados para o melhor
aprendizado do programador, procurando facilitar o processo de construo do algo-
ritmo.
Veja a seguir um exemplo de pseudocdigo, referente ao fluxograma mostrado na
figura 1.7.
23 Captulo 1 Introduo
Algoritmo Maior
var num1, num2, maior: inteiro;
incio
leia(num1, num2);
se (num1 > num2) ento
maior num1;
seno
maior num2;
escreva(maior);
fim
1.4 Exerccios do captulo
1. Defina o que um algoritmo.
2. Diferencie um algoritmo de um programa.
3. Explique como um programa executado em um computador.
4. Defina o que uma linguagem de programao de alto nvel e uma linguagem de
programao de baixo nvel.
5. Dado um programa executvel em um sistema operacional, o que preciso fazer
para que tal programa possa ser utilizado em outro sistema operacional?
6. Explique por que um cdigo Java portvel em vrios sistemas operacionais.
7. Por que a linguagem natural no adequada para a construo de algoritmos para
computador?
8. Quais as vantagens e desvantagens da utilizao de fluxograma e de pseudocdigo
na construo de algoritmos?

Você também pode gostar