Você está na página 1de 65

Algoritmia e Programao

Jorge Santos

Instituto Superior de Engenharia do Porto


Departamento de Engenharia Informtica

Fevereiro de 2006
ndice

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

iii
1.3.4.6 Determinar ano bissexto . . . . . . . . . . . . . . . . . 22
1.3.4.7 Parque de estacionamento . . . . . . . . . . . . . . . . 22
1.4 Instrues de Repetio (Ciclos) . . . . . . . . . . . . . . . . . . . . . . . 22
1.4.1 Ciclo condicional: repetir-at . . . . . . . . . . . . . . . . . . . . 23
1.4.2 Ciclo condicional: enquanto-fazer . . . . . . . . . . . . . . . . . 23
1.4.3 Ciclo determinstico: para-fazer . . . . . . . . . . . . . . . . . . . 24
1.4.4 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4.4.1 Calcular somatrio entre dois limites . . . . . . . . . . 26
1.4.4.2 Calcular factorial de um nmero . . . . . . . . . . . . 26
1.4.4.3 Determinar se um nmero primo . . . . . . . . . . . 27
1.4.4.4 Determinar nome e idade da pessoa mais nova de um
grupo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.4.4.5 Determinar o aluno melhor classificado e a mdia das
notas de uma turma . . . . . . . . . . . . . . . . . . . . 29
1.4.5 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.4.5.1 Diviso atravs de subtraces sucessivas . . . . . . . 30
1.4.5.2 Determinar o mximo e mnimo de uma srie . . . . . 31
1.4.5.3 Determinar quantidade de nmeros primos . . . . . . 31
1.4.5.4 Determinar se um nmero perfeito . . . . . . . . . . 31
1.4.5.5 Calcular potncia por multiplicaes sucessivas . . . . 31
1.4.5.6 Maior nmero mpar de uma sequncia de valores . . 31
1.4.5.7 Algarismos de um nmero . . . . . . . . . . . . . . . . 31
1.4.5.8 Apresentao grfica de temperaturas . . . . . . . . . 32
1.4.5.9 Soma dos algarismo de um nmero . . . . . . . . . . . 32
1.4.5.10 Jogo de adivinhar o nmero . . . . . . . . . . . . . . . 32
1.4.5.11 Capicua de um nmero . . . . . . . . . . . . . . . . . . 32
1.4.5.12 Converso de base numrica . . . . . . . . . . . . . . . 32
1.5 Traagens e Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.6 Programao modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.6.1 Sub-rotinas, parmetros e variveis locais . . . . . . . . . . . . . 35
1.6.1.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.6.1.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . 37
1.6.2 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.6.2.1 Funo que devolve o maior algarismo de um nmero 37
1.6.2.2 Funo que indica se um nmero perfeito . . . . . . 38
1.6.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.6.3.1 Funo mdia de dois nmeros . . . . . . . . . . . . . 39
1.6.3.2 Funo lei de Ohm . . . . . . . . . . . . . . . . . . . . . 39
1.6.3.3 Funo somatrio . . . . . . . . . . . . . . . . . . . . . 39
1.6.3.4 Funes para codificar e descodificar nmeros . . . . 39
1.6.3.5 Nmeros primos . . . . . . . . . . . . . . . . . . . . . . 40
1.7 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
1.7.1 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . 43
1.7.1.1 Funes manipulando vectores . . . . . . . . . . . . . 43

iv
1.7.2 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . 45
1.7.2.1 Determinar desvio padro de uma srie . . . . . . . . 45
1.7.2.2 Prova de atletismo . . . . . . . . . . . . . . . . . . . . . 45
1.8 Ordenao e pesquisa de vectores . . . . . . . . . . . . . . . . . . . . . . 45
1.8.1 Ordenao por seleco . . . . . . . . . . . . . . . . . . . . . . . 46
1.8.2 Pesquisa Sequencial . . . . . . . . . . . . . . . . . . . . . . . . . 47
1.8.3 Exercicios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . 48
1.8.3.1 Inverter um vector . . . . . . . . . . . . . . . . . . . . . 48
1.8.4 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.8.4.1 Juno ordenada de vectores . . . . . . . . . . . . . . . 49
1.8.4.2 Mtodo de ordenao por troca directa . . . . . . . . . 49
1.8.4.3 Filtro grfico . . . . . . . . . . . . . . . . . . . . . . . . 49

v
vi
Lista de Figuras

1.1 Estrutura de um computador . . . . . . . . . . . . . . . . . . . . . . . . 2


1.2 Notao dos Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Fluxograma e sintaxe - Instrues sequenciais . . . . . . . . . . . . . . . 6
1.4 Fluxograma e sintaxe - Sada de dados . . . . . . . . . . . . . . . . . . . 7
1.5 Fluxograma e sintaxe - Entrada de dados . . . . . . . . . . . . . . . . . 7
1.6 Fluxograma e sintaxe - Atribuio . . . . . . . . . . . . . . . . . . . . . 8
1.7 Fluxograma e sintaxe - Instruo deciso se-ento . . . . . . . . . . . . 12
1.8 Fluxograma e sintaxe - Instruo deciso se-ento-seno . . . . . . . . 13
1.9 Fluxograma e sintaxe - Instruo deciso mltipla seleccione-caso . 15
1.10 Fluxograma da determinao do mximo de 3 valores . . . . . . . . . . 18
1.11 Fluxograma e sintaxe - Instruo ciclo repetir-at . . . . . . . . . . . 23
1.12 Fluxograma e sintaxe - Instruo ciclo enquanto-fazer . . . . . . . . . 24
1.13 Fluxograma e sintaxe - Instruo ciclo para-fazer . . . . . . . . . . . . 25
1.14 Diviso inteira atravs de subtraces sucessivas . . . . . . . . . . . . . 33
1.15 Fluxograma e sintaxe - Funo . . . . . . . . . . . . . . . . . . . . . . . 36
1.16 Fluxograma e sintaxe - Procedimento . . . . . . . . . . . . . . . . . . . . 37
1.17 Ilustrao da lei de Ohm . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.18 Vector unidimensional: notas . . . . . . . . . . . . . . . . . . . . . . . . 41
1.19 Vector bidimensional (matriz): imagem . . . . . . . . . . . . . . . . . . 42
1.20 Imagem vdeo - original . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
1.21 Imagem vdeo - em tratamento . . . . . . . . . . . . . . . . . . . . . . . 50

vii
viii
Lista de Tabelas

1.1 Operadores relacionais, lgicos e aritmticos . . . . . . . . . . . . . . . 6


1.2 ndice de massa corprea . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3 Traagem do algoritmo 1.14 . . . . . . . . . . . . . . . . . . . . . . . . . 34

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

ix
x
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 metodo-
logias de programao que auxiliem a compreenso de programas computacionais
simples, a sua adaptao e desenvolvimento de novas aplicaes, e estimular a capa-
cidade dos leitores para: analisar e resolver problemas de programao.
A estrutura destes apontamentos foi definida 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 introdu-
o terica sobre o tpico em destaque, apresentados problemas e propostas solues
para os mesmos, adicionalmente so propostos exerccios para resoluo. Na codifi-
cao/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 Progra-
mao, Linguagens de Programao I do curso de Engenharia Informtica do Departa-
mento 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 peda-
ggico, 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
ISEP/DEI - Jorge Santos

xiv
Captulo 1

Algoritmia e Programao

Objectivos
Familiarizar os alunos com os conceitos e a terminologia associados Inform-
tica

Programar com clareza usando a metodologia da Programao Estruturada

1.1 Conceitos bsicos


Nesta seco so introduzidos os conceitos bsicos necessrios disciplina de algo-
ritmia e programao. Em particular, os conceitos de programao estruturada, pro-
grama, 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: in-
formao 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 re-
alizar 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 figura 1.1).

Hardware - esta a componente material/fsica do computador, que fornece a


capacidade de:

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


dade;
armazenar um conjunto de bytes;
comunicar com um conjunto de perifricos.

Estas componentes fsicas tm que receber ordens do que fazer e como se arti-
cular. Esta a funo do software.

Software - esta a componente lgica do computador, que consiste num con-


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


rectamente com o hardware e responsvel pela gesto de recursos e peri-
fricos. Neste conjunto incluem-se o sistema operativo e os programas de
controle do funcionamento do hardware, tais como programas de parame-
trizao, drivers e afins.
Ferramentas de desenvolvimento - conjunto de aplicaes utilizadas no de-
senvolvimento de aplicaes. Neste conjunto incluem-se as linguagens de
programao (compiladores e interpretadores) e os sistemas de gesto de
bases de dados.

2
Algoritmia e Programao

Aplicaes - conjunto de aplicaes que se destinam utilizao pelo utili-


zador final 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 (mi-
niaturizao e baixo custo) os informticos foram confrontados com projectos cada
vez mais sofisticados. Constata-se nessa altura a inverso dos custos dispendidos
com hardware e software, para alm do problema da fiabilidade 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 eficiente 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, im-
plementao e manuteno. Para cada uma das fases do desenvolvimento do soft-
ware foram estudadas mtodos e tcnicas especficas. 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 - Algo-
ritmo.
A programao estruturada define um conjunto de regras para elaborao de pro-
gramas. A programao estruturada baseia-se no desenho modular dos programas e
no refinamento gradual do topo para a base.
De acordo com este paradigma um programa pode ser definido pela forma se-
guinte:

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 (apontado-
res), 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, filas, rvores, grafos e ficheiros.
Um algoritmo consiste num conjunto finito e bem-definido de instrues que des-
crevem os passos lgicos necessrios realizao de uma tarefa ou resoluo de um

3
ISEP/DEI - Jorge Santos

problema, dado o estado inicial (nico), a execuo do algoritmo conduz ao estado


final (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 fique pronta mas no demasiado cozida.

Estabelecendo um paralelo entre esta receita culinria e um programa, os ingredi-


entes 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 in-
terpretao 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 selec-


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


cuo, de forma repetitiva, de um conjunto de instrues. Esta execuo de-
pende 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 ob-


jectivo ou audincia. Entre os mais comuns encontram-se o pseudo-cdigo e fluxo-
gramas.

4
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
fluxo do algoritmo, abstraindo-se das questes relacionadas com a sintaxe es-
pecfica de uma determinada linguagem de programao;

Fluxograma - consiste na descrio de um algoritmo de forma grfica. Este for-


malismo inclui um conjunto de smbolos grficos que representao os diferen-
tes tipos de instrues anteriormente descritas: sequncia, deciso e repetio.

1.1.3 Notao utilizada


Na representao de fluxogramas ser utilizada a notao apresentada na figura 1.2:

Execuo de
Incio/Fim Processamento
sub-rotina

Entrada Incio de
Deciso
de dados sub-rotina

Sada de
Fim iterao
dados
(Ciclo)

Figura 1.2: Notao dos Fluxogramas

Na escrita dos programas em pseudo-cdigo sero considerados as seguintes op-


es:

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

Foram utilizadas diferentes formataes para os conceitos a seguir explicitados,


com o objectivo de tornar a leitura dos algoritmos mais simples:

varivel;

5
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 aritmti-
cos mais comuns de acordo com a semntica definida na tabela 1.1.
< menor que + soma
> maior que - subtraco
e, conjuno
maior ou igual que * multiplicao
ou , disjuno
menor ou igual que / diviso
no, negao
= igual div diviso inteira
6= diferente % resto da diviso inteira

Tabela 1.1: Operadores relacionais, lgicos e aritmticos

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 fluxo (ver figura 1.3).

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

Figura 1.3: Fluxograma e sintaxe - Instrues sequenciais

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 figura 1.4 apresen-
tada sintaxe proposta para a escrita de uma ou vrias variveis.

6
Algoritmia e Programao

inicio
...
escrever escrever <lista-de-variaveis/textos>;
...
fim

Figura 1.4: Fluxograma e sintaxe - Sada de dados

Conforme os exemplos seguintes:


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";
fim

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 figura 1.5 apresentada a sintaxe pro-
posta para a leitura de uma ou vrias variveis.

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

Figura 1.5: Fluxograma e sintaxe - Entrada de dados

No caso de se pretender ler mais do que uma varivel, os nomes das variveis separam-
se por vrgulas. Considerem-se os seguintes exemplos:

7
ISEP/DEI - Jorge Santos

incio
# ler a varivel x;
ler x;
# ler as variveis nome e idade;
ler nome,idade;
fim

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 rece-
ber 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 figura 1.6 apresentada a sintaxe
proposta para a atribuio.

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

Figura 1.6: Fluxograma e sintaxe - Atribuio

Considerem-se os seguintes exemplos:


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";
fim

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.

8
Algoritmia e Programao

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

As linguagens de programao mais divulgadas utilizam o smbolo = para re-


presentar 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 progra-
mador escreve no programa no so expresses matemticas mas ordens (da o impe-
rativo) 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 objec-


tivo de ilustrar a utilizao de instrues sequenciais.

1.2.4.1 Cambiar moedas

O algoritmo 1.1 permite cambiar euros em dlares considerando a taxa de converso


1,17.

9
ISEP/DEI - Jorge Santos

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;
fim
Algoritmo 1.1: Cambiar euro para dlar

Sugesto: Escreva uma variao deste algoritmo que permita cmbios entre quais-
quer 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 definido pelas coordenadas (x,y). A distncia pode ser calcu-
lada de acordo com a frmula 1.2.1.

q
distncia = ( x2 x1 )2 + ( y2 y1 )2 (1.2.1)

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;
p ;
# Calcular distncia
distancia (x2 x1)2 + (y2 y1)2 ;
# Mostrar resultado;
escrever "Distncia=", distancia;
fim
Algoritmo 1.2: Calcular distncia euclidiana entre pontos

10
Algoritmia e Programao

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;
fim
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:

peso 55kg
I MC = 2
= = 20, 14
altura 1, 67m 1, 67m
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 cal-
cula o nmero de horas, minutos e segundos correspondentes. Conforme o seguinte
exemplo:

8053s = 2h + 14m + 13s

11
ISEP/DEI - Jorge Santos

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


nheit (tempF), calcule a temperatura expressa em graus Celsius (tempC). A converso
pode ser realizada de acordo com a frmula 1.2.2.

9 tempC
tempF = 32 + (1.2.2)
5

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 fluxos dis-
tintos, para tal utilizada instruo se. Esta instruo pode ser utilizada de duas
formas: se-ento e se-ento-seno.
Na figura 1.7 apresentada a sintaxe para o primeiro caso. se a condio for
verdadeira executado o bloco-instrues caso contrrio nada acontece.

inicio
se
...
ento se <condio>
ento <bloco-instrues>
bloco de
instrues
fim-se
...
fim

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:

12
Algoritmia e Programao

Entrada: nota
incio
escrever "Introduza nota:";
ler nota;
se nota 9,5 ento
escrever "O aluno foi aprovado";
fim-se
fim

Note-se que um bloco de instrues delimitado pelas instrues ento e fim-se.


No segundo caso (ver figura 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 ...
ento seno se <condio>
ento <bloco-instrues1>
bloco de bloco de seno <bloco-instrues2>
instrues 1 instrues 2
fim-se
...
fim

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;
fim-se
fim

13
ISEP/DEI - Jorge Santos

Neste exemplo so lidas as medidas dos lados de uma figura 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.

14
Algoritmia e Programao

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 figura
1.9.

inicio
...
seleccionar seleccionar <varivel>
caso <valor1> <bloco-instrues1>
caso <valor2> <bloco-instrues2>
caso 1 caso 2 caso 3 caso n caso <valor3> <bloco-instrues3>
bloco de bloco de bloco de bloco de
...
...
instrues 1 instrues 2 instrues 3 instrues n
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.
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";
fim-seleccionar
fim-seleccionar
fim
Algoritmo 1.4: Mquina de furao - deciso mltipla
Note-se que tal como acontece no caso da instruo se-ento a componente seno
opcional.

15
ISEP/DEI - Jorge Santos

O algoritmo 1.5 tem um funcionamento idntico ao 1.4 mas implementado atra-


vs 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";
fim-se
fim-se
fim-se
fim
Algoritmo 1.5: Mquina de furao - deciso binria

1.3.3 Exerccios Resolvidos

Nesta seco so apresentados alguns problemas e respectivas solues com o objec-


tivo de ilustrar a utilizao de instrues de deciso.

1.3.3.1 Distncia entre dois pontos

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

q
distncia = ( x2 x1 )2 + ( y2 y1 )2 (1.3.1)

Caso os pontos sejam coincidentes mostra mensagem "Pontos Coincidentes".

16
Algoritmia e Programao

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;
p e mostrar resultado;
# Calcular distncia
distancia (x2 x1)2 + (y2 y1)2 ;
se distancia=0 ento
escrever "Os pontos so coincidentes";
seno
escrever "Distncia=", distancia;
fim-se
fim
Algoritmo 1.6: Calcular distncia euclidiana entre pontos

1.3.3.2 Classificar em funo da mdia

O algoritmo 1.7 permite ler as notas de um aluno s disciplinas de Matemtica, Por-


tugus, Ingls e Geografia e calcular a mdia. Em funo da mdia mostra uma men-
sagem com o contedo "Aprovado" ou "Reprovado". Consideram-se notas positivas as
notas iguais ou superiores a 9,5.

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";
fim-se
fim
Algoritmo 1.7: Classificar em funo da mdia

17
ISEP/DEI - Jorge Santos

1.3.3.3 Determinar o mximo de 3 valores

Considere-se o problema de ler trs nmeros e calcular o maior deles. O fluxograma


1.10 permite capturar com grande facilidade a noo de fluxo e passos alternativos.
Na resoluo do problema foi adoptada uma estratgia de isolamento dos vrios ca-
sos, 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.

Incio

Introduza
trs nmeros

ler
A,B,C

ento A>B seno

A>C B>C

ento seno
ento

Maior A Maior B Maior C

escrever
Maior

Fim

Figura 1.10: Fluxograma da determinao do mximo de 3 valores

Note-se que a utilizao de fluxogramas est regra geral limitada representao


de pequenos programas ou processos com elevado grau de abstraco porque caso
contrrio o fluxograma estender-se-ia por inmeras pginas tornando a sua interpre-
tao muito difcil.
No algoritmo 1.8 foi codificado em pseudo-cdigo a soluo anteriormente deli-
neada no fluxograma da figura 1.10.

18
Algoritmia e Programao

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;
fim-se
seno
se B C ento
maximo B;
seno
maximo C;
fim-se
fim-se
escrever "O nmero maior :", maximo;
fim
Algoritmo 1.8: Calcular mximo de 3 nmeros

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;
fim-se
se num3 maximo ento
maximo num3;
fim-se
escrever "O nmero maior :", maximo;
fim
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?

19
ISEP/DEI - Jorge Santos

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 cal-
cular 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.
Entrada: x1, y1, x2, y2, x2, y2
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;
p a medida dos lados;
# Calcular
a p(x2 x1)2 + (y2 y1)2 ;
b p (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";
fim-se
fim
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 Classificar tringulo

Classificar um tringulo quanto aos lados, sendo que um tringulo com todos lados
iguais designado Equiltero, com todos os lados diferentes entre si designado Es-
caleno e caso tenha apenas dois lados iguais entre si, designa-se Issceles.

20
Algoritmia e Programao

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 mensa-
gem adequada.

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 (1.3.2)



b binmio
x = (1.3.3)
2a

1.3.4.4 Converter entre escalas de temperaturas


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, significam que o utilizador pretende converter a tem-
peratura 38 Celsius para Kelvin. Considere as frmulas 1.3.4 e 1.3.5 na resoluo do
programa.

9 tempC
tempF = 32 + (1.3.4)
5
tempC = tempK + 273 (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:

peso 55kg
I MC = = = 20, 14
altura2 1, 67m 1, 67m
Considerando a tabela 1.2, 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.2 e escreva uma das frases, conforme for o caso:

21
ISEP/DEI - Jorge Santos

IMC Interpretao
At 18,5 (inclusive) Abaixo do peso normal
De 18,5 a 25 (inclusive) Peso normal
De 25 a 30 (inclusive) Acima do peso normal
Acima de 30 Obesidade

Tabela 1.2: ndice de massa corprea

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.

22
Algoritmia e Programao

1.4.1 Ciclo condicional: repetir-at


O ciclo repetir-at executa um bloco de instrues at que uma determinada condi-
o 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 figura 1.11 apresentada a
sintaxe proposta para o ciclo repetir-at.

repita
inicio
...
bloco de
falso
repetir
instrues
<bloco-instrues>
at <condio>;
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;
fim

1.4.2 Ciclo condicional: enquanto-fazer


O ciclo enquanto executa um bloco de instrues enquanto uma determinada condi-
o lgica for verdadeira. Este ciclo testa a condio lgica entrada. Na figura 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.

23
ISEP/DEI - Jorge Santos

enquanto
condio
inicio
...
verdade
enquanto <condio> fazer
bloco de <bloco-instrues>
instrues fim-enquanto
falso ...
fim fim
enquanto

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;
fim-enquanto
fim

1.4.3 Ciclo determinstico: para-fazer


O ciclo para-fazer executa um bloco de instrues com um nmero pr-determinado
de vezes. Na figura 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.

24
Algoritmia e Programao

condio
inicio
...
faa
para <bloco-incio>;<condio>;<bloco-iter> fazer
itera n bloco de <bloco-instrues>
vezes instrues fim-para
...
fim fim
para-faa

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;
fim-para
escrever soma;
fim

Neste exemplo introduzido um conceito importante para a programao, o con-


ceito de acumulador. A varivel soma em cada iterao adicionada do valor da
varivel i, permitindo que no final:

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.

1.4.4 Exerccios Resolvidos


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

25
ISEP/DEI - Jorge Santos

1.4.4.1 Calcular somatrio entre dois limites

O algoritmo 1.11 permite calcular a somatrio dos nmeros existentes num intervalo
definido por limites inferior e superior. Note que o utilizador pode introduzir os li-
mites na ordem que entender, desta forma os intervalos [5-10] e [10-5] so igualmente
vlidos.
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;
fim-se
# Calcular soma propriamente dita;
soma 0;
para i minimo; imaximo; i i+1 fazer
soma soma + i;
fim-para
# Mostrar resultado;
escrever soma;
fim
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:


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

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

26
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;
fim-para
# Apresentar resultado;
escrever factorial;
fim
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 exem-
plo: 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 1; inumero; i i+1 fazer
# Determinar se i divisor do nmero;
se numero%i=0 e i6=1 e i6=numero ento
ndiv ndiv+1;
fim-se
fim-para
# 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";
fim-se
fim
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

27
ISEP/DEI - Jorge Santos

testar todos os nmeros, sendo obviamente pouco eficiente 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 eficiente, visto que termina o processo assim que encontra um di-
visor 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;
fim-se
i i+1;
fim-enquanto
# Testar se foi um encontrado algum divisor;
se primo=falso ento
escrever "O nmero ", numero, "no primo";
seno
escrever "O nmero ", numero, " primo";
fim-se
fim
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 final 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 neces-
sidades.
Uma sentinela regra geral uma varivel do tipo booleano (i.e., pode apresentar
os valores verdadeiro ou falso) e utilizada com o fito de controlar a execuo de
uma determinada seco do programa, este conceito muito til em programao.

28
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 6= "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;
fim-se
fim-se
fim-se
at nome="STOP";
escrever "Nome e idade da pessoa mais nova:", nomeMax, idadeMax;
fim
Algoritmo 1.15: Determinar nome/idade da pessoa mais nova

1.4.4.5 Determinar o aluno melhor classificado 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
final deve ser mostrado o nome do aluno melhor classificado 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.

29
ISEP/DEI - Jorge Santos

Sada: nomeMax, notaMax, media


incio
soma 0;
nAlunos 0;
repetir
escrever "Introduza nome:";
ler nome;
se nome 6= "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;
fim-se
fim-se
at nome="STOP";
# Calcular mdia;
media soma/nAlunos;
escrever "Nome do aluno melhor classificado:", nomeMax;
escrever "Mdia obtida pela turma:", media;
fim
Algoritmo 1.16: Determinar o aluno melhor classificado 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 quiser-
mos calcular 7/2, basta subtrair o dividendo (2) ao divisor (7), sucessivamente, at
que o resultado seja menor do que o dividendo.
O nmero de subtraces realizadas corresponde ao quociente inteiro, conforme
o exemplo seguinte:

30
Algoritmia e Programao

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

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


cluindo 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 verifique se um nmero perfeito.

1.4.5.5 Calcular potncia por multiplicaes sucessivas

Escrever um programa que permita calcular uma potncia do tipo baseexpoente atra-
vs de multiplicaes sucessivas. Por exemplo: 24 = 2 2 2 2. Considere as dife-
rentes 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 vi-


sualize individualmente.

31
ISEP/DEI - Jorge Santos

1.4.5.8 Apresentao grfica de temperaturas


Escreva um algoritmo que l a temperatura de N cidades portuguesas e que repre-
sente 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 verifique se se trata de
uma capicua, isto , uma sequncia de dgitos cuja leitura a mesma nos dois senti-
dos (exemplo:32523). Sugesto: Inverter a ordem dos dgitos e verificar 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 corres-
pondente 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, res-
pectivamente, posio ocupada por cada algarismo no nmero em binrio. Sendo
que o algarismo mais direita corresponde posio zero.

32
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 condi-
es, 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 exemplificado na figura 1.14.

Dividendo Divisor 33 7
Resto Quociente 5 4

33 26 19 12
- 7 - 7 - 7 - 7
26 19 12 5

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;
fim-enquanto
P7 resto dividendo;
fim
Algoritmo 1.17: Diviso inteira atravs de subtraces sucessivas (numerado)
Na tabela 1.3 so representados os passos nos quais as condies e/ou variveis

33
ISEP/DEI - Jorge Santos

podem mudar de valor (de P2 a P7 ) e possvel perceber as (quatro) iteraes realiza-


das dentro do ciclo enquanto-fazer, sendo que em cada iterao do ciclo so execu-
tadas os passos: P4 , P5 e P6 .

Passos dividendo divisor quociente resto dividendo divisor


P2 33 7
P3 33 7 0
P4 33 7 0 verdade
P5 26 7 0 verdade
P6 26 7 1 verdade
P4 26 7 1 verdade
P5 19 7 1 verdade
P6 19 7 2 verdade
P4 19 7 2 verdade
P5 12 7 2 verdade
P6 12 7 3 verdade
P4 12 7 3 verdade
P5 5 7 3 verdade
P6 5 7 4 verdade
P4 5 7 4 falso
P7 5 7 4 5

Tabela 1.3: 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 refinamento gradual do topo para a base. A modularidade permite entre outros
aspectos:

Criar diferentes camadas de abstraco do programa codificado e que por sua


vez facilitar a resoluo de problemas complexos, leitura e manuteno do c-
digo mais simples;

Reduzir os custos ao desenvolvimento de software e correco de erros;

Reduzir o nmero de erros emergentes durante a codificao;

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

34
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 progra-
mador 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 inicio ao fim 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 fun-
o matemtica, isto , funciona como uma caixa preta que recebe valores (designada
por parmetros) e devolve um resultado. Por exemplo a funo potencia (ver fr-
mula 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 definidas 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 ter-
mina 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 fluxograma propostos para a definio de uma funo so apresentados


na figura 1.15:
A funo identificada por um nome (nomeFuncao ), sendo a listaParmetros
constituda por zero ou mais variveis passadas funo. A expresso representa
o valor a retornar pela funo.

35
ISEP/DEI - Jorge Santos

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

Figura 1.15: Fluxograma e sintaxe - Funo

Considere-se no seguinte exemplo a definio 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;
fim-para
# O valor calculado retornado atravs do nome da funo;
potencia resultado;
fim-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);
fim

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
1 Por uma questo de simplicidade so considerados apenas expoentes inteiros e positivos no cl-
culo da potncia.

36
Algoritmia e Programao

1.6.1.2 Procedimentos

A sintaxe e o fluxograma propostos para a definio de um procedimento so apre-


sentados na figura 1.16:

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

Figura 1.16: Fluxograma e sintaxe - Procedimento

Considere-se no seguinte exemplo a definio e utilizao do procedimento


prtNumeroInvertido que permite imprimir um nmero inteiro invertido.
Procedimento prtNumeroInvertido(numero)
incio
enquanto numero>0 fazer
# O algarismo mais direita do nmero calculado atravs;
# da diviso inteira do nmero por 10;
algarismo numero % 10;
escrever algarismo;
# Truncar o algarismo direita;
num (numero-algarismo)/10;
fim-enquanto
fim-procedimento

1.6.2 Exerccios resolvidos


Nesta seco so apresentados alguns problemas e respectivas solues com o objec-
tivo 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

Escrever uma funo que recebe um nmero inteiro e devolve o maior algarismo
contido nesse nmero.

37
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 N6=0 fazer
alg N%10;
N (N - alg)/10;
se alg>max ento
max alg;
fim-se
fim-enquanto
maior max;
fim-funo
Funo maior(n) que devolve o maior algarismo de um nmero

1.6.2.2 Funo que indica se um nmero perfeito

Escrever uma funo que receba um nmero inteiro e devolva 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;
fim-se
fim-para
se soma=N ento
perfeito verdadeiro;
seno
perfeito falso;
fim-se
fim-funo
Funo perfeito(N) que indica se um nmero perfeito

1.6.3 Exerccios propostos


Nesta seco so propostos alguns problemas relacionados com a utilizao de pro-
cedimentos e funes na escritas de programas modulares.

38
Algoritmia e Programao

1.6.3.1 Funo mdia de dois nmeros


Escreva uma funo que, dados dois nmeros reais, retorna a mdia deles arredon-
dada 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 figura 1.17.

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
2i
Calcular o somatrio i
i =1
Sugesto: crie uma funo para determinar cada termo i da srie.

1.6.3.4 Funes para codificar e descodificar nmeros


Uma empresa pretende enviar cifrada uma sequncia de inteiros decimais de 4 d-
gitos (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.

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 ori-
ginal.

39
ISEP/DEI - Jorge Santos

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 n-
meros. Na resoluo deste problema deve ser utilizada uma funo que determina se
um nmero primo.

1.7 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 define 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 definir
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:
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;
fim-enquanto
fim

40
Algoritmia e Programao

o que naturalmente se revela completamente impraticvel.


A generalidade das linguagens de programao fornece este tipo de dados, cha-
mado vector (ou array) que permite ultrapassar esta limitao. A soluo consiste em
definir 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);
fim-para
fim

Um vector pode ento ser definido como um conjunto de tamanho fixo de ele-
mentos 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 1.7.1, no sendo obrigatrio
preencher todas as posies com valores.

tamanho = fim inicio + 1 (1.7.1)


Por exemplo, a instrues seguinte:
DIM notas(1 at 20)
permite definir um vector unidimensional chamado notas com 20 posies nume-
radas de 1 a 20. Na figura 1.18 apresentada uma representao grfica possvel deste
vector.

ndice 1 2 3 4 5 ... 20

Valor 12 8 9 17 15 ... 11

Figura 1.18: Vector unidimensional: notas

A sintaxe utilizada no acesso a cada posio do vector a seguinte forma:

41
ISEP/DEI - Jorge Santos

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];
fim

Um vector pode ter as dimenses que se pretenderem2 , fazendo-se a sua separao


por vrgulas.
Considere-se ainda um outro exemplo, um vector bidimensional que permite re-
presentar uma imagem, as duas dimenses da matriz definem o tamanho da imagem
(largura e altura) e o valor guardado em cada posio, a cor do pixel.
Na figura 1.19 apresentada uma representao grfica possvel para esta matriz.

1 2 3 ... 800

1 4 56 11 ... 6

2 12 8 1 ... 5

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

640 5 83 9 ... 4

Figura 1.19: Vector bidimensional (matriz): imagem

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 definida pela coluna 2 e linha 3 da matriz;
imagem[2][3] 5;
# Escrever no cran o valor da posio definida pela coluna 1 e linha 4 da matriz;
escrever notas[1][4];
fim

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

42
Algoritmia e Programao

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 definir
estruturas mais complexas como por exemplo: filas, pilhas e rvores.
Existem alguns aspectos a que necessrio prestar ateno quando se manipula
vectores em programao, nomeadamente:

Os vectores tm dimenso fixa. O nmero de elementos indicado na declara-


o e no pode ser alterado durante a execuo do programa.

Os vectores no se podem manipular como um todo, mas sim elemento a ele-


mento. Isto significa 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.

1.7.1 Exerccios resolvidos


1.7.1.1 Funes manipulando vectores

Faa um algoritmo que permita:

a) Uma funo que faa a leitura de 10 valores (inteiros), guardando-os num vec-
tor;

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.
Procedimento leituraVector(vector,dim)
incio
para i 1; i dim; i i+1 fazer
escrever "Introduza o elemento", i;
ler vector[i];
fim-para
fim-procedimento

A funo contarPares apresentada de seguida contabiliza a quantidade de n-


meros existentes no vector. A funo recebe prprio vector e a respectiva dimenso
como parmetros e retorna a quantidade de pares.

43
ISEP/DEI - Jorge Santos

Funo contarPares(vector,dim)
incio
soma 0;
para i 1; i dim; i i+1 fazer
se vector[i] % 2 ento
soma soma+1;
fim-se
fim-para
# Retornar resultado;
contarPares soma;
fim-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
# Os valores mximo e mnimo so iniciados com o primeiro elemento do vector;
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];
fim-se
fim-se
fim-para
# Retornar resultado;
maiorDiferenca mximo-mnimo;
fim-funo

No seguinte extracto (algoritmo 1.20) definido o vector e evocadas as funes e


procedimento anteriormente definidos.

44
Algoritmia e Programao

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;
fim
Algoritmo 1.20: Manipulao de Vectores (leitura, diferena entre mximo e m-
nimo e nmero de pares e mpares)

1.7.2 Exerccios propostos


1.7.2.1 Determinar desvio padro de uma srie
Escreva um programa modular que permita determinar o desvio padro de um s-
rie de nmeros de acordo com a formula 1.7.2. Considere a definio de funes e
procedimento para os diversos sub-problemas.
v
u n
u
u ( xi media)
t
desvioPadrao = i=1 (1.7.2)
n1

1.7.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 deter-
mine os nmeros dos juzes que atriburam a melhor nota do atleta.

1.8 Ordenao e pesquisa de vectores


A ordenao de vectores e a pesquisa de um dado elemento num vector, so opera-
es muito comuns em programao. Existem inmeros mtodos para ordenar vec-

45
ISEP/DEI - Jorge Santos

tores e para pesquisar valores em vectores. Sero apresentados nesta seco apenas
um exemplo de cada um. Tambm por uma questo de simplificao sero apenas
utilizados vectores de nmeros. No entanto estes mtodos poder-se-iam adaptar fa-
cilmente a vectores de outro tipo de dados.

1.8.1 Ordenao por seleco

O algoritmo do mtodo de ordenao por seleco consiste em seleccionar repetida-


mente 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 ele-
mento na segunda posio do vector, repetindo-se o processo at que todo o vector
fique 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
eficiente 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
# Fazer a troca dos dois elementos utilizando uma varivel auxiliar;
temp vector[j];
vector[j] vector[i];
vector[i] temp;
fim-se
fim-para
fim-para
fim-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.
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 auxi-
liar do processo, pois no possvel proceder trocar directa.
O problema de trocar os contedos de duas variveis similar e como tal o ex-
tracto de cdigo seguinte est errado, pois no final ambas as variveis A e B contero
o mesmo valor, 5.

46
Algoritmia e Programao

incio
A 10;
B 5;
# Fazer a troca dos contedos - ERRADO!!!;
A B;
B A;
fim

No extracto seguinte adoptado o procedimento adequado, conforme descrito


anteriormente, a utilizao de uma varivel auxiliar. No final, 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;
fim

1.8.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 exaustiva-
mente um vector na procura de um dado valor. A pesquisa termina quando for en-
contrado o valor a procurar ou quando tenha chegado ao fim 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.
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";
fim-se
escrever "O valor desejado existe na posio=",posicao;
fim
Algoritmo 1.21: Utilizar a pesquisa sequencial)
A pesquisa propriamente dita realizada pela seguinte funo:

47
ISEP/DEI - Jorge Santos

Funo pequisarValor(vector,dim,valor)
incio
encontrou falso;
i 0;
# Percorrer o vector at encontrar o elemento ou chegar ao fim do vector;
enquanto encontrou=falso e idim fazer
se valor = vector[i] ento
encontrou verdade;
seno
i i+1;
fim-se
fim-enquanto
se encontrou = verdade ento
# Caso encontre o valor retorna a posio;
pequisarValor i;
seno
# Caso no encontre o valor retorna -1;
pequisarValor -1;
fim-se
fim-funo

1.8.3 Exercicios resolvidos

1.8.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 se-
gundo 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.

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;
fim-para
fim-procedimento

48
Algoritmia e Programao

1.8.4 Exerccios propostos


1.8.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 or-
denadamente, da menor para a maior.
Escreva um programa que faa a juno ordenada dos dois vectores de notas num
terceiro vector.

1.8.4.2 Mtodo de ordenao por troca directa

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

1.8.4.3 Filtro grfico

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 filtros de software que permi-
tem eliminar erros menores e suavizar a imagem.
Construa um programa que implementa um filtro que substitui cada pixel pela
mdia dos valores das oito clulas que o rodeiam.
Na imagem 1.20 est representada a imagem conforme foi capturada em que cada
clula representa o tom de cinzento de um pixel.

A B C D E F

1 29 28 70 47 65 ...

2 214 84 18 175 118 ...

3 214 150 141 198 158 ...

4 129 130 31 51 36 ...

5 ... ... ... ... ... ...

Figura 1.20: Imagem vdeo - original

Exemplo de clculo das clulas:

49
ISEP/DEI - Jorge Santos

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 suficiente de vizinhos.
Na imagem 1.21 so apresentados os valores da clulas B2 e C2 aps serem calcu-
ladas enquanto que as restantes clulas ainda no foram calculadas.

A B C D E F

1 29 28 70 47 65 ...

2 214 108 114 175 118 ...

3 214 150 141 198 158 ...

4 129 130 31 51 36 ...

5 ... ... ... ... ... ...

Figura 1.21: Imagem vdeo - em tratamento

50
Bibliografia

[CCT, 2001] CCT. C Programming -Foundation Level, Training Manual & Exercises. Chel-
tenham Computer Training, Gloucester/UK, 2001.
[Kernighan e Ritchie, 1988] Brian W. Kernighan e Dennis M. Ritchie. The C Program-
ming 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 Pro-
gramao em C. FCA- Editora Informtica, 1998.

51

Você também pode gostar