Vous êtes sur la page 1sur 70

Algoritmia e Estruturas de Dados

Jorge Santos

Instituto Superior de Engenharia do Porto Departamento de Engenharia Informtica Fevereiro de 2006

Aviso de licena de utilizao: Este documento pode ser utilizado livremente para ns no comerciais, permitido aos seus utilizadores, copiar, distribuir e exibir publicamente os seus contedos, desde que sejam ressalvados os direitos de autor do mesmo, nomeadamente, dever ser sempre includa esta pgina em todas as cpias. Jorge Santos, 2006

ndice
1 Algoritmia e Programao 1.1 Conceitos bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Programao estruturada . . . . . . . . . . . . . . . . . . 1.1.3 Notao utilizada . . . . . . . . . . . . . . . . . . . . . . . 1.1.4 Operadores utilizados nos algoritmos . . . . . . . . . . . 1.2 Instrues sequenciais . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Sada de dados . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Entrada de dados . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.4 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . 1.2.4.1 Cambiar moedas . . . . . . . . . . . . . . . . . . 1.2.4.2 Distncia euclidiana entre dois pontos . . . . . 1.2.4.3 Determinar permetro e rea de circunferncia . 1.2.5 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . 1.2.5.1 Calcular ndice de massa corprea (IMC) . . . . 1.2.5.2 Converter horas, minutos e segundos . . . . . . 1.2.5.3 Teorema de Pitgoras . . . . . . . . . . . . . . . 1.2.5.4 Converter temperaturas . . . . . . . . . . . . . . 1.3 Instrues de Deciso . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Deciso binria . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2 Deciso mltipla . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . 1.3.3.1 Distncia euclidiana entre dois pontos . . . . . 1.3.3.2 Classicar em funo da mdia . . . . . . . . . 1.3.3.3 Determinar o mximo de 3 valores . . . . . . . 1.3.3.4 Determinar tringulo vlido . . . . . . . . . . . 1.3.4 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . 1.3.4.1 Classicar tringulo . . . . . . . . . . . . . . . . 1.3.4.2 Diviso . . . . . . . . . . . . . . . . . . . . . . . 1.3.4.3 Resolver equao da forma ax2 + bx + c = 0 . . 1.3.4.4 Converter entre escalas de temperaturas . . . . 1.3.4.5 Calcular ndice de massa corprea (IMC) . . . . 1 1 1 3 5 6 7 7 8 9 10 11 11 12 12 12 12 13 13 13 13 15 17 17 17 18 20 21 21 21 22 22 22

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

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

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

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

iii

1.4

1.5 1.6

1.7

1.3.4.6 Determinar ano bissexto . . . . . . . . . . . . . . . . . 1.3.4.7 Parque de estacionamento . . . . . . . . . . . . . . . . Instrues de Repetio (Ciclos) . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Ciclo condicional: repetir-at . . . . . . . . . . . . . . . . . . . . 1.4.2 Ciclo condicional: enquanto-fazer . . . . . . . . . . . . . . . . . 1.4.3 Ciclo determinstico: para-fazer . . . . . . . . . . . . . . . . . . . 1.4.4 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . 1.4.4.1 Calcular somatrio entre dois limites . . . . . . . . . . 1.4.4.2 Calcular factorial de um nmero . . . . . . . . . . . . 1.4.4.3 Determinar se um nmero primo . . . . . . . . . . . 1.4.4.4 Determinar nome e idade da pessoa mais nova de um grupo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.4.5 Determinar o aluno melhor classicado e a mdia das notas de uma turma . . . . . . . . . . . . . . . . . . . . 1.4.5 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.5.1 Diviso atravs de subtraces sucessivas . . . . . . . 1.4.5.2 Determinar o mximo e mnimo de uma srie . . . . . 1.4.5.3 Determinar quantidade de nmeros primos . . . . . . 1.4.5.4 Determinar se um nmero perfeito . . . . . . . . . . 1.4.5.5 Calcular potncia por multiplicaes sucessivas . . . . 1.4.5.6 Maior nmero mpar de uma sequncia de valores . . 1.4.5.7 Algarismos de um nmero . . . . . . . . . . . . . . . . 1.4.5.8 Apresentao grca de temperaturas . . . . . . . . . 1.4.5.9 Soma dos algarismo de um nmero . . . . . . . . . . . 1.4.5.10 Jogo de adivinhar o nmero . . . . . . . . . . . . . . . 1.4.5.11 Capicua de um nmero . . . . . . . . . . . . . . . . . . 1.4.5.12 Converso de base numrica . . . . . . . . . . . . . . . Traagens e Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programao modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 Sub-rotinas, parmetros e variveis locais . . . . . . . . . . . . . 1.6.1.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . 1.6.2 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.2.1 Funo que devolve o maior algarismo de um nmero 1.6.2.2 Funo que indica se um nmero perfeito . . . . . . 1.6.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.3.1 Funo mdia de dois nmeros . . . . . . . . . . . . . 1.6.3.2 Funo lei de Ohm . . . . . . . . . . . . . . . . . . . . . 1.6.3.3 Funo somatrio . . . . . . . . . . . . . . . . . . . . . 1.6.3.4 Funes para codicar e descodicar nmeros . . . . 1.6.3.5 Nmeros primos . . . . . . . . . . . . . . . . . . . . . . Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7.1 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . 1.7.2 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . .

23 23 23 24 24 25 27 27 28 29 30 31 32 32 33 33 33 33 33 33 34 34 34 34 34 35 36 37 37 39 39 39 40 41 41 41 41 41 42 42 42 43

iv

Estruturas de dados 2.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Exerccios resolvidos . . . . . . . . . . . . . . . . . 2.1.1.1 Funes manipulando vectores . . . . . 2.1.2 Exerccios propostos . . . . . . . . . . . . . . . . . 2.1.2.1 Determinar desvio padro de uma srie 2.1.2.2 Prova de atletismo . . . . . . . . . . . . . 2.2 Ordenao e pesquisa de vectores . . . . . . . . . . . . . . 2.2.1 Ordenao por seleco . . . . . . . . . . . . . . . 2.2.2 Pesquisa Sequencial . . . . . . . . . . . . . . . . . 2.2.3 Exercicios resolvidos . . . . . . . . . . . . . . . . . 2.2.3.1 Inverter um vector . . . . . . . . . . . . . 2.2.4 Exerccios propostos . . . . . . . . . . . . . . . . . 2.2.4.1 Juno ordenada de vectores . . . . . . . 2.2.4.2 Mtodo de ordenao por troca directa . 2.2.4.3 Filtro grco . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

45 45 48 48 50 50 50 51 51 52 53 53 54 54 54 54

vi

Lista de Figuras
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 2.1 2.2 2.3 2.4 Estrutura de um computador . . . . . . . . . . . . . . . . . . . . . . . Notao dos Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Instrues sequenciais . . . . . . . . . . . . . . Fluxograma e sintaxe - Sada de dados . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Entrada de dados . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Atribuio . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Instruo deciso se-ento . . . . . . . . . . . Fluxograma e sintaxe - Instruo deciso se-ento-seno . . . . . . . Fluxograma e sintaxe - Instruo deciso mltipla seleccione-caso Fluxograma da determinao do mximo de 3 valores . . . . . . . . . Fluxograma e sintaxe - Instruo ciclo repetir-at . . . . . . . . . . Fluxograma e sintaxe - Instruo ciclo enquanto-fazer . . . . . . . . Fluxograma e sintaxe - Instruo ciclo para-fazer . . . . . . . . . . . Diviso inteira atravs de subtraces sucessivas . . . . . . . . . . . . Fluxograma e sintaxe - Funo . . . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Procedimento . . . . . . . . . . . . . . . . . . . Ilustrao da lei de Ohm . . . . . . . . . . . . . . . . . . . . . . . . . . Vector unidimensional: notas . . . . . . Vector bidimensional (matriz): imagem Imagem vdeo - original . . . . . . . . . Imagem vdeo - em tratamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5 8 8 9 9 13 14 15 19 24 25 26 35 38 39 41 47 47 55 55

vii

viii

Lista de Tabelas
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 Operadores relacionais . . . . Operadores aritmticos . . . . Operadores lgicos . . . . . . Tabela de verdade - conjuno Tabela de verdade - disjuno Tabela de verdade - negao . ndice de massa corprea . . Traagem do algoritmo 1.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 7 7 7 22 36

Lista de Algoritmos
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 2.1 2.2 Cambiar euro para dlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcular distncia euclidiana entre pontos . . . . . . . . . . . . . . . . . Determinar permetro e rea de circunferncia . . . . . . . . . . . . . . . Mquina de furao - deciso mltipla . . . . . . . . . . . . . . . . . . . Mquina de furao - deciso binria . . . . . . . . . . . . . . . . . . . . Calcular distncia euclidiana entre pontos . . . . . . . . . . . . . . . . . Classicar em funo da mdia . . . . . . . . . . . . . . . . . . . . . . . . Calcular mximo de 3 nmeros . . . . . . . . . . . . . . . . . . . . . . . . Calcular mximo de 3 nmeros . . . . . . . . . . . . . . . . . . . . . . . . Validar tringulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcular somatrio entre dois limites . . . . . . . . . . . . . . . . . . . . Calcular factorial de um nmero . . . . . . . . . . . . . . . . . . . . . . . Determinar se um nmero primo . . . . . . . . . . . . . . . . . . . . . . Determinar se um nmero primo . . . . . . . . . . . . . . . . . . . . . . Determinar nome/idade da pessoa mais nova . . . . . . . . . . . . . . . Determinar o aluno melhor classicado e a mdia das notas de uma turma Diviso inteira atravs de subtraces sucessivas (numerado) . . . . . . Funo maior(n) que devolve o maior algarismo de um nmero . . . . Funo perfeito(N) que indica se um nmero perfeito . . . . . . . . . . Manipulao de Vectores (leitura, diferena entre mximo e mnimo e nmero de pares e mpares) . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar a pesquisa sequencial) . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 16 16 17 18 19 20 21 28 29 29 30 31 32 35 40 40 50 53

ix

Resumo
Estes apontamentos tm como objectivo principal apoiar os leitores que pretendam aprender programao de computadores Os contedos propostos tm como objectivo fornecer bases slidas de metodologias de programao que auxiliem a compreenso de programas computacionais simples, a sua adaptao e desenvolvimento de novas aplicaes, e estimular a capacidade dos leitores para: analisar e resolver problemas de programao. A estrutura destes apontamentos foi denida de acordo com a abordagem de aprender-por-exemplo, pelo que, os conceitos so apenas introduzidos de acordo com a necessidade de explicar a resoluo de um determinado algoritmo. Neste manual introduzem-se as bases da algoritmia de acordo com o paradigma da programao estruturada. Em cada seco apresentada um pequena introduo terica sobre o tpico em destaque, apresentados problemas e propostas solues para os mesmos, adicionalmente so propostos exerccios para resoluo. Na codicao/apresentao das solues geralmente Pseudo-Cdigo e/ou Fluxogramas. Este documento compila exerccios de vrios anos de ensino de muitos docentes do departamento nos quais me incluo. Ao longo do manual podero ser encontrados exemplos e exerccios propostos pelos docentes nas disciplinas de Algoritmia e Programao, Linguagens de Programao I do curso de Engenharia Informtica do Departamento de Engenharia Informtica (DEI), bem como de Programao I e Programao II do curso Engenharia Electrotcnica do Departamento de Engenharia Electrotcnica (DEE), ambos do ISEP.

xi

xii

Agradecimentos
Gostaria de agradecer aos colegas que permitiram a utilizao do seu material pedaggico, em particular, Alberto Sampaio, Ana Almeida Figueiredo, Ana Madureira, Carlos Vaz de Carvalho, Conceio Neves, Isabel Sampaio e Jos Avelino. Estou igualmente grato a todos aqueles que reviram o manual e deram inmeras sugestes para o seu melhoramento, nomeadamente Berta Baptista, Paulo Ferreira e Nuno Silva. Pese embora a inmeras sugestes/correes propostas pelos referidos colegas, quaisquer erros e gralhas que subsistam no documento so, naturalmente, da minha inteira responsabilidade. Porto, Fevereiro de 2006 Jorge Santos

xiii

Captulo 1 Algoritmia e Programao


Objectivos
Familiarizar os alunos com os conceitos e a terminologia associados Informtica Programar com clareza usando a metodologia da Programao Estruturada

1.1 Conceitos bsicos


Nesta seco so introduzidos os conceitos bsicos necessrios disciplina de algoritmia e programao. Em particular, os conceitos de programao estruturada, programa, estrutura de dados e algoritmo.

1.1.1 Introduo
Informtica a cincia que estuda a informao, em particular, preocupa-se com a estrutura, criao, gesto, armazenamento, pesquisa, disseminao e transferncia de informao. Para alm disso, a informtica estuda a aplicao da informao nas organizaes. A palavra informtica resultado da contraco das palavras: informao automtica. A matria prima da informtica a informao, na sua forma mais simples, dados e a ferramenta bsica o computador. O computador est para a informtica assim como o telescpio para astronomia. Um computador um conjunto de circuitos elctricos e electrnicos capaz de realizar de modo autnomo uma determinada tarefa, por obedincia a um programa armazenado internamente. Assim, um computador pode ser visto como um sistema de computao que compreende hardware e software (ver gura 1.1). Hardware - esta a componente material/fsica do computador, que fornece a capacidade de:

ISEP/DEI - Jorge Santos

COMPUTADOR Software
Aplicaes Ferramentas de desenvolvimento Sistema Operativo

Mmoria

CPU

Perifricos

Hardware
Figura 1.1: Estrutura de um computador

executar um determinado tipo de instrues a uma determinada velocidade; armazenar um conjunto de bytes; comunicar com um conjunto de perifricos. Estas componentes fsicas tm que receber ordens do que fazer e como se articular. Esta a funo do software. Software - esta a componente lgica do computador, que consiste num conjunto de programas que dirigem o funcionamento do computador. Para uma melhor sistematizao do software e as respectivas funes, este pode ser organizado nas seguintes categorias: Software de Sistema Operativo - conjunto de programas que comunica directamente com o hardware e responsvel pela gesto de recursos e perifricos. Neste conjunto incluem-se o sistema operativo e os programas de controle do funcionamento do hardware, tais como programas de parametrizao, drivers e ans. Ferramentas de desenvolvimento - conjunto de aplicaes utilizadas no desenvolvimento de aplicaes. Neste conjunto incluem-se as linguagens de programao (compiladores e interpretadores) e os sistemas de gesto de bases de dados.

Captulo 1. Algoritmia e Programao


Aplicaes - conjunto de aplicaes que se destinam utilizao pelo utilizador nal do sistema de computao. Regra geral o nvel de abstraco mais elevado do que nas categorias anteriores. Neste conjunto incluem-se as aplicaes por medida, ferramentas de gesto, folhas de clculo, editores de texto, etc.

1.1.2 Programao estruturada


Numa primeira fase, nas dcadas de 50 e 60, o desenvolvimento do hardware era o responsvel pela expanso dos computadores. A maioria do investimento era feito a este nvel, sendo a programao vista como uma arte. Na dcada de 70, incentivados pela melhoria das caractersticas de hardware (miniaturizao e baixo custo) os informticos foram confrontados com projectos cada vez mais sosticados. Constata-se nessa altura a inverso dos custos dispendidos com hardware e software, para alm do problema da abilidade do software passar a ser uma preocupao. Surge ento a necessidade de transformar a tarefa de construir software numa actividade com rigor comparvel a uma disciplina de engenharia nascendo assim uma nova disciplina a Engenharia de Software cujo objectivo a produo de Software de modo eciente em custos controlados e segurana. A produo de software, como de qualquer outro produto de engenharia passa por diferentes fases como sejam: planeamento, anlise, projecto, programao, implementao e manuteno. Para cada uma das fases do desenvolvimento do software foram estudadas mtodos e tcnicas especcas. A programao estruturada enquadra-se num desses mtodos e permite fasear o processo de construo de um programa descrevendo o processo computacional de um modo no ambguo - Algoritmo. A programao estruturada dene um conjunto de regras para elaborao de programas. A programao estruturada baseia-se no desenho modular dos programas e no renamento gradual do topo para a base. De acordo com este paradigma um programa pode ser denido pela forma seguinte: Programa = Estrutura de Dados + Algoritmo Um algoritmo manipula dados que podem ser de diversos tipos, designadamente: nmeros (inteiros ou reais), caracteres, cadeias de caracteres, endereos (apontadores), lgicos (verdadeiro e falso). As estrutura de dados so o modo como os dados esto organizados, acedidos e alterados. De entre as mais relevantes destacam-se: variveis simples, vectores mono e multi-dimensionais, listas, las, rvores, grafos e cheiros. Um algoritmo consiste num conjunto nito e bem-denido de instrues que descrevem os passos lgicos necessrios realizao de uma tarefa ou resoluo de um

ISEP/DEI - Jorge Santos


problema, dado o estado inicial (nico), a execuo do algoritmo conduz ao estado nal (nico). Considere-se por exemplo a seguinte receita para a confeco de uma omeleta de queijo. OMELETA DE QUEIJO FRESCO Ingredientes: 170 gr de queijo fresco 6 ovos grandes 30 gr de manteiga ou margarina Sal q.b. Modo de Preparao: Ponha o queijo fresco numa tigela e esmague-o com uma colher de pau, at formar um pur espesso e cremoso. Bata os ovos e misture-os com o queijo, adicionando um pouco de gua fria. Tempere a gosto. Derreta um pouco de gordura numa frigideira de base larga e adicione a mistura de ovos e queijo. Cozinhe em lume brando at que a omeleta que pronta mas no demasiado cozida. Estabelecendo um paralelo entre esta receita culinria e um programa, os ingredientes so as estruturas de dados e o modo de preparao o algoritmo. Naturalmente que uma receita culinria usa a linguagem natural e como tal muito difcil a sua interpretao por parte de um computador. De acordo com o paradigma da programao estruturada qualquer programa pode ser descrito utilizando exclusivamente as trs estruturas bsicas de controlo: Instrues de Sequncia - as instrues de sequncia so instrues atmicas (simples) permitem a leitura/escrita de dados, bem como o clculo e atribuio de valores; Instrues de Deciso - as instrues de deciso, ou seleco, permitem a seleco em alternncia de um ou outro conjunto de aces aps a avaliao lgica de uma condio; Instrues de Repetio - as instrues de repetio, ou ciclos, permitem a execuo, de forma repetitiva, de um conjunto de instrues. Esta execuo depende do valor lgico de uma condio que testada em cada iterao para decidir se a execuo do ciclo continua ou termina. Na descrio de algoritmos so utilizados diferentes formalismos conforme o objectivo ou audincia. Entre os mais comuns encontram-se o pseudo-cdigo e uxogramas.

Captulo 1. Algoritmia e Programao


Pseudo-cdigo - consiste na descrio do algoritmo numa linguagem parecida com a linguagem natural (portugus, ingls ou outra) de forma estruturada. O objectivo deste formalismo centrar a ateno do programador na lgica ou uxo do algoritmo, abstraindo-se das questes relacionadas com a sintaxe especca de uma determinada linguagem de programao; Fluxograma - consiste na descrio de um algoritmo de forma grca. Este formalismo inclui um conjunto de smbolos grcos que representao os diferentes tipos de instrues anteriormente descritas: sequncia, deciso e repetio.

1.1.3 Notao utilizada


Na representao de uxogramas ser utilizada a notao apresentada na gura 1.2:
Execuo de sub-rotina

Incio/Fim

Processamento

Entrada de dados

Deciso

Incio de sub-rotina

Sada de dados

Fim iterao (Ciclo)

Figura 1.2: Notao dos Fluxogramas Na escrita dos programas em pseudo-cdigo sero considerados as seguintes opes: Os algoritmos so delimitados pelas etiquetas incio e fim; As etiquetas Entrada: e Sada: so utilizadas na explicitao das entradas e sadas de dados, respectivamente, mais relevantes para o funcionamento do algoritmo; Os comentrios so precedidos do caracter # e so meramente documentais, como tal, no so executados; As aces so descritas atravs de verbos no innitivo; Foram utilizadas diferentes formataes para os conceitos a seguir explicitados, com o objectivo de tornar a leitura dos algoritmos mais simples: varivel;

ISEP/DEI - Jorge Santos


palavra chave; # comentrio;

1.1.4 Operadores utilizados nos algoritmos


Na escrita de algoritmos so utilizados os operadores relacionais, lgicos e aritmticos. Na tabela 1.1 so apresentados os operadores relacionais considerados e respectiva semntica. Na explicitao dos operadores considerem-se as variveis a e b apresentado os valores 13 e 5, respectivamente.

Tabela 1.1: Operadores relacionais Smbolo < > = = Nome menor que maior que maior ou igual que menor ou igual que igual a diferente de Exemplo a<b a>b ab ab a=b a=b Resultado falso verdadeiro verdadeiro falso falso verdadeiro

Na tabela 1.2 so apresentados os operadores aritmticos considerados e respectiva semntica. Na explicitao dos operadores considerem-se as variveis a e b apresentado os valores 13 e 5, respectivamente.

Tabela 1.2: Operadores aritmticos Smbolo + * / div % Nome soma subtraco multiplicao diviso diviso inteira resto da diviso inteira Exemplo a+b ab ab a/b a div b a%b Resultado 18 8 65 2.6 2 3

Na tabela 1.3 so apresentados os operadores lgicos considerados, a conjuno, disjuno e negao. Na avaliao das expresso lgicas utilizada a lgica Boole de acordo com as tabelas de verdade de cada operao, conjuno (tabela 1.4), disjuno (1.5) e negao (1.6).

Captulo 1. Algoritmia e Programao

Tabela 1.3: Operadores lgicos Smbolo e, ou , no, Nome conjuno disjuno negao

Tabela 1.4: Tabela de verdade - conjuno a falso falso verdadeiro verdadeiro b falso verdadeiro falso verdadeiro ab falso falso falso verdadeiro

Tabela 1.5: Tabela de verdade - disjuno a falso falso verdadeiro verdadeiro b falso verdadeiro falso verdadeiro ab falso verdadeiro verdadeiro verdadeiro

Tabela 1.6: Tabela de verdade - negao a falso verdadeiro

a verdadeiro falso

1.2 Instrues sequenciais


As instrues do tipo sequencial so as mais simples de todas apresentando uma uma estrutura atmica. So responsveis por permitirem fazer a entrada/sada de dados, execuo de clculos e atribuio de valores a variveis. A noo de ordem/sequncia representada atravs da seta de uxo (ver gura 1.3).

1.2.1 Sada de dados


As instrues de escrita permitem fazer a sada de dados (tipicamente para o cran) sejam estes variveis e/ou textos e/ou resultado de clculos. Na gura 1.4 apresentada sintaxe proposta para a escrita de uma ou vrias variveis. Conforme os exemplos seguintes:

ISEP/DEI - Jorge Santos

instruo1 instruo2 instruo3

inicio ... <instruo1>; <instruo2>; <instruo3>; ... fim

Figura 1.3: Fluxograma e sintaxe - Instrues sequenciais inicio ... escrever <lista-de-variaveis/textos>; ... fim

escrever

Figura 1.4: Fluxograma e sintaxe - Sada de dados

incio

# Escrever o contedo da varivel x;

escrever x;
# Escrever o contedo das variveis nome e idade;

escrever nome, idade;


# Escrever um texto seguido do valor da varivel x;

escrever "O valor de x :", x;


# Escrever o resultado da operao 4*4, 16;

escrever 4*4; # Escrever 4*4; escrever "4*4"; m

1.2.2 Entrada de dados


As instrues de leitura permitem fazer a entrada de dados, tipicamente a partir de um teclado, colocando-os em variveis. Na gura 1.5 apresentada a sintaxe proposta para a leitura de uma ou vrias variveis. No caso de se pretender ler mais do que uma varivel, os nomes das variveis separamse por vrgulas. Considerem-se os seguintes exemplos:

Captulo 1. Algoritmia e Programao


inicio ... ler <lista-de-variaveis>; ... fim

ler

Figura 1.5: Fluxograma e sintaxe - Entrada de dados

incio

# ler a varivel x;

ler x;
# ler as variveis nome e idade;

ler nome,idade; m

1.2.3 Atribuio
A instruo designada por atribuio permite atribuir o valor de uma expresso a uma varivel. A varivel que aparece no lado esquerdo da instruo vai assim receber o valor da expresso que aparece no lado direito da mesma instruo. Do lado direito da atribuio podemos ter: um nmero, um texto, o resultado de um clculo ou o contedo de uma outra qualquer varivel. Na gura 1.6 apresentada a sintaxe proposta para a atribuio.

var expr

inicio ... <varivel> <expresso>; ... fim

Figura 1.6: Fluxograma e sintaxe - Atribuio

Considerem-se os seguintes exemplos:

ISEP/DEI - Jorge Santos


incio

# Atribuir o valor 5 varivel x;

x 5;
# Atribuir o resultado da operao 5*5-2=23 varivel resultado;

resultado 5*5-2;
# Atribuir o valor da varivel n varivel maximo;

maximo n;
# Atribuir o texto "Ol Mundo" varivel txt;

txt "Ol mundo"; m No exemplo seguinte so realizados dois incrementos consecutivos da varivel contador. De incio atribudo o valor 1 a contador e posteriormente esta tomar o valor 2 e 3. incio
# Inicializao da varivel contador;

contador 1;
# Incremento da varivel contador;

contador contador+1;
# O resultado desta instruo 2;

escrever contador;
# Incremento da varivel contador;

contador contador+1;
# O resultado desta instruo 3;

escrever contador; m As linguagens de programao mais divulgadas utilizam o smbolo = para representar a atribuio. A razo de ser dessa opo de ordem prtica: resulta da inexistncia do smbolo nos teclados dos computadores. Note-se que caso fosse utilizado smbolo = o aspecto da instruo seria: contador=contador+1, o que constitui uma impossibilidade em termos estritamente matemticos. Chama-se a ateno para o facto de as linguagens estudadas normalmente pelos principiantes em informtica serem linguagens imperativas. Isto , o que o programador escreve no programa no so expresses matemticas mas ordens (da o imperativo) para o computador cumprir. O computador vai ver a atribuio no como uma igualdade matemtica (seja ela escrita com ou com = ), mas como uma ordem para primeiro calcular o valor da expresso direita e depois guardar esse valor na varivel indicada esquerda.

1.2.4 Exerccios Resolvidos


Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues sequenciais.

10

Captulo 1. Algoritmia e Programao


1.2.4.1 Cambiar moedas

O algoritmo 1.1 permite cambiar euros em dlares considerando a taxa de converso 1,17. Entrada: taxa, valorEuro Sada: valorDolar incio taxa 1,17; # Ler valor em euros; escrever "Introduza valor em euros="; ler valorEuro; # Calcular valor em dlar; valorDolar valorEuro*taxa; # Mostrar resultado; escrever "Valor em dolar=", valorDolar; m Algoritmo 1.1: Cambiar euro para dlar Sugesto: Escreva uma variao deste algoritmo que permita cmbios entre quaisquer moedas. 1.2.4.2 Distncia euclidiana entre dois pontos

O algoritmo 1.2 permite realizar o clculo da distncia euclidiana entre dois pontos, sendo que cada ponto denido pelas coordenadas (x,y). A distncia pode ser calculada de acordo com a frmula 1.2.1. distncia = Entrada: x1, y1, x2, y2 Sada: distancia incio

( x2 x1 )2 + ( y2 y1 )2

(1.2.1)

# Ler coordenadas do ponto 1;

escrever "Coordenadas ponto1 (x/y):"; ler x1,y1; # Ler coordenadas do ponto 2; escrever "Coordenadas ponto2 (x/y):"; ler x2,y2; # Calcular distncia; distancia (x2 x1)2 + (y2 y1)2 ; # Mostrar resultado; escrever "Distncia=", distancia; m Algoritmo 1.2: Calcular distncia euclidiana entre pontos

11

ISEP/DEI - Jorge Santos


1.2.4.3 Determinar permetro e rea de circunferncia

O algoritmo 1.3 permite determinar o permetro e rea de uma circunferncia, a partir do valor do raio. Entrada: raio Sada: perimetro, area incio pi 3,1415; # Ler o valor do raio; escrever "Introduza valor do raio:"; ler raio; # Calcular permetro e rea; area pi raio2 ; perimetro 2 pi raio; # Apresentar resultados; escrever "rea=", area; escrever "Permetro=", perimetro; m Algoritmo 1.3: Determinar permetro e rea de circunferncia

1.2.5 Exerccios Propostos


Nesta seco so propostos alguns problemas com vista aplicao conjugada de instrues sequenciais. 1.2.5.1 Calcular ndice de massa corprea (IMC)

O ndice de massa corprea (IMC) de um indivduo obtido dividindo-se o seu peso (em Kg) por sua altura (em m) ao quadrado. Assim, por exemplo, uma pessoa de 1,67m e pesando 55kg tem IMC igual a 20,14, j que: I MC = peso 55kg = 20, 14 = 2 1, 67m 1, 67m altura

Escreva um programa que solicite ao utilizador o fornecimento do seu peso em kg e de sua altura em m e a partir deles calcule o ndice de massa corprea do utilizador. 1.2.5.2 Converter horas, minutos e segundos

Descreva um algoritmo que a partir de um determinado nmero de segundos calcula o nmero de horas, minutos e segundos correspondentes. Conforme o seguinte exemplo: 8053s = 2h + 14m + 13s

12

Captulo 1. Algoritmia e Programao


1.2.5.3 Teorema de Pitgoras

Descreva um algoritmo para determinar a hipotenusa de um tringulo rectngulo, dados os catetos. 1.2.5.4 Converter temperaturas

Descreva um algoritmo que a partir de uma temperatura expressa em graus Fahrenheit (tempF), calcule a temperatura expressa em graus Celsius (tempC). A converso pode ser realizada de acordo com a frmula 1.2.2. tempF = 32 + 9 tempC 5 (1.2.2)

1.3 Instrues de Deciso


As instrues de deciso, ou seleco, permitem a seleco em alternncia de um ou outro conjunto de aces aps a avaliao lgica de uma condio.

1.3.1 Deciso binria


A deciso binria permite bifurcar a execuo de um algoritmo em dois uxos distintos, para tal utilizada instruo se. Esta instruo pode ser utilizada de duas formas: se-ento e se-ento-seno. Na gura 1.7 apresentada a sintaxe para o primeiro caso. se a condio for verdadeira executado o bloco-instrues caso contrrio nada acontece. inicio ... se <condio> ento <bloco-instrues> fim-se ... fim

se ento bloco de instrues

Figura 1.7: Fluxograma e sintaxe - Instruo deciso se-ento

Considere-se o seguinte exemplo utilizando a forma se-ento, no qual um aluno aprovado se tem nota maior ou igual a 9,5:

13

ISEP/DEI - Jorge Santos


Entrada: nota incio escrever "Introduza nota:"; ler nota; se nota 9,5 ento escrever "O aluno foi aprovado"; m-se m Note-se que um bloco de instrues delimitado pelas instrues ento e fim-se. No segundo caso (ver gura 1.8), em que a instruo tem a estrutura se-ento-seno, se a condio for verdadeira executado o bloco-instrues1 seno executado o bloco-instrues2. inicio ... se <condio> ento <bloco-instrues1> seno <bloco-instrues2> fim-se ... fim

se ento seno

bloco de instrues 1

bloco de instrues 2

Figura 1.8: Fluxograma e sintaxe - Instruo deciso se-ento-seno Considere-se o seguinte exemplo utilizando a forma se-ento-seno. Entrada: lado1, lado2 Sada: area incio

# Ler as medidas dos lados;

escrever "Introduza medidas dos lados:"; ler lado1, lado2; # Calcular rea; area lado1*lado2; se lado1 = lado2 ento escrever "rea do quadrado=", area; seno escrever "rea do rectngulo=", area; m-se m

14

Captulo 1. Algoritmia e Programao


Neste exemplo so lidas as medidas dos lados de uma gura rectangular, sendo que no caso particular de os dois lados serem iguais estamos na presena de um quadrado. Em qualquer um dos casos apresentada a mensagem correspondente.

1.3.2 Deciso mltipla

A instruo de de deciso mltipla um caso particular de instrues encadeadas do tipo se-ento-seno. Normalmente utilizada no teste de mltiplos valores de uma varivel. A sintaxe proposta para a deciso mltipla encontra-se descrita na gura 1.9.

seleccionar

caso 1
bloco de instrues 1

caso 2
bloco de instrues 2

caso 3
bloco de instrues 3

caso n
bloco de instrues n

...

inicio ... seleccionar <varivel> caso <valor1> <bloco-instrues1> caso <valor2> <bloco-instrues2> caso <valor3> <bloco-instrues3> ... seno <bloco-instruesN> fim-seleccionar ... fim

Figura 1.9: Fluxograma e sintaxe - Instruo deciso mltipla seleccione-caso

Considere uma mquina que permite apenas trs operaes, ligar, desligar e furar. O algoritmo 1.4 permite modelar o funcionamento da respectiva mquina. Sendo que aquando da digitao das letras: L, D e F, so apresentadas, respectivamente, as mensagens: Ligar, Desligar e Furar. No caso da letra digitada ser outra apresentada uma mensagem de erro.

15

ISEP/DEI - Jorge Santos


Entrada: letra incio # Ler letra; escrever "Introduza letra (L/D/F):"; ler letra;
# Testar casos e escrever mensagem respectiva;

seleccionar letra caso L escrever "Ligar"; caso D escrever "Desligar"; caso F escrever "Furar"; seno escrever "Operao invlida"; m-seleccionar m-seleccionar m Algoritmo 1.4: Mquina de furao - deciso mltipla Note-se que tal como acontece no caso da instruo se-ento a componente seno opcional. O algoritmo 1.5 tem um funcionamento idntico ao 1.4 mas implementado atravs da instruo se-ento-seno. Entrada: letra incio # Ler letra; escrever "Introduza letra (L/D/F):"; ler letra;
# Testar casos e escrever mensagem respectiva;

se letra=L ento escrever "Ligar"; seno se letra=D ento escrever "Desligar"; seno se letra=F ento escrever "Furar"; seno escrever "Operao invlida"; m-se m-se m-se m Algoritmo 1.5: Mquina de furao - deciso binria

16

Captulo 1. Algoritmia e Programao

1.3.3 Exerccios Resolvidos


Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues de deciso.

1.3.3.1

Distncia euclidiana entre dois pontos

O algoritmo 1.6 permite realizar o clculo da distncia euclidiana entre dois pontos, sendo que cada ponto denido pelas coordenadas (x,y). no clculo da distncia pode ser utilizada a frmula 1.3.1. distncia =

( x2 x1 )2 + ( y2 y1 )2

(1.3.1)

Caso os pontos sejam coincidentes mostra mensagem "Pontos Coincidentes". Entrada: x1, y1, x2, y2 Sada: distancia incio

# Ler coordenadas do ponto 1;

escrever "Coordenadas ponto1 (x/y):"; ler x1, y1; # Ler coordenadas do ponto 2; escrever "Coordenadas ponto2 (x/y):"; ler x2, y2; # Calcular distncia e mostrar resultado; distancia (x2 x1)2 + (y2 y1)2 ; se distancia=0 ento escrever "Os pontos so coincidentes"; seno escrever "Distncia=", distancia; m-se m Algoritmo 1.6: Calcular distncia euclidiana entre pontos

1.3.3.2

Classicar em funo da mdia

O algoritmo 1.7 permite ler as notas de um aluno s disciplinas de Matemtica, Portugus, Ingls e Geograa e calcular a mdia. Em funo da mdia mostra uma mensagem com o contedo "Aprovado" ou "Reprovado". Consideram-se notas positivas as notas iguais ou superiores a 9,5.

17

ISEP/DEI - Jorge Santos


Entrada: mat, por, ing, geo incio # Ler as notas do aluno; escrever "Introduza notas (mat, por, ing, geo):"; ler mat, por, ing, geo; # Calcular mdia; mat+por+ing+geo media ; 4 se media 9,5 ento escrever "Aprovado"; seno escrever "Reprovado"; m-se m Algoritmo 1.7: Classicar em funo da mdia

1.3.3.3

Determinar o mximo de 3 valores

Considere-se o problema de ler trs nmeros e calcular o maior deles. O uxograma 1.10 permite capturar com grande facilidade a noo de uxo e passos alternativos. Na resoluo do problema foi adoptada uma estratgia de isolamento dos vrios casos, primeiro testado o nmero A, depois o nmero B e caso nenhum dos dois seja o mximo, por excluso de partes, se conclu que o nmero C o maior de todos. Note-se que a utilizao de uxogramas est regra geral limitada representao de pequenos programas ou processos com elevado grau de abstraco porque caso contrrio o uxograma estender-se-ia por inmeras pginas tornando a sua interpretao muito difcil. No algoritmo 1.8 foi codicado em pseudo-cdigo a soluo anteriormente delineada no uxograma da gura 1.10.

18

Captulo 1. Algoritmia e Programao

Incio

Introduza trs nmeros

ler A,B,C

ento

A>B

seno

A>C ento ento

B>C seno

Maior A

Maior B

Maior C

escrever Maior

Fim

Figura 1.10: Fluxograma da determinao do mximo de 3 valores

Entrada: A, B, C Sada: maximo incio # Ler nmeros; escrever "Introduza nmero1, nmero2 e nmero3:"; ler A, B, C; se A B ento se A C ento maximo A; m-se seno se B C ento maximo B; seno maximo C; m-se m-se escrever "O nmero maior :", maximo; m Algoritmo 1.8: Calcular mximo de 3 nmeros 19

ISEP/DEI - Jorge Santos

O algoritmo 1.9 apresenta uma soluo alternativa para o mesmo problema. Entrada: num1, num2, num3 Sada: maximo incio # Ler nmeros; escrever "Introduza nmero1, nmero2 e nmero3:"; ler num1, num2, num3; # At prova em contrrio o primeiro dos nmeros o maior; maximo num1; se num2 maximo ento maximo num2; m-se se num3 maximo ento maximo num3; m-se escrever "O nmero maior :", maximo; m Algoritmo 1.9: Calcular mximo de 3 nmeros Sugesto: Baseando-se nas solues propostas escreva um algoritmo que permita a determinao do mximo entre 5 nmeros. Qual a soluo mais elegante?

1.3.3.4

Determinar tringulo vlido

O algoritmo 1.10 permite ler trs pontos geomtricos e determinar se estes formam um tringulo. Pode ser utilizada a frmula da distncia entre dois pontos para calcular as medidas dos lados do tringulo. Note-se que um tringulo s vlido se a medida de cada um dos seus lados menor que a soma dos lados restantes.

20

Captulo 1. Algoritmia e Programao


Entrada: x1, y1, x2, y2, x3, y3 incio # Ler coordenadas do ponto 1; escrever "Coordenadas ponto1 (x/y):"; ler x1, y1; # Ler coordenadas do ponto 2; escrever "Coordenadas ponto2 (x/y):"; ler x2, y2; # Ler coordenadas do ponto 3; escrever "Coordenadas ponto3 (x/y):"; ler x3, y3; # Calcular a medida dos lados; a (x2 x1)2 + (y2 y1)2 ; b (x3 x2)2 + (y3 y2)2 ; c (x1 x3)2 + (y1 y3)2 ; # Validar tringulo de acordo com a frmula; se (a < b+c) e (b < a+c) e (c < a+b) ento # Tringulo vlido; escrever "Os trs pontos formam um tringulo"; seno

# Pelo menos 2 pontos so coincidentes ou os 3 so colineares;

escrever "Os pontos no formam um tringulo"; m-se m Algoritmo 1.10: Validar tringulo

1.3.4 Exerccios Propostos


Nesta seco so propostos alguns problemas com vista aplicao de instrues de deciso. 1.3.4.1 Classicar tringulo

Classicar um tringulo quanto aos lados, sendo que um tringulo com todos lados iguais designado Equiltero, com todos os lados diferentes entre si designado Escaleno e caso tenha apenas dois lados iguais entre si, designa-se Issceles. 1.3.4.2 Diviso

Descreva um algoritmo que dados dois valores, divide o primeiro pelo segundo. Note que no possvel fazer a diviso por zero, neste caso deve ser apresentada a mensagem adequada.

21

ISEP/DEI - Jorge Santos


1.3.4.3 Resolver equao da forma ax2 + bx + c = 0

Calcular as razes de uma equao na forma ax2 + bx + c = 0. Note que os valores a, b e c podem ser zero, podendo dar origem a equaes sem soluo ou equaes de primeiro grau. Considere as frmulas 1.3.2 e 1.3.3 na resoluo do problema. binmio = b2 4ac b binmio x = 2a 1.3.4.4 Converter entre escalas de temperaturas (1.3.2) (1.3.3)

Escrever um programa que faa converses entre as trs escalas de temperaturas, Kelvin, Celsius e Fahrenheit, com base em trs valores de entrada: a temperatura e escala actual e escala pretendida. Conforme o seguinte exemplo: As entradas 38, C e K, signicam que o utilizador pretende converter a temperatura 38 Celsius para Kelvin. Considere as frmulas 1.3.4 e 1.3.5 na resoluo do programa. 9 tempC 5 tempC = tempK + 273 tempF = 32 +

(1.3.4) (1.3.5)

Sugesto: Tentar a resoluo com as estruturas se-ento-seno e alternativamente utilizar a estrutura de mltipla deciso. 1.3.4.5 Calcular ndice de massa corprea (IMC)

O ndice de massa corprea (IMC) de um indivduo obtido dividindo-se o seu peso (em Kg) por sua altura (em m) ao quadrado. Assim, por exemplo, uma pessoa de 1,67 m e pesando 55 Kg tem IMC igual a 20,14, j que: I MC = peso 55kg = 20, 14 = 1, 67m 1, 67m altura2 Interpretao Abaixo do peso normal Peso normal Acima do peso normal Obesidade

IMC At 18,5 (inclusive) De 18,5 a 25 (inclusive) De 25 a 30 (inclusive) Acima de 30

Tabela 1.7: ndice de massa corprea

22

Captulo 1. Algoritmia e Programao


Considerando a tabela 1.7, escreva um programa que leia o peso em kg e a altura em m de uma determinada pessoa de forma a calcular o ndice de massa corprea do mesmo e de seguida, estabelea as comparaes necessrias entre o IMC calculado e os valores da tabela 1.7 e escreva uma das frases, conforme for o caso: Voc est abaixo do peso normal. O seu peso est na faixa de normalidade. Voc est acima do peso normal. Voc precisa de perder algum peso. 1.3.4.6 Determinar ano bissexto

Um ano bissexto se divisvel por 4, excepto se, alm de ser divisvel por 4, for tambm divisvel por 100. Ento ele s bissexto se tambm for divisvel por 400. Escrever um algoritmo que leia o valor de um ano e escreva se o ano ou no bissexto. 1.3.4.7 Parque de estacionamento

Considere um parque de estacionamento que pratica os preos seguintes: 1a hora: 2 e 2a hora: 1,5 e a partir da 2a hora: 1 e/hora O tempo de permanncia no parque contabilizado em horas e minutos. Por exemplo, se uma viatura permanecer 2 horas e 30 minutos no parque, pagar 2 e (1a hora) + 1,5 e (2a hora) + 0,5 e (30 minutos a 1 e/hora) = 4 e. Elabore um algoritmo que, lido o tempo que determinada viatura permaneceu estacionada no parque, diga a quantia que deve ser paga.

1.4 Instrues de Repetio (Ciclos)


As instrues de repetio, ou ciclos, permitem a execuo de forma repetitiva de um conjunto de instrues. Esta execuo depende do valor lgico de uma condio que testada em cada iterao para decidir se a execuo do ciclo continua ou termina. Note-se que as diferentes instrues de ciclos a seguir apresentadas consistem em variaes da mesma estrutura.

23

ISEP/DEI - Jorge Santos

1.4.1 Ciclo condicional: repetir-at


O ciclo repetir-at executa um bloco de instrues at que uma determinada condio lgica seja verdadeira. Este ciclo testa a condio lgica aps a primeira iterao, ou seja, o teste realizado sada. Este ciclo deve ser utilizado sempre que se desejar que o cdigo seja executado pelo menos uma vez. Na gura 1.11 apresentada a sintaxe proposta para o ciclo repetir-at.

repita

bloco de instrues

falso

at condio

inicio ... repetir <bloco-instrues> at <condio>; ... fim

verdade

Figura 1.11: Fluxograma e sintaxe - Instruo ciclo repetir-at

Considere-se o seguinte exemplo em que a utilizao da estrutura repetir-at permite garantir que o valor da nota introduzida est situado entre 0 e 20. Entrada: nota incio repetir escrever "Introduzir nota entre 0-20:"; ler nota; at nota 0 e nota 20; m

1.4.2 Ciclo condicional: enquanto-fazer


O ciclo enquanto executa um bloco de instrues enquanto uma determinada condio lgica for verdadeira. Este ciclo testa a condio lgica entrada. Na gura 1.12 apresentada a sintaxe proposta para o ciclo enquanto-fazer. Considere-se o seguinte exemplo em que a utilizao da estrutura enquanto-fazer permite calcular e escrever a tabuada de um nmero.

24

Captulo 1. Algoritmia e Programao

enquanto condio

verdade bloco de instrues falso fim enquanto

inicio ... enquanto <condio> fazer <bloco-instrues> fim-enquanto ... fim

Figura 1.12: Fluxograma e sintaxe - Instruo ciclo enquanto-fazer

Entrada: numero incio


# Ler o nmero para o qual ser apresentada a tabuada

escrever "Introduza nmero:"; ler numero; i 1; enquanto i 10 fazer resultado numero*i; escrever numero, "*", i, "=", resultado;
# Incrementar a varivel i

i i+1; m-enquanto m

1.4.3 Ciclo determinstico: para-fazer


O ciclo para-fazer executa um bloco de instrues com um nmero pr-determinado de vezes. Na gura 1.13 apresentada a sintaxe proposta para o ciclo para-fazer. O bloco-incio - um conjunto de instrues que so executadas priori; A condio uma expresso lgica testada em cada iterao do ciclo, sendo necessrio que o seu valor lgico seja verdade para que o ciclo continue em execuo; O bloco-iter composto por um conjunto de instrues que so executadas em cada iterao.

25

ISEP/DEI - Jorge Santos

condio

faa itera n vezes bloco de instrues

fim para-faa

inicio ... para <bloco-incio>;<condio>;<bloco-iter> fazer <bloco-instrues> fim-para ... fim

Figura 1.13: Fluxograma e sintaxe - Instruo ciclo para-fazer

Considere-se o seguinte exemplo em que a utilizao da estrutura para-fazer permite calcular a soma os 100 primeiros nmeros inteiros. Sada: soma incio soma 0; para i 1; i<100; i i+1 fazer soma soma + i; m-para escrever soma; m Neste exemplo introduzido um conceito importante para a programao, o conceito de acumulador. A varivel soma em cada iterao adicionada do valor da varivel i, permitindo que no nal:

soma = 1 + 2 + 3 + 4 + 5 + + 100 = 5050

Por outro lado, a instruo i i+1 faz com que a varivel i tome todos os valores inteiros de 1 a 100. Considere-se a resoluo do problema de calcular a soma os 100 primeiros nmeros inteiros utilizando para tal a o ciclo enquanto-fazer.

26

Captulo 1. Algoritmia e Programao


Sada: soma incio soma 0;
# A iniciao da varivel de iterao tem de ser realizada antes do incio do ciclo

i 1; enquanto i 100 fazer soma soma + i;


# Incremento da varivel de iterao

i i+1; m-enquanto escrever soma; m

1.4.4 Exerccios Resolvidos

Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues cclicas. Nas solues so exploradas situaes com utilizao simples dos ciclos e/ou imbricados.

1.4.4.1

Calcular somatrio entre dois limites

O algoritmo 1.11 permite calcular a somatrio dos nmeros existentes num intervalo denido por limites inferior e superior. Note que o utilizador pode introduzir os limites na ordem que entender, desta forma os intervalos [5-10] e [10-5] so igualmente vlidos.

27

ISEP/DEI - Jorge Santos


Entrada: limite1, limite2 Sada: soma incio # Ler intervalo; escrever "Introduza nmero1:"; ler limite1; escrever "Introduza nmero2:"; ler limite2;
# Determinar o limite inferior e superior;

se limite1>limite2 ento maximo limite1; minimo limite2; seno maximo limite2; minimo limite1; m-se
# Calcular soma propriamente dita;

soma 0; para i minimo; imaximo; i i+1 fazer soma soma + i; m-para # Mostrar resultado; escrever soma; m Algoritmo 1.11: Calcular somatrio entre dois limites

1.4.4.2

Calcular factorial de um nmero

O algoritmo 1.12 permite calcular o factorial de um nmero sabendo que:

factorial(n) =

n=0 1 n 1 n factorial(n 1)

Exemplo: factorial(5)=5*4*3*2*1=120

28

Captulo 1. Algoritmia e Programao


Entrada: numero Sada: factorial incio

# Ler o nmero para o qual se pretende calcular o factorial;

escrever "Introduza nmero:"; ler numero; # Efectuar o clculo; factorial 1; para i 1; inumero; i i+1 fazer factorial factorial * i; m-para # Apresentar resultado; escrever factorial; m Algoritmo 1.12: Calcular factorial de um nmero 1.4.4.3 Determinar se um nmero primo

Um nmero primo se for apenas divisvel por si prprio e pela unidade, por exemplo: 11 nmero primo (visto que apenas divisvel por 11 e por 1), enquanto que 21 no primo, pois tem os seguintes divisores: 1,3,7 e 21. Entrada: numero incio escrever "Introduza nmero:"; ler numero;
# A varivel ndiv ser utilizada na contagem do nmero de divisores de um nmero;

ndiv 0; para i 2; i<numero; i i+1 fazer se numero%i=0 ento ndiv ndiv+1; m-se m-para

# Determinar se i divisor do nmero;

# Testar se existem divisores diferentes de 1 e do prprio nmero;

se ndiv>0 ento escrever "O nmero ", numero, "no primo"; seno escrever "O nmero ", numero, " primo"; m-se m Algoritmo 1.13: Determinar se um nmero primo O algoritmo 1.13 permite determinar se um nmero primo atravs da contagem de divisores diferentes da unidade e do prprio nmero. Esta soluo necessita de

29

ISEP/DEI - Jorge Santos


testar todos os nmeros, sendo obviamente pouco eciente no se recomenda a sua utilizao na prtica. Por sua vez, o algoritmo 1.14 permite determinar se um nmero primo de uma forma muito mais eciente, visto que termina o processo assim que encontra um divisor diferente da unidade e do prprio nmero. Por outro lado termina assim que o divisor atinge metade do valor do nmero, isto porque no possvel encontrar divisores inteiros entre metade do nmero e o prprio nmero. Entrada: numero incio escrever "Introduza nmero:"; ler numero;
# At prova em contrrio um nmero primo. Quando encontrado um divisor deixa de o ser;

primo verdadeiro; i 2; enquanto primo=verdadeiro e inumero/2 fazer # Determinar se i divisor do nmero; se numero%i=0 ento primo falso; m-se i i+1; m-enquanto # Testar se foi um encontrado algum divisor; se primo=falso ento escrever "O nmero ", numero, "no primo"; seno escrever "O nmero ", numero, " primo"; m-se m Algoritmo 1.14: Determinar se um nmero primo

1.4.4.4

Determinar nome e idade da pessoa mais nova de um grupo

O algoritmo 1.15 permite ler o nome e a idade de uma srie de pessoas. Este programa deve terminar quando for introduzido o nome da pessoa = "STOP". No nal deve ser mostrado o nome e idade da pessoa mais nova. Neste programa utilizada uma varivel com a funo de servir de sentinela, a varivel primeiro pode assumir os valores verdadeiro ou falso em funo das necessidades. Uma sentinela regra geral uma varivel do tipo booleano (i.e., pode apresentar os valores verdadeiro ou falso) e utilizada com o to de controlar a execuo de uma determinada seco do programa, este conceito muito til em programao.

30

Captulo 1. Algoritmia e Programao


Sada: nomeMin, idadeMin incio
# Esta sentinela permite controlar o primeiro elemento a ser lido de forma a iniciar a varivel idadeMin;

primeiro verdadeiro; repetir escrever "Introduza nome:"; ler nome; se nome = "STOP" ento escrever "Introduza idade:"; ler idade; se primeiro = verdadeiro ento idadeMin idade;
# Aps a primeira leitura a sentinela alterada para falso primeiro falso;

seno
# Se a idade acabada de ler for menor que o mnimo existente ento actualiza o mnimo e guarda o nome da pessoa;

se idade < idadeMin ento idadeMin idade; nomeMin nome; m-se m-se m-se at nome="STOP"; escrever "Nome e idade da pessoa mais nova:", nomeMin, idadeMin; m Algoritmo 1.15: Determinar nome/idade da pessoa mais nova

1.4.4.5

Determinar o aluno melhor classicado e a mdia das notas de uma turma

O algoritmo 1.16 permite ler as notas de portugus obtidas pelos elementos de uma turma. Este programa termina quando for introduzido o nome do aluno "STOP". No nal deve ser mostrado o nome do aluno melhor classicado e a mdia de notas de turma. Neste programa so utilizados ciclos encadeados. Note-se que este algoritmo l pelo menos um nome, nem que o primeiro nome seja "STOP"graas utilizao do ciclo repetir-at. No caso de o nome introduzo ser vlido (i.e., diferente de "STOP") ento so lidas notas do aluno.

31

ISEP/DEI - Jorge Santos


Sada: nomeMax, notaMax, media incio soma 0; nAlunos 0; repetir escrever "Introduza nome:"; ler nome; se nome = "STOP" ento repetir escrever "Introduza nota de portugus do aluno", nome; at nota0 e nota100; soma soma+nota; nAlunos nAlunos+1; se nota > notaMax ento notaMax nota; nomeMax nome; m-se m-se at nome="STOP"; se nAlunos > 0 ento # Calcular mdia; media soma/nAlunos; escrever "Nome do aluno melhor classicado:", nomeMax; escrever "Mdia obtida pela turma:", media; seno # No pode calcular mdia; escrever "No foram inseridos dados."; m-se m Algoritmo 1.16: Determinar o aluno melhor classicado e a mdia das notas de uma turma Sugesto: Resolver o ltimo exerccio utilizando ciclos do tipo enquanto-fazer.

1.4.5 Exerccios Propostos


Nesta seco so propostos alguns problemas com vista aplicao dos diferentes tipos de instrues anteriormente introduzidas com particular nfase na instrues cclicas. 1.4.5.1 Diviso atravs de subtraces sucessivas

O resultado da diviso inteira de um nmero inteiro por outro nmero inteiro pode sempre ser obtido utilizando-se apenas o operador de subtraco. Assim, se quisermos calcular 7/2, basta subtrair o dividendo (2) ao divisor (7), sucessivamente, at

32

Captulo 1. Algoritmia e Programao


que o resultado seja menor do que o dividendo. O nmero de subtraces realizadas corresponde ao quociente inteiro, conforme o exemplo seguinte: 72 = 5 52 = 3 32 = 1 Descrever um algoritmo para o clculo da diviso de um inteiro pelo outro. Note que se o dividendo for zero, esta uma operao matematicamente indenida. 1.4.5.2 Determinar o mximo e mnimo de uma srie

Ler 100 valores e determinar os valores mximo e mnimo da srie. 1.4.5.3 Determinar quantidade de nmeros primos

Determinar quantos so os nmeros primos existentes entre os valores 1 e 1000 (excluindo os limites do intervalo). 1.4.5.4 Determinar se um nmero perfeito

Um nmero n perfeito se a soma dos divisores inteiros de n (excepto o prprio n) igual ao valor de n. Por exemplo, o nmero 28 tem os seguintes divisores: 1, 2, 4, 7, 14, cuja soma exactamente 28. (Os seguintes nmeros so perfeitos: 6, 28, 496, 8128.) Escreva um algoritmo que verique se um nmero perfeito. 1.4.5.5 Calcular potncia por multiplicaes sucessivas

Escrever um programa que permita calcular uma potncia do tipo baseexpoente atravs de multiplicaes sucessivas. Por exemplo: 24 = 2 2 2 2. Considere as diferentes situaes relacionadas com os valores da base e/ou expoente iguais a zero. 1.4.5.6 Maior nmero mpar de uma sequncia de valores

Descreva um algoritmo que l uma sequncia de nmeros inteiros terminada pelo nmero zero e calcule o maior mpar e a sua posio na sequncia de valores. 1.4.5.7 Algarismos de um nmero

Escreva um programa para extrair os algarismos que compem um nmero e os visualize individualmente.

33

ISEP/DEI - Jorge Santos


1.4.5.8 Apresentao grca de temperaturas

Escreva um algoritmo que l a temperatura de N cidades portuguesas e que represente a temperatura de cada uma delas com uma barra de asteriscos (*), em que cada asterisco representa um intervalo de 2 C. De acordo com os exemplos seguintes: Porto 11 ***** Lisboa 16 ******** Faro 20 ********** Chaves 8 ****

1.4.5.9

Soma dos algarismo de um nmero

Escreva um programa que calcule a soma dos algarismos que compem um nmero. Por exemplo: 7258 = 7+2+5+8 = 22 1.4.5.10 Jogo de adivinhar o nmero

Escrever um programa para o o jogo de adivinhar um nmero. Este jogo consiste no seguinte: o programa sorteia um nmero e o jogador deve tentar adivinhar o nmero sorteado. Para isso o programa deve indicar se o palpite do jogador foi maior, menor ou se acertou no nmero sorteado. Caso o jogador acerte deve visualizado no cran o nmero de tentativas utilizadas. 1.4.5.11 Capicua de um nmero

Escreva um programa que leia um nmero inteiro positivo e verique se se trata de uma capicua, isto , uma sequncia de dgitos cuja leitura a mesma nos dois sentidos (exemplo:32523). Sugesto: Inverter a ordem dos dgitos e vericar se o nmero obtido coincide com o original. Por exemplo, 327 invertido ((7*10)+2)*10+3=723. 1.4.5.12 Converso de base numrica

Elaborar um programa para converter um nmero escrito em binrio para o correspondente na base decimal. A converso faz-se de acordo com o exemplo seguinte: 10110011(2) =

= 1 27 + 0 26 + 1 25 + 1 24 + 0 23 + 0 22 + 1 21 + 1 20 = 128 + 0 + 32 + 0 + 16 + 0 + 0 + 2 + 1 = 179(10)
Note que os expoentes das potncias na frmula de converso correspondem, respectivamente, posio ocupada por cada algarismo no nmero em binrio. Sendo que o algarismo mais direita corresponde posio zero.

34

Captulo 1. Algoritmia e Programao

1.5 Traagens e Teste


A traagem consiste em testar um algoritmo para um conjunto de valores de entrada, observando o comportamento interno do algoritmo para esses valores e ao longo dos vrios passos que compem o algoritmo. Assim, a primeira fase consiste em numerar/etiquetar os passos do algoritmo. De seguida necessrio construir uma tabela colocando na primeira linha as entidades que queremos estudar ao longo dos passos do algoritmo, a saber, variveis e condies, pois so as nicas entidades cujo valor pode variar. A ltima fase consiste em executar o algoritmo passo-a-passo. Considere-se o problema de calcular o quociente e resto da diviso inteira. O clculo destes calores pode ser realizado com sucesso atravs da aplicao sucessiva de subtraces, de acordo com o exemplicado na gura 1.14.
Dividendo Resto Divisor Quociente

33 7 5 4 12 - 7 5

33 - 7 26

26 - 7 19

19 - 7 12

Figura 1.14: Diviso inteira atravs de subtraces sucessivas Note-se que o quociente corresponde ao nmero de vezes para o qual possvel subtrair o divisor ao dividendo, no exemplo possvel subtrair 4 vezes o nmero 7 do 33, sendo que 5 ser o resto inteiro. Entrada: dividendo, divisor incio # Ler dividendo e divisor; P1 escrever "Introduza o dividendo e divisor"; P2 ler dividendo,divisor; P3 quociente 0; # Subtrair sucessivamente o divisor ao dividendo; P4 enquanto dividendo divisor fazer P5 dividendo dividendo - divisor; P6 quociente quociente+1; m-enquanto P7 resto dividendo; m Algoritmo 1.17: Diviso inteira atravs de subtraces sucessivas (numerado) Na tabela 1.8 so representados os passos nos quais as condies e/ou variveis

35

ISEP/DEI - Jorge Santos


podem mudar de valor (de P2 a P7 ) e possvel perceber as (quatro) iteraes realizadas dentro do ciclo enquanto-fazer, sendo que em cada iterao do ciclo so executadas os passos: P4 , P5 e P6 .
Passos P2 P3 P4 P5 P6 P4 P5 P6 P4 P5 P6 P4 P5 P6 P4 P7 dividendo 33 33 33 26 26 26 19 19 19 12 12 12 5 5 5 5 divisor 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 quociente 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 resto dividendo divisor

verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade falso 5

Tabela 1.8: Traagem do algoritmo 1.14

1.6 Programao modular


De acordo com o paradigma da programao estruturada, a escrita de algoritmos (e programas) deve ser baseada no desenho modular dos mesmos passando-se depois a um renamento gradual do topo para a base. A modularidade permite entre outros aspectos: Criar diferentes camadas de abstraco do programa codicado e que por sua vez facilitar a resoluo de problemas complexos, leitura e manuteno do cdigo mais simples; Reduzir os custos ao desenvolvimento de software e correco de erros; Reduzir o nmero de erros emergentes durante a codicao; Re-utilizao de cdigo de forma mais simples; A noo de modularidade crucial para a programao. A modularidade pode ser conseguida, por exemplo, atravs do recurso utilizao de sub-rotinas. A utilizao

36

Captulo 1. Algoritmia e Programao


de sub-rotinas permite modularizar os programas e encapsular processamento o que resulta em programas mais simples de desenvolver e ler. Quanto mais independentes os mdulos (sub-rotinas) mais atentamente o programador se pode concentrar sobre cada uma ignorando os restantes. Com a chamada de uma sub-rotina num qualquer ponto de um programa transferido o controlo para essa sub-rotina. isto , passam a ser executadas do incio ao m as instrues presentes nessa sub-rotina, retornado-se depois ao programa principal, exactamente instruo seguinte da chamada da sub-rotina.

1.6.1 Sub-rotinas, parmetros e variveis locais


Na programao estruturada so normalmente referidos dois tipos de sub-rotinas: as funes e os procedimentos. A diferena entre funes e procedimentos consiste no facto de as primeiras retornarem um valor, e os segundos no. No contexto da programao uma funo tem um funcionamento similar a funo matemtica, isto , funciona como uma caixa preta que recebe valores (designada por parmetros) e devolve um resultado. Por exemplo a funo potencia (ver frmula 1.6.1) recebe a base e expoente, e devolve o resultado. Note-se que a lista de parmetros passados para uma funo pode ser vazia. resultado = potencia(base, expoente) (1.6.1)

As variveis denidas no mbito das sub-rotinas so criadas no momento em que se inicia a execuo da sub-rotina e destrudas no momento em que a sub-rotina termina a sua execuo, isto , so variveis locais (dentro do contexto da sub-rotina) por oposio s variveis do programa que se designam por variveis globais. Este conceito muito importante e implica que: a forma correcta de se passar valores para dentro de uma sub-rotina atravs dos parmetros (e no recorrendo a uma varivel com o mesmo nome fora e dentro da sub-rotina); a forma correcta de se obter valores de uma sub-rotina recorrer a uma funo (e no a um procedimento) que tem a possibilidade de devolver valores. 1.6.1.1 Funes

A sintaxe e o uxograma propostos para a denio de uma funo so apresentados na gura 1.15. A funo identicada por um nome (nomeFuncao ), sendo a listaParmetros constituda por zero ou mais variveis passadas funo. A expresso representa o valor a retornar pela funo.

37

ISEP/DEI - Jorge Santos


Funo nomeFuncao(listaParametros) inicio ... nome <expresso> ... fim-funo

Execuo funo

Figura 1.15: Fluxograma e sintaxe - Funo

Considere-se no seguinte exemplo a denio e utilizao da funo potencia1 na construo de um programa modular. Funo potencia(base,expoente) incio # A varivel resultado local; resultado 1;
# Calcular a potncia atravs de multiplicaes sucessivas;

para i 1; i expoente; i i+1 fazer resultado resultado*base; m-para


# O valor calculado retornado atravs do nome da funo;

potencia resultado; m-funo A potencia utilizada no programa seguinte: incio


# Ler base e expoente;

escrever "Introduza base="; ler base; escrever "Introduza expoente="; ler expoente; # Apresentar resultado; escrever base," ",expoente,"=",potencia(base,expoente); m Executando o programa por exemplo para os valor 3 e 2, seria visualizado num monitor o seguinte texto: Introduza base=3 Introduza expoente=2 3^2=8
uma questo de simplicidade so considerados apenas expoentes inteiros e positivos no clculo da potncia.
1 Por

38

Captulo 1. Algoritmia e Programao


1.6.1.2 Procedimentos

A sintaxe e o uxograma propostos para a denio de um procedimento so apresentados na gura 1.16:

Execuo procedimento

Procedimento nomeProcedimento(listaParametros) ... blocos-de-instrues ... Fim-procedimento

Figura 1.16: Fluxograma e sintaxe - Procedimento

Considere-se no seguinte exemplo a denio e utilizao do procedimento prtNumeroInvertido que permite imprimir um nmero inteiro invertido. Comentrio: Explicar a razo de subtrair algarismo!! Procedimento prtNumeroInvertido(numero) incio enquanto numero>0 fazer algarismo numero % 10; escrever algarismo;
# Truncar o algarismo direita;

# O algarismo mais direita do nmero calculado atravs; # da diviso inteira do nmero por 10;

numero (numero-algarismo)/10; m-enquanto m-procedimento

1.6.2 Exerccios resolvidos


Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de procedimentos e funes na produo de programas modulares.

1.6.2.1

Funo que devolve o maior algarismo de um nmero

Considere uma funo que receba um nmero inteiro e devolva o maior algarismo contido nesse nmero.

39

ISEP/DEI - Jorge Santos


Funo maior(N) incio

# max vai conter o maior algarismo; # alg vai conter os algarismos do nmero, partindo das; # unidades para as dezenas, centenas, etc;

max N%10; enquanto N =0 fazer alg N%10; N (N - alg)/10; se alg>max ento max alg; m-se m-enquanto maior max; m-funo Funo maior(n) que devolve o maior algarismo de um nmero

1.6.2.2

Funo que indica se um nmero perfeito

Um nmero n perfeito se a soma dos divisores inteiros de n (excepto o prprio n) igual ao valor de n. Por exemplo, o nmero 28 tem os seguintes divisores: 1, 2, 4, 7, 14, cuja soma exactamente 28. (Os seguintes nmeros so perfeitos: 6, 28, 496, 8128.). Consider a funo que recebe um nmero inteiro e devolve os valores booleanos verdadeiro ou falso se o nmero ou no perfeito, respectivamente. Funo perfeito(N) incio soma 0; para x 1; x(N/2); x x+1 fazer se (N%x)=0 ento soma soma+x; m-se m-para se soma=N ento perfeito verdadeiro; seno perfeito falso; m-se m-funo Funo perfeito(N) que indica se um nmero perfeito

40

Captulo 1. Algoritmia e Programao

1.6.3 Exerccios propostos


Nesta seco so propostos alguns problemas relacionados com a utilizao de procedimentos e funes na escritas de programas modulares. 1.6.3.1 Funo mdia de dois nmeros

Escreva uma funo que, dados dois nmeros reais, retorna a mdia deles arredondada para um inteiro, e devolve os nmeros por ordem crescente. Faa um programa que permita testar a funo anterior. 1.6.3.2 Funo lei de Ohm

A lei de Ohm uma relao entre a corrente (I), a tenso (V) e a resistncia (R), de acordo com o circuito elctrico representado na gura 1.17.
I

Lei de Ohm:
V R

I = V/R

Figura 1.17: Ilustrao da lei de Ohm

a) Escreva uma funo que recebe os valores de V e R como parmetros, e calcule a corrente I . b) Escreva um programa que permita testar a funo anterior. 1.6.3.3 Funo somatrio
n

Calcular o somatrio

2i i i =1 Sugesto: crie uma funo para determinar cada termo i da srie. Funes para codicar e descodicar nmeros

1.6.3.4

Uma empresa pretende enviar cifrada uma sequncia de inteiros decimais de 4 dgitos (DigDigDigDig). A cifra consiste em: substituir cada dgito Dig por (Dig+8)%10 (i.e., adiciona 8 e calcula o resto da diviso do resultado por 10); depois troca o terceiro dgito com o primeiro e troca o quarto dgito com o segundo.

41

ISEP/DEI - Jorge Santos


a) Escreva uma funo que receba um inteiro decimal de 4 dgitos e o devolva cifrado. b) Escreva uma funo que receba um inteiro cifrado e o decifre para o valor original. c) Escreva uma funo que apresente um menu com 2 opes, cifrar e decifrar nmero, pea ao utilizador para escolher uma das opes, e retorne a opo escolhida. d) Faa um programa que permita testar as funes anteriores. 1.6.3.5 Nmeros primos

Escreva um procedimento que imprima os nmeros primos existentes entre dois nmeros. Na resoluo deste problema deve ser utilizada uma funo que determina se um nmero primo.

1.7 Recursividade
Recursividade uma caracterstica comum a todas denies que necessitam de recorrer a si prprias para se denirem. A recursividade largamente utilizada na matemtica e nas cincias de computao. No contexto da computao a recursividade muito utilizada na resoluo de uma gama variada de problemas e muito particularmente na manipulao de estruturas de dados recursivas (e.g., e listas, rvores e grafos). Considerem-se o exemplo da funo factorial denido atravs da formula 1.7.1. Normalmente uma denio recursiva compreende casos particulares e casos gerais, neste caso, n = 1 o caso particular e n > 1 o caso geral. Note-se que no caso geral, a denio da funo factorial conseguida atravs da prpria funo factorial. factorial(n) = n=0 1 n > 1 factorial(n 1) n (1.7.1)

No dia-a-dia tambm se encontram inmeras denies recursivas, por exemplo, o caso dos ascendentes familiares. Caso particular os ascendentes de determinada pessoa so os seus pais; Caso geral os ascendentes de uma pessoa so os ascendentes dos seus ascendentes;

1.7.1 Exerccios Resolvidos


Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de algoritmos recursivos.

42

Captulo 1. Algoritmia e Programao

1.7.2 Exerccios Propostos


Nesta seco so propostos alguns problemas com vista a ilustrar a utilizao de algoritmos recursivos.

43

ISEP/DEI - Jorge Santos

44

Captulo 2 Estruturas de dados


2.1 Vectores
No contexto da programao de computadores, um vector, uma das estruturas de dados mais simples. Um vector conjunto de dados consecutivos, usualmente do mesmo tamanho e tipo. Cada um dos elementos do vector acedido atravs do ndice (nmero inteiro) que dene a posio na qual o elemento est guardado. Considere que se pretende desenvolver um programa que dadas as notas de 4000 alunos, calcule o desvio de cada uma relativamente mdia das notas. Para o clculo dos desvios necessrio o clculo prvio da mdia, o que implica manter as notas aps o clculo da mdia, ou seja, guardar as notas em variveis. O problema pode ser decomposto em sub-problemas, como se segue:

Calcular a mdia;

Guardar as notas (para clculos posteriores);

Calcular o desvio de cada nota.

Uma soluo para guardar cada uma das notas (desaconselhvel!!), seria denir 4000 variveis, por exemplo: nota1, nota2, nota3, nota4, nota5, nota6, . . . , nota4000 Assim, as instrues para a leitura das notas seriam repetir 4000 vezes algo de semelhante a:

45

ISEP/DEI - Jorge Santos


incio enquanto numero>0 fazer escrever "Introduza a mdia do aluno nmero 1:"; ler nota1; escrever "Introduza a mdia do aluno nmero 2:"; ler nota2; ... escrever "Introduza a mdia do aluno nmero 4000:"; ler nota4000; m-enquanto m o que naturalmente se revela completamente impraticvel. A generalidade das linguagens de programao fornece este tipo de dados, chamado vector (ou array) que permite ultrapassar esta limitao. A soluo consiste em denir um vector cujo tamanho corresponde ao nmero de elementos desejados e uma varivel inteira para aceder a cada ndice do referido vector. Deste modo, para a leitura das 4000 notas poder-se-ia utilizar um ciclo, como a seguir se ilustra: incio para num 1; num<4000; num num+1 fazer escrever "Introduza a nota do aluno nmero",num; ler nota(num); m-para m Um vector pode ento ser denido como um conjunto de tamanho xo de elementos do mesmo tipo ocupando posies contguas. Antes de se utilizar um vector necessrio proceder sua declarao, cuja sintaxe proposta : DIM nomeVector (incio ATE fim) No qual: nomeVector - o nome do vector (escolhido pelo programador); inicio - o valor incio do ndice; fim o valor mximo do ndice; O nmero de posies do vector obedece formula 2.1.1, no sendo obrigatrio preencher todas as posies com valores. tamanho = m inicio + 1 Por exemplo, a instrues seguinte: DIM notas(1 at 20) (2.1.1)

46

Captulo 2. Estruturas de dados


permite denir um vector unidimensional chamado notas com 20 posies numeradas de 1 a 20. Na gura 2.1 apresentada uma representao grca possvel deste vector.
ndice
1 2 3 4 5
... ...

20

Valor 12

17 15

11

Figura 2.1: Vector unidimensional: notas

A sintaxe utilizada no acesso a cada posio do vector a seguinte forma: nome-do-vector[ndice] Como por exemplo: incio
# Declarao do vector;

DIM notas(1 at 20);


# Atribuir o valor 5 posio 3 do vector;

notas[3] 5;
# Escrever no cran o valor da posio 1 do vector ;

escrever notas[1]; m Um vector pode ter as dimenses que se pretenderem1 , fazendo-se a sua separao por vrgulas. Considere-se ainda um outro exemplo, um vector bidimensional que permite representar uma imagem, as duas dimenses da matriz denem o tamanho da imagem (largura e altura) e o valor guardado em cada posio, a cor do pixel. Na gura 2.2 apresentada uma representao grca possvel para esta matriz.
1 1 2
...

...

800

4 12
...

56 8
...

11 1
...

...

6 5
...

... ... ...

640

83

Figura 2.2: Vector bidimensional (matriz): imagem


1 Um

vector tambm designado matriz quando apresenta mais do que uma dimenso.

47

ISEP/DEI - Jorge Santos


No seguinte exemplo procedesse declarao e consequente utilizao deste vector bidimensional : incio
# Declarao da matriz;

DIM imagem(1 at 800, 1 at 640);


# Atribuir o valor 5 posio denida pela coluna 2 e linha 3 da matriz;

imagem[2][3] 5;
# Escrever no cran o valor da posio denida pela coluna 1 e linha 4 da matriz;

escrever notas[1][4]; m Para alm da utilizao descrita nesta seco, os vectores so muito utilizados de forma combinada com outras estruturas de dados (e.g., registos) por forma a denir estruturas mais complexas como por exemplo: las, pilhas e rvores. Existem alguns aspectos a que necessrio prestar ateno quando se manipula vectores em programao, nomeadamente: Os vectores tm dimenso xa. O nmero de elementos indicado na declarao e no pode ser alterado durante a execuo do programa. Os vectores no se podem manipular como um todo, mas sim elemento a elemento. Isto signica que no se podem somar dois vectores directamente, mas sim os elementos de cada vector individualizados. Muitas linguagens de programao no avisam (isto no d erro) se o limite da dimenso de um vector for excedido. Neste caso os resultados da execuo do programa podem ser imprevisveis.

2.1.1 Exerccios resolvidos


2.1.1.1 Funes manipulando vectores Faa um algoritmo que permita: a) Uma funo que faa a leitura de 10 valores (inteiros), guardando-os num vector; b) Uma funo que retorne a diferena entre o maior e o menor valor do vector; c) Uma funo que devolva o nmero de valores pares e mpares do vector; No procedimento leituraVector apresentada de seguida realizada a leitura do vector. Note-se que tanto o prprio vector como a respectiva dimenso so passados para o procedimento como argumentos.

48

Captulo 2. Estruturas de dados


Procedimento leituraVector(vector,dim) incio para i 1; i dim; i i+1 fazer escrever "Introduza o elemento", i; ler vector[i]; m-para m-procedimento A funo contarPares apresentada de seguida contabiliza a quantidade de nmeros existentes no vector. A funo recebe prprio vector e a respectiva dimenso como parmetros e retorna a quantidade de pares. Funo contarPares(vector,dim) incio soma 0; para i 1; i dim; i i+1 fazer se vector[i] % 2 ento soma soma+1; m-se m-para # Retornar resultado; contarPares soma; m-funo A funo maiorDiferenca apresentada de seguida, recebe o prprio vector e a respectiva dimenso como parmetros e retorna a diferena entre os valores mximo e mnimo existentes no vector. Funo maiorDiferenca(vector,dim) incio mximo vector[1]; mnimo vector[1]; para i 1; i dim; i i+1 fazer se vector[i] > mximo ento mximo vector[i]; seno se vector[i] < mnimo ento mnimo vector[i]; m-se m-se m-para # Retornar resultado; maiorDiferenca mximo-mnimo; m-funo

# Os valores mximo e mnimo so iniciados com o primeiro elemento do vector;

49

ISEP/DEI - Jorge Santos


No seguinte extracto (algoritmo 2.1) denido o vector e evocadas as funes e procedimento anteriormente denidos. incio DIM vector (1 at 10);
# Evocar o procedimento de leitura do vector; lerVector(vector,10); # Calcular a diferena entre mximo e mnimo e apresentar resultado;

escrever "Diferena mxima=", maiorDiferenca(vector,10); # Contar os nmeros pares e mpares; nPares maiorDiferenca(vector,10) escrever "Nmeros pares=", nPares; escrever "Nmeros mpares=", 10-nPares; m Algoritmo 2.1: Manipulao de Vectores (leitura, diferena entre mximo e mnimo e nmero de pares e mpares)

2.1.2 Exerccios propostos


2.1.2.1 Determinar desvio padro de uma srie

Escreva um programa modular que permita determinar o desvio padro de um srie de nmeros de acordo com a formula 2.1.2. Considere a denio de funes e procedimento para os diversos sub-problemas.

desvioPadrao =

i =1

(xi media)
n1 (2.1.2)

2.1.2.2

Prova de atletismo

Faa a leitura das pontuaes que 5 juzes de uma determinada prova atriburam a um atleta (valores compreendidos entre 0 e 9 inclusive). Determine e apresente com formato adequado, os seguintes valores: mdia obtida pelo atleta; a pior e a melhor pontuao; a percentagem de pontuaes iguais ou superiores a 8 valores; supondo que a 1 nota foi atribuda pelo juiz n1 e assim sucessivamente determine os nmeros dos juzes que atriburam a melhor nota do atleta.

50

Captulo 2. Estruturas de dados

2.2 Ordenao e pesquisa de vectores


A ordenao de vectores e a pesquisa de um dado elemento num vector, so operaes muito comuns em programao. Existem inmeros mtodos para ordenar vectores e para pesquisar valores em vectores. Sero apresentados nesta seco apenas um exemplo de cada um. Tambm por uma questo de simplicao sero apenas utilizados vectores de nmeros. No entanto estes mtodos poder-se-iam adaptar facilmente a vectores de outro tipo de dados.

2.2.1 Ordenao por seleco


O algoritmo do mtodo de ordenao por seleco consiste em seleccionar repetidamente o menor elemento dos que ainda no foram tratados (da o nome do mtodo). Pretendendo-se uma ordenao por ordem crescente, primeiro selecciona-se o menor elemento do vector e faz-se a sua troca com o elemento na primeira posio do vector, em seguida selecciona-se o segundo menor elemento e faz-se a sua troca com o elemento na segunda posio do vector, repetindo-se o processo at que todo o vector que ordenado. De seguida apresentado o algoritmo que implementa este mtodo onde vector o vector a ordenar e dim o nmero de elementos do vector. Este mtodo bastante eciente para vectores de pequena e mdia dimenso. Procedimento ordenarVector(vector,dim) incio para i 1; i dim-1; i i+1 fazer para j i+1; j dim; j j+1 fazer se vector[j] < vector[i] ento temp vector[j]; vector[j] vector[i]; vector[i] temp; m-se m-para m-para m-procedimento No procedimento ordenarVector necessrio fazer a troca de valores entre duas variveis. Este conceito muito utilizado em programao e como tal merece uma anlise atenta. Comentrio: Falta fazer desenhos!!! Considere-se o problema o problema de trocar os contedos de duas garrafas cheias contendo lquidos (e.g., gua e sumo de laranja). Para proceder trocas dos contedos necessrio considerar uma terceira garrafa vazia que servira como auxiliar do processo, pois no possvel proceder trocar directa.

# Fazer a troca dos dois elementos utilizando uma varivel auxiliar;

51

ISEP/DEI - Jorge Santos


O problema de trocar os contedos de duas variveis similar e como tal o extracto de cdigo seguinte est errado, pois no nal ambas as variveis A e B contero o mesmo valor, 5. incio A 10; B 5;
# Fazer a troca dos contedos - ERRADO!!!;

A B; B A; m No extracto seguinte adoptado o procedimento adequado, conforme descrito anteriormente, a utilizao de uma varivel auxiliar. No nal, as variveis A e B contero os valores 5 e 10, respectivamente. incio A 10; B 5;
# Fazer a troca dos contedos - CORRECTO!!!;

temp A; A B; B temp; m

2.2.2 Pesquisa Sequencial

A pesquisa sequencial o mtodo mais simples de implementar na procura de um elemento num vector. Este mtodo consiste em pesquisar sequencial e exaustivamente um vector na procura de um dado valor. A pesquisa termina quando for encontrado o valor a procurar ou quando tenha chegado ao m do vector. Este mtodo funciona em vectores ordenados e/ou desordenados. No exemplo seguinte considerado um vector notas com 100 elementos em que se pretende procurar um valor usando o mtodo de pesquisa sequencial descrita.

52

Captulo 2. Estruturas de dados


incio DIM notas (1 at 100); escrever "Introduza o valor a pesquisar="; ler valor; # Evocar a funo de pesquisa; posicao pequisarValor(notas, 100, valor); se posicao= -1 ento escrever "O valor desejado no existe no vector"; m-se escrever "O valor desejado existe na posio=",posicao; m Algoritmo 2.2: Utilizar a pesquisa sequencial) A pesquisa propriamente dita realizada pela seguinte funo: Funo pequisarValor(vector,dim,valor) incio encontrou falso; i 0;
# Percorrer o vector at encontrar o elemento ou chegar ao m do vector;

enquanto encontrou=falso e idim fazer se valor = vector[i] ento encontrou verdade; seno i i+1; m-se m-enquanto se encontrou = verdade ento # Caso encontre o valor retorna a posio; pequisarValor i; seno # Caso no encontre o valor retorna -1; pequisarValor -1; m-se m-funo

2.2.3 Exercicios resolvidos


2.2.3.1 Inverter um vector Considere o problema de inverter um vector para o qual apresentada de seguida uma soluo possvel. Esta soluo troca o primeiro elemento com o ltimo, o segundo com o penltimo, o terceiro com o antepenltimo e assim sucessivamente at inverter a totalidade do vector. Note-se que o iterador do vector vai variar desde a primeira posio at metade da dimenso.

53

ISEP/DEI - Jorge Santos


Procedimento invertervector(vector,dim) incio para i 1; i dim/2; i i+1 fazer # Fazer a troca dos dois elementos; temp vector[i]; vector[i] vector[dim-i+1]; vector[dim-i+1] temp; m-para m-procedimento

2.2.4 Exerccios propostos


2.2.4.1 Juno ordenada de vectores Suponha que as notas dos alunos de duas turmas so lidas para dois vectores, um para cada turma. Considere que as notas foram inseridas em ambos os vectores ordenadamente, da menor para a maior. Escreva um programa que faa a juno ordenada dos dois vectores de notas num terceiro vector. 2.2.4.2 Mtodo de ordenao por troca directa

Neste mtodo compara-se cada posio do vector com todas as outras sucessivamente e troca sempre que encontrar um valor menor numa posio frente. Escreva um algoritmo que implemente este mtodo. 2.2.4.3 Filtro grco

Uma unidade industrial na rea da metalomecnica utiliza sistemas de vdeo para o reconhecimento automtico de componentes que passam num tapete rolante. Aps a captura de cada imagem, esta tem que ser tratada com ltros de software que permitem eliminar erros menores e suavizar a imagem. Construa um programa que implementa um ltro que substitui cada pixel pela mdia dos valores das oito clulas que o rodeiam. Na imagem 2.3 est representada a imagem conforme foi capturada em que cada clula representa o tom de cinzento de um pixel. Exemplo de clculo das clulas: clula B2 = A1 + A2 + A3 + B1 + B3 + C1 + C2 + C3 = 108 clula C2 = B1 + B2 + B3 + C1 + C3 + D1 + D2 + D3 = 114 Note-se que as clulas dos limites da imagem (assinalados a cinzento) no podem ser calculados pois no tm o nmero suciente de vizinhos.

54

Captulo 2. Estruturas de dados

A 1 29 2 214

B 28 84

C 70 18

D 47

E 65

F ... ... ... ... ...

175 118

3 214 150 141 198 158 4 129 130 5 ... ... 31 ... 51 ... 36 ...

Figura 2.3: Imagem vdeo - original

Na imagem 2.4 so apresentados os valores da clulas B2 e C2 aps serem calculadas enquanto que as restantes clulas ainda no foram calculadas.

A 1 29

B 28

C 70

D 47

E 65

F ... ... ... ... ...

2 214 108 114 175 118 3 214 150 141 198 158 4 129 130 5 ... ... 31 ... 51 ... 36 ...

Figura 2.4: Imagem vdeo - em tratamento

55

ISEP/DEI - Jorge Santos

56

Bibliograa
[CCT, 2001] CCT. C Programming -Foundation Level, Training Manual & Exercises. Cheltenham Computer Training, Gloucester/UK, 2001. [Kernighan e Ritchie, 1988] Brian W. Kernighan e Dennis M. Ritchie. The C Programming Language, Second Edition. Prentice Hall, Inc., 1988. [Mosich, 1988] D. Mosich. Advanced Turbo C Programmers Guide. John Wiley & Sons, 1988. [Sampaio e Sampaio, 1998] Isabel Sampaio e Alberto Sampaio. Fundamental da Programao em C. FCA- Editora Informtica, 1998.

57

Vous aimerez peut-être aussi