Algoritmos e Logica de Programacao

download Algoritmos e Logica de Programacao

If you can't read please download the document

Transcript of Algoritmos e Logica de Programacao

SumrioPrefcio 1 Introduo 1.1 O desenvolvimento de um software . . . . . . 1.2 Algoritmos e lgica de programao . . . . . 1.2.1 O signicado de um algoritmo . . . . 1.2.2 Exemplo de algoritmo . . . . . . . . 1.3 A formalizao de um algoritmo . . . . . . . 1.3.1 A sintaxe de um algoritmo . . . . . . 1.3.2 Exemplo de sintaxe de um algoritmo . 1.3.3 A semntica de um algoritmo . . . . 1.4 Como resolver problemas . . . . . . . . . . . 1.4.1 A anlise e a sntese de um problema 1.4.2 Modelagem de problemas . . . . . . 1.4.3 O papel da lgica em programao . . 1.5 Como se portar em um curso de computao . 1.6 Exerccios . . . . . . . . . . . . . . . . . . . xix 1 1 3 4 5 12 12 13 15 16 16 17 19 21 24 27 27 27 28 33 33 37 43 44

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

. . . . . . . . . . . . . .

2

Conceitos de Computao e Computadores 2.1 Origens da computao . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 A necessidade de calcular . . . . . . . . . . . . . . . . . 2.1.2 O desenvolvimento de sistemas de numerao . . . . . . . 2.2 A evoluo dos computadores . . . . . . . . . . . . . . . . . . . 2.2.1 Gerao zero Computadores puramente mecnicos . . . 2.2.2 Primeira gerao Computadores a vlvula e rel . . . . . 2.2.3 Segunda gerao Computadores transistorizados . . . . 2.2.4 Terceira gerao Computadores com circuitos integrados

. . . . . . . .

. . . . . . . .

. . . . . . . .

viii

Algoritmos e Lgica de Programao 2.2.5 Quarta gerao Computadores com chips VLSI A representao da informao em um computador . . . 2.3.1 A eletrnica digital do computador . . . . . . . . 2.3.2 Conceitos de bits e seus mltiplos . . . . . . . . 2.3.3 Caracteres e cadeias de caracteres . . . . . . . . 2.3.4 Imagens . . . . . . . . . . . . . . . . . . . . . . 2.3.5 Sons . . . . . . . . . . . . . . . . . . . . . . . . A arquitetura de um computador . . . . . . . . . . . . . O funcionamento da UCP na execuo dos programas . . O projeto lgico na construo de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 47 47 48 50 52 56 59 60 64 67 67 68 68 69 71 72 73 73 74 80 83 87 93 94 95 95 95 96 96 97 99 99 100 102 102 103

2.3

2.4 2.5 2.6 3

Algoritmos e Fluxogramas 3.1 Reviso do conceito de algoritmo . . . . . . . . . . . . . . . . 3.2 Aplicabilidade dos algoritmos . . . . . . . . . . . . . . . . . 3.2.1 Exemplo no computacional de um algoritmo . . . . . 3.2.2 Exemplo computacional de um algoritmo . . . . . . . 3.3 Propriedades de um algoritmo . . . . . . . . . . . . . . . . . 3.4 Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Construindo uxogramas . . . . . . . . . . . . . . . . . . . . 3.5.1 Fluxograma mnimo . . . . . . . . . . . . . . . . . . 3.5.2 Fluxograma com comandos seqenciais . . . . . . . . 3.5.3 Fluxograma com comandos de deciso . . . . . . . . 3.5.4 Fluxograma com comandos de repetio . . . . . . . . 3.5.5 Simulao de algoritmos com uxogramas . . . . . . 3.6 Convenes para tipos de dados . . . . . . . . . . . . . . . . 3.6.1 Nmeros . . . . . . . . . . . . . . . . . . . . . . . . 3.6.2 Caracteres e cadeias de caracteres . . . . . . . . . . . 3.6.3 Valores lgicos . . . . . . . . . . . . . . . . . . . . . 3.7 Convenes para os nomes de variveis . . . . . . . . . . . . 3.8 Convenes para as expresses . . . . . . . . . . . . . . . . . 3.8.1 Operao de atribuio . . . . . . . . . . . . . . . . . 3.8.2 Operaes aritmticas . . . . . . . . . . . . . . . . . 3.8.3 Operaes relacionais . . . . . . . . . . . . . . . . . 3.8.4 Operaes lgicas . . . . . . . . . . . . . . . . . . . 3.8.5 Expresses . . . . . . . . . . . . . . . . . . . . . . . 3.9 Sub-rotinas predenidas . . . . . . . . . . . . . . . . . . . . 3.9.1 Funes matemticas . . . . . . . . . . . . . . . . . . 3.9.2 Funes e procedimentos para as cadeias de caracteres

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

Sumrio

ix

3.10 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4 Estruturas de Programao 4.1 Estruturas de programao . . . . . . . . . . . . . . . . . . . . . . 4.2 Estruturas seqenciais . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Estruturas de deciso . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Estrutura SE-ENTO . . . . . . . . . . . . . . . . . . . . . 4.3.2 Estrutura SE-ENTO-SENO . . . . . . . . . . . . . . . . 4.3.3 Estrutura CASO . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Exemplos de estruturas de deciso . . . . . . . . . . . . . . 4.4 Estruturas de repetio . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Estrutura ENQUANTO-FAA . . . . . . . . . . . . . . . . 4.4.2 Estrutura REPITA-AT . . . . . . . . . . . . . . . . . . . . 4.4.3 Estrutura PARA-AT-FAA . . . . . . . . . . . . . . . . . 4.4.4 Exemplos de estruturas de repetio . . . . . . . . . . . . . 4.4.5 Smbolos especcos para estruturas de repetio (ISO 5807) 4.5 Outras representaes de algoritmos . . . . . . . . . . . . . . . . . 4.5.1 Portugol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5.2 Diagramas de Nassi-Schneidermann . . . . . . . . . . . . . 4.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variveis Indexadas 5.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Variveis indexadas unidimensionais . . . . . . . . . . . . . . . 5.3 Representao de vetores na memria do computador . . . . . . 5.4 Utilizao de vetores . . . . . . . . . . . . . . . . . . . . . . . 5.5 Exemplos de uxogramas com vetores . . . . . . . . . . . . . . 5.5.1 Localizao de um elemento do vetor . . . . . . . . . . 5.5.2 Mdia aritmtica dos elementos de um vetor . . . . . . 5.5.3 Localizao de elementos de um vetor por algum critrio 5.5.4 Determinao do maior e menor elemento de um vetor . 5.5.5 Clculo de um polinmio pelo mtodo de Horner . . . . 5.6 Variveis indexadas bidimensionais . . . . . . . . . . . . . . . 5.7 Exemplos de uxogramas com matrizes . . . . . . . . . . . . . 5.7.1 Leitura de elementos para uma matriz . . . . . . . . . . 5.7.2 Produto de um vetor por uma matriz . . . . . . . . . . . 5.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 115 116 117 117 118 119 120 122 122 123 124 126 133 136 136 139 142 149 149 151 152 153 155 155 158 158 160 161 163 164 164 165 167

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

5

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

x 6

Algoritmos e Lgica de Programao Tcnicas para a Soluo de Problemas 6.1 A tcnica top-down . . . . . . . . . . . . . . 6.1.1 Exemplo de aplicao . . . . . . . . 6.2 Sub-rotinas . . . . . . . . . . . . . . . . . . 6.2.1 Funes . . . . . . . . . . . . . . . . 6.2.2 Exemplos de funes . . . . . . . . . 6.2.3 O mecanismo de chamada de funes 6.2.4 Procedimentos . . . . . . . . . . . . 6.3 Exerccios . . . . . . . . . . . . . . . . . . . 175 175 176 181 181 183 187 188 191

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

A Pequeno Histrico da Computao 195 A.1 Linha do tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 B A Norma ISO 5807/1985 B.1 Os smbolos . . . . . . . . . . . . . . B.1.1 Smbolos relativos a dados . . B.1.2 Smbolos relativos a processos B.1.3 Smbolos de linhas . . . . . . B.1.4 Smbolos especiais . . . . . . B.1.5 Textos internos . . . . . . . . 201 202 203 204 205 206 207

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

C Operadores e Funes Predenidas 209 C.1 Operadores matemticos . . . . . . . . . . . . . . . . . . . . . . . . . 210 C.2 Funes predenidas . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Referncias Bibliogrcas 214

PrefcioA quem se destina este livro?Este livro destina-se a um curso introdutrio de lgica de programao, especialmente para aqueles ministrados em escolas de Engenharia. Um dos principais problemas encontrados pelo estudante de Engenharia em um primeiro curso de lgica de programao a carncia de textos que abordem de forma direta e clara as etapas necessrias para suportar o processo de resoluo de problemas (computacionais ou no), a saber: a anlise, com a identicao e soluo de subproblemas, e a sntese, unio das solues encontradas para compor a soluo do problema original. O resultado dessas etapas sintetizado em passos que devem ser seguidos em determinada ordem e que constituem os algoritmos.

Abordagem empregadaPretende-se aqui seguir uma apresentao incremental dos tpicos. Inicialmente so propostos problemas simples que envolvem raciocnio lgico e que possuem soluo livre, de modo a ambientar e a incentivar o estudante na descrio dos passos elementares necessrios resoluo de problemas. Isso fundamental, pois grande parte dos estudantes que tem um primeiro contato com lgica de programao apresenta decincias na organizao de suas solues e em abstraes. Alm disso, neste primeiro contato, um processo genrico de soluo de problemas apresentado de maneira a fornecer um conjunto de dicas ou heursticas que podem ser aplicadas em todos os problemas a serem resolvidos, fortalecendo assim o processo de abstrao, essencial em programao. A seguir so apresentados os conceitos de computao e computadores. Embora um primeiro curso de lgica de programao possa ser ministrado sem referncias a como um computador organizado e como funciona, verica-se na prtica que esse enfoque no adequado. Como se sabe, o grande problema do estudante nesses cursos

xx

Algoritmos e Lgica de Programao

introdutrios a abstrao de procedimentos e dados. Nesse ponto apresenta-se uma arquitetura de computador bem simples, baseada na arquitetura de Von Neumann, para xar de modo tangvel os conceitos relacionados a instrues e dados operados em computadores. Objetiva-se aqui que o estudante futuramente consiga relacionar os aspectos abstratos de computao, tais como variveis, estruturas de programas e decomposio funcional com sua implementao. Essa parte serve ainda como incentivo para a necessidade de se descrever algoritmos antes de sua implementao propriamente dita. Depois, e acompanhando todo o livro, emprega-se uma notao formal para a soluo de problemas. Utiliza-se neste texto a descrio de algoritmos sob a forma de uxogramas baseados na norma ISO 5807/1985. Os uxogramas so compostos por smbolos bsicos que representam as menores partes em um processo de soluo: estruturas seqenciais, de deciso e de repetio. O uso de uxogramas nesta obra justicado pelo fato de que o engenheiro tem a obrigao de desenvolver um raciocnio lgico bem-estruturado e que o uxograma ainda representa uma poderosa ferramenta para a vericao e teste da lgica empregada na soluo de problemas. A utilizao de uxogramas em Engenharia ampla: de descries de programas at descries de processos de fabricao ou processos qumicos, seu emprego similar e regido nica e exclusivamente pela lgica utilizada na composio de seus blocos, at se alcanar a soluo de um determinado problema. Alm do uso de uxogramas, so apresentadas ainda duas outras formas conhecidas para a representao de algoritmos: diagramas de Nassi-Schneidermann e o pseudocdigo baseado na lngua portuguesa, o Portugol. Os diagramas de Nassi-Schneidermann empregam uma representao em caixas aninhadas, em que cada uma relacionada a um determinado tipo de comando ou estrutura de programao. J o Portugol usa uma descrio textual e estruturada da soluo de um problema na qual os comandos so descritos por palavras-chave reservadas e extradas da lngua portuguesa.

Descrio dos captulosNo Captulo 1 so apresentados os conceitos bsicos sobre modelagem de problemas em Engenharia e como organizar suas solues utilizando passos elementares. Faz-se aqui um preldio ao estudo dos algoritmos, com uma descrio de mtodos para auxiliar o estudante no processo de identicao e resoluo de problemas, bem como a proposio de problemas de lgica com soluo livre para ambientar o estudante nesse processo. No Captulo 2 so discutidos os conceitos de computao e computadores. Inicia-se com a discusso da origem da palavra computao, seu signicado e aplicaes. A seguir so discutidos os conceitos bsicos sobre a organizao de computadores utilizando a

Prefcio

xxi

arquitetura de Von Neumann. Um computador hipottico com instrues simplicadas apresentado de forma a proporcionar ao estudante simulaes de como as instrues e os dados so realmente processados. Os conceitos de algoritmo e uxograma so formalizados no Captulo 3. So discutidos o conceito e as propriedades de um algoritmo, a representao de algoritmos por uxogramas, como criar um uxograma utilizando os smbolos bsicos da norma ISO 5807/1985, bem como convenes para os tipos de dados, os nomes de variveis e operadores. J no Captulo 4 formalizam-se as estruturas de programao. So apresentados os nomes e as topologias das estruturas tpicas de um programa: as estruturas seqenciais, de deciso e de repetio. Apresentam-se ainda nesse captulo duas outras formas de representao de algoritmos: os diagramas de Nassi-Schneidermann e a pseudolinguagem Portugol. apresentado, no Captulo 5, o conceito de variveis indexadas e seu uso. As variveis indexadas so aquelas que referenciam de forma ordenada uma seqncia de dados homogneos. Separam-se aqui, para melhor compreenso, o conceito e a utilizao de varivel indexada unidimensional (ou vetor) do conceito de varivel indexada bidimensional e multidimensional. Com essa separao, espera-se que o estudante consiga estender os conceitos e operaes relacionados a variveis indexadas unidimensionais para dimenses maiores. Por m, no Captulo 6 so discutidas as tcnicas para a soluo de problemas, mais especicamente as tcnicas para modularizar a soluo utilizando sub-rotinas. So apontados os dois tipos bsicos de sub-rotinas (funo e procedimento) e como empreg-los de acordo com a tcnica top-down de modularizao. A Figura da pgina xxii exibe a organizao dos captulos deste livro.

Convenes tipogrcasAlgumas convenes tipogrcas foram utilizadas neste livro para tornar mais clara a sua compreenso: Negrito empregado para destacar os conceitos importantes. Itlico utilizado para enfatizar os conceitos essenciais e para palavras estrangeiras.

xxii

Algoritmos e Lgica de Programao

Captulo 1 - Introduo

Captulo 2 - Conceitos de Computao e Computadores

Captulo 3 - Algoritmos e Fluxogramas

Captulo 4 - Estruturas de Programao

Captulo 5 - Variveis Indexadas

Captulo 6 - Tcnicas para a Soluo de Problemas

Nos exerccios existem smbolos para identicar aqueles que so bsicos, de resoluo imediata; mdios, nos quais o estudante deve pensar um pouco mais na soluo; e desaos, a m de empenhar-se mais na sua soluo:

exerccio fcil exerccio mdio exerccio desaador

Captulo 1

IntroduoUm programa de computador um produto resultante da atividade intelectual de um programador. Essa atividade, por sua vez, depende de um treinamento prvio em abstrao e modelagem de problemas, bem como o uso da lgica na vericao das solues. Neste captulo so apresentados os conceitos introdutrios sobre a tarefa de programar computadores, a necessidade do uso de lgica na programao, a importncia de se abstrair e modelar os problemas antes de partir para as solues. Por m, so apresentadas algumas dicas teis que podem ser utilizadas na soluo de problemas em geral.

1.1

O desenvolvimento de um software

Um programa de computador ou simplesmente software representado pelas instrues e dados que algum ser humano deniu e que ao serem executados por alguma mquina cumprem algum objetivo. A mquina a que este texto se refere um computador digital1 . Os computadores digitais so mquinas eletrnicas contendo processadores e circuitos digitais adequados, operando com sinais eltricos em dois nveis ou binrios (a ser detalhados no Captulo 2). Os dados so organizados em um computador de acordo com sua representao binria, isto , seqncias de 0s e 1s. O objetivo de se utilizar um computador extrair as informaes resultantes de computaes, isto , o resultado das execues das instrues de algum programa. Deve-se observar a diferena entre informao e dado: o dado1

Existem tambm computadores analgicos.

2

Algoritmos e Lgica de Programao

por si s um valor qualquer armazenado em um computador enquanto a informao representa a interpretao desse dado, ou seja, qual o seu signicado. Parte dos dados processados durante a execuo de um software fornecida pelo ser humano (ou outra mquina) e denominada dados de entrada. Por outro lado, os dados de sada so aqueles fornecidos ao ser humano (ou outra mquina) aps o processamento dos dados de entrada. De qualquer forma, importante notar que o objetivo do software que motiva sua construo. Este pode ser denido como alguma necessidade humana, por exemplo, um programa para simular o funcionamento de um circuito digital, um programa para comandar um rob em uma linha de montagem, um sistema de gerenciamento de informaes em uma empresa, somente para citar algumas. A Figura 1.1 descreve uma simplicao do processo de desenvolvimento de um software.

Figura 1.1 Simplicao do processo de construo de um software. Nessa gura, o cliente especica exatamente o que o software deve conter. Ele sabe o que o software deve conter e realizar, mas regra geral no sabe como. Ele indica o que o software deve contemplar e executar por meio de especicaes chamadas requisitos. Entende-se por cliente a entidade que contrata os servios para a criao de um software, podendo ser uma empresa, pessoa ou ainda uma empresa que, por iniciativa prpria, produza e venda seu software livremente (por exemplo, a Microsoft). No desenvolvimento, os requisitos do cliente so traduzidos em especicaes tcnicas de software pelos analistas de sistema ou engenheiros de software. O desenvolvimento de um software tipicamente dividido nas seguintes etapas: Anlise: criam-se especicaes que detalham como o software vai funcionar; Projeto: criam-se especicaes que detalham o resultado da anlise em termos mais prximos da implementao do software;

Captulo 1 Introduo

3

Implementao: utilizando-se uma linguagem de programao e as especicaes de projeto, o software construdo; Testes: aps a construo do software, so realizados testes para conferir sua conformidade com os requisitos iniciais. O software deve satisfazer a todas especicaes do cliente. Por m, aps os testes o software implantado na empresa. A implantao pode variar desde uma simples instalao via CD-ROM, que dure alguns minutos, at a instalao e testes de integrao de diversos softwares, que pode levar semanas. De qualquer forma, o fato de o software estar nalizado e testado no signica que esteja totalmente livre de erros, tambm denominados bugs. Assim, deve-se voltar e tentar identicar a causa dos erros. Pior que erros de programao, o caso em que pode acontecer de o software funcionar corretamente, no apresentar erros, mas no realizar o que o cliente esperava. Nesse caso, deve-se retornar etapa inicial, vericando os requisitos e refazendo todo o ciclo de desenvolvimento novamente. um fato que grande parte do investimento feito em um software gasta na correo de erros do que propriamente na sua elaborao. Da, surge a necessidade de enxergar o software como o produto de um processo bem-denido e controlado, que atue sobre as suas etapas de desenvolvimento, em outras palavras, um processo de engenharia de software.

1.2

Algoritmos e lgica de programao

Como foi brevemente apresentado na Seo 1.1, o software deve ser encarado como um produto de um processo bem-denido e controlado de engenharia. O intuito deste livro no entrar em detalhes sobre engenharia de software e sim concentrar-se na disseminao de conceitos bsicos que viabilizem a especicao correta de softwares, uma etapa imediatamente anterior a sua implementao ou programao. O estudo de algoritmos e de lgica de programao essencial no contexto do processo de criao de um software. Ele est diretamente relacionado com a etapa de projeto de um software em que, mesmo sem saber qual ser a linguagem de programao a ser utilizada, se especica completamente o software a ponto de na implementao ser possvel traduzir diretamente essas especicaes em linhas de cdigo em alguma linguagem de programao como Pascal, C, Java e outras. Essa tarefa permite vericar, em um nvel maior de abstrao, se o software est correto ou no. Permite, inclusive, averiguar se o software atender s especicaes

4

Algoritmos e Lgica de Programao

originalmente propostas. Assim, evita-se partir diretamente para a etapa de implementao, o que poder ocasionar mais erros no produto nal.

1.2.1

O signicado de um algoritmo

Um algoritmo representa um conjunto de regras para a soluo de um problema. Essa uma denio geral, podendo ser aplicada a qualquer circunstncia que exija a descrio da soluo. Dessa forma, uma receita de bolo um exemplo de um algoritmo2 , pois descreve as regras necessrias para a concluso de seu objetivo: a preparao de um bolo. Em um bolo, descrevem-se quais sero os ingredientes e as suas quantidades. Depois, quais so as regras para o seu preparo, como a seqncia de incluso dos ingredientes para bater as gemas; cozimento e assim por diante, conforme a Figura 1.2.

Figura 1.2 Uma receita de bolo um algoritmo. A correta execuo das instrues contidas na receita de bolo leva sua preparao. No entanto, se essas instrues tiverem sua ordem trocada ou a quantidade dos ingredientes alterada, o resultado vai divergir do original. Existe, ainda, o perigo de o autor da receita no a ter testado previamente, o que poder gerar, novamente, resultados indesejveis3 . Da mesma forma, em programao, o algoritmo especica com clareza e de forma correta as instrues que um software dever conter para que, ao ser executado, fornea resultados esperados (veja a Figura 1.3).

2 3

Na realidade, um algoritmo informal e impreciso. Se o fogo estiver desregulado, tambm vai gerar problemas.

Captulo 1 Introduo

5

Figura 1.3 A tarefa de especicar um algoritmo.

Em primeiro lugar, deve-se saber qual o problema a ser resolvido pelo software o seu objetivo. Da, deve-se extrair todas as informaes a respeito desse problema (dados e operaes), relacion-las com o conhecimento atual que se tem do assunto, buscando eventualmente informaes de outras fontes. Essa fase representa a modelagem do problema em questo e vai ser detalhada na Seo 1.4.2. A modelagem do problema resultante de um processo mental de abstrao, o qual ser discutido na Seo 1.4. Depois, sabendo como resolver o problema, a tarefa consiste em descrever claramente os passos para se chegar sua soluo. Os passos por si s no resolvem o problema; necessrio coloc-los em uma seqncia lgica (veja Seo 1.4.3), que, ao ser seguida, de fato o solucionar. Alm disso, importante que essa descrio possua algum tipo de conveno para que todas as pessoas envolvidas na denio do algoritmo possam entend-lo (veja a Seo 1.3). Chega-se, ento, na especicao do algoritmo.

1.2.2

Exemplo de algoritmo

Considere o problema das Torres de Hanoi. A proposio do problema a seguinte: inicialmente tm-se trs hastes, A, B e C, e na haste A repousam trs anis de dimetros diferentes, em ordem decrescente por dimetro (veja a Figura 1.4).

6

Algoritmos e Lgica de Programao

A

B

C

A

B

C

Situao inicial

Situao final

Figura 1.4 O problema das Torres de Hanoi. O objetivo transferir os trs anis da haste A para B, usando C se necessrio. As regras de movimento so: deve-se mover um nico anel por vez; um anel de dimetro maior nunca pode repousar sobre algum outro de dimetro menor. As nicas informaes para se resolver esse problema so as conguraes inicial e nal dos anis e as regras de movimento. Uma soluo poderia ser a seguinte seqncia de operaes (veja o Algoritmo 1.1 e a Figura 1.5).

Algoritmo 1.1 Algoritmo para resolver o problema das Torres de Hanoi. Incio 1. Mover um anel da haste A para a haste B. 2. Mover um anel da haste A para a haste C. 3. Mover um anel da haste B para a haste C. 4. Mover um anel da haste A para a haste B. 5. Mover um anel da haste C para a haste A. 6. Mover um anel da haste C para a haste B. 7. Mover um anel da haste A para a haste B. Fim

Captulo 1 Introduo

7

A

B

C

A

B

C

A

Incio B

C

A

Passo 1 B

C

A

Passo 2 B

C

A

Passo 3 B

C

A

Passo 4 B

C

A

Passo 5 B

C

Passo 6

Passo 7 - Soluo

Figura 1.5 Soluo do problema das Torres de Hanoi.

8

Algoritmos e Lgica de Programao

Como se obteve essa soluo? Primeiro, importante entender o enunciado do problema e as regras que foram impostas. Dessa forma, no possvel especicar os movimentos nos quais uma pea que esteja abaixo de outra seja movida e nem mover mais de uma pea por vez. Segundo, importante vericar a cada passo denido se a soluo est se aproximando do objetivo nal. O Algoritmo 1.2 dene outra seqncia de operaes para se solucionar o problema. Algoritmo 1.2 Outro algoritmo para as Torres de Hanoi. Incio 1. Mover um anel da haste A para a haste C. 2. Mover um anel da haste A para a haste B. 3. Mover um anel da haste C para a haste B. 4. Mover um anel da haste A para a haste C. 5. Mover um anel da haste B para a haste C. 6. Mover um anel da haste B para a haste A. 7. Mover um anel da haste C para a haste A. 8. Mover um anel da haste C para a haste B. 9. Mover um anel da haste A para a haste C. 10. Mover um anel da haste A para a haste B. 11. Mover um anel da haste C para a haste B. Fim

Deve-se observar que essa soluo vlida e tambm resolve o caso das Torres de Hanoi. No entanto, leva-se mais tempo para chegar se soluo (onze passos contra sete da soluo anterior). Esse exemplo demonstra que uma mesma soluo pode ser melhor ou pior que outra. Isso um conceito importante quando se trata de um programa, pois, dependendo do problema, determinar uma soluo mais eciente pode economizar at horas de processamento. Outras solues vlidas tambm podem ser propostas, mas no tero menos que sete movimentos. Agora, e se for considerado o mesmo problema, porm, com n anis postados inicialmente na haste A? Como isso afetar a soluo? interessante estudar diversos casos particulares antes de elaborar uma soluo genrica.