Professional Documents
Culture Documents
Teoria e Prtica
Marco Medina Cristina Fertig
Novatec Editora
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 explicaremos 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.
13
14
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
Algoritmos e Programao
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 detalhada 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.
Captulo 1 Introduo
15
Barramento
Memria
Dispositivos Entrada/Sada
Conexes externas
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
Compilador
Captulo 1 Introduo
17
Memria
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
Memria
Cdigo-objeto executvel
Captulo 1 Introduo
19
cdigo ser traduzido em tempo real para a linguagem proprietria e executado. A traduo 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.
Cdigo-fonte Java
Compilador
Bytecode
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 conseqentemente 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 sinttica 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 alternativa para expressarmos algoritmos para computador. Na realidade, j existem algumas alternativas. Apresentaremos duas delas: fluxograma e pseudocdigo.
Captulo 1 Introduo
21
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 vantagens. 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 pensamento 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 desaconselhvel 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.
incio
Sim
No
maior num1
maior num2
escreva maior
fim
22
Algoritmos e Programao
1.3.3 Pseudocdigo
Algoritmos podem ser representados em cdigo diretamente em linguagem de programao. 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 imprescindveis 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 aceitao 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 questo 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 algoritmo. Veja a seguir um exemplo de pseudocdigo, referente ao fluxograma mostrado na figura 1.7.
Captulo 1 Introduo
Algoritmo Maior
var num1, num2, maior: inteiro; incio leia(num1, num2);
23
escreva(maior); fim
maior num2;