You are on page 1of 12

Algoritmos e Programao

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.

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.

Captulo 1 Introduo

15

UCP Unidade Central de Processamento

Barramento

Memria

Dispositivos Entrada/Sada

Conexes externas

Teclado Mouse Monitor Impressora etc.

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 programao 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 composta apenas de nmeros. Assim, fazer algoritmos na linguagem de programao do computador ou em sua linguagem de mquina um processo extremamente complicado 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 compreendida. 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 montagem 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 produtividade 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 precisaro 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 cdigoobjeto. 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.

Captulo 1 Introduo

17

Cdigo-fonte em linguagem alto nvel

Interpretador Traduo de cada instruo na fase de execuo do programa

Memria

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 extremamente 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 software, 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 programas 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 operaes 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

Memria

Cdigo-objeto executvel

Compilador (etapa II)

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 cdigoobjeto de um programa seja portvel para qualquer mquina que utilize o mesmo sistema 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 programa 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 esteja 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

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

Memria Traduo de cada instruo na fase de execuo do programa

Java Virtual Machine

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 orientar 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 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

leia num1, num2

Sim

num1 > num2

No

maior num1

maior num2

escreva maior

fim

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

se (num1 > num2) ento seno maior num1;

escreva(maior); fim

maior num2;

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?

You might also like