Universidade Federal de Mato Grosso do Sul

Departamento de Computa¸ c˜ao e Estat´ıstica/CCET
Departamento de Ciˆencias Exatas/CPCX
Algoritmos e Estrutura de Dados I
Autor:
Prof. Dr. Marcelo Ferreira Siqueira (DCT/UFMS)
Colaboradores:
Prof. Dr. F´abio Henrique Viduani Martinez (DCT/UFMS)
Prof. Dr. Said Sadique Adi (DCT/UFMS)
Prof. M.Sc. Amaury A. de Castro Junior (DEX/CPCX/UFMS)
Material de apoio utilizado na disciplina de Algoritmos
e Estrutura de Dados I, nos cursos de Bacharelado em
Ciˆencia da Computa¸ c˜ ao e Bacharelado em An´ alise de
Sistemas do DCT/UFMS e Bacharelado em Sistemas de
Informa¸ c˜ ao do DEX/CPCX/UFMS.
Mato Grosso do Sul - Brasil
Apresenta¸c˜ao
A disciplina de Algoritmos e Estrutura de Dados I, oferecida na primeira
s´erie dos cursos de Bacharelado em Ciˆencia da Computa¸ c˜ao, Bacharelado em
An´alise de Sistemas e Bacharelado em Sistemas de Informa¸ c˜ao da UFMS,
possui uma importˆancia fundamental no que diz respeito `a aprendizagem dos
conceitos introdut´orios de racioc´ınio l´ogico e matem´atico, resolu¸ c˜ao de pro-
blemas e programa¸ c˜ao de computadores. No decorrer desses cursos, muitas
outras disciplinas fazem uso e aprofundam os conceitos estudados inicial-
mente aqui.
Esta apostila re´ une um conjunto de conceitos e exerc´ıcios introdut´orios
e deve ser usada apenas como suporte aos seus primeiros passos no desen-
volvimento de sua capacidade de abstra¸ c˜ao, resolu¸ c˜ao de problemas e na
habilidade de programa¸ c˜ao de computadores. O texto foi desenvolvido com
base em todos os materiais relacionadas na bibliografia deste documento.
Dessa forma, esse material dever´a permanecer em constante atualiza¸ c˜ao,
sendo importante a participa¸ c˜ao dos alunos neste processo de corre¸ c˜ao, atu-
aliza¸ c˜ao e reformula¸ c˜ao dos t´opicos, sempre que for necess´ario.
Na disciplina de Algoritmos e Estrutura de Dados I ´e adotada uma pseu-
dolinguagem de programa¸ c˜ao, semelhante ao PORTUGOL. Entretanto, exis-
tem disciplinas pr´aticas no curso que far˜ao uso de laborat´orio e de uma lin-
guagem de programa¸ c˜ao espec´ıfica (C, C++ ou JAVA). Vale ressaltar que,
aqueles acadˆemicos que obtiverem sucesso na disciplina te´orica de Algorit-
mos e Estrutura de Dados I e, ao final dela, puderem programar com de-
senvoltura na linguagem espec´ıfica que foi trabalhada no curso, ter˜ao maior
facilidade para aprender novos conceitos e novas linguagens de programa¸ c˜ao.
Por ´ ultimo, mas n˜ao menos importante, apesar desse material apresentar
uma boa parte dos assuntos que ser˜ao discutidos em sala de aula, ´e FORTE-
MENTE recomendado que os acadˆemicos SEMPRE procurem informa¸ c˜oes
em outras fontes (tais como livros, notas de aula, Internet, entre outros),
podendo come¸ car pelas obras indicadas como referˆencias para a elabora¸ c˜ao
deste documento.
I
Para come¸car...
´
E imposs´ıvel ensinar algu´em a pensar, j´a que todas as pessoas j´a nas-
cem com essa capacidade. Nosso objetivo aqui ´e o de compreender como
desenvolver e aperfei¸ coar a t´ecnica de pensamento, no que diz respeito ao
racioc´ınio l´ogico e matem´atico. Isso ´e fundamental para desenvolvermos a
nossa capacidade de resolver problemas e de programar computadores.
Impor disciplina ao c´erebro ´e um processo que, muitas vezes, produz
resultados a longo prazo. No entanto, se o seu interesse ´e obter resultados
a curto e m´edio prazos, ´e fundamental que haja uma atividade mental
constante e muita persistˆencia. Para isso, devemos estar preparados e
motivados para nos dedicarmos a uma pr´atica constante de todos os
conceitos vistos em sala de aula. Portanto, leitura, pesquisa e exerc´ıcios
nunca ser˜ao demais nesse processo.
Na vida, se temos um objetivo e nos planejamos para alcan¸ c´a-lo, a pos-
sibilidade de sucesso torna-se bem maior do que quando n˜ao existe um pla-
nejamento. A mesma id´eia pode ser aplicada `a resolu¸ c˜ao de problemas e ao
desenvolvimento de programas. Dessa forma, nunca devemos come¸ car a pro-
gramar a partir do nada, pois quando se come¸ ca a escrever um programa sem
termos pensado e refletido sobre o problema que deu origem a ele, fica dif´ıcil
visualiz´a-lo como um todo. O entendimento adequado do programa, a com-
preens˜ao de sua solu¸ c˜ao e a cria¸ c˜ao de um “rascunho”pr´evio do programa
(algoritmo) e da solu¸ c˜ao s˜ao necess´arios para a defini¸ c˜ao da abordagem mais
adequada para o problema. Al´em disso, esquematizar o programa ajuda a
fixar exatamente o que se deseja, a economizar tempo em frente ao monitor
na tentativa de escrever um programa que cumpra o desejado e a superar
as dificuldades que, por ventura, venham a ser encontradas.
Como vocˆe j´a deve ter percebido, a constru¸ c˜ao de um programa n˜ao se
resume ao dom´ınio de uma linguagem de programa¸ c˜ao e nem a simples ativi-
dade de digita¸ c˜ao de uma seq¨ uˆencia de linhas de c´odigo em um computador.
Antes disso, existe um trabalho mental a ser desenvolvido at´e que se tenha
um projeto completo e acabado da solu¸ c˜ao de um problema. Esse exerc´ıcio
intelectual ´e o que diferencia o trabalho desenvolvido por um analista ou
projetista de sistemas do trabalho de um digitador ou programador.
II
Conte´ udo
1 Introdu¸ c˜ao `a Computa¸ c˜ao 1
1.1 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Algoritmos e Resolu¸ c˜ao de Problemas . . . . . . . . . . . . . 3
1.3 Resolu¸ c˜ao de Problemas e Abstra¸ c˜ao . . . . . . . . . . . . . . 4
1.4 Algoritmos e Computadores . . . . . . . . . . . . . . . . . . . 6
1.4.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.2 Linguagens de Programa¸ c˜ao . . . . . . . . . . . . . . . 11
1.4.3 Software . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5 A Computa¸ c˜ao Como Disciplina . . . . . . . . . . . . . . . . 13
2 Os Computadores HV-1, HV-2 e HIPO 16
2.1 O Computador HV-1 . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.1 Gaveteiro . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.2 Calculadora . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.3 EPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4 Porta-Cart˜oes . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.5 Folha de Sa´ıda . . . . . . . . . . . . . . . . . . . . . . 18
2.1.6 Operador . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.1.7 Programando o HV-1 . . . . . . . . . . . . . . . . . . 19
2.1.8 Instru¸ c˜oes do HV-1 . . . . . . . . . . . . . . . . . . . . 20
2.1.8.1 Soma . . . . . . . . . . . . . . . . . . . . . . 21
2.1.8.2 Carga no AC . . . . . . . . . . . . . . . . . . 21
2.1.8.3 Armazenamento do AC . . . . . . . . . . . . 21
2.1.8.4 Impress˜ao . . . . . . . . . . . . . . . . . . . . 22
2.1.8.5 Leitura . . . . . . . . . . . . . . . . . . . . . 22
2.1.8.6 Desvio Condicional . . . . . . . . . . . . . . 22
2.1.8.7 Pare . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.9 Exemplo de Programa . . . . . . . . . . . . . . . . . . 23
2.2 O Computador HV-2 . . . . . . . . . . . . . . . . . . . . . . . 25
2.3 O Computador HIPO . . . . . . . . . . . . . . . . . . . . . . 28
2.3.1 Mem´oria . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3.2 CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3.3 EPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3.4 Unidade de Entrada . . . . . . . . . . . . . . . . . . . 29
2.3.5 Unidade de Sa´ıda . . . . . . . . . . . . . . . . . . . . . 30
2.3.6 Instru¸ c˜oes do HIPO . . . . . . . . . . . . . . . . . . . 30
2.3.7 Exemplo de Programa . . . . . . . . . . . . . . . . . . 30
III
Conte´ udo UFMS
2.4 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 Desenvolvimento de Algoritmos - Parte I 32
3.1 Componentes de um Algoritmo . . . . . . . . . . . . . . . . . 32
3.2 Uma Linguagem para Algoritmos . . . . . . . . . . . . . . . . 34
3.3 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4 Vari´aveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.5 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.6 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.6.1 Operador de Atribui¸ c˜ao . . . . . . . . . . . . . . . . . 38
3.6.2 Operadores Aritm´eticos . . . . . . . . . . . . . . . . . 39
3.6.3 Comando de Atribui¸ c˜ao . . . . . . . . . . . . . . . . . 39
3.6.4 Precedˆencia de Operadores . . . . . . . . . . . . . . . 40
3.6.5 Entrada e Sa´ıda . . . . . . . . . . . . . . . . . . . . . 41
3.7 Estrutura Geral de um Algoritmo . . . . . . . . . . . . . . . . 41
4 Desenvolvimento de Algoritmos - Parte II 44
4.1 Express˜oes Condicionais . . . . . . . . . . . . . . . . . . . . . 44
4.1.1 Rela¸ c˜oes . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.2 Operadores L´ogicos . . . . . . . . . . . . . . . . . . . 45
4.2 Estruturas de Controle . . . . . . . . . . . . . . . . . . . . . . 47
4.2.1 Estruturas Condicionais . . . . . . . . . . . . . . . . . 47
4.2.2 Estruturas de Repeti¸ c˜ao . . . . . . . . . . . . . . . . . 51
4.3 Problemas e Solu¸ c˜oes . . . . . . . . . . . . . . . . . . . . . . . 56
5 Estruturas de Dados 70
5.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.1.1 Definindo uma Estrutura de Dados Vetor . . . . . . . 72
5.1.2 Declarando e Manipulando Vari´aveis do Tipo Vetor . 73
5.1.3 Problemas e Solu¸ c˜oes Envolvendo Vetores . . . . . . . 74
5.2 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2.1 Problemas e Solu¸ c˜oes Envolvendo Matrizes . . . . . . 80
5.3 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.3.1 Definindo uma Estrutura de Registro . . . . . . . . . . 83
5.3.2 Criando e Manipulando Vari´aveis de Registros . . . . 84
5.3.3 Vetores de Registros . . . . . . . . . . . . . . . . . . . 85
5.3.4 Registro de Tipos Complexos . . . . . . . . . . . . . . 86
5.3.5 Um Problema Envolvendo Registros . . . . . . . . . . 87
5.4 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
6 Modulariza¸ c˜ao 100
6.1 O Quˆe e Por Quˆe? . . . . . . . . . . . . . . . . . . . . . . . . 100
6.2 Componentes de um m´odulo . . . . . . . . . . . . . . . . . . . 101
6.3 Ferramentas para Modulariza¸ c˜ao . . . . . . . . . . . . . . . . 102
IV
Conte´ udo UFMS
6.4 Criando Fun¸ c˜oes e Procedimentos . . . . . . . . . . . . . . . . 103
6.5 Chamando Fun¸ c˜oes e Procedimentos . . . . . . . . . . . . . . 105
6.6 Passagem de Parˆametros . . . . . . . . . . . . . . . . . . . . . 106
6.7 Escopo de Dados e C´odigo . . . . . . . . . . . . . . . . . . . . 107
6.8 Problemas e Solu¸ c˜oes . . . . . . . . . . . . . . . . . . . . . . . 109
7 Ponteiros 119
7.1 Tipos Base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.2 Opera¸ c˜oes com Ponteiros . . . . . . . . . . . . . . . . . . . . 123
7.3 Ponteiros e Vetores . . . . . . . . . . . . . . . . . . . . . . . . 124
7.4 Aloca¸ c˜ao Dinˆamica de Mem´oria . . . . . . . . . . . . . . . . . 125
7.5 Ponteiros para Ponteiros . . . . . . . . . . . . . . . . . . . . . 128
8 Algoritmos de Ordena¸ c˜ao 130
8.1 Bubble-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
8.2 Insertion-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.3 Selection-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
9 Um pouco sobre complexidade de algoritmos 133
10 Listas 136
10.1 Defini¸ c˜oes b´asicas . . . . . . . . . . . . . . . . . . . . . . . . . 136
10.2 Aloca¸ c˜ao seq¨ uencial . . . . . . . . . . . . . . . . . . . . . . . 137
10.2.1 Pilhas e Filas . . . . . . . . . . . . . . . . . . . . . . . 139
10.2.1.1 Pilhas . . . . . . . . . . . . . . . . . . . . . . 140
10.2.1.2 Filas . . . . . . . . . . . . . . . . . . . . . . . 141
10.2.2 Um exemplo de aplica¸ c˜ao de uma pilha . . . . . . . . 143
V
Introdu¸c˜ao `a
Computa¸c˜ao 1
Computadores s˜ao dispositivos que s´o sabem fazer um tipo de coisa: exe-
cutar algoritmos para processar informa¸ c˜ao. Para cientistas da Computa¸ c˜ao,
algoritmo ´e o conceito central da Computa¸ c˜ao.
Neste T´opico, introduziremos a no¸ c˜ao de algoritmo, mostraremos alguns
exemplos, abordaremos a rela¸ c˜ao algoritmo-computador e discutiremos so-
bre a Computa¸ c˜ao e suas ´areas.
1.1 Algoritmo
H´a tantas defini¸ c˜oes diferentes para o termo algoritmo quanto autores
escrevendo sobre elas. Entretanto, todas estas defini¸ c˜oes concordam que um
algoritmo ´e uma seq¨ uˆencia de instru¸ c˜oes para resolver um problema, a qual
possui as seguintes propriedades:
• Garantia de t´ermino: o problema a ser resolvido possui condi¸ c˜oes
espec´ıficas que, quando satisfeitas, a execu¸ c˜ao do algoritmo ´e encer-
rada e o problema ´e ent˜ao tido como “resolvido”. Al´em disso, estas
condi¸ c˜oes devem ser satisfeitas ap´os uma quantidade finita de tempo,
a ser contado a partir do in´ıcio da execu¸ c˜ao do algoritmo.
• Exatid˜ao: a inten¸ c˜ao de cada instru¸ c˜ao no algoritmo deve ser sufici-
entemente clara, de forma que n˜ao haja ambig¨ uidade na interpreta¸ c˜ao
da inten¸ c˜ao.
• Efetividade: cada instru¸ c˜ao deve ser b´asica o suficiente para ser exe-
cutada, pelo menos em princ´ıpio, por qualquer agente usando apenas
l´apis e papel.
1
1.1. Algoritmo UFMS
Para exemplificar a no¸ c˜ao de algoritmo, considere o problema de encon-
trar o m´aximo divisor comum (MDC) de dois n´ umeros naturais quaisquer e
a seguinte seq¨ uˆencia de instru¸ c˜oes para resolver o problema:
1. Chame o maior n´ umero de a e o menor de b
2. Divida a por b e chame o resto de r
3. Se r ´e igual a zero ent˜ao o MDC ´e igual a b e a execu¸ c˜ao das instru¸ c˜oes
encerra aqui. Caso contr´ario, siga para a pr´oxima instru¸ c˜ao.
4. Atribua o valor de b a a e o valor de r a b
5. Volte para a instru¸ c˜ao 2.
Esta seq¨ uˆencia de instru¸ c˜oes ´e um algoritmo para o problema de encon-
trar o MDC de dois n´ umeros naturais quaisquer. Pois, se seguida, resolve
qualquer ocorrˆencia do problema
1
. A execu¸ c˜ao da seq¨ uˆencia sempre p´ara
ap´os uma quantidade finita de tempo. Isto ´e garantido pela instru¸ c˜ao 3, que
compara o valor de r a zero e termina a execu¸ c˜ao se r ´e igual a 0. Cada ins-
tru¸ c˜ao da seq¨ uˆencia ´e clara e poss´ıvel de ser executada por qualquer pessoa
que saiba, pelo menos, dividir dois n´ umeros.
Como era de se esperar, nem toda seq¨ uˆencia de instru¸ c˜oes para resolver
um determinado problema pode ser considerada um algoritmo. Por exemplo,
se a instru¸ c˜ao “Divida x por y se todo n´ umero inteiro par maior que 2 ´e a
soma de dois n´ umeros primos” estiver presente na seq¨ uˆencia, ela s´o poder´a
ser executada se soubermos se a proposi¸ c˜ao “todo n´ umero inteiro par maior
que 2 ´e a soma de dois n´ umeros primos” ´e verdadeira ou falsa. Entretanto,
esta proposi¸ c˜ao, conhecida como conjectura de Goldbach, foi proposta
em 1742 e continua sem solu¸ c˜ao at´e hoje. Logo, nossa instru¸ c˜ao n˜ao pode
ser executada por qualquer agente hoje em dia e, portanto, n˜ ao pode fazer
parte de um algoritmo.
Um outro exemplo de instru¸ c˜ao que n˜ao pode fazer parte de um algoritmo
´e “Escreva todos os n´ umeros ´ımpares”. Neste caso, temos uma instru¸ c˜ao
que n˜ao pode ser executada porque a execu¸ c˜ao nunca terminar´a, apesar de
sabermos exatamente como determinar os n´ umeros ´ımpares. Observe que se
modific´assemos a instru¸ c˜ao para “Escreva todos os n´ umeros ´ımpares menores
do que 100”, ela poderia, perfeitamente, fazer parte de um algoritmo.
Um problema para o qual existe uma solu¸ c˜ao na forma de algoritmo ´e
dito um problema algor´ıtmico. O problema de encontrar o MDC de dois
n´ umeros naturais quaisquer ´e, portanto, um problema algor´ıtmico. Proble-
mas algor´ıtmicos, em geral, possuem muitas ocorrˆencias. Por exemplo, para
1
Se vocˆe n˜ao acredita nisso, pode come¸car a testar!
2
1.2. Algoritmos e Resolu¸ c˜ao de Problemas UFMS
o problema de encontrar o MDC de dois n´ umeros naturais, cada ocorrˆencia
´e uma dupla distinta de n´ umeros naturais cujo MDC queremos encontrar.
Um algoritmo ´e dito correto quando ele sempre termina e produz a resposta
correta para todas as ocorrˆencias de um dado problema.
Algoritmo, ent˜ao, pode ser imaginado como a especifica¸ c˜ao de um pro-
cesso “mecˆanico” que, quando executado, leva-nos `a solu¸c˜ao de algum pro-
blema. Embora o termo algoritmo esteja relacionado intimamente com
Ciˆencia da Computa¸ c˜ao, algoritmos tem sido parte de nossas vidas desde a
primeira vez que uma pessoa explicou para outra como fazer alguma coisa.
As pessoas utilizam algoritmos quando seguem receitas culin´arias ou ins-
tru¸ c˜oes para programar um v´ıdeo cassete. Entretanto, nem todo algoritmo
pode ser executado por um computador. Um computador pode executar
apenas aqueles algoritmos cujas instru¸ c˜oes envolvam tarefas que ele possa
entender e executar. Este n˜ao ´e o caso, por exemplo, de instru¸ c˜oes como
“bata as gemas” e “ligue o v´ıdeo cassete”.
Computadores executam algoritmos que manipulam apenas dados e n˜ao
coisas f´ısicas, tais como gema de ovo e v´ıdeo cassete. A execu¸ c˜ao de um
algoritmo por um computador ´e denominada processamento de dados e
consiste de trˆes partes: uma entrada, um processo e uma sa´ıda. A entrada
´e um conjunto de informa¸ c˜oes que ´e requisitada para que as instru¸ c˜oes do
algoritmo possam ser executadas. O processo ´e a seq¨ uˆencia de instru¸ c˜oes
que comp˜oe o algoritmo. A sa´ıda ´e o resultado obtido com a execu¸ c˜ao
do processo para a entrada fornecida. Por exemplo, a entrada e a sa´ıda
para uma computa¸ c˜ao do algoritmo para o problema de encontrar o MDC
de dois n´ umeros naturais s˜ao, respectivamente, dois n´ umeros naturais e o
MDC deles.
Quando escrevemos algoritmos para serem executados por computador,
temos de fazer algumas suposi¸ c˜oes sobre o modelo de computa¸ c˜ao entrada-
processo-sa´ıda. A primeira delas ´e que, a fim de realizar qualquer com-
puta¸ c˜ao, o algoritmo deve possuir um meio de obter os dados da entrada.
Esta tarefa ´e conhecida como leitura da entrada. A segunda, ´e que o al-
goritmo deve possuir um meio de revelar o resultado da computa¸ c˜ao. Isto
´e conhecido como escrita dos dados da sa´ıda. Todo e qualquer computa-
dor possui dispositivos atrav´es dos quais a leitura e a escrita de dados s˜ao
realizadas.
1.2 Algoritmos e Resolu¸c˜ao de Problemas
Todo algoritmo est´a relacionado com a solu¸ c˜ao de um determinado pro-
blema. Portanto, construir um algoritmo para um dado problema significa,
3
1.3. Resolu¸ c˜ao de Problemas e Abstra¸ c˜ao UFMS
antes de mais nada, encontrar uma solu¸ c˜ao para o problema e descrevˆe-la
como uma sequˆencia finita de a¸ c˜oes.
A tarefa de encontrar a solu¸ c˜ao de um problema qualquer ´e , em ge-
ral, realizada de forma emp´ırica e um tanto quanto desorganizada; ocorrem
v´arios procedimentos mentais, dos quais raramente tomamos conhecimento.
A organiza¸ c˜ao do procedimento de resolu¸ c˜ao de problemas ´e extremamente
desej´avel, pois somente assim podemos verificar onde o procedimento n˜ao
est´a eficiente. Identificadas as deficiˆencias, procuramos formas de corrigi-las
e, consequentemente, aumentamos a nossa capacidade de resolver proble-
mas.
A capacidade para resolver problemas pode ser vista como uma habili-
dade a ser adquirida. Esta habilidade, como qualquer outra, pode ser obtida
pela combina¸ c˜ao de duas partes:
• Conhecimento: adquirido pelo estudo. Em termos de resolu¸ c˜ao de
problemas, est´a relacionado a que t´aticas, estrat´egias e planos usar e
quando usar;
• Destreza: adquirida pela pr´atica. A experiˆencia no uso do conheci-
mento nos d´a mais agilidade na resolu¸ c˜ao de problemas.
Independente do problema a ser resolvido, ao desenvolvermos um algo-
ritmo devemos seguir os seguintes passos:
• An´alise preliminar: entender o problema com a maior precis˜ao
poss´ıvel, identificando os dados e os resultados desejados;
• Solu¸ c˜ao: desenvolver um algoritmo para o problema;
• Teste de qualidade: executar o algoritmo desenvolvido com uma
entrada para a qual o resultado seja conhecido;
• Altera¸ c˜ao: se o resultado do teste de qualidade n˜ao for satisfat´orio,
altere o algoritmo e submeta-o a um novo teste de qualidade;
• Produto final: algoritmo conclu´ıdo e testado, pronto para ser apli-
cado.
1.3 Resolu¸c˜ao de Problemas e Abstra¸c˜ao
Talvez, o fator mais determinante para o sucesso em resolver um pro-
blema seja abstra¸ c˜ ao. De acordo com o Webster’s New Dictionary of Ameri-
can Language (segunda edi¸ c˜ao), abstra¸ c˜ao “´e alguma coisa independente de
4
1.3. Resolu¸ c˜ao de Problemas e Abstra¸ c˜ao UFMS
qualquer ocorrˆencia particular” ou “o processo de identificar certas proprie-
dades ou caracter´ısticas de uma entidade material e us´a-las para especificar
uma nova entidade que representa uma simplifica¸ c˜ao da entidade da qual
ela foi derivada”. Esta “nova entidade” ´e o que chamamos de abstra¸ c˜ao.
Para entender o papel da abstra¸ c˜ao na resolu¸ c˜ao de problemas, considere
a seguinte ocorrˆencia de um problema que lembra nossos tempos de crian¸ ca:
Maria tinha cinco ma¸c˜ as e Jo˜ ao tinha trˆes. Quantas ma¸c˜ as eles
tinham juntos?
Provavelmente, um adulto resolveria este problema fazendo uma abstra¸ c˜ao
das ma¸ c˜as como se elas fossem os n´ umeros 5 e 3 e faria a soma de tais
n´ umeros. Uma crian¸ ca poderia imaginar as cinco ma¸ c˜as de Maria como cinco
palitinhos e as trˆes de Jo˜ao como trˆes palitinhos. Da´ı, faria uma contagem
dos palitinhos para chegar `a solu¸ c˜ao. Em ambos os casos, os elementos do
problema foram substitu´ıdos por outros (n´ umeros e palitinhos) e a solu¸ c˜ao
foi encontrada atrav´es da manipula¸ c˜ao dos novos elementos.
O processo de abstra¸ c˜ao pode ser visto como constando de n´ıveis. Isto
diz respeito ao grau de simplifica¸ c˜ao de uma abstra¸ c˜ao. Por exemplo, minha
av´o cozinha desde garota, logo se algu´em entreg´a-la uma receita culin´aria
de uma lazanha ao molho branco e n˜ao mencionar como o molho branco ´e
feito, provavelmente, isto n˜ao ser´a um problema para ela. Entretanto, se a
mesma receita for dada para mim, eu n˜ao saberei fazer a tal lazanha
2
. Isto
quer dizer que a receita dada para mim deveria conter maiores detalhes do
processo de preparo da lazanha do que aquela dada para minha av´o. Aqui,
a receita ´e uma abstra¸ c˜ao e o n´ıvel de detalhe da receita ´e proporcional ao
n´ıvel de simplifica¸ c˜ao da abstra¸ c˜ao.
Algoritmos bem projetados s˜ao organizados em n´ıveis de abstra¸ c˜ao, pois
um mesmo algoritmo deve ser entendido por pessoas com diferentes graus
de conhecimento. Quando um algoritmo est´a assim projetado, as instru¸ c˜oes
est˜ao organizadas de tal forma que podemos entender o algoritmo sem, con-
tudo, ter de entender os detalhes de todas as instru¸ c˜ao de uma s´o vez.
Para tal, o processo de constru¸ c˜ao de algoritmos conta com ferramentas,
tais como m´odulos, que agrupam instru¸ c˜oes que realizam uma determinada
tarefa no algoritmo, independente das demais, tal como fazer a leitura da
entrada, dispensando-nos de entender o detalhe de cada instru¸ c˜ao separa-
damente, mas sim fornecendo-nos uma vis˜ao da funcionalidade do grupo de
instru¸ c˜oes.
2
A menos que eu compre o molho branco no supermercado.
5
1.4. Algoritmos e Computadores UFMS
1.4 Algoritmos e Computadores
Desde que o homem come¸ cou a processar dados, ele tentou construir
m´aquinas para ajud´a-lo em seu trabalho. O computador moderno ´e o re-
sultado dessas tentativas que vˆem sendo realizadas desde o ano 1.200 a.C.
com a inven¸ c˜ao da calculadora denominada ´abaco, a qual foi mais tarde
aperfei¸ coada pelos chineses. O computador ´e, sem d´ uvida alguma, um dos
principais produtos da ciˆencia do s´eculo XX.
O que ´e um computador? De acordo com o Webster’s New World Dicti-
onary of the American Language (segunda edi¸ c˜ao), um computador ´e “uma
m´aquina eletrˆonica que, por meio de instru¸ c˜oes e informa¸ c˜oes armazenadas,
executa r´apida e frequentemente c´alculos complexos ou compila, correlaciona
e seleciona dados”. Basicamente, um computador pode ser imaginado como
uma m´aquina que manipula informa¸ c˜ao na forma de n´ umeros e caracteres.
Esta informa¸ c˜ao ´e referenciada como dado. O que faz dos computadores
uma m´aquina not´avel ´e a extrema rapidez e precis˜ao com que eles podem
armazenar, recuperar e manipular dados.
Quando desejamos utilizar um computador para nos auxiliar na tarefa
de processamento de dados, deparamo-nos com alguns problemas inerentes
a este processo: “Como informaremos ao computador o algoritmo que deve
ser executado para obtermos o resultado desejado?”, “Como forneceremos a
entrada do algoritmo?” e “Como receberemos o resultado do algoritmo?”
O ato de instruir o computador para que ele resolva um determinado
problema ´e conhecido como programa¸ c˜ao. Esta tarefa nada mais ´e do
que inserir no computador as a¸ c˜oes do algoritmo que corresponde `a solu¸ c˜ao
do problema e os dados referenciados pelas a¸ c˜oes. Entretanto, antes de
inserir as a¸ c˜oes e os dados no computador, devemos reescrevˆe-las em uma
linguagem apropriada para descrever algoritmos computacionais, ou seja,
em uma linguagem de programa¸ c˜ao.
O termo programa ´e comumente empregado para designar o algoritmo
em uma linguagem de programa¸ c˜ao. Entretanto, n˜ao h´a distin¸ c˜ao concei-
tual entre algoritmo e programa no que diz respeito `a linguagem em que eles
est˜ao escritos. A ´ unica diferen¸ ca ´e que um programa n˜ao necessariamente
termina. Um exemplo de programa que nunca termina ´e o sistema operaci-
onal de um computador. Como os programas a serem estudados neste curso
sempre terminar˜ao, n´os utilizaremos os termos programa e algoritmo como
sinˆonimos.
Cada computador possui uma linguagem de programa¸ c˜ao pr´opria, deno-
minada linguagem de m´aquina, e, em geral, distinta das linguagens de
m´aquina dos demais modelos de computador. Esta ´e a ´ unica linguagem de
6
1.4. Algoritmos e Computadores UFMS
programa¸ c˜ao que o computador realmente entende. No entanto, para evitar
que n´os tenhamos de aprender a linguagem de m´aquina de cada computa-
dor diferente para o qual queremos programar, muitas linguagens de pro-
grama¸ c˜ao independentes de m´aquina foram criadas. Se vocˆe aprende uma
linguagem independente de m´aquina, estar´a apto, pelo menos em princ´ıpio,
a programar qualquer computador.
As linguagens de programa¸ c˜ao independentes de m´aquina n˜ao s˜ao com-
preendidas pelos computadores. Ent˜ao, para que elas possam ser ´ uteis para
n´os, um programa denominado compilador deve estar presente no compu-
tador. Um compilador para uma determinada linguagem de programa¸ c˜ao re-
aliza a tradu¸ c˜ao autom´atica de um programa para a linguagem de m´aquina.
Tudo que n´os temos a fazer para executar um programa escrito em uma
linguagem de programa¸ c˜ao, que n˜ao ´e a linguagem de m´aquina do compu-
tador, ´e compilar o nosso programa com o compilador espec´ıfico daquela
linguagem.
Tanto o algoritmo quanto os seus dados de entrada s˜ao inseridos nos
computadores por meio de equipamentos eletrˆonicos conhecidos como pe-
rif´ericos de entrada. O teclado e o mouse s˜ao exemplos de perif´ericos de
entrada. As instru¸ c˜oes e os dados inseridos no computador atrav´es de um
perif´erico de entrada s˜ao armazenados em um dispositivo do computador
denominado mem´ oria. Os dados de sa´ıda resultantes da execu¸ c˜ao do algo-
ritmo pelo computador s˜ao apresentados tamb´em por meio de equipamentos
eletrˆonicos denominados perif´ericos de sa´ıda. O v´ıdeo e a impressora s˜ao
exemplos de perif´ericos de sa´ıda.
O computador executa um determinado programa atrav´es de um dis-
positivo interno denominado unidade central de processamento, mais
conhecido no mundo dos computadores pela sua abrevia¸ c˜ao em Inglˆes: CPU
de Central Processing Unit. A CPU ´e respons´avel por buscar as instru¸ c˜oes e
os dados do programa que est˜ao armazenados na mem´oria do computador,
decodificar as instru¸ c˜oes e executar a tarefa descrita por elas com os respec-
tivos dados. A CPU pode ser imaginada como o “c´erebro” do computador.
No mundo dos computadores, vocˆe ouvir´a as pessoas falarem sobre hard-
ware e software. Hardware se refere `a m´aquina propriamente dita e a todos
os perif´ericos conectados a ela. Software se refere aos programas que fazem
a m´aquina realizar alguma tarefa. Muitos “pacotes” de software est˜ao dis-
pon´ıveis nos dias atuais. Eles incluem processadores de texto, sistemas ge-
renciadores de banco de dados, jogos, sistemas operacionais e compiladores.
Vocˆe pode e aprender´a a criar seus pr´oprios softwares.
Para aprender a criar softwares, vocˆe dever´a adquirir capacidade para:
7
1.4. Algoritmos e Computadores UFMS
• Desenvolver algoritmos para solucionar problemas envolvendo trans-
forma¸ c˜ao de informa¸ c˜ao;
• Usar uma linguagem de programa¸ c˜ao.
Inicialmente, vocˆe deve imaginar que aprender uma linguagem de pro-
grama¸ c˜ao, seja de m´aquina ou n˜ao, ´e a tarefa mais dif´ıcil porque seus pro-
blemas ter˜ao solu¸ c˜oes relativamente f´aceis. Nada poderia ser mais enganoso!
A coisa mais importante que vocˆe pode fazer como um estudante
de Computa¸ c˜ao ´e desenvolver sua habilidade para resolver pro-
blemas. Uma vez que vocˆe possui esta capacidade, vocˆe pode aprender a
escrever programas em diversas linguagens de programa¸ c˜ao.
1.4.1 Hardware
Toda transmiss˜ao de dados, manipula¸ c˜ao, armazenagem e recupera¸ c˜ao
´e realmente realizada por um computador atrav´es de pulsos el´etricos e
magn´eticos representando sequˆencias de d´ıgitos bin´arios (bits), isto ´e, sequˆencias
de 0’s e 1’s. Cada sequˆencia, por sua vez, ´e organizada em 1 ou mais bytes,
que s˜ao grupos de oito bits. Neste contexto, as instru¸ c˜oes e os dados ma-
nipulados pelo computador nada mais s˜ao do que sequˆencias de bytes que
possuem significado para o computador.
As instru¸ c˜oes e os dados s˜ao armazenados na mem´oria do computador.
Um computador possui dois tipos de mem´oria: a prim´aria e a secund´aria.
A primeira ´e tamb´em conhecida como mem´ oria principal ou mem´ oria
tempor´aria e tem como objetivo armazenar as instru¸ c˜oes e os dados de
um programa em execu¸ c˜ao. Esta mem´oria se assemelha a um “gaveteiro”,
pois ´e uma sequˆencia de posi¸ c˜oes de tamanho fixo, cada qual possuindo um
identificador distinto denominado endere¸ co.
Cada posi¸ c˜ao da mem´oria prim´aria armazena uma instru¸ c˜ao ou parte
dela ou um dado do programa. A CPU se comunica constantemente com
a mem´oria prim´aria para obter a pr´oxima instru¸ c˜ao do programa a ser
executada ou um dado necess´ario `a execu¸ c˜ao da instru¸ c˜ao. Tanto as ins-
tru¸ c˜oes quanto os dados s˜ao localizados na mem´oria atrav´es dos endere¸ cos
das posi¸ c˜oes de mem´oria que os contˆem.
O tamanho de cada posi¸ c˜ao de mem´oria ´e dado em bytes. Cada 1024
bytes representam 1 quilobyte (1K), cada 1024K representam 1 megabyte
(1M), cada 1024M representam 1 gigabyte (1G) e cada 1024G representam 1
terabyte (1T). Se o tamanho de uma posi¸ c˜ao de mem´oria de um computador
mede 2 bytes e a mem´oria possui 640 Kbytes de capacidade de armazenagem,
o n´ umero de posi¸ c˜oes de mem´oria ´e igual a 327.680.
8
1.4. Algoritmos e Computadores UFMS
A mem´oria prim´aria perde todo o seu conte´ udo no momento em que o
computador ´e desligado. Ela possui o prop´osito principal de armazenar ins-
tru¸ c˜oes e dados de um programa em execu¸ c˜ao. Sua principal caracter´ıstica ´e
a rapidez com que as informa¸ c˜oes nela armazenadas s˜ao lidas e escritas pela
CPU. Toda vez que um programa deve ser executado, ele ´e inserido antes
na mem´oria prim´aria.
A mem´oria secund´aria possui caracter´ısticas opostas `aquelas da mem´oria
prim´aria. Ela ´e permanente, isto ´e, o computador pode ser desligado, mas ela
n˜ao perde o seu conte´ udo. Ela ´e mais lenta do que a mem´oria principal e, em
geral, possui muito mais capacidade para armazenagem de informa¸ c˜ao. O
principal prop´osito da mem´oria secund´aria ´e armazenar programas e dados
que o computador pode executar e utilizar, respectivamente, em um dado
instante.
Os discos r´ıgidos, os discos flex´ıveis e os CD-ROM’s s˜ao exemplos de
mem´oria secund´aria. Quando um programa armazenado em mem´oria se-
cund´aria precisa ser executado, o computador primeiro transfere o programa
e os dados necess´arios a sua execu¸ c˜ao para a mem´oria e, da´ı, inicia a execu¸ c˜ao
do programa.
As mem´orias tamb´em podem ser classificadas quanto `a permiss˜ao ou n˜ao
para alterarmos o seu conte´ udo. Os principais tipos nesta classifica¸ c˜ao s˜ao:
• Mem´oria de acesso aleat´orio (Random Access Memory - RAM). Este
tipo de mem´oria permite a leitura e a escrita de seus dados em qual-
quer de suas posi¸ c˜oes. O acesso a qualquer posi¸ c˜ao ´e aleat´orio, isto
´e, podemos ter acesso a qualquer posi¸ c˜ao diretamente. A mem´oria
principal de um computador ´e uma mem´oria do tipo RAM.
• Mem´oria apenas para leitura (Read Only Memory - ROM). Este tipo
de mem´oria permite apenas a leitura de seus dados, como o pr´ oprio
nome sugere. O conte´ udo de uma ROM ´e gravado durante seu processo
de fabrica¸ c˜ao, de acordo com a vontade do usu´ario. Uma vez que o
usu´ario decidiu quais dados devem ser armazenados na ROM, ele os
transmite ao fabricante da mem´oria. Feita a grava¸ c˜ao da ROM, o seu
conte´ udo n˜ao poder´a mais ser alterado.
A CPU de um computador, devido a sua complexidade, ´e normalmente
dividida, para fins de estudo e projeto, em duas partes:
• a Unidade de Controle (Control Unit - CU), onde as sequˆencias de
c´odigo bin´ario, que representam as instru¸ c˜oes a serem executadas, s˜ao
identificadas e atrav´es da qual os dados s˜ao obtidos da mem´ oria; e
9
1.4. Algoritmos e Computadores UFMS
• a Unidade L´ogica e Aritm´etica (Arithmetic and Logic Unit - ALU),
onde as instru¸ c˜oes s˜ao efetivamente executadas.
Toda instru¸ c˜ao ´e codificada como uma sequˆencia de bits. Alguns desses
bits identificam a instru¸ c˜ao propriamente dita e os demais contˆem o endere¸ co
da posi¸ c˜ao de mem´oria dos dados usados pela instru¸ c˜ao. A CU interpreta
a sequˆencia de bits e identifica qual ´e a instru¸ c˜ao e, se houver referˆencia
a algum dado, realiza a busca do dado na mem´oria. Estas opera¸ c˜oes s˜ao
realizadas por um conjunto de circuitos l´ogicos que comp˜oe a CU. A execu¸ c˜ao
das instru¸ c˜oes ´e realizada pela ALU.
A CPU tamb´em possui seus pr´oprios elementos de mem´oria. Eles s˜ao
denominados registradores. Os registradores armazenam, em cada ins-
tante, os dados a serem imediatamente processados, isto ´e, os dados refe-
renciados pela instru¸ c˜ao processada no momento e que foram trazidos da
mem´oria principal. Os registradores possibilitam o aumento de velocidade
na execu¸ c˜ao das instru¸ c˜oes, pois os resultados intermedi´arios da instru¸ c˜ao
n˜ao precisam ser armazenados na mem´oria principal.
Com o avan¸ co da microeletrˆonica ´e poss´ıvel construir toda uma CPU em
uma ´ unica pastilha de sil´ıcio. Essa pastilha, ou chip, denomina-se micro-
procesador, sendo conhecido pelo nome de seu fabricante seguido de um
determinado n´ umero, como por exemplo, Intel 80486. Os microprocessado-
res s˜ao classificados pelo tamanho da palavra - ou comprimento, em bits,
da unidade de informa¸ c˜ao - que s˜ao capazes de processar de uma s´o vez.
Os primeiros microprocessadores foram de 8 bits, seguidos pelos de 16 bits,
depois pelos de 32 bits e, mais recentemente, pelos de 64 bits.
As unidades de entrada, que servem para introduzir programas ou
dados no computador, e as unidades de sa´ıda, que servem para receber
programas ou dados do computador, s˜ao denominadas perif´ericos de en-
trada e perif´ericos de sa´ıda, respectivamente. Os perif´ericos de entrada
mais comuns s˜ao:
• Teclado;
• Mouse;
• Unidade de disco;
• Scanner e
• Leitora ´otica.
E, alguns dos perif´ericos de sa´ıda mais comuns s˜ao:
10
1.4. Algoritmos e Computadores UFMS
• V´ıdeo;
• Impressora; e
• Unidade de disco.
1.4.2 Linguagens de Programa¸c˜ao
A primeira gera¸ c˜ao de linguagens de programa¸ c˜ao remonta aos dias de
codifica¸ c˜ao em linguagem de m´aquina. Esta linguagem ´e formada por ins-
tru¸ c˜oes descritas como sequˆencias de bytes, ou seja, ela ´e baseada em um
alfabeto que possui apenas dois elementos, o bit 0 e o bit 1, e cada palavra
(instru¸ c˜ao) da linguagem ´e formada por grupos de oito bits denominados
bytes que possuem significado para o computador. Portanto, um programa
em linguagem de m´aquina poderia se parecer com a seguinte sequˆencia de
bytes:
01000011 00111010 00111011 01000001 00101011 01000100
O tamanho de uma instru¸ c˜ao pode ser de 1 ou mais bytes, dependendo do
n´ umero total de instru¸ c˜oes da linguagem e do n´ umero m´aximo de operandos
por instru¸ c˜ao. Observe que com apenas 1 byte vocˆe pode codificar 256
instru¸ c˜oes! Os dados utilizados por um programa tamb´em s˜ao codificados
com 0’s e 1’s.
Para programar em linguagem de m´aquina, n´os devemos conhecer a
sequˆencia de bits que determina cada instru¸ c˜ao e tamb´em como codificar
os dados em bin´ario. Al´em disso, vocˆe deve conhecer os dispositivos in-
ternos do computador, pois as instru¸ c˜oes de uma linguagem de m´aquina
envolvem diretamente tais dispositivos.
Como a maioria dos problemas resolvidos por computadores n˜ ao envolve
o conhecimento dos dispositivos internos do computador, a programa¸ c˜ao em
linguagem de m´aquina ´e, na maioria das vezes, inadequada, pois o desenvol-
vedor perde mais tempo com os detalhes da m´aquina do que com o pr´oprio
problema. Entretanto, para programas onde o controle de tais dispositivos
´e essencial, o uso de linguagem de m´aquina ´e mais apropriado ou, `as vezes,
indispens´avel.
O pr´oximo passo na evolu¸ c˜ao das linguagens de programa¸ c˜ao foi a cria¸ c˜ao
da linguagem montadora ou assembly. Nesta linguagem, as instru¸ c˜oes da
linguagem de m´aquina recebem nomes compostos por letras, denominados
mnemˆonicos, que s˜ao mais significativos para n´os humanos. Por exemplo,
a instru¸ c˜ao na linguagem montadora do processador 8088 que soma o valor
11
1.4. Algoritmos e Computadores UFMS
no registrador CL com o valor no registrador BH e armazena o resultado em
CL ´e dada por:
ADD CL,BH .
Esta instru¸ c˜ao equivale a seguinte sequˆencia de dois bytes na linguagem de
m´aquina do 8088:
00000010 11001111 .
Para que o computador pudesse executar um programa escrito em lin-
guagem montadora foi desenvolvido um compilador denominado montador
ou assembler, o qual realiza a tradu¸ c˜ao autom´atica de um c´odigo escrito em
linguagem montadora para o seu correspondente em linguagem de m´aquina.
O sucesso da linguagem montadora animou os pesquisadores a criarem
linguagens em que a programa¸ c˜ao fosse realizada atrav´es de instru¸ c˜oes na
l´ıngua inglesa, deixando para o pr´oprio computador a tarefa de traduzir
o c´odigo escrito em tais linguagens para sua linguagem de m´ aquina. Isto
foi poss´ıvel devido `a cria¸ c˜ao de compiladores mais complexos do que os
montadores.
A primeira destas linguagens, que teve ampla aceita¸ c˜ao, surgiu em 1957
e ´e ainda hoje utilizada. Trata-se da linguagem FORTRAN (FORmula
TRANslation). A grande vantagem de linguagens como a FORTRAN ´e
que o programador n˜ao necessita se preocupar com os detalhes internos do
computador, pois as instru¸ c˜oes da linguagem n˜ao envolvem os elementos
internos do computador, tais como os registradores. Este fato tamb´em per-
mitiu a execu¸ c˜ao do mesmo programa em computadores distintos sem haver
altera¸ c˜ao em seu “texto”.
Na d´ecada de 70 surgiu a linguagem C e, na d´ecada de 80, a linguagem
C++. Ambas constituem uma evolu¸ c˜ao na forma de estruturar as instru¸ c˜oes
de um programa e seus respectivos dados em rela¸ c˜ao as suas antecessoras.
Outro aspecto importante da evolu¸ c˜ao das linguagens de programa¸ c˜ao diz
respeito `a quantidade de detalhe que o programador deve fornecer ao com-
putador para que ele realize as tarefas desejadas.
1.4.3 Software
O software pode ser classificado como sendo de dois tipos: b´asico ou
aplicativo. Softwares b´asicos s˜ao programas que administram o funciona-
mento do computador e nos auxiliam a us´a-lo. Softwares aplicativos s˜ao
12
1.5. A Computa¸ c˜ao Como Disciplina UFMS
programas que executam com o aux´ılio dos softwares b´asicos e realizam
tarefas tipicamente resolvidas pelos computadores.
Os principais softwares b´asicos s˜ao:
• Sistema Operacional: conjunto de programas que gerencia o compu-
tador e serve de interface entre os programas do usu´ario e a m´aquina,
isto ´e, controla o funcionamento do computador, as opera¸ c˜oes com
os perif´ericos e as transferˆencias de dados entre mem´oria, CPU e pe-
rif´ericos.
Um sistema operacional pode ser classificado de acordo com a sua
capacidade de execu¸ c˜ao de tarefas como:
– monotarefa: sistema operacional que permite a execu¸ c˜ao de
apenas um programa de cada vez. Por exemplo, o DOS;
– multitarefa: sistema operacional que permite mais de um pro-
grama em execu¸ c˜ao simultaneamente. Por exemplo, o Unix e o
Windows NT.
• Utilit´arios: programas de uso gen´erico que funcionam em conjunto
com o sistema operacional e que tˆem como objetivo executar fun¸ c˜oes
comuns em um computador. Por exemplo, formatadores de disco,
programas que realizam transferˆencia de dados entre computadores,
entre outros.
• Compiladores: programas que traduzem um programa em uma lin-
guagem de programa¸ c˜ao espec´ıfica para seu equivalente em uma lin-
guagem de m´aquina espec´ıfica.
• Interpretadores: programas que, para cada instru¸ c˜ao do programa,
interpretam o seu significado e a executam imediatamente.
• Depuradores: programas que auxiliam o programador a encontrar
erros em seus programas.
Um software aplicativo ´e aquele que realiza tarefas mais especializadas
e que, apoiado nos softwares b´asicos, torna o computador uma ferramenta
indispens´avel `as organiza¸ c˜oes. Por exemplo, editores de texto, programas
de desenho e pintura, programas de automa¸ c˜ao cont´abil, entre outros.
1.5 A Computa¸c˜ao Como Disciplina
A disciplina de Computa¸ c˜ao ´e conhecida por v´arios nomes, tais como
“Ciˆencia da Computa¸ c˜ao”, “Engenharia da Computa¸ c˜ao”, “Inform´atica” e
13
1.5. A Computa¸ c˜ao Como Disciplina UFMS
assim por diante. Qualquer que seja a denomina¸ c˜ao, Computa¸ c˜ao pode
ser entendida como “ o estudo de processos sistem´aticos que descrevem e
transformam informa¸ c˜ao: suas teorias, an´alise, projeto, eficiˆencia, imple-
menta¸ c˜ao e a aplica¸ c˜ao”. A quest˜ao fundamental da Computa¸ c˜ao ´e “O que
pode ou n˜ao ser automatizado?”.
De acordo com o que vimos neste texto, os “processos sistem´aticos que
transformam a informa¸ c˜ao” s˜ao exatamente os algoritmos. Ent˜ao, podemos
dizer que a Computa¸ c˜ao ´e o estudo de algoritmos, mais especificamente, a
teoria, an´alise, projeto, eficiˆencia, implementa¸ c˜ao e aplica¸ c˜ao deles. Cada
uma destas partes ´e abordada em uma ´area espec´ıfica da Computa¸ c˜ao, a
saber:
• Arquitetura. Esta ´area estuda as v´arias formas de fabrica¸ c˜ao e orga-
niza¸ c˜ao de m´aquinas nas quais os algoritmos possam ser efetivamente
executados.
• Linguagens de Programa¸ c˜ao. Esta ´area estuda os m´etodos para
projeto e tradu¸ c˜ao de linguagens de programa¸ c˜ao.
• Teoria da Computa¸ c˜ao. Aqui as pessoas perguntam e respondem
quest˜oes tais como: “Uma determinada tarefa pode ser realizada por
computador?” ou “Qual ´e o n´ umero m´ınimo de opera¸ c˜oes necess´arias
para qualquer algoritmo que execute uma certa tarefa?”
• An´alise de Algoritmos. Esta ´area compreende o estudo da me-
dida do tempo e do espa¸ co que os algoritmos necessitam para realizar
determinadas tarefas.
• Projeto de algoritmos. Esta ´area estuda os m´etodos para desen-
volver algoritmos de forma r´apida, eficiente e confi´avel.
As aplica¸ c˜oes envolvendo algoritmos s˜ao respons´aveis pelo surgimento de
outras ´areas da Computa¸ c˜ao, tais como Sistemas Operacionais, Bancos de
Dados, Inteligˆencia Artificial, entre outras.
Observe que a defini¸ c˜ao de Computa¸ c˜ao dada acima tamb´em menciona
que a Computa¸ c˜ao compreende os “os processos sistem´aticos que descrevem
a informa¸ c˜ao”. Isto ´e, a Computa¸ c˜ao envolve tamb´em o estudo de m´etodos
para representar e armazenar dados a serem utilizados pelos algoritmos du-
rante suas execu¸ c˜oes. Sendo assim, podemos dizer que a Computa¸ c˜ao ´e o
estudo de algoritmos e suas estruturas de dados.
Neste curso, n´os estudaremos m´etodos para construir algoritmos e tamb´em
algumas estruturas de dados simples para representar, no computador, os
dados utilizados pelos algoritmos que construiremos. No ano seguinte, vocˆes
14
1.5. A Computa¸ c˜ao Como Disciplina UFMS
estudar˜ao algoritmos e estruturas de dados conhecidos e bem mais comple-
xos do que aqueles que desenvolveremos neste ano.
Bibliografia
Este texto foi elaborado a partir dos livros abaixo relacionados:
1. Lambert, K.A., Nance, D.W., Naps, T.L. Introduction to Computer
Science with C++. West Publishing Company, 1996.
2. Pothering, G.J., Naps, T.L. Introduction to Data Structures and Al-
gorithm Analysis with C++. West Publishing Company, 1995.
3. Shackelford, R.L. Introduction to Computing and Algorithms. Addison-
Wesley Longman, Inc, 1998.
4. Tucker, A., Bernat, A.P., Bradley, W.J., Cupper, R.D., Scragg, G.W.
Fundamentals of Computing I - Logic, Problem Solving, Programs, and
Computers. C++ Edition. McGraw-Hill, 1995.
15
Os Computadores
HV-1, HV-2 e HIPO 2
Neste T´opico, estudaremos trˆes computadores hipot´eticos: HV-1, HV-2
e HIPO. O estudo do funcionamento destes trˆes computadores nos auxiliar´a
na compreens˜ao do funcionamento dos computadores reais e tamb´em no
aprendizado de conceitos fundamentais da programa¸ c˜ao de computadores,
tais como os conceitos de vari´avel e programa armazenado.
Uma pessoa que denominaremos usu´ario utilizar´a os computadores men-
cionados anteriormente para resolver seus problemas de processamento de
dados. Cada um dos trˆes computadores poder´a funcionar sem a interferˆencia
do usu´ario at´e que a solu¸ c˜ao total do problema seja fornecida a ele.
2.1 O Computador HV-1
O computador HV-1 ´e formado pelos seguintes componentes:
• Um gaveteiro com 100 gavetas;
• Uma calculadora com mostrador e teclado;
• Um pequeno quadro-negro denominado EPI;
• Um porta-cart˜ oes;
• Uma folha de sa´ıda; e
• Um operador do sistema, uma pessoa chamada CHICO, com l´apis,
apagador de quadro-negro e giz.
16
2.1. O Computador HV-1 UFMS
2.1.1 Gaveteiro
O gaveteiro consiste numa sequˆencia de gavetas numeradas de 00 a 99.
O n´ umero de cada gaveta ´e denominado seu endere¸ co. Cada gaveta cont´em
um pequeno quadro-negro, onde ´e escrito um n´ umero sempre com 3 algaris-
mos (por exemplo, 102, 003, etc.) e outras informa¸ c˜oes que veremos mais
tarde. O gaveteiro ´e constru´ıdo de tal maneira que valem as seguintes regras
de utiliza¸ c˜ao:
1. em qualquer momento, no m´aximo uma gaveta pode estar aberta;
2. a leitura do quadro-negro de uma gaveta n˜ao altera o que nele est´a
gravado;
3. a escrita de uma informa¸ c˜ao no quadro-negro de uma gaveta ´e sempre
precedida do apagamento do mesmo; e
4. somente o operador CHICO tem acesso ao gaveteiro.
2.1.2 Calculadora
Trata-se de uma calculadora usual, com teclado para entrada de n´ umeros,
teclas das quatro opera¸ c˜oes aritm´eticas b´asicas, tecla ‘=’ e um mostrador,
que denominaremos acumulador. N˜ao h´a tecla de ponto (ou v´ırgula) deci-
mal ou outra tecla adicional qualquer. H´a dois tipos de opera¸ c˜oes efetuadas
com essa calculadora:
1. carga de um n´ umero no acumulador. Para isso, pressiona-se a tecla
‘=’ (garantindo-se assim o encerramento de alguma opera¸ c˜ ao pr´evia) e
a seguir “digitam-se” os algarismos do n´ umero a ser carregado, o qual
aparece no acumulador;
2. opera¸ c˜ao aritm´etica. Esta ´e sempre feita entre o n´ umero que est´a no
acumulador e um segundo n´ umero. Para isso, pressiona-se a tecla da
opera¸ c˜ao desejada, digita-se o segundo n´ umero e pressiona-se a tecla
‘=’. O resultado da opera¸ c˜ao aparece no acumulador.
Assim como o gaveteiro, a calculadora s´o pode ser utilizada pelo CHICO.
2.1.3 EPI
Trata-se de quadro-negro independente do gaveteiro, com a forma 22,
onde ser´a escrito um n´ umero entre 00 e 99, correspondendo a um endere¸ co
17
2.1. O Computador HV-1 UFMS
de gaveta do gaveteiro. O n´ umero nele escrito indica sempre o “Endere¸ co
da Pr´oxima Instru¸ c˜ao”, donde sua abreviatura.
Somente o CHICO tem acesso ao EPI.
2.1.4 Porta-Cart˜oes
´
E um dispositivo similar aos porta-cigarros onde s˜ao empilhados ma¸ cos
de cigarro a serem vendidos. O porta-cart˜oes funciona de acordo com as
seguintes regras:
1. cart˜oes com informa¸ c˜oes s˜ao colocados exclusivamente pela parte su-
perior, um a um; quando um cart˜ao cont´em um n´ umero, este ´e sempre
escrito com 3 algarismos, como por exemplo, 101, 003, etc;
2. cart˜oes s˜ao retirados da extremidade inferior, um de cada vez, apare-
cendo na mesma ordem em que foram colocados no dispositivo;
3. a retirada de cart˜oes s´o pode ser feita pelo CHICO; e
4. a coloca¸ c˜ao de cart˜oes s´o pode ser feita pelo usu´ario.
2.1.5 Folha de Sa´ıda
Trata-se de uma folha de papel onde pode ser escrito um n´ umero em
cada linha, utilizando-se sempre linhas consecutivas. Somente o CHICO
pode escrever nessa folha; somente o usu´ario pode ler o que j´a foi escrito.
2.1.6 Operador
Resumindo as diversas caracter´ısticas descritas, vemos que o operador
CHICO ´e a ´ unica pessoa que tem acesso ao gaveteiro, `a calculadora, ao EPI,
e ´e o ´ unico que pode retirar cart˜oes do porta-cart˜oes e escrever na folha
de sa´ıda. Ele executa estritamente ordens recebidas, n˜ao podendo tomar
nenhuma iniciativa pr´opria, executando alguma a¸ c˜ao fora da especifica¸ c˜ao
dessas ordens.
O CHICO trabalha sempre em um de dois estados diferentes:
1. Estado de carga, onde ele exclusivamente transcreve informa¸ c˜oes de
cart˜oes, lidos do porta-cart˜oes, para gavetas do gaveteiro.
18
2.1. O Computador HV-1 UFMS
2. Estado de execu¸ c˜ao, onde ele executa ordens gravadas nas gavetas.
Os detalhes do funcionamento desses estados ser˜ao explicados adiante.
A comunica¸ c˜ao entre o usu´ario e o operador ´e feita exclusivamente atrav´es
das unidades porta-cart˜oes e folha de sa´ıda. O CHICO sabe fazer “de
cabe¸ ca” uma ´ unica opera¸ c˜ao aritm´etica: incrementar de 1 o conte´ udo do
EPI.
2.1.7 Programando o HV-1
Para resolver um problema usando o computador HV-1, o usu´ario deve
planejar uma sequˆencia de ordens (o programa) a serem executadas pelo
CHICO. Cada uma dessas ordens ´e denominada instru¸ c˜ao. Um exemplo
de instru¸ c˜ao ´e o seguinte: “some o conte´ udo da gaveta de endere¸ co 41 ao
conte´ udo do acumulador”. A fim de se produzir a execu¸ c˜ao correta das ins-
tru¸ c˜oes e na sequˆencia adequada, elas s˜ao escritas nas gavetas do gaveteiro.
Para executar uma instru¸ c˜ao da sequˆencia, o CHICO segue os seguintes
passos:
1. consulta o EPI, onde est´a escrito o endere¸ co E da pr´oxima instru¸ c˜ao;
2. incrementa de 1 o conte´ udo do EPI, apagando o valor anterior e es-
crevendo o novo valor (o qual neste caso ser´a E+1);
3. abre a gaveta de endere¸ co E; nesta gaveta ele deve encontrar uma
instru¸ c˜ao I, que ´e lida;
4. fecha a gaveta E; e
5. executa I.
Ap´os finalizados esses passos, o CHICO recome¸ ca do passo 1, com exce¸ c˜ao
de um caso explicado a seguir. Se a execu¸ c˜ao da instru¸ c˜ao I n˜ao acarretar
altera¸ c˜ao no conte´ udo do EPI, a pr´oxima instru¸ c˜ao a ser executada ser´a a
da gaveta de endere¸ co E+1, devido ao passo 2. Se uma instru¸ c˜ao acarretar
altera¸ c˜ao no EPI, mudando o seu conte´ udo para X, a pr´oxima instru¸ c˜ao a
ser executada ser´a a da gaveta de endere¸ co X; diz-se que houve um desvio
para X.
As instru¸ c˜oes escritas nas gavetas do gaveteiro constituem um pro-
grama armazenado. Para conseguir a execu¸ c˜ao de um programa, o usu´ario
deve produzir inicialmente o armazenamento desse programa no gaveteiro,
passando portanto a constituir um programa armazenado. Isso ´e feito da
seguinte forma:
19
2.1. O Computador HV-1 UFMS
1. o usu´ario escreve cada instru¸ c˜ao em um cart˜ao, precedida de um en-
dere¸ co; assim, cada cart˜ao do programa cont´em um par ordenado (E,I),
onde E ´e um endere¸ co e I uma instru¸ c˜ao;
2. o CHICO ´e colocado em estado de carga de programa;
3. o usu´ario coloca o conjunto de cart˜oes do programa no porta-cart˜oes,
em qualquer ordem;
4. como o CHICO est´a em estado de carga, ele lˆe um cart˜ao com um
par (E,I); abre a gaveta de endere¸ co E; escreve em seu quadro-negro a
instru¸ c˜ao I; fecha essa gaveta;
5. o CHICO repete o passo 4 at´e ler o ´ ultimo cart˜ao de programa, ap´os
o que ele ´e colocado em estado de execu¸ c˜ao de programa.
Ap´os o encerramento da carga do programa, o CHICO ´e colocado em
estado de execu¸ c˜ao de programa. Isso ´e feito por meio de um cart˜ao especial,
que deve encerrar o conjunto de cart˜oes de programa. A forma desse cart˜ao
´e “EXECUTE X”, onde X ´e um n´ umero escrito pelo usu´ario; ser´a o endere¸ co
da gaveta onde se encontra a primeira instru¸ c˜ao a ser executada.
Ao ler esse cart˜ao, o CHICO apaga o EPI e escreve o mesmo valor X; a
seguir, ele vai para o passo 1 da execu¸ c˜ao de uma instru¸ c˜ao, como exposto
no in´ıcio deste item.
Para completar este quadro, resta descrever como o CHICO entra em
estado de carga de programa. Vamos supor que, na verdade, esse estado
seja o estado “normal” do CHICO; ele s´o pode sair desse estado ao tentar
carregar um cart˜ao “EXECUTE X”. Estando em estado de execu¸ c˜ao, ele s´o
sai desse estado nos dois casos seguintes:
1. atrav´es da execu¸ c˜ao da instru¸ c˜ao “pare a execu¸ c˜ao”;
2. se ocorrer algum erro durante a execu¸ c˜ao.
Um exemplo do caso 2 ´e o de o CHICO tentar executar uma instru¸c˜ao
inv´alida, isto ´e, n˜ao conhecida.
2.1.8 Instru¸c˜oes do HV-1
O conte´ udo de uma gaveta de endere¸ co E, isto ´e, o n´ umero gravado em
seu quadro-negro, ser´a representado por cE. Assim, c10 indicar´a o conte´ udo
da gaveta 10. Indicaremos por cAC o conte´ udo do acumulador; este ser´a
abreviado por AC.
20
2.1. O Computador HV-1 UFMS
2.1.8.1 Soma
• Instru¸ c˜ao: “some o cE ao AC”.
• Significado: some o cE ao cAC e coloque o resultado no AC; o cE n˜ ao
se altera.
• Execu¸ c˜ao: o CHICO efetua os seguintes passos:
1. digita a tecla ‘+’ da calculadora;
2. abre a gaveta de endere¸ co E;
3. lˆe o n´ umero escrito nessa gaveta (cE) e digita-o na calculadora;
4. fecha a gaveta E; e
5. digita ‘=’ na calculadora.
Daqui em diante, em lugar de escrevermos “gaveta de endere¸ co E”, escre-
veremos simplesmente E. Tamb´em deixaremos de mencionar explicitamente
que ´e o CHICO quem efetua os passos da execu¸ c˜ao.
2.1.8.2 Carga no AC
• Instru¸ c˜ao: “carregue o cE no AC”.
• Significado: copie o cE no AC; o cE n˜ao muda.
• Execu¸ c˜ao:
1. digita ‘=’;
2. abre E;
3. lˆe cE e digita-o; e
4. fecha E.
2.1.8.3 Armazenamento do AC
• Instru¸ c˜ao: “armazene o cAC em E”.
• Significado: copie o cAC em E; o cAC n˜ao muda (oposto da instru¸ c˜ao
anterior).
• Execu¸ c˜ao:
1. abre E;
2. apaga o cE;
3. lˆe o cAC e o escreve em E; e
4. fecha a gaveta.
21
2.1. O Computador HV-1 UFMS
2.1.8.4 Impress˜ao
• Instru¸ c˜ao: “imprima o cE”.
• Significado: o cE ´e transcrito na folha de sa´ıda.
• Execu¸ c˜ao:
1. abre E;
2. lˆe cE e escreve seu valor na pr´oxima linha da folha de sa´ıda; e
3. fecha a gaveta.
Note que supusemos haver espa¸ co na folha de sa´ıda. No caso contr´ario,
o CHICO aguarda at´e ser fornecida nova folha.
2.1.8.5 Leitura
• Instru¸ c˜ao: “leia um cart˜ao e guarde em E”.
• Significado: o conte´ udo do pr´oximo cart˜ao do porta-cart˜ oes ´e lido e
transcrito para E;
• Execu¸ c˜ao:
1. abre E;
2. retira um cart˜ao do porta-cart˜oes;
3. lˆe o conte´ udo do cart˜ao e escreve o seu valor em E;
4. joga fora o cart˜ao; e
5. fecha E.
Note que supusemos haver cart˜ao no porta-cart˜oes. Em caso contr´ario,
o CHICO aguarda a coloca¸ c˜ao de pelo menos um cart˜ao no porta-cart˜oes.
2.1.8.6 Desvio Condicional
• Instru¸ c˜ao: “se cAC= 0, desvie para E”.
• Significado: se h´a um n´ umero diferente de 0 no AC, a pr´oxima ins-
tru¸ c˜ao a ser executada est´a em E, caso contr´ario n˜ao h´a nada a fazer
(isto ´e, a pr´oxima instru¸ c˜ao a ser executada estar´a na gaveta seguinte
`a que cont´em esta instru¸ c˜ao).
• Execu¸ c˜ao:
1. lˆe o cAC; e
2. se cAC=0 ent˜ao apaga o EPI e escreve E no mesmo.
22
2.1. O Computador HV-1 UFMS
2.1.8.7 Pare
• Instru¸ c˜ao: “pare”.
• Significado: encerra a execu¸ c˜ao do programa.
• Execu¸ c˜ao:
1. entrega a folha de sa´ıda para o usu´ario; e
2. entra no estado de carga.
2.1.9 Exemplo de Programa
Considere o seguinte problema:

´
E dada uma sequˆencia de n´ umeros inteiros positivos; determinar sua
soma”.
Suponhamos que o usu´ario do computador HV-1 planeje resolver o pro-
blema da seguinte maneira:
1. cada n´ umero da sequˆencia ´e escrito em um cart˜ao;
2. dois cart˜oes adicionais contendo o n´ umero 0 s˜ao colocados um imedi-
atamente antes do primeiro cart˜ao da sequˆencia, e o outro logo ap´os o
´ ultimo cart˜ao;
3. o programa ´e escrito em cart˜oes j´a no formato de carga de programa
como mostrado na tabela abaixo:
endere¸ co instru¸ c˜ao
01 leia um cart˜ao e guarde em 11
02 leia um cart˜ao e guarde em 12
03 imprima o c12
04 carregue no AC o c11
05 some o c12 ao AC
06 armazene o cAC em 11
07 carregue o c12 no AC
08 se cAC= 0, desvie para 02
09 imprima o c11
10 pare
4. ´e formada uma pilha de cart˜oes com a seguinte ordem: programa -
EXECUTE 01 - cart˜oes conforme 1 e 2 acima. Essa pilha ´e colocada
23
2.1. O Computador HV-1 UFMS
no porta-cart˜oes. Teremos nesta unidade, portanto, os cart˜oes denomi-
nados cart˜oes de programa e cart˜oes de dados, precedendo e seguindo,
respectivamente, o cart˜ao EXECUTE; e
5. terminada a execu¸ c˜ao, ´e recebida a folha de sa´ıda, onde estar˜ao im-
pressos os n´ umeros da sequˆencia, seguidos da soma procurada.
Para compreendermos como funciona o processo descrito pelo programa
e pelos cart˜oes de dados, vejamos um exemplo concreto.
Seja a sequˆencia 100, 5 e 31. Os cart˜oes de dados conter˜ao, conforme 1
e 2, os seguintes valores, pela ordem: 000, 100, 005, 031 e 000. Suponhamos
que o CHICO tenha carregado o programa e tenha encontrado o cart˜ao
EXECUTE 01. Como vimos na Sub-Se¸ c˜ao 2.1.7, ele apaga o EPI, escreve
nele o n´ umero 01, e come¸ ca a executar as instru¸ c˜oes do programa conforme
os passos 1 a 5 descritos no in´ıcio daquela Sub-Se¸ c˜ao.
Se n´os fizermos um acompanhamento do papel do CHICO na execu¸ c˜ao
do programa, obteremos a tabela de execu¸ c˜ao a seguir:
24
2.2. O Computador HV-2 UFMS
g pc cAC c11 12 fs cEPI
000,100,005,031,000 01
01 100,005,031,000 000 02
02 005,031,000 000 100 03
03 005,031,000 000 100 100 04
04 005,031,000 000 000 100 100 05
05 005,031,000 100 000 100 100 06
06 005,031,000 100 100 100 100 07
07 005,031,000 100 100 100 100 08
08 005,031,000 100 100 100 100 02
02 031,000 100 100 005 100 03
03 031,000 100 100 005 100,005 04
04 031,000 100 100 005 100,005 05
05 031,000 105 100 005 100,005 06
06 031,000 105 105 005 100,005 07
07 031,000 005 105 005 100,005 08
08 031,000 005 105 005 100,005 02
02 000 005 105 031 100,005 03
03 000 005 105 031 100,005,031 04
04 000 105 105 031 100,005,031 05
05 000 136 105 031 100,005,031 06
06 000 136 136 031 100,005,031 07
07 000 031 136 031 100,005,031 08
08 000 031 136 031 100,005,031 02
02 031 136 000 100,005,031 03
03 031 136 000 100,005,031,000 04
04 136 136 000 100,005,031,000 05
05 136 136 000 100,005,031,000 06
06 136 136 000 100,005,031,000 07
07 000 136 000 100,005,031,000 08
08 000 136 000 100,005,031,000 09
09 000 136 000 100,005,031,000,136 10
10 000 136 000 100,005,031,000,136
onde “g” ´e o n´ umero da gaveta com a instru¸ c˜ao, “pc” ´e o porta-cart˜oes, “fs”
´e a folha de sa´ıda e “cEPI” ´e o conte´ udo do EPI.
2.2 O Computador HV-2
As instru¸ c˜oes do computador HV-1 est˜ao escritas por extenso, diferindo
assim dos n´ umeros armazenados em outras gavetas, como as de endere¸ co 11
25
2.2. O Computador HV-2 UFMS
e 12 no programa exemplo da Sub-Se¸ c˜ao 2.1.9. Consiguiremos uma grande
simplifica¸ c˜ao de nota¸ c˜ao e de funcionamento se codificarmos as instru¸ c˜oes,
transformando-as tamb´em em n´ umero. Como veremos mais tarde, isso per-
mitir´a inclusive a substitui¸ c˜ao, com relativa facilidade, do operador CHICO
por dispositivos eletrˆonicos. Para simplificar a compreens˜ao, suponhamos
que cada gaveta do gaveteiro contenha um quadro-negro da seguinte forma:
222,
onde o CHICO s´o pode escrever n´ umeros de 3 algarismos, como 001, 015,
152, etc. O novo computador assim obtido receber´a a sigla HV-2.
No computador HV-2, as instru¸ c˜oes dever˜ao ser necessariamente codifi-
cadas como n´ umeros de 3 algarismos, para podermos grav´a-las no gaveteiro.
Elas ter˜ao a forma CEE, onde C ´e um d´ıgito de 1 a 7 e corresponde ao c´ odigo
da instru¸ c˜ao; EE ´e um n´ umero de 00 a 99 e corresponde ao endere¸ co da
gaveta empregada na execu¸ c˜ao da instru¸ c˜ao, denominado c´ odigo de en-
dere¸ co. As instru¸ c˜oes vistas na Se¸ c˜ao 2.1.8 ser˜ao codificadas conforme a
tabela dada a seguir:
instru¸ c˜ao codificada instru¸ c˜ao
1EE carregue o cEE no AC
2EE armazene o cAC em EE
3EE leia um cart˜ao e guarde em EE
4EE imprima o cEE
5EE some o cEE ao AC
6EE se cAC= 0 desvie para EE
7EE pare
Lembremos que cEE significa conte´ udo (agora sempre com 3 d´ıgitos) da
gaveta de endere¸ co EE. Na instru¸ c˜ao “pare” usamos sempre EE=0.
Por exemplo, a instru¸ c˜ao 512 encontrada pelo CHICO em alguma gaveta
´e interpretada por ele como “some o conte´ udo da gaveta 12 ao conte´ udo do
acumulador e guarde o resultado no acumulador”. Na tabela dada a seguir
apresentamos o programa da Sub-Se¸ c˜ao 2.1.9 codificado para o computador
HV-2:
26
2.2. O Computador HV-2 UFMS
endere¸ co instru¸ c˜ao codificada
01 311
02 312
03 412
04 111
05 512
06 211
07 112
08 602
09 411
10 700
Observe um fato muito importante: ´e imposs´ıvel, no modelo HV-2,
distinguir-se o conte´ udo de uma gaveta como correspondendo a uma ins-
tru¸ c˜ao codificada ou a um n´ umero manipulado por certas instru¸ c˜oes, o que
n˜ao era o caso do modelo HV-1. Por exemplo, seguindo a execu¸ c˜ao do pro-
grama exemplo da Sub-Se¸ c˜ao 2.1.9, vemos, na d´ecima quarta linha, que a
gaveta 11 recebe o conte´ udo 105, correpondendo ao n´ umero “cento e cinco”
(resultado da soma at´e esse momento) e n˜ao `a instru¸ c˜ao “carregue no AC o
c05”. Como pode o CHICO distinguir esses dois significados? Na verdade,
a distin¸ c˜ao ´e feita atrav´es da situa¸ c˜ao em que o CHICO se encontra ao se
utilizar de uma gaveta (no caso, a 11). Assim, se ele estiver abrindo uma
gaveta (no caso, a 11) `a procura da pr´oxima instru¸ c˜ao a ser executada, o
seu conte´ udo ser´a interpretado como sendo uma instru¸ c˜ao codificada (no
caso, a instru¸ c˜ao 105). Por outro lado, se essa gaveta for aberta durante
a execu¸ c˜ao de uma instru¸ c˜ao, o seu conte´ udo ser´a usado como um valor
num´erico (no caso, o n´ umero 105).
A id´eia de se armazenar as instru¸ c˜oes da mesma maneira que os dados
´e atribu´ıda ao famoso matem´atico americano John Von Neumann, que em
meados da d´ecada de 1940 propˆos esse esquema. Esse conceito foi um dos
motivos que possibilitou a r´apida evolu¸ c˜ao dos computadores da´ı para frente.
A codifica¸ c˜ao, por meio de n´ umeros, de instru¸ c˜oes que manipulam n´ umeros
´e, em essˆencia, a id´eia fundamental. Uma id´eia an´aloga foi aplicada na
d´ecada de 1930 pelo matem´atico alem˜ao G¨odel, o qual codificou numeri-
camente teoremas sobre n´ umeros, permitindo assim se enunciar teoremas
sobre teoremas, chegando ao seu famoso “teorema da incompletude” dos
sistemas axiom´aticos.
27
2.3. O Computador HIPO UFMS
2.3 O Computador HIPO
O fabricante dos computadores HV-2 percebeu, em um dado instante,
que eles tinham as seguintes desvantagens:
1. os valores num´ericos que podiam ser representados nas gavetas eram
muito restritos, permitindo apenas 3 algarismos, sem sinal;
2. o operador CHICO era muito lento;
3. da mesma maneira, o mecanismo das gavetas e de outros componentes
tamb´em era muito lento. Assim, propˆos-se a fabricar um outro com-
putador, que denominou de HIPO (cuja sigla prov´em de “computador
hipot´etico”). Podemos descrever a sua organiza¸ c˜ao comparando-a com
a do HV-2.
2.3.1 Mem´oria
Em lugar do gaveteiro, o HIPO disp˜oe de um dispositivo eletrˆonico, de-
nominado mem´ oria, com regras de funcionamento an´alogas `as do gaveteiro
do HV-2. Este dispositivo cont´em partes, denominadas c´elulas, que corres-
pondem `as gavetas no gaveteiro. Cada c´elula tem comprimento de 8 bits
(1 byte). O modelo mais simples do HIPO ´e produzido com mem´oria de 32
c´elulas, de endere¸ cos 00 a 31.
Em cada c´elula podem ser representadas instru¸ c˜oes codificadas como
especificado mais adiante ou um n´ umero inteiro de -128 a 127, representado
por complemento de 2 (dois).
2.3.2 CPU
No caso do computador HV-2, um operador, o CHICO, acionava todos os
dispositivos, seja gaveteiro ou calculadora. No HIPO, esse papel ´e desempe-
nhado por um sistema de circuitos eletrˆonicos, cujo funcionamento equivale
`as a¸ c˜oes executadas pelo CHICO no HV-2. Esse sistema ´e denominado de
Unidade de Controle ou simplesmente UC.
Na Se¸ c˜ao 2.1.6 foi dito que o CHICO pode estar em um dos dois estados:
“carga” e “execu¸ c˜ao”. Analogamente, a unidade de controle do HIPO estar´a
um um desses dois estados em qualquer instante. O CHICO interpretava
as instru¸ c˜oes escritas nas gavetas do HV-2. As instru¸ c˜oes interpretadas por
essa UC do HIPO e armazenadas na mem´oria tˆem o formato mostrado a
seguir:
28
2.3. O Computador HIPO UFMS
C C C E E E E E
onde os d´ıgitos bin´arios “CCC” representam o c´odigo da instru¸ c˜ao e os
d´ıgitos bin´arios “EEEEE” representam o endere¸ co de uma c´elula de mem´oria.
No lugar da calculadora, o computador HIPO realiza as opera¸ c˜oes aritm´eticas
por meio de um conjunto de circuitos denominado Unidade L´ ogica e
Aritm´etica ou simplesmente ULA. Para executar uma opera¸ c˜ao de soma,
por exemplo, impulsos eletrˆonicos s˜ao encaminhados `a se¸ c˜ao apropriada do
circuito da ALU, iniciando uma sequˆencia de opera¸ c˜oes que resulta na ob-
ten¸ c˜ao do resultado da opera¸ c˜ao no acumulador. O acumulador ´e um regis-
trador acess´ıvel eletronicamente, isto ´e, n˜ao possui exibi¸ c˜ao visual.
2.3.3 EPI
O endere¸ co da pr´oxima instru¸ c˜ao ´e um registrador eletrˆonico, sem exibi¸ c˜ao
visual, com formato de um n´ umero com 5 algarismos bin´arios. Somente
a CPU do HIPO tem acesso ao EPI, podendo consult´a-lo ou alterar seu
conte´ udo.
2.3.4 Unidade de Entrada
Em lugar do porta-cart˜oes, o HIPO cont´em uma unidade de entrada
com capacidade para ler eletronicamente linhas de entrada com o formato
apresentado a seguir:
I/D :22222222 e E :22222.
Isto ´e, cada linha de entrada cont´em duas partes. Se a unidade de controle
est´a em estado de execu¸ c˜ao, s´o ´e utilizada a parte I/D (iniciais de Instru¸ c˜ao/
Dado). O usu´ario especifica na mesma um n´ umero de 8 d´ıgitos bin´arios, onde
o d´ıgito mais significativo representa o sinal do n´ umero (0-n˜ao negativo e
1-negativo). Uma instru¸ c˜ao de leitura executada pela unidade de controle
provoca a transcri¸ c˜ao do n´ umero dado pelo usu´ario na linha de entrada
para uma c´elula da mem´oria. O endere¸ co dessa c´elula ´e especificado pela
instru¸ c˜ao de leitura.
No estado de carga, o usu´ario especifica em I/D uma instru¸ c˜ao conforme
o formato dado na Se¸ c˜ao 2.3.2 e, em E, o endere¸ co da c´elula de mem´oria
onde a instru¸ c˜ao deve ser carregada. O mesmo esquema do HV-1 ´e usado
para se mudar a unidade de controle do estado de carga para o estado de
execu¸ c˜ao e vice-versa.
29
2.3. O Computador HIPO UFMS
V´arios dispositivos podem ser usados como unidade de entrada: cart˜oes
perfurados (onde furos codificam os elementos das linhas), cart˜oes marcados
a l´apis ou com tinta magn´etica, teclado como de m´aquina de escrever, etc.
Todos eles transformam a representa¸ c˜ao externa acess´ıvel ao usu´ario em
impulsos eletrˆonicos que s˜ao enviados pela unidade de controle `a mem´oria,
posicionando os circuitos desta a fim de que as c´elulas envolvidas tenham
um conte´ udo equivalente `a representa¸ c˜ao externa.
2.3.5 Unidade de Sa´ıda
Em lugar da folha de sa´ıda do HV-2, o HIPO cont´em uma unidade de
sa´ıda com capacidade de gravar linhas de sa´ıda. Cada uma destas consiste
em um n´ umero com 8 d´ıgitos bin´arios, onde o d´ıgito mais significativo indica
o sinal do n´ umero (0-n˜ao negativo e 1-negativo).
Novamente, nenhum dispositivo de sa´ıda particular foi indicado, podendo
o mesmo ser uma m´aquina de escrever, uma impressora de linha, um termi-
nal de v´ıdeo, etc.
2.3.6 Instru¸c˜oes do HIPO
Vejamos algumas das instru¸ c˜oes do computador HIPO. Supomos que
as instru¸ c˜oes tenham c´odigo de endere¸ co “EEEEE”. Lembramos que cAC
abrevia “conte´ udo do acumulador”.
instru¸ c˜ao codificada significado
001EEEEE carrega o cEEEEE no AC
010EEEEE armazena o cAC em EEEEE
011EEEEE lˆe uma linha de entrada e p˜oe seu conte´ udo em EEEEE
100EEEEE grava o cEEEEE em uma linha de sa´ıda
101EEEEE soma o cEEEEE ao cAC e guarda o resultado em AC
110EEEEE desvia para EEEEE se cAC= 0
111EEEEE pare
000EEEEE inicia o estado de execu¸ c˜ao com a instru¸ c˜ao em EEEEE
2.3.7 Exemplo de Programa
A tabela a seguir ilustra o programa da Se¸ c˜ao 2.1.9 escrito na linguagem
de m´aquina do computador HIPO.
30
2.4. Bibliografia UFMS
endere¸ co instru¸ c˜ao
00000 01101010
00001 01101011
00010 10001011
00011 00101010
00100 10101011
00101 01001010
00110 00101011
00111 11000001
01000 10001010
01001 11100000
2.4 Bibliografia
O texto apresentado neste Cap´ıtulo foi retirado e adaptado, com fins
did´atico, do Cap´ıtulo 2, “O Computador `a Gaveta”, do livro “Introdu¸ c˜ao
`a Computa¸ c˜ao e `a Constru¸ c˜ao de Algoritmos” de autoria dos professores
Routo Terada e Waldemar W. Setzer, publicado pela editora Makron Books
do Brasil em 1992.
31
Desenvolvimento de
Algoritmos - Parte I 3
Neste t´opico, vocˆe encontrar´a uma breve descri¸ c˜ao dos componentes de
um algoritmo e aprender´a a construir algoritmos utilizando os componentes
mais simples e uma linguagem de programa¸ c˜ao virtual.
3.1 Componentes de um Algoritmo
Quando desenvolvemos algoritmos, trabalhamos, tipicamente, com sete
tipos de componentes: estruturas de dados, vari´ aveis, constantes, instru¸ c˜ oes
de manipula¸ c˜ ao de dados, express˜ oes condicionais, estruturas de controle e
m´ odulos. Cada um destes tipos de componentes est˜ao descritos brevemente
a seguir:
• Estrutura de dados, vari´aveis e constantes. Dados s˜ao repre-
senta¸ c˜oes de informa¸ c˜oes usadas por um algoritmo. Isto inclui dados
de entrada e sa´ıda, bem como dados gerados pelo algoritmo para seu
pr´oprio uso. Quando um algoritmo ´e executado por um computador,
os valores dos dados por ele manipulados devem ser armazenados em
algum “dep´osito”, de modo que tais valores estejam dispon´ıveis para
serem usados pelo algoritmo a qualquer momento. A defini¸ c˜ao da or-
ganiza¸ c˜ao interna de tais “dep´ositos”, bem como da rela¸c˜ao entre suas
partes, ´e conhecida como estrutura de dados.
Na maior parte das vezes, desejamos que um “dep´osito” de dados
seja vari´ avel, isto ´e, que o seu conte´ udo possa ser alterado durante
a execu¸ c˜ao do algoritmo. Por exemplo, no algoritmo para calcu-
lar o MDC de dois n´ umeros naturais (ver Cap´ıtulo 1), a, b e r s˜ao
“dep´ositos” para valores de dados cujos conte´ udos mudam durante a
execu¸ c˜ao do algoritmo. Outras vezes, queremos que o conte´ udo de um
32
3.1. Componentes de um Algoritmo UFMS
“dep´osito” de dados seja constante, ou seja, que ele n˜ao seja alterado
durante a execu¸ c˜ao do algoritmo.
• Instru¸ c˜ oes para Manipula¸ c˜ao de Dados. Qualquer algoritmo
requer instru¸ c˜oes que fa¸ cam o seguinte: obtenham valores de da-
dos fornecidos pelo usu´ario e armazenem-os em estruturas de dados;
manipulem aqueles valores de dados, isto ´e, modifiquem o valor de
uma vari´avel atrav´es de opera¸ c˜oes aritm´eticas, copiem o valor de uma
vari´avel para outra, entre outras; comuniquem os valores de dados
resultantes do algoritmo ao usu´ario.
• Express˜oes condicionais. Algoritmos tamb´em apresentam “pontos
de decis˜ao”. A capacidade de um algoritmo de tomar decis˜oes ´e o que
o faz potente. Se um algoritmo n˜ao pudesse fazer mais do que seguir
uma ´ unica lista de opera¸ c˜ao, ent˜ao um computador nada mais seria
do que uma m´aquina de calcular.
Tais decis˜oes s˜ao baseadas em express˜oes condicionais que, quando
avaliadas, resultam em apenas um dos seguintes dois valores: verda-
deiro ou falso. Por exemplo, no algoritmo para calcular o MDC de dois
n´ umeros naturais (ver Cap´ıtulo 1), a compara¸ c˜ao “r ´e igual a zero” ´e
um exemplo de express˜ao condicional. O resultado desta compara¸ c˜ao
pode ser apenas verdadeiro ou falso, dependendo se r ´e igual a zero ou
n˜ao, respectivamente.
Se uma express˜ao condicional ´e verdadeira, o algoritmo pode agir de
diferentes formas, tal como executar certas instru¸ c˜oes ou n˜ao execut´a-
las. Portanto, a partir do resultado de uma express˜ao condicional, o
algoritmo pode tomar decis˜oes diferentes. No algoritmo para calcular
o MDC, se a express˜ao condicional “r ´e igual a zero” ´e verdadeira, o
algoritmo encerra sua execu¸ c˜ao. Do contr´ario, ele continua a execu¸ c˜ao.
• Estruturas de controle. Os elementos de um algoritmo que go-
vernam o que ocorre depois que um algoritmo toma uma decis˜ao s˜ao
denominados estruturas de controle. Sem estruturas de controle, as
decis˜oes n˜ao possuem qualquer valor. Isto ´e, o que adianta tomar
uma decis˜ao se vocˆe n˜ao pode efetu´a-la? Sem estruturas de controle,
o algoritmo ´e apenas uma lista de instru¸ c˜oes que deve ser executada
sequencialmente. Estruturas de controle permitem que um algoritmo
possa tomar decis˜oes e, a partir delas, executar algumas instru¸ c˜oes ou
n˜ao, repetir a execu¸ c˜ao de certas instru¸ c˜oes e executar um grupo de
instru¸ c˜oes em detrimento de outro.
No algoritmo para calcular o MDC de dois n´ umeros naturais foi uti-
lizada uma estrutura de controle condicional que permite encerrar ou
n˜ao a execu¸ c˜ao do algoritmo, dependendo do resultado da avalia¸ c˜ao
da express˜ao condicional “r ´e igual a zero”: “se r ´e igual a zero ent˜ao
33
3.2. Uma Linguagem para Algoritmos UFMS
o MDC ´e igual a b e a execu¸ c˜ao encerra aqui. Caso contr´ario, siga
para a pr´oxima instru¸ c˜ ao”.
• M´odulos. Algoritmos podem se tornar muito complexos, de modo
que agrupar todos os seus componentes em uma ´ unica unidade far´a
com que o algoritmo seja dif´ıcil de entender, dif´ıcil de manter e dif´ıcil
de estender. Para evitar que isso ocorra, constru´ımos nossos algorit-
mos utilizando m´odulos, que s˜ao trechos de algoritmos que agrupam
instru¸ c˜oes e dados necess´arios para a realiza¸ c˜ao de uma dada tarefa
l´ogica do algoritmo, que seja a mais independente poss´ıvel das demais.
A utiliza¸ c˜ao de m´odulos facilita o entendimento do algoritmo, pois eles
s˜ao menores do que o algoritmo como um todo e podem ser entendidos
individualmente, isto ´e, para entendermos um deles n˜ao precisamos,
necessariamente, entender os demais, visto que eles s˜ao partes indepen-
dentes do algoritmo. A manuten¸ c˜ao do algoritmo tamb´em ´e facilitada,
pois a modifica¸ c˜ao de um m´odulo n˜ao deve afetar os demais, desde que
o m´odulo continuar´a fazendo o que ele fazia antes. Por ´ ultimo, a ex-
tens˜ao de um algoritmo pode ser feita mais facilmente se pudermos
reutilizar m´odulos j´a existentes.
3.2 Uma Linguagem para Algoritmos
A experiˆencia tem mostrado que ´e necess´ario expressar id´eias algor´ıtmicas
em uma forma mais precisa e mais compacta do que aquela encontrada em
uma “linguagem natural”, tal como Portuguˆes. H´a muitas linguagens que
poder´ıamos utilizar com o prop´osito de escrever algoritmos, incluindo qual-
quer linguagem de programa¸ c˜ao, as quais nos permitem escrever algoritmos
em uma forma que os computadores podem entender.
A vantagem de usar uma linguagem de programa¸ c˜ao ´e que podemos, de
fato, executar nossos algoritmos em um computador. Entretanto, para o
prop´osito de introduzir conceitos algor´ıtmicos, esta abordagem possui trˆes
s´erias desvantagens:
• Linguagens de programa¸ c˜ao s˜ao criadas com algum prop´osito espec´ıfico
em mente e, desta forma, enfatizam algumas caracter´ısticas em detri-
mento de outras. N˜ao h´a linguagem de programa¸ c˜ao que possa ser
considerada “a melhor”. A op¸ c˜ao por qualquer uma delas resultaria
em compromissos que omitem a diferen¸ ca entre propriedades impor-
tantes de algoritmos e as propriedades de certos tipos de programas.
• As linguagens de programa¸ c˜ao incluem muitos detalhes t´ecnicos que
34
3.3. Tipos de Dados UFMS
introduzem dificuldades extras que n˜ao est˜ao relacionadas com o as-
pecto l´ogico da resolu¸ c˜ao de problemas algor´ıtmicos.
• Os praticantes se tornam t˜ao envolvidos com os aspectos t´ecnicos das
linguagens que desviam a aten¸ c˜ao da importˆancia de um bom projeto
de algoritmo.
Por estas raz˜oes, neste curso, os algoritmos ser˜ao descritos em pseu-
doc´odigo (uma linguagem virtual de programa¸ c˜ao). Entretanto, oportuna-
mente, traduziremos alguns algoritmos que construiremos na sala de aula
para seus equivalentes na linguagem de programa¸ c˜ao C++.
3.3 Tipos de Dados
Os dados manipulados por um algoritmo podem possuir natureza dis-
tinta, isto ´e, podem ser n´ umeros, letras, frases, etc. Dependendo da natureza
de um dado, algumas opera¸ c˜oes podem ou n˜ao fazer sentido quando aplica-
das a eles. Por exemplo, n˜ao faz sentido falar em somar duas letras. Para
poder disting¨ uir dados de naturezas distintas e saber quais opera¸ c˜oes podem
ser realizadas com eles, os algoritmos lidam com o conceito de tipo de dados.
O tipo de um dado define o conjunto de valores ao qual o valor do
dado pertence, bem como o conjunto de todas as opera¸ c˜oes que podem atuar
sobre qualquer valor daquele conjunto de valores. Por exemplo, o tipo de
dados num´erico pode ser imaginado como o conjunto de todos os n´ umeros
e de todas as opera¸ c˜oes que podem ser aplicadas aos n´ umeros.
Os tipos de dados manipulados por um algoritmo podem ser classifica-
dos em dois grupos: atˆ omicos e complexos. Os tipos atˆomicos s˜ao aqueles
cujos elementos do conjunto de valores s˜ao indivis´ıveis. Por exemplo, o tipo
num´erico ´e atˆomico, pois os n´ umeros n˜ao s˜ao compostos de partes. Por
outro lado, os tipos complexos
1
s˜ao aqueles cujos elementos do conjunto de
valores podem ser decompostos em partes mais simples. Por exemplo, o tipo
cadeia ´e aquele cujos elementos do conjunto de valores s˜ao frases e frases
podem ser decompostas em caracteres, os quais s˜ao indivis´ıveis.
Entre os tipos atˆomicos, os mais comuns s˜ao:
• num´erico: inclui os n´ umeros inteiros, racionais e irracionais e as
opera¸ c˜oes aritm´eticas e relacionais para estes n´ umeros. Na nossa lin-
guagem de descri¸ c˜ao de algoritmos, os n´ umeros inteiros s˜ao escritos
apenas como a concatena¸ c˜ao dos d´ıgitos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Por
1
Alguns autores utilizam o termo estruturado ao inv´es de complexo.
35
3.4. Vari´aveis UFMS
exemplo, 5, 100 e 1678. Os n´ umeros com fra¸ c˜ao devem ser escritos, nos
algoritmos, com a presen¸ ca do ponto decimal. Por exemplo, 3.14159,
100.0 e 0.5. No caso do n´ umero ser negativo, adicionamos o sinal “−”
na frente do n´ umero, tal como −23. Dentre os tipos num´ericos dis-
tinguiremos os tipos inteiro e real que incluem, respectivamente, os
n´ umeros inteiros e reais.
• caracter: inclui os s´ımbolos do alfabeto usado pela nossa linguagem
de programa¸ c˜ao virtual. Estes s´ımbolos consistem das letras do alfa-
beto romano, dos d´ıgitos 0, 1, . . . , 9, dos caracteres de pontua¸ c˜ao, tais
como ?, ., . . ., dos s´ımbolos de opera¸ c˜ao aritm´etica + e −, entre outros.
As opera¸ c˜oes definidas para este tipo s˜ao igualdade e desigualdade. Os
elementos do conjunto de valores do tipo caracter devem ser escritos,
nos algoritmos, entre aspas simples, como, por exemplo, ‘a’, ‘1’ e ‘?’.
Note a diferen¸ ca entre escrever 1 e ‘1’. No primeiro caso, temos o
n´ umero inteiro um; no segundo, o caracter representando o d´ıgito um.
• l´ogico: inclui apenas os valores verdadeiro e falso e as opera¸ c˜oes
l´ogicas. Nos algoritmos, estes valores s˜ao escritos como V e F.
Entre os tipos complexos, vamos utilizar inicialmente apenas o tipo ca-
deia, cujo conjunto de valores ´e formado por frases ou cadeias. Por frase,
entendemos uma concatena¸ c˜ao de valores do tipo caracter. As frases s˜ao
escritas, nos algoritmos, entre aspas duplas, tal como “Entre com algum
valor: ”. Note que “a” e ‘a’ s˜ao valores pertencentes a tipos distintos. No
primeiro caso, temos uma frase que cont´em apenas o caracter a; no segundo,
temos o caracter a.
3.4 Vari´aveis
Como dito antes, um algoritmo manipula dados, que podem ser dados
vari´aveis ou constantes. Por exemplo, em um algoritmo que calcula a ´area de
um c´ırculo, o raio do c´ırculo ´e um dado de entrada vari´avel, pois o valor do
raio pode variar de c´ırculo para c´ırculo. Por outro lado, o valor do n´ umero
π, utilizado no c´alculo da ´area do c´ırculo
2
, ´e uma constante. N˜ao importa
qual seja o raio do c´ırculo, o mesmo valor π ´e utilizado no c´alculo da ´area.
Um algoritmo representa dados vari´aveis e dados constantes atrav´es de
vari´ aveis e constantes, respectivamente. Uma vari´avel pode ser imaginada
como um “dep´osito” para armazenar valores de dados, para o qual existe
um nome, conhecido como identificador, e cujo conte´ udo pode ser alterado
2
A ´area do c´ırculo ´e dada por πr
2
, onde r ´e o raio do c´ırculo.
36
3.5. Constantes UFMS
pelo algoritmo. O identificador de uma vari´avel deve ser distinto daquele
das demais vari´aveis do algoritmo, pois ´e atrav´es do identificador da vari´avel
que o algoritmo a disting¨ ue das demais e tem acesso ao seu conte´ udo.
O ato de criar uma vari´avel ´e conhecido como declara¸ c˜ao de vari´avel.
Cada vari´avel utilizada em um algoritmo deve ter sido declarada antes de
ser utilizada pela primeira vez. Ao criarmos uma vari´avel, temos de, expli-
citamente, associar-lhe um tipo de dados, pois o tipo determina o conjunto
de valores que a vari´avel pode armazenar e, conseq¨ uentemente, a estrutura
de dados que define o conte´ udo da vari´avel. Desta forma, se uma vari´avel ´e
declarada como sendo do tipo num´erico, ela n˜ao poder´a armazenar qualquer
outro valor que n˜ao seja um n´ umero.
Para se declarar uma vari´avel, segue-se o formato abaixo:
<tipo da vari´avel> <lista de identificadores>
onde tipo da vari´ avel ´e o nome do tipo ao qual as vari´aveis estar˜ao associadas
e lista de identificadores ´e uma lista de identificadores de vari´aveis separados
por v´ırgula.
Como exemplo, considere a declara¸ c˜ao de duas vari´aveis, denominadas
x do tipo inteiro e y do tipo real:
inteiro x
inteiro y
Quando executamos um algoritmo em um computador, a cada vari´avel
corresponde uma posi¸ c˜ao distinta de mem´oria, em geral, o endere¸ co da pri-
meira c´elula de mem´oria ocupada pelo conte´ udo da vari´avel. Vari´aveis,
portanto, nada mais s˜ao do que representa¸ c˜oes simb´olicas para posi¸ c˜oes de
mem´oria que armazenam dados. O uso de vari´aveis ´e uma caracter´ıstica das
linguagens de alto-n´ıvel, pois, como pudemos constatar no cap´ıtulo anterior,
quando programamos em linguagem de m´aquina, utilizamos os pr´oprios en-
dere¸ cos de mem´oria para referenciar os dados manipulados pelo programa.
3.5 Constantes
Uma constante faz exatamente o que o nome sugere: representa um
dado cujo valor n˜ao muda durante todo o algoritmo. Assim como uma
vari´avel, uma constante tamb´em possui um identificador ´ unico e deve ser
declarada antes de ser utilizada. No entanto, como o valor da constante ´e
37
3.6. Operadores UFMS
fixo, ele ´e atribu´ıdo `a constante no momento de sua declara¸ c˜ao, de modo
que n˜ao h´a necessidade de explicitarmos o tipo do valor da constante.
Em nossa linguagem de escrita de algoritmos, uma constante ´e declarada
da seguinte forma:
defina <identificador> <valor>
onde defina ´e uma palavra-chave, identificador ´e o identificador da constante
e valor ´e o valor da constante. Entenda por palavra-chave qualquer palavra
que tenha um significado espec´ıfico para o algoritmo e que n˜ao deve ser
utilizada para qualquer outro prop´osito, tal como para dar um nome a uma
vari´avel. Neste curso, as palavras-chaves sempre aparecer˜ao sublinhadas.
Como exemplo, temos a declara¸ c˜ao de duas constantes, PI e MENSAGEM:
defina PI 3.14159
Defina MENSAGEM “A ´area do c´ırculo ´e:”
Desta forma, PI ´e uma constante do tipo num´erico e MENSAGEM ´e uma
constante do tipo cadeia, ou seja, MENSAGEM ´e uma frase.
3.6 Operadores
N´os declaramos vari´aveis e constantes a fim de criar espa¸ co para ar-
mazenar os valores dos dados manipulados pelo algoritmo. Uma vez que
declaramos as vari´aveis e constantes, temos a nossa disposi¸ c˜ao v´arios tipos
de operadores, com os quais podemos atribuir valor a uma vari´avel e mani-
pular os valores armazenados em vari´aveis e constantes. H´a trˆes categorias
b´asicas de operadores: operadores de atribui¸ c˜ ao, operadores aritm´eticos e
operadores de entrada e sa´ıda.
3.6.1 Operador de Atribui¸c˜ao
O ato de atribuir ou copiar um valor para uma vari´avel ´e conhecido como
atribui¸ c˜ao. Utilizaremos o operador de atribui¸ c˜ao (←) como um s´ımbolo
para esta opera¸ c˜ao. Por exemplo, as seguintes instru¸ c˜oes atribuem os valores
4 e ‘a’ `as vari´aveis x e y, respectivamente:
x ← 4
y ←‘a’
38
3.6. Operadores UFMS
Ap´os tais opera¸ c˜oes de atribui¸ c˜ao serem executadas, x conter´a o valor 4 e
y, o valor ‘a’. Lembre-se de que, para qualquer vari´avel ser utilizada em um
algoritmo, temos de declar´a-la antes de seu primeiro uso.
3.6.2 Operadores Aritm´eticos
Os operadores aritm´eticos b´asicos s˜ao quatro:
• adi¸ c˜ao, representado pelo s´ımbolo +;
• subtra¸ c˜ao, representado pelo s´ımbolo −;
• multiplica¸ c˜ao, representado pelo s´ımbolo ∗; e
• divis˜ao, representado pelo s´ımbolo /.
Estes operadores podem ser aplicados a express˜oes envolvendo valores num´ericos
quaisquer, n˜ao importando se o n´ umero ´e inteiro ou cont´em parte fracion´aria.
Como exemplo, suponha que as vari´aveis a, b e c tenham sido declaradas
como segue:
inteiro a, b, c
Ent˜ao, podemos escrever express˜oes como as seguintes:
a +b +c
a −b ∗ c/2
A opera¸ c˜ao de divis˜ao, representada pelo s´ımbolo /, ´e a divis˜ao real.
Isto ´e, mesmo que os operandos sejam n´ umeros inteiros, o resultado ´e real.
Entretanto, para podermos trabalhar apenas com aritm´etica inteira, existem
dois outros operadores: DIV e MOD. DIV ´e o operador de divis˜ ao para
n´ umeros inteiros. Se fizermos 4 DIV 3, obteremos 1 como resultado, ao
passo que 4/3 resulta em 1.333 . . .. J´a o operador MOD ´e utilizado para
obtermos o resto de uma divis˜ao inteira. Por exemplo, 5 MOD 2 ´e igual a
1, o resto da divis˜ao inteira de 5 por 2.
3.6.3 Comando de Atribui¸c˜ao
Um comando de atribui¸ c˜ao ´e qualquer comando que inclua um ope-
rador de atribui¸ c˜ao. Este comando sempre envolve uma vari´avel, que se
localiza `a esquerda do operador, e um valor ou uma express˜ao que se loca-
liza `a direita do operador. Quando um comando de atribui¸ c˜ ao ´e executado, o
39
3.6. Operadores UFMS
valor do lado direito do operador de atribui¸ c˜ao, que pode ser uma constante,
o conte´ udo de uma vari´avel ou o resultado de uma express˜ao, ´e copiado para
a vari´avel do lado esquerdo do operador.
Como exemplo, considere os seguintes comandos de atribui¸ c˜ao:
x ← a + 2 −c
y ← 4
z ← y
onde a, c, x, y e z s˜ao vari´aveis.
3.6.4 Precedˆencia de Operadores
Assim como na aritm´etica padr˜ao, a precedˆencia de operadores nas
express˜oes aritm´eticas dos algoritmos tamb´em ´e governada pelo uso de
parˆenteses. A menos que os parˆenteses indiquem o contr´ario, as opera¸ c˜oes
de divis˜ao e multiplica¸ c˜ao s˜ao executadas primeiro e na ordem em que forem
encontradas ao lermos a express˜ao da esquerda para a direita. Em seguida,
temos as opera¸ c˜oes de adi¸ c˜ao e subtra¸ c˜ao.
Como exemplo, considere o seguinte trecho algor´ıtmico:
inteiro a
inteiro b
inteiro c
inteiro x
a ← 2
b ← 3
c ← 4
x ← a +b ∗ c
Este trecho de c´odigo armazenar´a o valor 14 na vari´avel x. Se fosse desejado
realizar a opera¸ c˜ao de adi¸ c˜ao primeiro, o comando de atribui¸ c˜ao seria
x ← (a +b) ∗ c
Neste caso, o uso dos parˆenteses fez com que a opera¸ c˜ao de adi¸ c˜ao fosse rea-
lizada primeiro. Na nossa linguagem para escrita de algoritmos, a utiliza¸ c˜ao
de parˆenteses possui o mesmo significado visto no primeiro grau. Al´em de
possu´ırem prioridade m´axima perante os demais operadores aritm´eticos, os
parˆenteses tamb´em podem ocorrer de forma “aninhada”, como na express˜ao
abaixo:
40
3.7. Estrutura Geral de um Algoritmo UFMS
((2 + 3) −(1 + 2)) ∗ 3 −(3 + (3 −2))
que resulta no valor 2.
3.6.5 Entrada e Sa´ıda
Qualquer algoritmo requer a obten¸ c˜ao de dados do “mundo” (entrada)
e tamb´em um meio de comunicar ao “mundo” o resultado por ele obtido
(sa´ıda). Para tal, existem duas opera¸ c˜oes, denominadas entrada e sa´ıda,
realizadas, respectivamente, pelos operadores leia e escreva. O operador de
leitura tem sempre um ou mais vari´aveis como operandos, enquanto o opera-
dor de sa´ıda pode possuir constantes, vari´aveis e express˜oes como operandos.
A forma geral destes operadores ´e:
leia <lista de vari´aveis>
escreva <lista de vari´aveis e/ou constantes e/ou express˜oes >
onde leia e escreva s˜ao palavras-chave, lista de vari´ aveis ´e uma lista de
identificadores separados por v´ırgula, e lsita de identificadores e/ou cons-
tantes e/ou express˜ oes, como o pr´oprio nome j´a define ´e uma lista contendo
identificadores (de constantes ou vari´aveis), constantes e express˜oes, inde-
pendente de alguma ordem.
Como exemplo do uso dos operadores de entrada e sa´ıda, temos:
inteiro x
leia x
escreva x
escreva “O valor de x ´e:”, x
3.7 Estrutura Geral de um Algoritmo
Nesta Se¸ c˜ao, veremos algumas caracter´ısticas que encontraremos nos al-
goritmos que estudaremos neste curso:
1. A linha de cabe¸ calho, que ´e a primeira linha do algoritmo, cont´em a
palavra-chave algoritmo, seguida por um identificador, que ´e o nome
escolhido para o algoritmo.
2. A declara¸ c˜ ao de constantes e vari´ aveis ser´a o pr´oximo passo, sendo
que a declara¸ c˜ao de constantes precede a declara¸ c˜ao de vari´aveis.
41
3.7. Estrutura Geral de um Algoritmo UFMS
3. O corpo do algoritmo cont´em as instru¸ c˜oes que faze parte da descri¸ c˜ao
do algoritmo.
4. A linha final, que ´e a ´ ultima linha do algoritmo, cont´em a palavra-chave
fimalgoritmo para especificar onde o algoritmo termina.
Temos ainda alguns detalhes que servir˜ao para deixar o algoritmo mais
claro e mais f´acil de ler:
1. Os passos do algoritmo s˜ao especificados atrav´es da identa¸ c˜ ao dos
v´arios comandos entre a linha de cabe¸ calho e a linha final. A identa¸ c˜ao,
visualmente, enquadra o corpo do algoritmo no olho humano e acaba
com a confus˜ao criada por n˜ao sabermos onde o algoritmo come¸ ca ou
termina.
2. Dentro do corpo do algoritmo, linhas em branco s˜ao usadas para dividir
o algoritmo em partes logicamente relacionadas e tornar o algoritmo
mais leg´ıvel.
3. O algoritmo pode vir seguido de coment´ arios. Coment´arios s˜ao linhas
que n˜ao s˜ao executadas e cujo prop´osito ´e apenas o de facilitar o en-
tendimento do algoritmo por parte de quem desejar lˆe-lo. As linhas
de coment´ario s˜ao iniciadas com duas barras (“//”) e podem abrigar
qualquer texto.
Como exemplo, considere um algoritmo para calcular e escrever a ´area
de um c´ırculo, dado o raio do c´ırculo.
// algoritmo para calcular a ´area do c´ırculo
algoritmo area do circulo
// declara¸ c˜ao de constantes e vari´aveis
defina PI 3.14159
defina MENSAGEM “O valor da ´area do c´ırculo ´e: ”
real raio, area
// leitura do raio do c´ırculo
leia raio
// c´alculo da ´area do c´ırculo
area ← PI ∗ raio ∗ raio
// comunica¸ c˜ao do resultado
42
3.7. Estrutura Geral de um Algoritmo UFMS
escreva MENSAGEM, area
fimalgoritmo
Bibliografia
O texto deste cap´ıtulo foi elaborado a partir dos livros abaixo relaciona-
dos:
1. Pothering, G.J., Naps, T.L. Introduction to Data Structures and Al-
gorithm Analysis with C++. West Publishing Company, 1995.
2. Shackelford, R.L. Introduction to Computing and Algorithms. Addison-
Wesley Longman, Inc, 1998.
43
Desenvolvimento de
Algoritmos - Parte II 4
Neste t´opico, vocˆe estudar´a detalhadamente dois componentes dos al-
goritmos: express˜oes condicionais e estruturas de controle. Como visto no
cap´ıtulo anterior, as express˜oes condicionais possibilitam os algoritmos to-
marem decis˜oes que s˜ao governadas pelas estruturas de controle.
4.1 Express˜oes Condicionais
Denomina-se express˜ao condicional ou expres˜ao l´ogica a express˜ao
cujos operandos s˜ao rela¸ c˜oes, constantes e/ou vari´aveis do tipo l´ogico.
4.1.1 Rela¸c˜oes
Uma express˜ao relacional, ou simplesmente rela¸ c˜ao, ´e uma com-
para¸ c˜ao entre dois valores do mesmo tipo b´asico. Estes valores s˜ao represen-
tados na rela¸ c˜ao atrav´es de constantes, vari´aveis ou express˜oes aritm´eticas.
Os operadores relacionais, que indicam a compara¸ c˜ao a ser realizada
entre os termos da rela¸ c˜ao, s˜ao conhecidos da Matem´atica:
Operador Descri¸ c˜ao
= igual a
= diferente de
> maior que
< menor que
≥ maior ou igual a
≤ menor ou igual a
44
4.1. Express˜oes Condicionais UFMS
O resultado da avalia¸ c˜ao de uma rela¸ c˜ao ´e sempre um valor l´ ogico, isto
´e, V ou F.
Como exemplo, considere as vari´aveis a, b e c definidas a seguir:
inteiro a, b, c
Agora, suponha as seguintes atribui¸ c˜oes:
a ← 2
b ← 3
c ← 4
Ent˜ao, as express˜oes a = 2, a > b +c, c ≤ 5 − a e b = 3 valem V, F, F e F,
respectivamente.
4.1.2 Operadores L´ogicos
Uma proposi¸ c˜ao ´e qualquer senten¸ ca que possa ser avaliada como ver-
dadeira ou falsa. Por exemplo, a senten¸ ca “a popula¸ c˜ao de Campo Grande
´e de 500 mil habitantes” pode ser classificada como verdadeira ou falsa e,
portanto, ´e uma proposi¸ c˜ao. J´a a senten¸ ca “feche a porta!” n˜ao pode e, con-
sequentemente, n˜ao ´e uma proposi¸ c˜ao. No nosso contexto, uma proposi¸ c˜ao
´e uma rela¸ c˜ao, uma vari´avel e/ou uma constante do tipo l´ ogico.
As express˜oes condicionais ou l´ogicas s˜ao formadas por uma ou mais
proposi¸ c˜oes. Quando h´a mais de uma proposi¸ c˜ao em uma express˜ao l´ogica,
elas est˜ao relacionadas atrav´es de um operador l´ogico. Os operadores
l´ogicos utilizados como conectivos nas express˜oes l´ogicas s˜ao os seguintes:
Operador Descri¸ c˜ao
E para a conjun¸ c˜ao
OU para a disjun¸ c˜ao
N
˜
AO para a nega¸ c˜ao
Duas proposi¸ c˜oes podem ser combinadas pelo conectivo E para formar
uma ´ unica proposi¸ c˜ao denominada conjun¸ c˜ao das proposi¸ c˜oes originais. A
conjun¸ c˜ao das proposi¸ c˜oes p e q ´e representada por p ∧ q e lemos “p e q”.
O resultado da conjun¸ c˜ao de duas proposi¸ c˜oes ´e verdadeiro se e somente se
ambas as proposi¸ c˜oes s˜ao verdadeiras, como mostrado na tabela a seguir.
45
4.1. Express˜oes Condicionais UFMS
p q p ∧ q
V V V
V F F
F V F
F F F
Duas proposi¸ c˜oes quaisquer podem ser combinadas pelo conectivo OU
(com o sentido de e/ou) para formar uma nova proposi¸ c˜ao que ´e chamada
disjun¸ c˜ao das duas proposi¸ c˜ oes originais. A disjun¸ c˜ao de duas proposi¸ c˜oes p
e q ´e representada por p∨q e lemos “p ou q”. A disjun¸ c˜ao de duas proposi¸ c˜oes
´e verdadeira se e somente se, pelo menos, uma delas for verdadeira, como
mostrado na tabela a seguir.
p q p ∨ q
V V V
V F V
F V V
F F F
Dada uma proposi¸ c˜ao p qualquer, uma outra proposi¸ c˜ao, chamada nega¸ c˜ao
de p, pode ser formada escrevendo “
´
E falso que” antes de p ou, se poss´ıvel,
inserindo a palavra “n˜ao” em p. Simbolicamente, designamos a nega¸ c˜ao de
p por p e lemos “n˜ao p”. Desta forma, podemos concluir que se p ´e verda-
deira, ent˜ao p ´e falsa; se p ´e falsa, ent˜ao p ´e verdadeira, como mostrado
na tabela a seguir.
p p
V F
F V
Agora, vejamos alguns exemplos de express˜oes l´ogicas que utilizam os
conectivos vistos antes. Considere as vari´aveis a, b, c e x definidas a seguir:
inteiro a, b, c
l´ogico x
Agora, suponha as seguintes atribui¸ c˜oes:
a ← 2
b ← 3
c ← 4
x ← F
46
4.2. Estruturas de Controle UFMS
Ent˜ao, as express˜oes a = 2 E a > b +c, c ≤ 5 −a OU b = 3, e N
˜
AO x valem
F, F e V, respectivamente.
Na primeira express˜ao, a = 2 E a > b + c, a = 2 e a > b + c s˜ao
rela¸ c˜oes. Em particular, a > b +c cont´em uma express˜ao aritm´etica, b +c,
que devemos resolver primeiro para da´ı podermos avaliar a rela¸ c˜ao a > b+c.
De forma an´aloga, devemos primeiro resolver as rela¸ c˜oes a = 2 e a > b + c
para podermos resolver a express˜ao l´ogica a = 2 E a > b + c. Isto significa
que estamos realizando as opera¸ c˜oes em uma certa ordem: em primeiro
lugar, fazemos as opera¸ c˜oes aritm´eticas, depois as opera¸ c˜oes relacionais e,
por ´ ultimo, as opera¸ c˜oes l´ogicas. A tabela a seguir ilustra a prioridade de
todos os operadores vistos at´e aqui.
Operador Prioridade
/, ∗, DIV, MOD 1 (m´axima)
+, − 2
=, =, ≥, ≤, >, < 3
N
˜
AO 4
E 5
OU 6 (m´ınima)
Observe que entre os operadores l´ogicos existe n´ıveis distintos de prioridade,
assim como entre os operadores aritm´eticos. Isto significa que na express˜ao
a = 2 OU a > b + c E c ≤ 5 − a, a opera¸ c˜ao l´ogica a > b + c E c ≤ 5 − a ´e
realizada primeiro e seu resultado ´e, ent˜ao, combinado atrav´es do operador
de disjun¸ c˜ao (OU) com aquele da rela¸ c˜ao a = 2. Se quis´essemos mudar a
ordem natural de avalia¸ c˜ao, poder´ıamos escrever a express˜ao com o uso de
parˆenteses: (a = 2 OU a > b +c) E c ≤ 5 −a.
4.2 Estruturas de Controle
Uma vez que a express˜ao condicional foi avaliada, isto ´e, reduzida para
um valor V ou F, uma estrutura de controle ´e necess´aria para governar as
a¸ c˜oes que se suceder˜ao. Daqui em diante, veremos dois tipos de estruturas
de controle: estrutura condicional e estrutura de repeti¸c˜ ao.
4.2.1 Estruturas Condicionais
A estrutura condicional mais simples ´e a se - ent˜ao - fimse. A forma
geral desta estrutura ´e mostrada a seguir:
47
4.2. Estruturas de Controle UFMS
se <express˜ao condicional> ent˜ao
comando
1
comando
2
.
.
.
comando
n
fimse
Esta estrutura funciona da seguinte forma: se express˜ ao condicional for
verdadeira, os comandos 1, 2, . . . , n, contidos dentro da estrutura, s˜ao exe-
cutados e, depois disso, o comando imediatamente depois da estrutura de
controle ´e executado. Caso contr´ario, os comandos 1, 2, . . . , n n˜ao s˜ao exe-
cutados e o fluxo de execu¸ c˜ao do algoritmo segue com o comando imedia-
tamente depois da estrutura de controle. Isto significa que esta forma de
estrutura de controle permite que um algoritmo execute ou n˜ ao um determi-
nado n´ umero de comandos, dependendo de uma dada condi¸ c˜ao ser ou n˜ao
satisfeita.
Como exemplo, considere um algoritmo para ler dois n´ umeros, a e b, e
escrevˆe-los em ordem n˜ao decrescente:
// algoritmo para escrever dois n´ umeros em ordem n˜ao decrescente
algoritmo ordena dois n´ umeros
// declara¸ c˜ao de vari´aveis
inteiro a, b, temp
// lˆe os n´ umeros
leia a, b
// ordena os n´ umeros
se a > b ent˜ao
temp ← a
a ← b
b ← temp
fimse
// escreve os n´ umeros ordenados
escreva a, b
fimalgoritmo
Tudo que este algoritmo faz ´e verificar se o valor de a, fornecido na entrada,
´e maior do que o valor de b; se sim, ele troca os valores de a e b; caso
48
4.2. Estruturas de Controle UFMS
contr´ario, ele n˜ao altera o valor destas vari´aveis. Como a opera¸ c˜ao de troca
deve ser realizada apenas quando a > b, ela foi inserida dentro da estrutura
condicional se - ent˜ao - fimse.
Um outro ponto importante deste exemplo ´e a opera¸ c˜ao de troca. Esta
opera¸ c˜ao ´e realizada com a ajuda de uma outra vari´avel, denominada temp,
e atrav´es de trˆes atribui¸ c˜oes. Isto n˜ao pode ser feito de outra forma! A
fim de atribuir o valor de a a b e o valor de b a a, temos de utilizar uma
outra vari´avel, pois ao executarmos a ← b, atribu´ımos o valor de b a a e,
consequentemente, perdemos o valor que, anteriormente, estava retido em
a. Logo, para podermos fazer com que este valor possa ser atribu´ıdo a b,
antes de executarmos a ← b, guardamos o valor de a em um valor seguro: a
vari´avel temp. Depois, atribu´ımos o valor em temp a b.
Uma varia¸ c˜ao da estrutura de controle se - ent˜ao - fimse ´e a estrutura se
- ent˜ao - sen˜ao - fimse. Esta estrutura permite ao algoritmo executar uma
de duas seq¨ uˆencias mutuamente exclusivas de comandos.
A forma geral deste comando ´e dada a seguir.
se <express˜ao condicional> ent˜ao
comando
1
comando
2
.
.
.
comando
n
sen˜ao comando

1
comando

2
.
.
.
comando

n
fimse
Neste caso, se o resultado da express˜ao condicional for verdadeiro, os
comandos 1, 2, . . . , n s˜ao executados e depois disso o primeiro comando logo
ap´os o fim da estrutura de controle ´e executado; caso contr´ ario, se o resultado
da express˜ao condicional for falso, os comandos 1

, 2

, . . . , n

s˜ao executados e
depois disso o pr´oximo comando a ser executado ´e aquele logo ap´os o fim da
estrutura de controle. Notemos que as seq¨ uˆencias de comandos correspon-
dentes a ent˜ao e sen˜ao s˜ao mutuamente exclusivas, isto ´e, ou os comandos
1, 2, . . . , n s˜ao executados ou os comandos 1

, 2

, . . . , n

s˜ao executados.
Como exemplo considere um algoritmo para escrever uma mensagem
com o resultado de um exame, dada a nota obtida pelo candidato no exame:
// algoritmo para escrever resultado de um exame
49
4.2. Estruturas de Controle UFMS
// baseado na nota obtida pelo candidato
algoritmo resultado exame
// declara¸ c˜ao de constantes e vari´aveis
defina NOTAMINIMA 6.0
real nota
// lˆe a nota do candidato
leia nota
// compara a nota lida e escreve resultado
se nota ≥ NOTAMINIMA ent˜ao
escreva “candidato aprovado”
sen˜ao
escreva “candidato reprovado”
fimse
fimalgoritmo
As estruturas condicionais podem estar “aninhadas”, isto ´e, elas podem
ocorrer umas dentro de outras. Como exemplo disto, considere o seguinte
algoritmo que lˆe trˆes n´ umeros e escreve-os em ordem n˜ao decrescente:
// algoritmo para ordenar trˆes n´ umeros
algoritmo ordena trˆes n´ umeros
// declara¸ c˜ao de vari´aveis
inteiro a, b, c, temp
// lˆe os trˆes n´ umeros
leia a, b, c
// encontra o menor dos trˆes n´ umeros e guarda em a
se (a > b) OU (a > c) ent˜ao
se (b ≤ c) ent˜ao
temp ← a
a ← b
b ← temp
sen˜ao
temp ← a
a ← c
c ← temp
fimse
fimse
50
4.2. Estruturas de Controle UFMS
// encontra o valor intermedi´ario e guarda em b
se (b > c) ent˜ao
temp ← b
b ← c
c ← temp
fimse
// escreve os n´ umeros em ordem n˜ao descrescente
escreva a, b, c
fimalgoritmo
4.2.2 Estruturas de Repeti¸c˜ao
A estrutura de repeti¸ c˜ao, ou simplesmente la¸ co, permite que um
grupo de comandos seja executado repetidamente um n´ umero determinado
de vezes ou at´e que uma determinada condi¸ c˜ao se torne verdadeira ou falsa.
Nesta Subse¸ c˜ao, estudaremos trˆes estruturas de repeti¸c˜ao:
• a estrutura para - fa¸ ca
• a estrutura enquanto - fa¸ ca
• a estrutura repita - at´e
A estrutura de repeti¸ c˜ao para - fa¸ ca possui a seguinte forma geral
para <vari´avel> de <valor inicial> at´e <valor final> fa¸ ca
comando
1
comando
2
.
.
.
comando
n
fimpara
e funciona como segue:
1. atribui `a vari´ avel, que ´e o nome de uma vari´avel num´erica, o valor
num´erico valor inicial;
2. compara o valor de vari´ avel com o valor num´erico valor final. Se ele
for menor ou igual a valor final, vai para o passo 3. Caso contr´ario,
executa o comando imediatamente ap´os a estrutura de repeti¸ c˜ao;
51
4.2. Estruturas de Controle UFMS
3. executa os comandos 1 a n;
4. incrementa o valor de vari´ avel de uma unidade.
5. volta para o passo 2.
Como exemplo, considere o seguinte algoritmo para calcular e exibir a
soma de todos os n´ umeros pares desde 100 at´e 200, inclusive:
// algoritmo para somar os pares de 100 a 200
algoritmo soma pares 100 a 200
// declara¸ c˜ao de vari´aveis
inteiro soma, i
// inicializa com 0 a vari´avel que guardar´a a soma
soma ← 0
// calcula a soma
para i de 100 at´e 200 fa¸ ca
se i MOD 2 = 0 ent˜ao
soma ← soma +i
fimse
fimpara
// escreve o valor da soma
escreva “A soma dos pares de 100 a 200 ´e: ”, soma
fimalgoritmo
Neste algoritmo, o la¸ co para - fa¸ ca inicia com a atribui¸ c˜ao do valor 100 `a
vari´avel i. Da´ı, compara o valor de i com 200 e, como i < 200, executa pela
primeira vez os comandos dentro do la¸ co e, ao final da execu¸ c˜ao, incrementa
i de uma unidade. Deste ponto em diante, o valor de i ´e comparado com
200 e, caso seja menor ou igual a 200, uma nova itera¸ c˜ao do la¸ co ´e realizada
e i ´e novamente incrementada de uma unidade ao final da itera¸ c˜ ao. Este
processo se repete at´e que i seja igual a 201. Desta forma, i guarda um
valor de 100 a 200 a cada repeti¸ c˜ao do la¸ co. A cada itera¸ c˜ao, o algoritmo
verifica se o valor de i ´e par ou ´ımpar. Se o valor de i for par, o valor de i ´e
adicionado ao valor na vari´avel soma.
Observe que a vari´avel soma recebe o valor 0 antes do la¸ co ser executado.
Esta atribui¸ c˜ao ´e denominada inicializa¸ c˜ao da vari´avel. Como vocˆe pode
perceber, soma ´e utilizada como um acumulador, isto ´e, a cada itera¸ c˜ao do
52
4.2. Estruturas de Controle UFMS
la¸ co, soma ´e incrementada de mais um n´ umero par e isto ´e feito somando o
valor atual de soma ao n´ umero par em i e atribuindo o resultado novamente
`a vari´avel soma: soma ← soma + i. Entretanto, se a inicializa¸ c˜ao n˜ao
estivesse presente no algoritmo, quando o la¸ co fosse executado pela primeira
vez, n˜ao haveria um valor em soma e a atribui¸ c˜ao soma ← soma + i n˜ao
faria sentido
1
.
Uma varia¸ c˜ao da estrutura de repeti¸ c˜ao para - fa¸ ca ´e aquela que nos
possibilita controlar o valor do incremento da vari´avel contadora do la¸ co:
para <vari´avel> de <valor inicial> at´e <valor final> passo <incremento> fa¸ ca
comando
1
comando
2
.
.
.
comando
n
fimpara
onde incremento ´e o valor adicionado ao valor de vari´ avel ao final de cada
itera¸ c˜ao. Quando a parte do comando passo <incremento> n˜ao est´a pre-
sente, o valor assumido para o incremento ´e 1 (um).
Esta varia¸ c˜ao da estrutura de repeti¸ c˜ao para - fa¸ ca nos permite, por
exemplo, resolver o problema de calcular a soma de todos os pares de 100
a 200 de uma forma mais elegante do que aquela vista anteriormente, como
podemos constatar a seguir:
// algoritmo para somar os pares de 100 a 200
algoritmo soma pares 100 a 200
// declara¸ c˜ao de vari´aveis
inteiro soma, i
// inicializa com 0 a vari´avel que guardar´a a soma
soma ← 0
// calcula a soma
para i de 100 at´e 200 passo 2 fa¸ ca
soma ← soma +i
fimpara
1
Se vocˆe executasse este algoritmo em computador sem a inicializa¸c˜ao de soma, o
resultado seria imprevis´ıvel, pois n˜ao poder´ıamos prever o valor que est´a na posi¸c˜ao de
mem´oria do computador correspondente a soma.
53
4.2. Estruturas de Controle UFMS
// escreve o valor da soma
escreva “A soma dos pares de 100 a 200 ´e: ”, soma
fimalgoritmo
A estrutura de repeti¸ c˜ao para - fa¸ ca deve ser utilizada apenas quando
queremos repetir a execu¸ c˜ao de um ou mais comandos um n´ umero conhecido
de vezes, como no exemplo anterior. Entretanto, h´a problemas em que n˜ao
´e poss´ıvel determinar, previamente, o n´ umero de repeti¸ c˜oes. Neste caso,
devemos utilizar a estrutura enquanto - fa¸ ca ou repita - at´e.
A estrutura enquanto - fa¸ ca possui a seguinte forma geral
enquanto <express˜ao condicional> fa¸ ca
comando
1
comando
2
.
.
.
comando
n
fimenquanto
A l´ogica do funcionamento desta estrutura de repeti¸ c˜ao ´e a seguinte:
1. express˜ ao condicional ´e avaliada. Se o resultado for verdadeiro, ent˜ao
o fluxo do algoritmo segue para o passo seguinte. Caso contr´ario, o co-
mando imediatamente posterior `a estrutura de repeti¸ c˜ao ´e executado;
2. executa os comandos de 1 a n;
3. volta para o passo 1.
Como exemplo, considere o seguinte algoritmo para ler um n´ umero in-
teiro n, que n˜ao cont´em d´ıgito 0, e escrever um n´ umero inteiro m que cor-
responde a n invertido:
// algoritmo para inverter um n ´ mero inteiro sem d´ıgito 0
algoritmo inverte n´ umero
// declara¸ c˜ao de vari´aveis
inteiro n, r, m
// lˆe o valor de um inteiro
leia n
54
4.2. Estruturas de Controle UFMS
// inicializa a vari´avel que conter´a o inteiro invertido
m ← 0
// encontra o n´ umero invertido
enquanto n > 0 fa¸ ca
r ← n MOD 10
m ← m∗ 10 +r
n ← n DIV 10
fimenquanto
// exibe o n´ umero invertido
escreva m
fimalgoritmo
Observe que, neste algoritmo, o la¸ co ´e repetido uma quantidade de vezes
igual ao n´ umero de d´ıgitos de n. Como n ´e desconhecido at´e a execu¸ c˜ao do
algoritmo iniciar, n˜ao somos capazes de dizer, ao escrevermos o algoritmo,
quantos d´ıgitos n ter´a, logo n˜ao saberemos prever o n´ umero de repeti¸ c˜oes do
la¸ co. Entretanto, podemos determinar o n´ umero de d´ıgitos de n ao longo da
execu¸ c˜ao do algoritmo e isto ´e feito indiretamente pelo algoritmo ao dividir
n, sucessivamente, por 10, o que far´a n “perder” o d´ıgito menos significativo
a cada repeti¸ c˜ao do la¸ co e se tornar 0 em algum momento. Neste ponto,
podemos encerrar o la¸ co.
A estrutura de repeti¸ c˜ao repita - at´e ´e semelhante `a estrutura enquanto -
fa¸ ca, pois ambas s˜ao utilizadas quando n˜ao conhecemos, antecipadamente, o
n´ umero de repeti¸ c˜oes. A diferen¸ ca entre elas reside no fato que a seq¨ uˆencia
de instru¸ c˜oes da estrutura repita - at´e ´e executada pelo menos uma vez,
independentemente da express˜ao condicional ser ou n˜ao verdadeira.
A estrutura repita - at´e tem a seguinte forma geral:
repita
comando
1
comando
2
.
.
.
comando
n
at´e <express˜ao condicional>
A l´ogica do funcionamento desta estrutura de repeti¸ c˜ao ´e a seguinte:
1. executa a seq¨ uˆencia de instru¸ c˜oes;
55
4.3. Problemas e Solu¸ c˜oes UFMS
2. express˜ ao condicional ´e avaliada. Se ela for falsa, ent˜ao o fluxo de
execu¸ c˜ao volta para o passo 1. Caso contr´ario, o comando imediata-
mente posterior `a estrutura de repeti¸ c˜ao ´e executada.
Como exemplo, considere o seguinte trecho algor´ıtmico:
.
.
.
repita
escreva “entre com um n´ umero positivo: ”
leia n
at´e n > 0
.
.
.
Neste trecho de algoritmo, o objetivo do la¸ co ´e garantir que a vari´avel n
receba um n´ umero positivo; enquanto o usu´ario entrar com um n´ umero
menor ou igual a zero, o algoritmo continuar´a solicitando a entrada.
4.3 Problemas e Solu¸c˜oes
Nesta Se¸ c˜ao, veremos quatro problemas e suas respectivas solu¸ c˜oes. As-
sociado a cada solu¸ c˜ao est´a um breve coment´ario.
Os problemas e suas respectivas solu¸ c˜oes s˜ao os seguintes:
1. Uma pessoa aplicou seu capital a juros e deseja saber, trimestralmente,
a posi¸ c˜ao de seu investimento inicial c. Chamando de i a taxa de juros
do trimestre, escrever uma tabela que forne¸ ca, para cada trimestre, o
rendimento auferido e o saldo acumulado durante o per´ıodo de x anos,
supondo que nenhuma retirada tenha sido feita.
// algoritmo para calcular rendimento e montante de aplica¸ c˜ao
// trimestral
algoritmo calcula rendimento
// declara¸ c˜ao de vari´aveis
inteiro x, n
inteiro c, i, r, j
// lˆe o capital inicial, a taxa de juros e n´ umeros de anos
leia c, i, x
56
4.3. Problemas e Solu¸ c˜oes UFMS
// calcula o n´ umero de trimestres em x anos
n ← x ∗ 4
// calcula e exibe rendimento e montante
para j de 1 at´e n fa¸ ca
r ← i ∗ c
c ← c +r
escreva “rendimento do trimestre ”, j, “: ”, r
escreva “montante do trimestre ”, j, “: ”, c
fimpara
fimalgoritmo
O algoritmo inicia com o c´alculo do n´ umero de trimestres em x anos,
j´a que o rendimento deve ser calculado por trimestre e a taxa de juros
i tamb´em ´e dada em fun¸ c˜ao do n´ umero de trimestres. O la¸ co para -
fa¸ ca ´e repetido n vezes, onde n ´e o n´ umero de trimestres encontrado.
A cada repeti¸ c˜ao do la¸ co, o rendimento r ´e calculado e o capital c ´e
somado a r para totalizar o montante do mˆes. Em seguida, os valores
de r e c s˜ao exibidos para o usu´ario.
2. Em um frigor´ıfico existem 90 bois. Cada boi traz em seu pesco¸ co
um cart˜ao contendo seu n´ umero de identifica¸ c˜ao e seu peso. Fa¸ ca um
algoritmo que encontre e escreva o n´ umero e o peso do boi mais gordo
e do boi mais magro.
// algoritmo para encontrar o n´ umero e o peso do boi mais gordo e
// do boi mais magro de um conjunto de 90 bois
algoritmo encontra n´ umero peso
// declara¸ c˜ao de vari´aveis
inteiro num, boigordo, boimagro,
real peso, maiorpeso, menorpeso
// lˆe os dados do primeiro boi
escreva “entre com o n´ umero de identifica¸ c˜ao do primeiro boi: ”
leia num
escreva “entre com o peso do primeiro boi: ”
leia peso
// inicializa as vari´aveis que conter˜ao o resultado
boigordo ← num
boimagro ← num
57
4.3. Problemas e Solu¸ c˜oes UFMS
maiorpeso ← peso
menorpeso ← peso
// compara os pesos para encontrar o boi mais gordo e o boi mais magro
para j de 2 at´e 90 fa¸ ca
escreva “entre com o n´ umero do pr´oximo boi: ”
leia num
escreva “entre com o peso do pr´oximo boi: ”
leia peso
// compara o peso lido com o maior peso at´e ent˜ao
se peso > maiorpeso ent˜ao
maiorpeso ← peso
boigordo ← num
sen˜ao
se peso < menorpeso ent˜ao
menorpeso ← peso
boimagro ← num
fimse
fimse
fimpara
// escreve o n´ umero e o peso do boi mais gordo e do boi mais magro
escreva “o n´ umero do boi mais gordo ´e: ”, boigordo
escreva “o peso do boi mais gordo ´e: ”, maiorpeso
escreva “o n´ umero do boi mais magro ´e: ”, boimagro
escreva “o peso do boi mais magro ´e: ”, menorpeso
fimalgoritmo
Neste algoritmo, a id´eia ´e ler e processar as informa¸ c˜oes de cada boi
simultaneamente, pois n˜ao necessitamos guardar as informa¸ c˜oes dos
90 bois para depois process´a-las. Esta leitura ´e realizada atrav´es de
um la¸ co para - fa¸ ca, pois sabemos exatamente quantos bois existem:
90. Para guardar o n´ umero do boi mais gordo, o n´ umero do boi mais
magro, o peso do boi mais gordo e o peso do boi mais magro, usamos
quatro vari´aveis, uma para cada dado.
Para encontrar o n´ umero e peso do boi mais gordo e o n´ umero e peso
do boi mais magro, comparamos o peso do boi que acabamos de ler
com os at´e ent˜ao maior e menor pesos. O problema ´e que para reali-
zarmos esta opera¸ c˜ao pela primeira vez, as vari´aveis que armazenam o
maior e o menor peso precisam possuir algum valor. Para tal, lemos as
informa¸ c˜oes sobre o primeiro boi separadamente e inicializamos ambas
as vari´aveis com o peso do primeiro boi. Da´ı em diante, podemos pros-
seguir como imaginamos: comparando tais vari´aveis com os valores de
58
4.3. Problemas e Solu¸ c˜oes UFMS
cada boi, um a um.
3. Uma pesquisa sobre algumas caracter´ısticas f´ısicas da popula¸ c˜ao de
uma determinada regi˜ao coletou os seguintes dados, referentes a cada
habitante, para serem analisados:
• idade em anos
• sexo (masculino, feminino)
• cor dos olhos (azuis, verdes, castanhos)
• cor dos cabelos (louros, castanhos, pretos)
Para cada habitante s˜ao informados os quatro dados acima. A fim
de indicar o final da entrada, ap´os a seq¨ uˆencia de dados dos habitan-
tes, o usu´ario entrar´a com o valor −1 para a idade, o que deve ser
interpretado pelo algoritmo como fim de entrada.
// algoritmo para encontrar a maior idade de um conjunto de indiv´ıduos
// e o percentual de indiv´ıduos do sexo feminino com idade entre 18 e
// 35 anos, inclusive, e olhos verdes e cabelos louros
algoritmo encontra maior idade e percentual
// declara¸ c˜ao de vari´aveis
inteiro idade, maioridade, habitantes, totalhabitantes
real porcentagem
cadeia sexo, olhos, cabelos
// inicializa algumas vari´aveis
maioridade ← −1
habitantes ← 0
totalhabitantes ← 0
// lˆe a idade do primeiro habitante
escreva “entre com a idade do habitante ou -1 para encerrar: ”
leia idade
// calcula os resultados
enquanto idade = −1 fa¸ ca
escreva “entre com o sexo do habitante: ”
leia sexo
escreva “entre com a cor dos olhos do habitante: ”
leia olhos
escreva “entre com a cor dos cabelos do habitante: ”
59
4.3. Problemas e Solu¸ c˜oes UFMS
leia cabelos
// compara a idade lida com a maior idade at´e ent˜ao
se idade > maioridade ent˜ao
maioridade ← idade
fimse
// conta o n´ umero total de habitantes
totalhabitantes ← totalhabitantes + 1
// conta o n´ umero total de habitantes que satisfazem as restri¸ c˜oes
// (sexo feminino, idade entre 18 e 35 anos, olhos verdes e cabelos louros)
se idade ≥ 18 E (idade ≤ 35) E (sexo =“feminino”) E
(olhos =“verdes”) E (cabelos =“louros”) ent˜ao
habitantes ← habitantes + 1
fimse
// lˆe a idade do pr´oximo habitante
escreva “entre com a idade do habitante ou -1 para encerrar: ”
leia idade
fimenquanto
// escreve a maior idade e a porcentagem pedida
se totalhabitantes > 0 ent˜ao
porcentagem ← (habitantes/totalhabitantes) ∗ 100
escreva “a maior idade ´e: ”, maioridade
escreva “a porcentagem ´e: ”, porcentagem
fimse
fimalgoritmo
Este algoritmo difere do anterior em dois aspectos importantes: a en-
trada de dados e a forma pela qual encontramos a maior idade. Desta
vez, n˜ao sabemos quantos habitantes ser˜ao processados, portanto n˜ao
podemos realizar a leitura atrav´es de um la¸ co para - fa¸ ca. Entretanto,
o problema diz que a entrada encerra quando for digitado o n´ umero
−1 ao inv´es de uma idade, o que nos possibilita utilizar um la¸ co do
tipo enquanto - fa¸ ca para ler a entrada.
Quanto `a idade, observe que, ao inv´es de lermos o primeiro habitante
separadamente para inicializarmos o valor de maioridade com a idade
do primeiro habitante, usamos um n´ umero negativo. Neste caso, isso
´e poss´ıvel, pois n˜ao existe um valor de idade negativo e, al´em disso,
quando maioridade for comparada com a idade do primeiro habitante,
ela sempre vai receber este valor, pois ele sempre ser´a maior do que o
valor negativo de maioridade.
60
4.3. Problemas e Solu¸ c˜oes UFMS
Finalmente, o algoritmo calcula a porcentagem pedida de habitantes
e escreve os resultados dentro de uma estrutura condicional se - ent˜ao
- fimse. Isto ´e necess´ario para evitar que o c´alculo de porcentagem
seja realizado com o valor de totalhabitantes igual a 0, o que seria um
comando imposs´ıvel de ser executado.
4. Escrever um algoritmo para fazer uma tabela de seno de A, com A
variando de 0 a 1.6 radiano de d´ecimo em d´ecimo de radiano, usando
a s´erie
sen A = A−
A
3
3!
+
A
5
5!
+
com erro inferior a 0.0001. Escrever tamb´em o n´ umero de termos
utilizado.
// algoritmo para calcular o seno de um n´ umero por aproxima¸ c˜ao
algoritmo calcula seno
// declara¸ c˜ao de vari´aveis
real a, sena, t
inteiro n
// gera todos os valores de a para c´alculo do seno
para a de 0 at´e 1.6 passo 0.1 fa¸ ca
// c´alculo do seno de a
sena ← 0
t ← a
n ← 0
repita
sena ← sena +t
n ← n + 1
t ← −t ∗ (a ∗ a)/(2 ∗ n ∗ (2 ∗ n + 1))
at´e (t ≤ 0.0001) E (−t ≤ 0.0001)
fimpara
// escreve o seno obtido
escreva “o valor de a ´e: ”, a
escreva “o valor do seno de a ´e: ”, sena
escreva “o n´ umero de termos usados no c´alculo foi: ”, n
fimalgoritmo
Neste algoritmo, temos um “aninhamento” de la¸ cos. O la¸ co mais ex-
terno tem a finalidade de gerar todos os n´ umeros de 0 a 1.6, com
incremento de 0.1, dos quais desejamos calcular o seno. O la¸ co mais
61
4.3. Problemas e Solu¸ c˜oes UFMS
interno, por sua vez, tem a finalidade de calcular o seno do valor atual
de a gerado pelo la¸ co mais externo. A cada repeti¸ c˜ao do la¸ co mais
interno, um repita - at´e, um termo da s´erie ´e calculado e adicionado `a
vari´avel sena.
Um termo da s´erie ´e sempre calculado a partir do anterior, multiplicando-
se por este o que falta para se obter aquele. O valor do termo ´e ar-
mazenado em t. Observe que se t ´e o n-´esimo termo da s´erie, ent˜ao o
(n + 1)-´esimo termo pode ser obtido da seguinte forma:
t = t
a
2
2 n (2 n + 1)
.
Por exemplo,
a
5
5!
= −
a
3
3!

a
2
2 2 (2 2 + 1)
.
A express˜ao condicional “(t ≤ 0.0001) E (−t ≤ 0.0001)” garante que
o la¸ co repita - at´e encerra apenas quando o pr´oximo termo t a ser
adicionado a sena for inferior, em valor absoluto, a 0.0001, indicando
que o valor at´e ent˜ao em sena possui uma precis˜ao de 0.0001.
Bibliografia
O texto deste cap´ıtulo foi elaborado a partir dos livros abaixo relaciona-
dos:
1. Farrer, H. et. al. Algoritmos Estruturados. Editora Guanabara, 1989.
2. Shackelford, R.L. Introduction to Computing and Algorithms. Addison-
Wesley Longman, Inc, 1998.
62
Lista de Exerc´ıcios
1. Dados trˆes n´ umeros naturais, verificar se eles formam os lados de um
triˆangulo retˆangulo.
2. Dados trˆes n´ umeros inteiros, imprimi-los em ordem crescente.
3. Dada uma cole¸ c˜ao de n´ umeros naturais terminada por 0, imprimir seus
quadrados.
4. Dado n, calcular a soma dos n primeiros n´ umeros naturais.
5. Dado n, imprimir os n primeiros naturais ´ımpares.
Exemplo:
Para n = 4 a sa´ıda dever´a ser 1, 3, 5, 7.
6. Durante os 31 dias do mˆes de mar¸ co foram tomadas as temperaturas
m´edias di´arias de Campo Grande, MS. Determinar o n´ umero de dias
desse mˆes com temperaturas abaixo de zero.
7. Dados x inteiro e n um natural, calcular x
n
.
8. Uma loja de discos anota diariamente durante o mˆes de abril a quan-
tidade de discos vendidos. Determinar em que dia desse mˆes ocorreu
a maior venda e qual foi a quantidade de discos vendida nesse dia.
9. Dados o n´ umero n de alunos de uma turma de Programa¸ c˜ao de Com-
putadores I e suas notas de primeira prova, determinar a maior e a
menor nota obtidas por essa turma, onde a nota m´ınima ´e 0 e a nota
m´axima ´e 100.
10. Dados n e uma seq¨ uˆencia de n n´ umeros inteiros, determinar a soma
dos n´ umeros pares.
11. Dado n natural, determinar n!.
12. Dados n e dois n´ umeros naturais n˜ao nulos i e j, imprimir em ordem
crescente os n primeiros naturais que s˜ao m´ ultiplos de i ou de j ou de
ambos.
Exemplo:
Para n = 6, i = 2 e j = 3 a sa´ıda dever´a ser 0, 2, 3, 4, 6, 8.
63
Lista de Exerc´ıcios UFMS
13. Dizemos que um n´ umero natural ´e triangular se ´e produto de trˆes
n´ umeros naturais consecutivos.
Exemplo:
120 ´e triangular, pois 4 5 6 = 120.
Dado n natural, verificar se n ´e triangular.
14. Dado p inteiro, verificar se p ´e primo.
15. Uma pessoa aplicou um capital de x reais a juros mensais de y durante
1 ano. Determinar o montante de cada mˆes durante este per´ıodo.
16. Dado um natural n, determine o n´ umero harmˆonico H
n
definido por
H
n
=
n
¸
k=1
1
k
.
17. Os pontos (x, y) que pertencem `a figura H (veja a figura 4.1) s˜ao tais
que x ≥ 0, y ≥ 0 e x
2
+ y
2
≤ 1. Dados n pontos reais (x, y), verifique
se cada ponto pertence ou n˜ao a H.
x
y
H
Figura 4.1:
´
Area H de um quarto de um c´ırculo. Veja o exerc´ıcio 17.
18. Considere o conjunto H = H
1
∪ H
2
de pontos reais, onde
H
1
= ¦(x, y)[x ≤ 0, y ≤ 0, y +x
2
+ 2x −3 ≤ 0¦
H
2
= ¦(x, y)[x ≥ 0, y +x
2
−2x −3 ≤ 0¦
Fa¸ ca um algoritmo que lˆe uma seq¨ uˆencia de n pontos reais (x, y) e
verifica se cada ponto pertence ou n˜ao ao conjunto H. O algoritmo
deve tamb´em contar o n´ umero de pontos da seq¨ uˆencia que pertencem
a H.
19. Dados n´ umeros reais a, b e c, calcular as ra´ızes de uma equa¸ c˜ao do
segundo grau da forma ax
2
+bx +c = 0. Imprimir a solu¸ c˜ao em uma
das seguintes formas:
64
Lista de Exerc´ıcios UFMS
a. DUPLA b. REAIS DISTINTAS c. COMPLEXAS
raiz raiz 1 parte real
raiz 2 parte imagin´aria
20. Para n alunos de uma determinada classe s˜ao dadas as 3 notas das
provas. Calcular a m´edia aritm´etica das provas de cada aluno, a m´edia
da classe, o n´ umero de aprovados e o n´ umero de reprovados, onde o
crit´erio de aprova¸ c˜ao ´e m´edia ≥ 5,0.
21. Dadas as popula¸ c˜oes de Caarap´o (MS) e Rio Negro (MS) e sabendo que
a popula¸ c˜ao de Caarap´o tem um crescimento anual de x e a popula¸ c˜ao
de Rio Negro tem um crescimento anual de y determine:
(a) se a popula¸ c˜ao da cidade menor ultrapassa a da maior;
(b) quantos anos passar˜ao antes que isso aconte¸ ca.
22. Dados dois n´ umeros inteiros positivos, determinar o m´ aximo divisor
comum entre eles utilizando o algoritmo de Euclides.
Exemplo:
1 1 1 2
24 15 9 6 3 = mdc(24,15)
9 6 3 0
23. Dado n inteiro positivo, dizemos que n ´e perfeito se for igual `a soma
de seus divisores positivos diferentes de n.
Exemplo:
28 ´e perfeito, pois 1 + 2 + 4 + 7 + 14 = 28
Verificar se um dado inteiro positivo ´e perfeito.
24. Leonardo Fibonacci
2
conseguiu modelar o ritmo de crescimento da po-
pula¸ c˜ao de coelhos atrav´es de uma seq¨ uˆencia de n´ umeros naturais que
passou a ser conhecida como seq¨ uˆencia de Fibonacci. O n-´esimo
n´ umero da seq¨ uˆencia de Fibonacci F
n
´e dado pela seguinte f´ormula de
recorrˆencia:
2
Matem´atico italiano do s´eculo XII, conhecido pela descoberta dos n´ umeros de Fibo-
nacci e pelo seu papel na introdu¸c˜ao do sistema decimal ar´abico para escrita e manipula¸c˜ao
de n´ umeros na Europa. O nome do matem´atico era Leonardo Fibonacci (

–

).
Seu pai, Guglielmo, tinha o apelido de Bonacci, que quer dizer “pessoa simples”. Le-
ornardo foi postumamente conhecido como Fibonacci (filius Bonacci ). Naquela ´epoca,
uma pessoa ilustre tinha seu sobrenome associado ao lugar a que pertencia. Por isso, este
matem´atico ´e mais conhecido como Leonardo de Pisa ou Leonardo Pisano.
65
Lista de Exerc´ıcios UFMS

F
1
= 1
F
2
= 1
F
i
= F
i−1
+F
i−2
para i ≥ 3.
Fa¸ ca um algoritmo que dado n calcula F
n
.
25. Dizemos que um n´ umero i ´e congruente m´ odulo m a j se i mod m =
j mod m.
Exemplo:
35 ´e congruente m´odulo 4 a 39, pois 35 mod 4 = 3 = 39 mod
4.
Dados n, j e m naturais n˜ao nulos, imprimir os n primeiros naturais
congruentes a j m´odulo m.
26. Dado um n´ umero natural na base bin´aria, transform´a-lo para a base
decimal.
Exemplo:
Dado 10010 a sa´ıda ser´a 18, pois 1 2
4
+ 0 2
3
+ 0 2
2
+ 1
2
1
+ 0 2
0
= 18.
27. Dado um n´ umero natural na base decimal, transform´a-lo para a base
bin´aria.
Exemplo:
Dado 18 a sa´ıda dever´a ser 10010.
28. Dado um n´ umero inteiro positivo n que n˜ao cont´em um d´ıgito 0,
imprimi-lo na ordem inversa de seus d´ıgitos.
Exemplo:
Dado 26578 a sa´ıda dever´a ser 87562.
29. Qualquer n´ umero natural de quatro algarismos pode ser dividido em
duas dezenas formadas pelos seus dois primeiros e dois ´ ultimos d´ıgitos.
Exemplos:
1297 : 12 e 97.
5314 : 53 e 14.
Escreva um algoritmo que imprima todos os n´ umeros de quatro al-
garismos cuja raiz quadrada seja a soma das dezenas formadas pela
divis˜ao acima.
Exemplo:
66
Lista de Exerc´ıcios UFMS

9801 = 99 = 98 + 01.
Portanto, 9801 ´e um dos n´ umeros a ser impresso.
30. Dados n e uma seq¨ uˆencia de n n´ umeros inteiros, determinar quantos
segmentos de n´ umeros iguais consecutivos comp˜oem essa seq¨ uˆencia.
Exemplo:
A seq¨ uˆencia
....
5 ,
....
2, 2 ,
. .. .
4, 4, 4, 4,
....
1, 1 ´e formada por 5 seg-
mentos de n´ umeros iguais.
31. Dados um inteiro positivo n e uma seq¨ uˆencia de n n´ umeros inteiros,
determinar o comprimento de um segmento crescente de comprimento
m´aximo.
Exemplos:
Na seq¨ uˆencia 5, 10, 3,
. .. .
2, 4, 7, 9, 8, 5 o comprimento do seg-
mento crescente m´aximo ´e 4.
Na seq¨ uˆencia 10, 8, 7, 5, 2 o comprimento de um segmento
crescente m´aximo ´e 1.
32. Dizemos que um n´ umero natural n com pelo menos 2 algarismos ´e
pal´ındrome se
o primeiro algarismo de n ´e igual ao seu ´ ultimo algarismo;
o segundo algarismo de n ´e igual ao se pen´ ultimo algarismo;
e assim sucessivamente.
Exemplos:
567765 ´e pal´ındrome;
32423 ´e pal´ındrome;
567675 n˜ao ´e pal´ındrome.
Dado um n´ umero natural n, n ≥ 10, verificar se n ´e pal´ındrome.
33. Dado um inteiro positivo n, calcular e imprimir o valor da seguinte
soma
1
n
+
2
n −1
+
3
n −2
+. . . +
n
1
pelas seguintes maneiras:
(a) f´ormula de recorrˆencia;
(b) f´ormula do termo geral.
67
Lista de Exerc´ıcios UFMS
34. Fa¸ ca um algoritmo que calcula a soma
1 −
1
2
+
1
3

1
4
+. . . +
1
9999

1
10000
pelas seguintes maneiras:
(a) adi¸ c˜ao dos termos da direita para a esquerda;
(b) adi¸ c˜ao dos termos da esquerda para a direita;
(c) adi¸ c˜ao separada dos termos positivos e dos termos negativos da
esquerda para a direita;
(d) adi¸ c˜ao separada dos termos positivos e dos termos negativos da
direita para a esquerda;
(e) f´ormula de recorrˆencia;
(f) f´ormula do termo geral.
35. Uma maneira de calcular o valor do n´ umero π ´e utilizar a seguinte
s´erie:
π = 4 −
4
3
+
4
5

4
7
+
4
9

4
11
+. . .
Fazer um algoritmo para calcular e imprimir o valor de π atrav´es da
s´erie acima, com precis˜ao de 4 casas decimais. Para obter a precis˜ao
desejada, adicionar apenas os termos cujo valor absoluto seja maior
ou igual a 0,0001.
36. Dados x real e n natural, calcular uma aproxima¸ c˜ao para cos x atrav´es
dos n primeiros termos da seguinte s´erie:
cos x = 1 −
x
2
2!
+
x
4
4!

x
6
6!
+. . . + (−1)
k
x
2k
(2k)!
+. . .
Compare com os resultados de sua calculadora.
37. Dados x e ε reais, ε > 0, calcular uma aproxima¸ c˜ao para sen x atrav´es
da seguinte s´erie infinita
sinx =
x
1!

x
3
3!
+
x
5
5!
−. . . + (−1)
k
x
2k+1
(2k + 1)!
+. . .
incluindo todos os termos T
i
= (−1)
k x
2k+1
(2k+1)!
, at´e que T
i
< ε. Compare
com os resultados de sua calculadora.
38. Dadas n seq¨ uˆencias de n´ umeros inteiros, cada qual terminada por 0,
calcular a soma dos n´ umeros pares de cada seq¨ uˆencia.
39. Dado um n´ umero inteiro positivo n, determinar todos os inteiros entre
1 e n que s˜ao comprimento de hipotenusa de um triˆangulo retˆangulo
com catetos inteiros.
68
Lista de Exerc´ıcios UFMS
40. Dados dois naturais me n, determinar, entre todos os pares de n´ umeros
naturais (x, y) tais que x ≤ m e y ≤ n, um par para o qual o valor da
express˜ao xy −x
2
+y seja m´aximo e calcular tamb´em esse m´aximo.
41. Dados n n´ umeros inteiros positivos, calcular a soma dos que s˜ao pri-
mos.
42. Sabe-se que um n´ umero da forma n
3
´e igual `a soma de n n´ umeros
´ımpares consecutivos.
Exemplo:
1
3
= 1
2
3
= 3 + 5
3
3
= 7 + 9 + 11
4
3
= 13 + 15 + 17 + 19
.
.
.
Dado m, determine os ´ımpares consecutivos cuja soma ´e igual a n
3
para n assumindo valores de 1 a m.
43. Dado um n´ umero inteiro positivo, determine a sua decomposi¸ c˜ao em
fatores primos, calculando tamb´em a multiplicidade de cada fator.
44. Dados n inteiros positivos, determinar o m´aximo divisor comum entre
eles.
69
Estruturas de Dados 5
Como visto no Cap´ıtulo 3, tipos de dados elementares s˜ao caracterizados
pelo fato que seus valores s˜ao atˆomicos, isto ´e, n˜ao admitem decomposi¸ c˜ao.
Os tipos de dados num´erico, caracter e l´ogico est˜ao entre os tipos de dados
elementares suportados pela maioria das linguagens de programa¸ c˜ao. Entre-
tanto, se os valores de um tipo de dados admitem decomposi¸ c˜ao em valores
mais simples, ent˜ao o tipo de dados ´e dito complexo ou estruturado, ao inv´es
de elementar, e a organiza¸ c˜ao de cada componente e as rela¸c˜oes entre eles
constitui o que chamamos de estrutura de dados.
Neste Cap´ıtulo, estudaremos as estruturas de dados mais elementares,
tais como vetores, matrizes e registros, mas que nos permitir˜ao resolver
problemas mais complexos do que aqueles vistos at´e agora.
5.1 Vetores
Considere o seguinte problema:
Calcule a m´edia aritm´etica das notas de 5 alunos de uma disci-
plina e determine o n´ umero de alunos que tiveram nota superior
`a m´edia calculada.
Como vocˆe bem sabe, o c´alculo da m´edia aritm´etica das notas de 5 alunos
de uma disciplina pode ser resolvido atrav´es de uma estrutura de repeti¸ c˜ao
como a que segue:
.
.
.
soma ← 0
para i de 1 at´ e 5 fa¸ ca
70
5.1. Vetores UFMS
leia nota
soma ← soma +nota
fimpara
media ← soma/5
.
.
.
Entretanto, se seguirmos com este trecho de algoritmo, como determinare-
mos quantos alunos obtiveram nota superior `a m´edia calculada? Isto porque
n˜ao temos as notas de cada um dos 5 alunos depois que o trecho acima for
executado. Logo, devemos optar por outro caminho, que pode ser este que
segue abaixo:
// algoritmo para calcular a m´edia de 5 notas e escrever
// quantos alunos obtiveram nota superior `a m´edia
algoritmo calcula m´edia e notas superiores
// declara¸ c˜ao de constantes e vari´aveis
inteiro soma, media, nota1, nota2, nota3
inteiro nota4, nota5, num
// leitura das notas
leia nota1, nota2, nota3, nota4, nota5
// c´alculo a soma das notas
soma ← nota1 +nota2 +nota3 +nota4 +nota5
// c´alculo da m´edia
media ← soma/5
// c´alculo das notas superiores `a m´edia
num ← 0
se nota1 > media ent˜ao
num ← num+ 1
fimse
se nota2 > media ent˜ao
num ← num+ 1
fimse
se nota3 > media ent˜ao
num ← num+ 1
fimse
71
5.1. Vetores UFMS
se nota4 > media ent˜ao
num ← num+ 1
fimse
se nota5 > media ent˜ao
num ← num+ 1
fimse
// escreve o n´ umero de alunos com nota superior `a m´edia
escreve “o n´ umero de alunos com nota superior `a m´edia ´e: ”, num
fimalgoritmo
Como podemos constatar, n˜ao fomos capazes de utilizar uma estrutura de
repeti¸ c˜ao para calcular quantas notas eram superiores `a m´edia, mesmo em-
bora houvesse 5 estruturas condicionais idˆenticas, a menos da vari´avel com
o valor da nota, para realizar o c´alculo desejado. No caso do problema
acima, esta redundˆancia n˜ao chega a ser um “fardo”, mas se tiv´essemos 100,
1000, ou mesmo 1000000 de notas, esta solu¸ c˜ao seria invi´avel, uma vez que
ter´ıamos de escrever, respectivamente, 100, 1000 ou 1000000 de estruturas
condicionais semelhantes, uma para cada nota. Felizmente, para problemas
como este, temos uma forma eficaz de solu¸ c˜ao, que utiliza uma estrutura de
dados denominada vetor.
5.1.1 Definindo uma Estrutura de Dados Vetor
A estrutura de dados vetor ´e uma estrutura de dados linear utilizada
para armazenar uma lista de valores do mesmo tipo. Um dado vetor ´e
definido como tendo algum n´ umero fixo de c´elulas idˆenticas. Cada c´elula
armazena um, e somente um, dos valores de dados do vetor. Cada uma das
c´elulas de um vetor possui seu pr´oprio endere¸ co, ou ´ındice, atrav´es do qual
podemos referenci´a-la. Por exemplo, a primeira c´elula de um vetor possui
´ındice 1, a quarta possui ´ındice 4, e assim por diante.
Ao definirmos um vetor, estamos na verdade especificando a estrutura
de dados de um novo tipo de dados, o tipo de dados vetor, pois este tipo,
ao contr´ario dos tipos primitivos, n˜ao est´a “pronto para uso” e, portanto,
deve ser definido explicitamente dentro do algoritmo. Temos tamb´em que a
defini¸ c˜ao de uma estrutura de dados ´e parte da especifica¸ c˜ao de um tipo de
dados complexo, que, como sabemos, tamb´em consiste na especifica¸ c˜ao das
opera¸ c˜oes sobre o conjunto de valores do tipo. Entretanto, no momento, ve-
remos a defini¸ c˜ao de tipos complexos como composta apenas da especifica¸ c˜ao
da estrutura de dados.
72
5.1. Vetores UFMS
N´os podemos definir um vetor atrav´es da especifica¸ c˜ao de um identifi-
cador para um tipo vetor, suas dimens˜oes e o tipo de dados dos valores que
ele pode armazenar. Isto ´e feito da seguinte forma:
definatipo vetor[l
i
..l
s
] de <tipo dos elementos> <nome do tipo>
onde
• definatipo e vetor s˜ao palavras-chave;
• tipo dos elementos ´e o nome do tipo dos elementos do vetor;
• nome do tipo ´e um identificador para o tipo sendo definido;
• l
i
e l
s
s˜ao respectivamente os limites inferior e superior do vetor.
Por exemplo, para criarmos um vetor de 5 elementos inteiros chamado
vetor notas, fazemos:
definatipo vetor[1..5] de inteiro vetor notas
O n´ umero de elementos (c´elulas) de um vetor ´e dado por l
s
− l
i
+ 1 e
o ´ındice do primeiro elemento (c´elula) ´e l
i
, do segundo ´e l
i
+ 1, e assim
por diante. Isto significa que dois vetores a e b com valores l
i
e l
s
sejam
1 e 5 e 7 e 11, respectivamente, possuem o mesmo n´ umero de elementos:
5 = 5−1+1 = 11−7+1; entretanto, o primeiro elemento de a possui ´ındice
1, enquanto o primeiro elemento de b possui ´ındice 7.
5.1.2 Declarando e Manipulando Vari´aveis do Tipo Vetor
Para declararmos uma vari´avel de um tipo vetor, procedemos exatamente
da mesma forma que para um tipo simples. Por exemplo, considere a cria¸ c˜ao
de uma vari´avel denominada notas do tipo vetor notas:
vetor notas notas
Esta declara¸ c˜ao significa que estamos criando uma vari´avel notas que ´e
do tipo vetor notas, ou seja, um vetor de inteiros com 5 posi¸ c˜oes de ´ındices
1 a 5. Uma vez declarada a vari´avel notas, podemos atribuir qualquer
conjunto de 5 valores num´ericos `a vari´avel. Entretanto, isto n˜ao ´e feito da
forma mais natural, tal como
73
5.1. Vetores UFMS
notas ← (−1, 0, 1, 33, −10)
mas sim individualmente; ou seja, um valor por vez a cada c´elula do vetor.
Para tal, usamos o nome da vari´avel, o´ındice da c´elula e uma sintaxe pr´opria.
Por exemplo, notas[0] ← −1, atribui o valor −1 `a c´elula de ´ındice 1 do vetor.
De forma geral, as c´elulas, e n˜ao a vari´avel do tipo vetor como um todo,
´e que s˜ao utilizadas em qualquer opera¸ c˜ao envolvendo a vari´avel, sejam elas
leitura, escrita, atribui¸ c˜ao, express˜ao, e assim por diante. No caso particular
do vetor notas, a c´elula de ´ındice i de notas, notas[i], pode ser usada em
qualquer parte de um algoritmo em que uma vari´avel inteira possa ser usada.
Isto significa que podemos ter comandos tais como
leia notas[1], escreva notas[1] e notas[2] ← notas[1] + 1.
5.1.3 Problemas e Solu¸c˜oes Envolvendo Vetores
Vamos iniciar esta subse¸ c˜ao resolvendo de forma eficaz o problema esta-
belecido no in´ıcio deste Cap´ıtulo:
1. Calcule a m´edia aritm´etica das notas de 5 alunos de uma disciplina
e determine o n´ umero de alunos que tiveram nota superior `a m´edia
calculada.
// algoritmo para calcular a m´edia de 5 notas e escrever
// quantos alunos obtiveram nota superior `a m´edia
algoritmo calcula m´edia e notas superiores
// declara¸ c˜ao de constantes
defina LI 1
defina LS 5
// declara¸ c˜ao de tipos
definatipo vetor[LI..LS] de real vetor notas
// declara¸ c˜ao de vari´aveis
vetor notas notas
real soma, media
inteiro num, i
// lˆe e calcula a m´edia das notas
soma ← 0
74
5.1. Vetores UFMS
para i de LI at´e LS fa¸ ca
leia notas[i]
soma ← soma +notas[i]
fimpara
// c´alculo da m´edia
media ← soma/(LS −LI + 1)
// c´alculo das notas superiores `a m´edia
num ← 0
para i de LI at´e LS fa¸ ca
se notas[i] > media ent˜ao
num ← num+ 1
fimse
fimpara
// escreve o n´ umero de alunos com nota superior `a m´edia
escreve “o n´ umero de alunos com nota superior `a m´edia ´e: ”, num
fimalgoritmo
2. Escreva um algoritmo que declare uma vari´avel de um tipo vetor de
10 elementos inteiros, leia 10 valores para esta vari´avel e ent˜ao escreva
o maior e o menor valor do vetor e suas respectivas posi¸ c˜oes no vetor.
// algoritmo para ler um vetor de 10 elementos e depois escrever
// o maior e o menor elemento e suas respectivas posi¸ c˜oes
algoritmo encontra menor maior
// declara¸ c˜ao de constantes
defina LI 1
defina LS 10
// cria um tipo vetor de n´ umeros
definatipo vetor[LI..LS] de inteiro vetor10
// declara¸ c˜ao de vari´aveis
vetor10 n
inteiro i, maior, menor, pmenor, pmaior
// lˆe 10 n´ umeros e armazena-os em um vetor
para i de LI at´e LS fa¸ ca
escreva “Entre com o elemento ”, i −LI + 1, “ do vetor: ”
75
5.1. Vetores UFMS
leia n[i]
fimpara
// determina menor e maior e suas posi¸ c˜oes
menor ← n[LI]
maior ← n[LI]
pmenor ← 1
pmaior ← 1
para i de LI + 1 at´e LS fa¸ ca
se menor > n[i] ent˜ao
menor ← n[i]
pmenor ← i −LI + 1
sen˜ao
se maior < n[i] ent˜ao
maior ← n[i]
pmaior ← i −LI + 1
fimse
fimse
fimpara
// escreve o menor e o maior valor e suas posi¸ c˜oes
escreva “O menor valor ´e: ”, menor
escreva “A posi¸ c˜ao do menor valor ´e: ”, pmenor
escreva “O maior valor ´e: ”, maior
escreva “A posi¸ c˜ao do maior valor ´e: ”, pmaior
fimalgoritmo
3. O Departamento de Computa¸ c˜ao e Estat´ıstica (DCT) da UFMS deseja
saber se existem alunos cursando, simultaneamente, as disciplinas Pro-
grama¸ c˜ao de Computadores e Introdu¸ c˜ao `a Ciˆencia da Computa¸ c˜ao.
Para tal, est˜ao dispon´ıveis os n´ umeros de matr´ıcula dos alunos de Pro-
grama¸ c˜ao de Computadores (no m´aximo 60) e de Introdu¸ c˜ao `a Ciˆencia
da Computa¸ c˜ao (no m´aximo 80).
Escreva um algoritmo que leia cada conjunto de n´ umeros de matr´ıcula
dos alunos e escreva as matr´ıculas daqueles que est˜ao cursando as duas
disciplinas ao mesmo tempo. Considere que cada conjunto de n´ umeros
de matr´ıcula encerre com a matr´ıcula inv´alida 9999, de forma que o
algoritmo saiba quando o conjunto de n´ umeros j´a foi lido.
// algoritmo para determinar e escrever as matr´ıcula iguais de duas
// de duas disciplinas
// algoritmo determina matr´ıculas iguais
76
5.1. Vetores UFMS
// declara¸ c˜ao de constantes
defina LI 1
defina LSPC 60
defina LSICC 80
// declara¸ c˜ao de tipos
definatipo vetor[LI..LSPC] de inteiro vetorpc
definatipo vetor[LI..LSICC] de inteiro vetoricc
// declara¸ c˜ao de vari´aveis
vetorpc vpc
vetoricc vicc
inteiro i, j, k, l, num
// lˆe as matr´ıculas dos alunos de Programa¸ c˜ao de Computadores
i ← LI −1
leia num
enquanto num = 9999 fa¸ ca
i ← i + 1
vpc[i] ← num
leia num
fimenquanto
// lˆe as matr´ıculas dos alunos de Introdu¸ c˜ao
// `a Ciˆencia da Computa¸ c˜ao
j ← LI −1
leia num
enquanto num = 9999 fa¸ ca
j ← j + 1
vicc[j] ← num
leia num
fimenquanto
// verifica se existem matr´ıculas iguais. Se existirem, escreve
// as matr´ıculas iguais.
para k de LI at´e i fa¸ ca
l ← LI
enquanto l ≤ j fa¸ ca
se vpc[k] = vicc[l] ent˜ao
escreva vpc[k]
l ← j + 1
sen˜ao
77
5.1. Vetores UFMS
l ← l + 1
fimse
fimenquanto
fimpara
fimalgoritmo
4. Escreva um algoritmo que recebe um inteiro 0 < n ≤ 100 e um vetor
de n n´ umeros inteiros cuja primeira posi¸ c˜ao ´e 1 e inverte a ordem dos
elementos do vetor sem usar outro vetor.
// algoritmo para inverter a ordem dos elementos de um vetor sem
// utilizar vetor auxiliar
algoritmo inverte
// declara¸ c˜ao de constantes
defina LI 1
defina LS 100
// cria um tipo vetor de n´ umeros
definatipo vetor[LI..LS] de inteiro vet int
// declara¸ c˜ao de vari´aveis
vet int v
inteiro i, temp
// entrada de dados
leia n
para i de 1 at´e n fa¸ ca
leia v[i]
fimpara
// troca os elementos com seus sim´etricos
para i de 1 at´e n DIV 2 fa¸ ca
temp ← v[i]
v[i] ← v[n −i + 1]
v[n −i + 1] ← temp
fimpara
// sa´ıda dos resultados
para i de 1 at´e n fa¸ ca
escreva v[i]
78
5.2. Matrizes UFMS
fimpara
fimalgoritmo
5.2 Matrizes
Os vetores que estudamos at´e ent˜ao s˜ao todos unidimensionais. Mas,
podemos declarar e manipular vetores com mais de uma dimens˜ao, os quais
denominamos matrizes. Por exemplo, podemos definir uma estrutura de
dados matriz 4 por 5 (uma tabela com 4 linhas e 5 colunas), denominada
tabela, escrevendo as seguintes linhas:
defina LI 1 1
defina LS 1 4
defina LI 2 1
defina LS 2 5
definatipo vetor[LI 1..LS 1] de inteiro coluna
definatipo vetor[LI 2..LS 2] de coluna tabela
Neste exemplo, coluna ´e um tipo vetor de n´ umeros, isto ´e, um tipo cuja
estrutura de dados ´e um vetor unidimensional, como estamos acostumados
a criar. Entretanto, tabela ´e um tipo vetor de coluna, ou seja, um tipo cuja
estrutura de dados ´e um vetor bidimensional (uma matriz), pois cada um
de seus elementos ´e do tipo vetor de n´ umeros do tipo coluna!
Uma forma alternativa para definir o tipo tabela acima (e preferida pelos
desenvolvedores de algoritmo) ´e a seguinte:
defina LI 1 1
defina LS 1 4
defina LI 2 1
defina LS 2 5
definatipo vetor[LI 1..LS 1, LI 2..LS 2] de inteiro tabela
Tanto em uma forma de defini¸ c˜ao quanto na outra, as constantes LI 1,
LS 1, LI 2 e LS 2 estabelecem o n´ umero de elementos da tabela. Isto ´e,
LS 1 − LI 1 + 1 ´e n´ umero de linhas da tabela, enquanto LS 2 − LI 2 + 1,
o n´ umero de colunas.
79
5.2. Matrizes UFMS
Uma vez definido o tipo tabela, podemos declarar uma vari´avel deste tipo
da mesma maneira que declaramos vari´aveis dos demais tipos. Por exemplo,
a linha abaixo declara uma vari´avel denominada mat do tipo tabela:
tabela mat
A partir da´ı, podemos manipular a vari´avel mat utilizando dois ´ındices,
em vez de apenas 1, para referenciar cada elemento desta matriz. O primeiro
´ındice identifica a posi¸ c˜ao do elemento na primeira dimens˜ao, enquanto o
segundo identifica a posi¸ c˜ao do elemento na segunda dimens˜ao. Se imagi-
narmos mat como uma tabela, ent˜ao o primeiro ´ındice corresponde `a linha
da tabela em que o elemento se encontra, enquanto o segundo, ` a coluna. Por
exemplo, suponha que desejemos atribuir o valor 0 a todos os elementos da
matriz mat. Isto pode ser feito com o seguinte trecho de c´odigo:
.
.
.
para i de LI 1 at´e LS 1 fa¸ ca
para j de LI 2 at´e LS 2 fa¸ ca
mat[i, j] ← 0
fimpara
fimpara
.
.
.
Observe que um aninhamento de la¸ cos foi utilizado para “varrer” toda a
matriz. O la¸ co mais externo ´e respons´avel por variar o ´ındice que representa
a posi¸ c˜ao do elemento na primeira dimens˜ao da matriz, enquanto o la¸ co
mais interno ´e utilizado para variar o ´ındice que representa a posi¸ c˜ao do
elemento na segunda dimens˜ao da matriz. A sintaxe mat[i, j] ´e usada para
referenciarmos o elemento da linha i e coluna j da matriz mat.
5.2.1 Problemas e Solu¸c˜oes Envolvendo Matrizes
1. Escreva um algoritmo que declare uma vari´avel de um tipo matriz de
4 por 5 elementos num´ericos, leia valores para esta vari´avel e escreva
a soma dos elementos de cada linha da matriz, bem como a soma de
todos os elementos.
// algoritmo para determinar e escrever a soma dos elementos das linhas
// de uma matriz 4 por 5 e a soma de todos os elementos da matriz
algoritmo soma por linha e de linhas de matriz
80
5.2. Matrizes UFMS
// declara¸ c˜ao de constantes
defina LI 1 1
defina LS 1 4
defina LI 2 1
defina LS 2 5
// declara¸ c˜ao de tipos
definatipo vetor[LI 1..LS 1, LI 2..LS 2] de inteiro tabela
// declara¸ c˜ao de vari´aveis
tabela mat
inteiro i, j, somalin, somatot
// leitura dos elementos da matriz
para i de LI 1 at´e LS 1 fa¸ ca
para j de LI 2 at´e LS 2 fa¸ ca
escreva “entre com o elemento ”, i −LI 1 + 1,“ e ”, j −LI 2 + 1,
“ da matriz”
leia mat[i, j]
fimpara
fimpara
// soma elementos por linha e totaliza
somatot ← 0
para i de LI 1 at´e LS 1 fa¸ ca
// calcula a soma da linha i −LI 1 + 1
somalin ← 0
para j de LI 2 at´e LS 2 fa¸ ca
somalin ← somalin +mat[i, j]
fimpara
// exibe a soma da linha i −LI 1 + 1
escreva “A soma dos elementos da linha ”, i −LI 1 + 1,“: ”, somalin
// acumula a soma das linhas para encontrar a soma total
somatot ← somatot +mat[i, j]
fimpara
// exibe a soma total
escreva “A soma de todos os elementos ´e: ”, somatot
fimalgoritmo
81
5.2. Matrizes UFMS
2. Dadas duas matrizes A
n×m
e B
m×p
, com n ≤ 50, m ≤ 50 e p ≤ 50.
Obter a matriz matriz C
m×p
onde C = AB.
// algoritmo para multiplicar duas matrizes
algoritmo produto de matrizes
// defini¸ c˜ao de constantes
defina LI 1
defina LS 50
// defini¸ c˜ao de tipos
definatipo vetor[LI..LS, LI..LS] de inteiro matriz
// declara¸ c˜ao de vari´aveis
matriz A, B, C
inteiro i, j, k, n, m, p
// entrada de dados
leia n, m, p
para i de 1 at´e n fa¸ ca
para j de 1 at´e m fa¸ ca
leia A[i, j]
fimpara
fimpara
para i de 1 at´e m fa¸ ca
para j de 1 at´e p fa¸ ca
leia B[i, j]
fimpara
fimpara
// C´alculo da matriz produto
para i de 1 at´e n fa¸ ca
para j de 1 at´e p fa¸ ca
C[i, j] ← 0
para k de 1 at´e m fa¸ ca
C[i, j] ← A[i, k] ∗ B[k, j] +C[i, j]
fimpara
fimpara
fimpara
// escrita da matriz C
para i de 1 at´e n fa¸ ca
82
5.3. Registros UFMS
para j de 1 at´e p fa¸ ca
escreva C[i, j]
fimpara
fimpara
fimalgoritmo
5.3 Registros
Um registro ´e uma estrutura de dados que agrupa dados de tipos dis-
tintos ou, mais raramente, do mesmo tipo. Um registro de dados ´e composto
por um certo n´ umero de campos de dado, que s˜ao itens de dados individu-
ais. Por exemplo, suponha que desejemos criar um algoritmo para manter
um cadastro dos empregados de uma dada companhia. Neste cadastro, te-
mos os seguintes dados para cada empregado:
• Nome do empregado.
• CPF do empregado.
• Sal´ario do empregado.
• Se o empregado possui ou n˜ao dependentes.
Ent˜ao, cada ficha deste cadastro pode ser representada por um registro
que cont´em os campos nome, CPF, sal´ario e indica¸ c˜ao de existˆencia de
dependentes. Neste caso, a natureza dos campos ´e bem diversificada, pois
nome pode ser representado por uma cadeia, CPF e sal´ario por valores
num´ericos e existˆencia de dependentes por um valor l´ogico.
5.3.1 Definindo uma Estrutura de Registro
A sintaxe para defini¸ c˜ao de um novo tipo registro ´e a seguinte:
definatipo registro
< tipo do campo
1
> < campo
1
>
< tipo do campo
2
> < campo
2
>
.
.
.
< tipo do campo
n
> < campo
n
>
fimregistro <nome do tipo>
83
5.3. Registros UFMS
onde nome do tipo ´e o nome do tipo registro cuja estrutura est´a sendo
criada, campo
i
´e o nome do i-´esimo campo do registro e tipo do campo
i
´e o
tipo do i-´esimo campo do registro.
Como exemplo, vamos criar um registro para representar uma ficha do
cadastro de empregados dado como exemplo anteriormente:
definatipo registro
cadeia nome
inteiro CPF
real salario
l´ogico temdep
fimregistro regficha
5.3.2 Criando e Manipulando Vari´aveis de Registros
Uma vez que um tipo registro tenha sido definido, podemos criar tantas
vari´aveis daquele tipo quanto desejarmos, assim como fazemos com qualquer
outro tipo complexo visto at´e ent˜ao. Por exemplo, para criarmos trˆes fichas
de empregado para o nosso exemplo do cadastro, escrevemos:
regficha ficha1, ficha2, ficha3
Cada uma dessas trˆes vari´aveis ´e um registro do tipo regficha e, portanto,
cada uma delas possui quatro campos de dado: nome, CPF, salario e temdep.
Assim como vari´aveis de vetores e matrizes, vari´aveis registros s˜ao ma-
nipuladas atrav´es de suas partes constituintes. Em particular, uma vari´avel
registro ´e manipulada atrav´es de seus campos. Ent˜ao, se desejarmos atribuir
um valor a uma vari´avel registro, temos de efetuar a atribui¸ c˜ao de valores
para seus campos constituintes, um de cada vez. Como exemplo, considere
a seguinte atribui¸ c˜ao do conjunto de valores “Beltrano de Tal”, 123456789,
1800000 e falso `a vari´avel ficha1:
ficha1.nome ← “Beltrano de Tal”
ficha1.CPF ← 123456789
ficha1.salario ← 180.00
ficha1.temdep ← falso
A partir deste exemplo, podemos verificar que o acesso a cada campo
de uma vari´avel registro ´e realizado atrav´es da escrita do nome da vari´avel
84
5.3. Registros UFMS
registro seguido de um ponto (.) que, por sua vez, ´e seguido pelo nome do
campo.
5.3.3 Vetores de Registros
Registros nos fornecem uma forma de agrupar dados de natureza dis-
tinta. Entretanto, criarmos uma ´ unica vari´avel de um registro complexo
n˜ao parece ser muito diferente de criarmos uma vari´avel para cada campo
do registro e trat´a-las individualmente. Isto ´e, criar uma ´ unica vari´avel de
um registro complexo n˜ao nos ajudaria a resolver nossos problemas mais
facilmente do que com o que aprendemos antes. A grande for¸ ca dos regis-
tros reside no uso deles combinado com vetores. Por exemplo, um grupo
de 100 empregados iria requerer um conjunto de 100 vari´aveis registros, o
que pode ser conseguido atrav´es da cria¸ c˜ao de um vetor de 100 elementos
do tipo registro em quest˜ao!
Um vetor de registros ´e criado da mesma forma que criamos vetores de
qualquer dos tipos que aprendemos at´e ent˜ao. Suponha, por exemplo, que
desejemos criar um vetor de 100 elementos do tipo regficha. Isto ´e feito da
seguinte forma:
defina LI 1
defina LS 100
definatipo registro
cadeia nome
inteiro CPF
real salario
l´ogico temdep
fimregistro regficha
definatipo vetor[LI..LS] de regficha vetcad
Agora, considere a declara¸ c˜ao de uma vari´avel do tipo vetcad:
vetcad cadastro
Para manipular um registro individual do vetor cadastro, utilizamos o
nome da vari´avel vetor e o´ındice do elemento correspondente ao registro que
queremos acessar, como fazemos com um vetor de qualquer outro tipo. Da´ı
em diante, procedemos como aprendemos na Subse¸ c˜ao 5.3.2. Por exemplo,
85
5.3. Registros UFMS
se quisermos atribuir o conjunto de valores “Sicrano de Tal”, 987654321,
540, 00 e verdadeiro ao primeiro registro de cadastro, fazemos:
cadastro[1].nome ← “Sicrano de Tal”
cadastro[1].CPF ← 987654321
cadastro[1].salario ← 540, 00
cadastro[1].temdep ← verdadeiro
5.3.4 Registro de Tipos Complexos
Assim como combinamos vetores e registros para criar vetores de registro,
podemos ter um registro de cujo um ou mais campos s˜ao de um outro
tipo de registro ou vetores. Suponha, por exemplo, que queremos adicionar
um campo ao nosso registro regficha para representar a conta banc´aria do
empregado. Este campo pode ser um outro registro contendo os campos
nome do banco, n´ umero da agˆencia e n´ umero da conta banc´aria. Vejamos
como ficaria a nova defini¸ c˜ao de regficha:
definatipo registro
cadeia banco
inteiro agencia
inteiro numcc
fimregistro regbanco
definatipo registro
cadeia nome
inteiro CPF
real salario
l´ogico temdep
regbanco conta
fimregistro regficha
O fato do campo conta de regbanco ser um outro registro faz com que
a manipula¸ c˜ao deste campo seja realizada, tamb´em, atrav´es de suas partes
constituintes. Ent˜ao, se criarmos uma vari´avel ficha do tipo regficha, temos
de manipular o campo conta de ficha como segue:
ficha.conta.banco ← “Banco de Pra¸ ca”
ficha.conta.agencia ← 666
ficha.conta.numcc ← 4555
86
5.3. Registros UFMS
5.3.5 Um Problema Envolvendo Registros
Suponha que vocˆe tenha sido contratado pela Copeve para construir
parte de um programa para calcular o n´ umero de acertos em prova dos
candidatos ao vestibular da UFMS. Para tal, vocˆe dever´a escrever um algo-
ritmo que ler´a os dados de cada candidato e o gabarito das provas, calcular´a
o n´ umero de acertos de cada candidato em cada prova e escrever´a o n´ umero
de acertos dos candidatos em cada prova.
Considere a resposta a cada quest˜ao de prova como sendo um dos cinco
caracteres ‘a’, ‘b’, ‘c’, ‘d’ e ‘e’.
Vamos iniciar a constru¸ c˜ao da solu¸ c˜ao deste problema pela defini¸ c˜ao
dos tipos e estruturas de dados necess´arios. De acordo com a descri¸ c˜ao do
problema, temos um gabarito, que ´e representado por uma matriz, e um
registro que cont´em uma matriz e um vetor. Cada candidato possui um tal
registro. Logo, o conjunto de todos os candidatos pode ser representado por
um vetor de registros.
O algoritmo ´e dado a seguir:
// algoritmo para calcular o n´ umero de acertos de
// candidatos ao vestibular
algoritmo vestibular
// defini¸ c˜ao de constantes
defina NUMQUEST 40
defina NUMPROVAS 5
defina NUMCAND 5000
// defini¸ c˜ao de tipos
definatipo vetor[1..NUMPROVAS] de inteiro vet ac
definatipo vetor[1..NUMQUEST, 1..NUMPROVAS] de caracter mat gab
definatipo registro
inteiro codigo
mat gab X
vet ac A
fimregistro regcand
definatipo vetor[1..NUMCAND] de regcand vet cand
//declara¸ c˜ao de vari´aveis
87
5.3. Registros UFMS
mat gab G //matriz contendo o gabarito
vet cand candidato // vetor de registros contendo os dados dos candidatos
inteiro i, j, k, n, soma
//leitura da matriz de gabarito
para j de 1 at´e NUMPROV AS fa¸ ca
para i de 1 at´e NUMQUEST fa¸ ca
escreva “Resposta da quest˜ao”, i, “da prova”, j
leia G[i, j]
fimpara
fimpara
//leitura da quantidade de candidatos
escreva “Quantidade de candidatos”
leia n
//leitura dos dados dos candidatos
para k de 1 at´e n fa¸ ca
escreva “C´odigo do candidato:”
leia candidato[k].codigo
para j de 1 at´e NUMPROV AS fa¸ ca
para i de 1 at´e NUMQUEST fa¸ ca
escreva “Resposta da quest˜ao”, i, “da prova”, j
leia candidato[k].X[i, j]
fimpara
fimpara
fimpara
//C´alculo dos acertos de cada candidato
para k de 1 at´e n fa¸ ca
para j de 1 at´e NUMPROV AS fa¸ ca
soma ← 0
para i de 1 at´e NUMQUEST fa¸ ca
se G[i][j] = candidato[k].X[i][j] ent˜ao
soma ← soma + 1
fimse
fimpara
candidato[k].A[j] ← soma
fimpara
fimpara
//Sa´ıda dos resultados
para k de 1 at´e n fa¸ ca
88
5.3. Registros UFMS
escreva “C´odigo:”, candidato[k].codigo
para j de 1 at´e NUMPROV AS fa¸ ca
escreva candidato[k].A[j], “acertos na prova”, j
fimpara
fimpara
fimalgoritmo
Bibliografia
O texto deste cap´ıtulo foi elaborado a partir dos livros abaixo relaciona-
dos:
1. Farrer, H. et. al. Algoritmos Estruturados. Editora Guanabara, 1989.
2. Shackelford, R.L. Introduction to Computing and Algorithms. Addison-
Wesley Longman, Inc, 1998.
89
Lista de exerc´ıcios
Vetores
1. Dada uma seq¨ uˆencia de n n´ umeros, imprimi-la em ordem inversa `a de
leitura.
2. Deseja-se publicar o n´ umero de acertos de cada aluno em uma prova em
forma de testes. A prova consta de 30 quest˜oes, cada uma com cinco
alternativas identificadas por A, B, C, D e E. Para isso s˜ao dados:
o cart˜ao gabarito;
o cart˜ao de respostas de cada aluno, contendo o seu n´ umero
e suas respostas.
3. Tentando descobrir se um dado era viciado, um dono de cassino o
lan¸ cou n vezes. Dados os n resultados dos lan¸ camentos, determinar o
n´ umero de ocorrˆencias de cada face.
4. Um jogador viciado de cassino deseja fazer um levantamento estat´ıstico
simples sobre uma roleta. Para isso, ele fez n lan¸ camentos nesta roleta.
Sabendo que uma roleta cont´em 37 n´ umeros (de 0 a 36), calcular a
freq¨ uˆencia de cada n´ umero desta roleta nos n lan¸ camentos realizados.
5. Dados dois vetores x e y, ambos com n elementos, determinar o pro-
duto escalar desses vetores.
6. S˜ao dados dois n´ umeros inteiros positivos p e q, sendo que o n´ umero
de d´ıgitos de p ´e menor ou igual ao n´ umero de d´ıgitos de q. Verificar
se p ´e um subn´ umero de q.
Exemplos:
p = 23, q = 57238, p ´e subn´ umero de q;
p = 23, q = 258347, p n˜ao ´e subn´ umero de q.
7. S˜ao dadas as coordenadas reais x e y de um ponto, un n´ umero natural
n e as coordenadas reais de n pontos, com 1 ≤ n ≤ 100. Deseja-se
calcular e imprimir sem repeti¸ c˜ao os raios das circunferˆencias centradas
no ponto (x, y) que passem por pelo menos um dos n pontos dados.
Exemplo:
90
Lista de exerc´ıcios UFMS

(x, y) = (1.0, 1.0);
n = 5;
Pontos:(−1.0, 1.2), (1.5, 2.0), (0.0, −2.0), (0.0, 0.5), (4.0, 2.0)
Nesse caso h´a trˆes circunferˆencias de raios 1.12, 2.01 e 3.162.
Observa¸ c˜oes:
(a) A distˆancia entre os pontos (a, b) e (c, d) ´e

(a −c)
2
+ (b −d)
2
.
(b) Dois pontos est˜ao na mesma circunferˆencia se est˜ao `a mesma
distˆancia do centro.
8. Dadas duas cadeias (uma contendo uma frase e outra contendo uma
palavra), determine o n´ umero de vezes que a palavra ocorre na frase.
Exemplo:
Para a palavra ANA e a frase:
ANA E MARIANA GOSTAM DE BANANA.
Temos que a palavra ocorre 4 vezes na frase.
9. Dada uma seq¨ uˆencia de n n´ umeros reais, determinar os n´ umeros que
comp˜oem a seq¨ uˆencia e o n´ umero de vezes que cada um deles ocorre
na mesma.
Exemplo:
n = 8
Seq¨ uˆencia: −1.7, 3.0, 0.0, 1.5, 0.0, −1.7, 2.3, −1.7
Sa´ıda:
−1.7 ocorre 3 vezes
3.0 ocorre 1 vez
0.0 ocorre 2 vezes
1.5 ocorre 1 vez
2.3 ocorre 1 vez
10. Dizemos que uma seq¨ uˆencia de n elementos, com n par, ´e balanceada
se as seguintes somas s˜ao todas iguais:
a soma do maior elemento com o menor elemento;
a soma do segundo maior elemento com o segundo menor
elemento;
a soma do terceiro maior elemento com o terceiro menor
elemento;
e assim por diante . . .
Exemplo:
91
Lista de exerc´ıcios UFMS
2 12 3 6 16 15 ´e uma seq¨ uˆencia balanceada, pois 16 + 2 =
15 + 3 = 12 + 6.
Dados n (n par) e uma seq¨ uˆencia de n n´ umeros inteiros, verificar se
essa seq¨ uˆencia ´e balanceada.
11. Dados dois n´ umeros naturais m e n e duas seq¨ uˆencias ordenadas com
m e n n´ umeros inteiros, obter uma ´ unica seq¨ uˆencia ordenada contendo
todos os elementos das seq¨ uˆencias originais sem repeti¸ c˜ao.
Sugest˜ ao: imagine uma situa¸ c˜ao real, por exemplo, dois fich´arios em
uma biblioteca.
12. Dadas duas seq¨ uˆencias com n n´ umeros inteiros entre 0 e 9, interpreta-
das como dois n´ umeros inteiros de n algarismos, calcular a seq¨ uˆencia
de n´ umeros que representa a soma dos dois inteiros.
Exemplo:
n = 8,
1
a
seq¨ uˆencia 8 2 4 3 4 2 5 1
2
a
seq¨ uˆencia + 3 3 7 5 2 3 3 7
1 1 6 1 8 6 5 8 8
13. Calcule o valor do polinˆomio p(x) = a
0
+ a
1
x + . . . + a
n
x
n
em k
pontos distintos. S˜ao dados os valores de n (grau do polinˆomio),
de a
0
, a
1
, . . . a
n
(coeficientes reais do polinˆomio), de k e dos pontos
x
1
, x
2
, . . . , x
n
.
14. Dado o polinˆomio p(x) = a
0
+a
1
x +. . . a
n
x
n
, isto ´e, os valores de n e
de a
0
, a
1
, . . . , a
n
, determine os coeficientes reais da primeira derivada
de p(x).
15. Dados dois polinˆomios reais
p(x) = a
0
+a
1
x +. . . +a
n
x
n
e q(x) = b
0
+b
1
x +. . . +b
m
x
m
determinar o produto desses dois polinˆomios.
16. Chama-se seq¨ uˆencia de Farey relativa `a n a seq¨ uˆencia de fra¸ c˜oes
racionais irredut´ıveis, dispostas em ordem crescente, com denomina-
dores positivos e n˜ao maiores que n.
Exemplo:
Se n = 5, os termos α da seq¨ uˆencia de Farey, tais que 0 ≤
α ≤ 1, s˜ao:
0
1
,
1
5
,
1
4
,
1
3
,
2
5
,
1
2
,
3
5
,
2
3
,
3
4
,
4
5
,
1
1
.
92
5.4. Matrizes UFMS
Para gerarmos os termos α de uma seq¨ uˆencia de Farey tais que 0 ≤ α ≤
1, podemos utilizar o seguinte processo. Come¸ camos com as fra¸ c˜oes
0
1
e
1
1
, e entre cada duas fra¸ c˜oes consecutivas
i
j
e
k
m
, introduzimos
a fra¸ c˜ao
i+k
j+m
e assim sucessivamente enquanto j + m ≤ n. Quando
n˜ao for mais poss´ıvel introduzir novas fra¸ c˜oes teremos gerados todos
os termos α da seq¨ uˆencia de Farey relativa a n, tais que 0 ≤ α ≤ 1.
Utilizando o m´etodo descrito, determine os termos α, 0 ≤ α ≤ 1, da
seq¨ uˆencia de Farey relativa a n, com n inteiro positivo.
Sugest˜ ao: gere os numeradores e os denominadores em dois vetores.
17. Dada uma seq¨ uˆencia x
1
, x
2
, . . . , x
k
de n´ umeros inteiros, verifique se
existem dois segmentos consecutivos iguais nesta seq¨ uˆencia, isto ´e, se
existem i e m tais que
x
i
, x
i+1
, . . . , x
i+m−1
= x
i+m
, x
i+m+1
, . . . , x
i+2m−1
.
Imprima, caso existam, os valores de i e m.
Exemplo:
Na seq¨ uˆencia 7, 9, 5, 4, 5, 4, 8, 6 existem i = 3 e m = 2.
18. Dada uma seq¨ uˆencia x
0
, x
1
, . . . , x
k−1
de k n´ umeros inteiros, determinar
um segmento de soma m´axima.
Exemplo:
Na seq¨ uˆencia 5, 2, −2, −7, 3, 14, 10, −3, 9, −6, 4, 1, a soma do
segmento ´e 33.
5.4 Matrizes
1. Seja a seguinte matriz A:
175 225 10 9000 37 475
98 100 363 432 156 18
40 301 302 6381 1 0
402 4211 7213 992 442 7321
21 3 2 1 9000 2000
(a) Quantos elementos fazem parte do conjunto?
(b) Qual o conte´ udo do elemento identificado por A[4, 5]?
(c) Qual o conte´ udo da vari´avel x ap´os a execu¸ c˜ao do comando x =
A[3, 2] +A[4, 1]?
93
5.4. Matrizes UFMS
(d) O que aconteceria caso fosse referenciado o elemento A[5, 1] em
um programa em linguagem C?
(e) Somar os elementos da quarta coluna (A[1, 3] +A[1, 3] +A[2, 3] +
A[3, 3] +A[4, 3]).
(f) Somar os elementos da terceira linha (A[2, 1] +A[2, 1] +A[2, 2] +
A[2, 3] +A[2, 4] +A[2, 5]).
2. Dada uma matriz real B, de 100 linhas e 200 colunas, escrever um pro-
grama que calcule o somat´orio dos elementos da quadrag´esima coluna
e que calcule o somat´orio da trig´esima linha.
3. Dadas duas matrizes A e B, de dimens˜oes n m, fazer um programa
que calcule a matriz C
n×m
= A+B.
4. Fazer um programa que dada uma matriz A
n×m
, determine A
t
.
5. Dada uma matriz real A com m linhas e n colunas e um vetor real V
com n elementos, determinar o produto de A por V .
6. Um vetor real x com n elementos ´e apresentado como resultado de um
sistema de equa¸ c˜oes lineares Ax = b cujos coeficientes s˜ao representa-
dos em uma matriz real A
m×n
e os lados direitos das equa¸ c˜oes em um
vetor real b de m elementos. Verificar se o vetor x ´e realmente solu¸ c˜ao
do sistema dado.
7. Dadas duas matrizes reais A
m×n
e B
n×p
, calcular o produto de A por
B.
8. Dada uma matriz real A
m×n
, verificar se existem elementos repetidos
em A.
9. Seja A
26×10
uma matriz fornecida, cujo conte´ udo ´e a popula¸ c˜ao dos 10
munic´ıpios mais populosos dos 26 estados brasileiros (A[i, j] representa
a popula¸ c˜ao do j-´esimo munic´ıpio do i-´esimo estado). Determinar o
n´ umero do munic´ıpio mais populoso e o n´ umero do estado a que per-
tence. Considerando que a primeira coluna sempre cont´em a popula¸ c˜ao
da capital do estado, calcular a m´edia da popula¸ c˜ao das capitais dos
26 estados.
10. Deseja-se atualizar as contas correntes dos clientes de uma agˆencia
banc´aria.
´
E dado o cadastro de n clientes contendo, para cada cliente,
o n´ umero de sua conta e o seu saldo; o cadastro est´a ordenado pelo
n´ umero da conta. Em seguida, ´e dado o n´ umero m de opera¸ c˜oes
efetuadas no dia e, para cada opera¸ c˜ao, o n´ umero da conta, uma letra
C ou D indicando se a opera¸ c˜ao ´e de cr´edito ou d´ebito e o valor da
opera¸ c˜ao. Emitir o extrato atualizado dos clientes.
94
5.4. Matrizes UFMS
11. Deseja-se fazer a emiss˜ao da folha de pagamento de uma empresa.
Para cada um dos n funcion´arios s˜ao dadas as seguintes informa¸ c˜oes:
C´odigo Descri¸ c˜ao
NOME Nome do funcion´ario
SAL Sal´ario do funcion´ario
HED Horas extras diurnas
HEN Horas extras noturnas
ND N´ umero de dependentes
FAL Faltas em horas
DE Descontos eventuais
REF Gastos com refei¸ c˜oes feitas na empresa
VAL Vales retirados durante o mˆes
Para cada funcion´ario, emitir as seguintes informa¸ c˜oes:
Nome,
Sal´ario,
Horas Extras = HED ∗ SAL/160 + HEN ∗ 1,2 ∗ SAL/160,
Sal´ario Fam´ılia = ND ∗ 0,05 ∗ Sal´ario M´ınimo vigente,
Sal´ario Bruto = Sal´ario + Horas Extras + Sal´ario Fam´ılia.
e os descontos efetuados:
INSS = 0,08 ∗ SAL,
Faltas = FAL ∗ SAL/160,
Refei¸ c˜oes,
Vales,
Descontos Eventuais,
Imposto de Renda = 0,08 ∗ Sal´ario Bruto.
e finalmente o seu Sal´ario L´ıquido:
Sal´ario L´ıquido = Sal´ario Bruto - Descontos.
12. Dizemos que uma matriz inteira A
n×n
´e uma matriz de permuta¸ c˜ao
se em cada linha e em cada coluna houver n −1 elementos nulos e um
´ unico elemento 1.
Exemplo:
A matriz abaixo ´e de permuta¸ c˜ao

¸
¸
¸
0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1
¸

95
5.4. Matrizes UFMS
Observe que

¸
2 −1 0
−1 2 0
0 0 1
¸

n˜ao ´e de permuta¸ c˜ao.
Dada uma matriz inteira A
n×n
, verificar se A ´e de permuta¸ c˜ao.
13. Dada uma matriz A
m×n
, imprimir o n´ umero de linhas e o n´ umero de
colunas nulas da matriz.
Exemplo:
m = 4 e n = 4

¸
¸
¸
1 0 2 3
4 0 5 6
0 0 0 0
0 0 0 0
¸

tem 2 linhas nulas e 1 coluna nula.
14. Dizemos que uma matriz quadrada inteira ´e um quadrado m´agico
1
se a soma dos elementos de cada linha, a soma dos elementos de cada
coluna e a soma dos elementos da diagonal principal e secund´ aria s˜ao
todas iguais.
Exemplo:
A matriz

¸
8 0 7
4 5 6
3 10 2
¸

´e um quadrado m´agico.
Dada uma matriz quadrada inteira A
n×n
, verificar se A ´e um quadrado
m´agico.
15. (a) Imprimir as n primeiras linhas do triˆangulo de Pascal
2
.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 4 10 10 5 1
.
.
.
1
O primeiro registro conhecido de um quadrado m´agico vem da China e data do segundo
s´eculo antes de Cristo.
2
Descoberto em 1654 pelo matem´atico francˆes Blaise Pascal.
96
5.4. Matrizes UFMS
(b) Imprimir as n primeiras linhas do triˆangulo de Pascal usando
apenas um vetor.
16. Um jogo de palavras cruzadas pode ser representado por uma matriz
A
m×n
onde cada posi¸ c˜ao da matriz corresponde a um quadrado do
jogo, sendo que 0 indica um quadrado branco e −1 indica um quadrado
preto. Indicar na matriz as posi¸ c˜oes que s˜ao in´ıcio de palavras hori-
zontais e/ou verticais nos quadrados correspondentes (substituindo os
zeros), considerando que uma palavra deve ter pelo menos duas letras.
Para isso, numere consecutivamente tais posi¸ c˜oes.
Exemplo:
Dada a matriz

¸
¸
¸
¸
¸
0 −1 0 −1 −1 0 −1 0
0 0 0 0 −1 0 0 0
0 0 −1 −1 0 0 −1 0
−1 0 0 0 0 −1 0 0
0 0 −1 0 0 0 −1 −1
¸

a sa´ıda dever´a ser

¸
¸
¸
¸
¸
1 −1 2 −1 −1 3 −1 4
5 6 0 0 −1 7 0 0
8 0 −1 −1 9 0 −1 0
−1 10 0 11 0 −1 12 0
13 0 −1 14 0 0 −1 −1
¸

17. Uma matriz D
8×8
pode representar a posi¸ c˜ao atual de um jogo de da-
mas, sendo que 0 indica uma casa vazia, 1 indica uma casa ocupada
por uma pe¸ ca branca e −1 indica uma casa ocupada por uma pe¸ ca
preta. Supondo que as pe¸ cas pretas est˜ao se movendo no sentido cres-
cente das linhas da matriz D, determinar as posi¸ c˜oes das pe¸ cas pretas
que:
(a) podem tomar pe¸ cas brancas;
(b) podem mover-se sem tomar pe¸ cas;
(c) n˜ao podem se mover.
18. Um campeonato de futebol foi disputado por n times identificados
pelos seus nomes. Para cada time s˜ao considerados os seguintes dados:
PG n´ umero de pontos ganhos (3 por vit´oria, 1 por empate e 0 por derrota);
GM n´ umero de gols marcados;
GS n´ umero de gols sofridos;
S saldo de gols (GM - GS);
V n´ umero de vit´orias;
GA goal average ou m´edia de gols (GM / GS).
97
5.4. Matrizes UFMS
(a) Dados os resultados de mjogos, imprima uma tabela com todos os
dados (PG, GM, GS, S, V, GA, igual `aquela que sai no jornal) dos
n times. Cada resultado ´e representado na forma (t
1
, t
2
, n
1
, n
2
)
cuja interpreta¸ c˜ao ´e a seguinte: no jogo t
1
t
2
o resultado foi
n
1
n
2
.
Exemplo:
S˜ao Paulo, Milan, 3, 2
Palmeiras, Crici´ uma, 1, 2
.
.
.
(b) Com os mesmos dados do item (a), imprima a classifica¸ c˜ao dos
times no campeonato (do primeiro para o ´ ultimo). A classifica¸ c˜ao
´e pelo n´ umero de pontos ganhos (PG) e em segundo lugar pelo
saldo de gols (S). Se houver empate segundo os dois crit´erios,
classifique os times envolvidos como quiser.
(c) Um grupo de t torcedores organizou um bol˜ ao sobre os resultados
dos m jogos. Cada resultado certo vale 5 pontos (inclusive o
placar) ou 3 pontos (apenas o vencedor ou empate). Com os
dados do item (a) e mais os palpites que s˜ao compostos de m
pares de n´ umeros inteiros (p
1
, q
1
), (p
2
, q
2
), . . . , (p
m
, q
m
), onde o i-
´esimo par representa o palpite do i-´esimo jogo, descubra o nome
do ganhador do bol˜ao.
19. Os elementos a
ij
de uma matriz inteira A
n×n
representam os custos
de transporte da cidade i para a cidade j. Dados n itiner´arios, cada
um com k cidades, calcular o custo total para cada itiner´ario.
Exemplo:

¸
¸
¸
4 1 2 3
5 2 1 400
2 1 3 8
7 1 2 5
¸

O custo do itiner´ario 0 3 1 3 3 2 1 0 ´e
a
03
+a
31
+a
13
+a
33
+a
32
+a
21
+a
10
= 3+1+400+5+2+1+5 =
417.
20. Considere n cidades numeradas de 0 a n−1 que est˜ao interligadas por
uma s´erie de estradas de m˜ao ´ unica. As liga¸ c˜oes entre as cidades s˜ao
representadas pelos elementos de uma matriz quadrada L
n×n
, cujos
elementos l
ij
assumem o valor 1 ou 0, conforme exista ou n˜ao estrada
direta que saia da cidade i e chegue `a cidade j. Assim, os elementos
da coluna j indicam as estradas que chegam `a cidade j. Por conve¸ c˜ao
l
ii
= 1.
A figura abaixo mostra um exemplo para n = 4.
98
5.4. Matrizes UFMS
(a) Dado k, determinar quantas estradas saem e quantas chegam `a
cidade k.
(b) A qual das cidades chega o maior n´ umero de estradas?
(c) Dado k, verificar se todas as liga¸ c˜oes diretas entre a cidade k e
outras s˜ao de m˜ao dupla.
(d) Relacionar as cidades que possuem sa´ıdas diretas para a cidade
k.
(e) Relacionar, se existirem:
i. As cidades isoladas, isto ´e, as que n˜ao tˆem liga¸ c˜ao com ne-
nhuma outra;
ii. As cidade das quais n˜ao h´a sa´ıda, apesar de haver entrada;
iii. As cidades das quais h´a sa´ıda sem haver entrada.
(f) Dada uma seq¨ uˆencia de m inteiros cujos valores est˜ao entre 0 e
n−1, verificar se ´e poss´ıvel realizar o roteiro correspondente. No
exemplo dado, o roteiro representado pela seq¨ uˆencia 2 3 2 1 0,
com m = 5, ´e imposs´ıvel.
(g) Dados k e p, determinar se ´e poss´ıvel ir da cidade k para a cidade
p pelas estradas existentes. Vocˆe consegue encontrar o menor
caminho entre as duas cidades?
99
Modulariza¸c˜ao 6
Os algoritmos que temos constru´ıdo at´e ent˜ao s˜ao muito simples, pois
resolvem problemas simples e apresentam apenas os componentes mais ele-
mentares dos algoritmos: constantes, vari´aveis, express˜oes condicionais e
estruturas de controle. Entretanto, a maioria dos algoritmos resolve pro-
blemas complicados, cuja solu¸ c˜ao pode ser vista como formada de v´arias
subtarefas ou m´ odulo, cada qual resolvendo uma parte espec´ıfica do pro-
blema.
Neste t´opico, veremos como escrever um algoritmo constitu´ıdo de v´arios
m´odulos e como estes m´odulos trabalham em conjunto para resolver um
determinado problema algor´ıtmico.
6.1 O Quˆe e Por Quˆe?
Um m´ odulo nada mais ´e do que um grupo de comandos que constitui
um trecho de algoritmo com uma fun¸ c˜ao bem definida e o mais independente
poss´ıvel das demais partes do algoritmo. Cada m´odulo, durante a execu¸ c˜ao
do algoritmo, realiza uma tarefa espec´ıfica da solu¸ c˜ao do problema e, para
tal, pode contar com o aux´ılio de outros m´odulos do algoritmo. Desta forma,
a execu¸ c˜ao de um algoritmo contendo v´arios m´odulos pode ser vista como
um processo cooperativo.
A constru¸ c˜ao de algoritmos compostos por m´odulos, ou seja, a constru¸ c˜ao
de algoritmos atrav´es de modulariza¸ c˜ao possui uma s´erie de vantagens:
• Torna o algoritmo mais f´acil de escrever. O desenvolvedor pode
focalizar pequenas partes de um problema complicado e escrever a
solu¸ c˜ao para estas partes, uma de cada vez, ao inv´es de tentar resolver
o problema como um todo de uma s´o vez.
100
6.2. Componentes de um m´odulo UFMS
• Torna o algoritmo mais f´acil de ler. O fato do algoritmo estar
dividido em m´odulos permite que algu´em, que n˜ao seja o seu autor,
possa entender o algoritmo mais rapidamente por tentar entender os
seus m´odulos separadamente, pois como cada m´odulo ´e menor e mais
simples do que o algoritmo monol´ıtico correspondente ao algoritmo
modularizado, entender cada um deles separadamente ´e menos com-
plicado do que tentar entender o algoritmo como um todo de uma s´o
vez.
• Eleva o n´ıvel de abstra¸ c˜ao.
´
E poss´ıvel entender o que um algoritmo
faz por saber apenas o que os seus m´odulos fazem, sem que haja a
necessidade de entender os detalhes internos aos m´odulos. Al´em disso,
se os detalhes nos interessam, sabemos exatamente onde examin´a-los.
• Economia de tempo, espa¸ co e esfor¸ co. Freq¨ uentemente, neces-
sitamos executar uma mesma tarefa em v´arios lugares de um mesmo
algoritmo. Uma vez que um m´odulo foi escrito, ele pode, como vere-
mos mais adiante, ser “chamado” quantas vezes quisermos e de onde
quisermos no algoritmo, evitando que escrevamos a mesma tarefa mais
de uma vez no algoritmo, o que nos poupar´a tempo, espa¸ co e esfor¸ co.
• Estende a linguagem. Uma vez que um m´odulo foi criado, podemos
utiliz´a-lo em outros algoritmos sem que eles sejam modificados, da
mesma forma que usamos os operadores leia e escreva em nossos
algoritmos.
A maneira mais intuitiva de proceder `a modulariza¸ c˜ao de problemas
´e realizada atrav´es da defini¸ c˜ao de um m´odulo principal, que organiza e
coordena o trabalho dos demais m´odulos, e de m´odulos espec´ıficos para cada
uma das subtarefas do algoritmo. O m´odulo principal solicita a execu¸ c˜ao dos
v´arios m´odulos em uma dada ordem, os quais, antes de iniciar a execu¸ c˜ao,
recebem dados do m´odulo principal e, ao final da execu¸ c˜ao, devolvem o
resultado de suas computa¸ c˜oes.
6.2 Componentes de um m´odulo
Os m´odulos que estudaremos daqui em diante possuem dois componen-
tes: corpo e interface. O corpo de um m´odulo ´e o grupo de comandos que
comp˜oe o trecho de algoritmo correspondente ao m´odulo. J´ a a interface
de um m´odulo pode ser vista como a descri¸ c˜ao dos dados de entrada e de
sa´ıda do m´odulo. O conhecimento da interface de um m´odulo ´e tudo o que
´e necess´ario para a utiliza¸ c˜ao correta do m´odulo em um algoritmo.
101
6.3. Ferramentas para Modulariza¸ c˜ao UFMS
A interface de um m´odulo ´e definida em termos de parˆametros. Um
parˆametro ´e um tipo especial de vari´avel que o valor de um dado seja
passado entre um m´odulo e qualquer algoritmo que possa us´a-lo. Existem
trˆes tipos de parˆametros:
• parˆametros de entrada, que permitem que valores sejam passados
para um m´odulo a partir do algoritmo que solicitou sua execu¸ c˜ao;
• parˆametros de sa´ıda, que permitem que valores sejam passados do
m´odulo para o algoritmo que solicitou sua execu¸ c˜ao; e
• parˆametros de entrada e sa´ıda, que permitem tanto a passagem de
valores para o m´odulo quanto a passagem de valores do m´odulo para
o algoritmo que solicitou sua execu¸ c˜ao.
Quando criamos um m´odulo, especificamos o n´ umero e tipos de parˆametros
que ele necessita. Isto determina a interface do m´odulo. Qualquer algoritmo
que use um m´odulo deve utilizar os parˆametros que s˜ao especificados na in-
terface do m´odulo para se comunicar com ele.
6.3 Ferramentas para Modulariza¸c˜ao
H´a dois tipos de m´odulos:
• fun¸ c˜ao: uma fun¸ c˜ao ´e um m´odulo que produz um ´ unico valor de sa´ıda.
Ela pode ser vista como uma express˜ao que ´e avaliada para um ´ unico
valor, sua sa´ıda, assim como uma fun¸ c˜ao em Matem´atica.
• procedimento: um procedimento ´e um tipo de m´odulo usado para
v´arias tarefas, n˜ao produzindo valores de sa´ıda.
As diferen¸ cas entre as defini¸ c˜oes de fun¸ c˜ao e procedimento permitem
determinar se um m´odulo para uma dada tarefa deve ser implementado como
uma fun¸ c˜ao ou procedimento. Por exemplo, se um m´odulo para determinar
o menor de dois n´ umeros ´e necess´ario, ele deve ser implementado como uma
fun¸ c˜ao, pois ele vai produzir um valor de sa´ıda. Por outro lado, se um m´odulo
para determinar o maior e o menor valor de uma seq¨ uˆencia de n´ umeros ´e
requerido, ele deve ser implementado como um procedimento, pois ele vai
produzir dois valores de sa´ıda.
Vamos considerar que a produ¸ c˜ao de um valor de sa´ıda por uma fun¸ c˜ao
´e diferente da utiliza¸ c˜ao de parˆametros de sa´ıda ou de entrada e sa´ıda. Vere-
mos mais adiante que os parˆametros de sa´ıda e de entrada e sa´ıda modificam
102
6.4. Criando Fun¸ c˜oes e Procedimentos UFMS
o valor de uma vari´avel do algoritmo que a chamou, diferentemente do valor
de sa´ıda produzido por uma fun¸ c˜ao que ser´a um valor a ser usado em uma
atribui¸ c˜ao ou evolvido em alguma express˜ao.
6.4 Criando Fun¸c˜oes e Procedimentos
A fim de escrevermos uma fun¸ c˜ao ou procedimento, precisamos cons-
truir as seguintes partes: interface e corpo. Como dito antes, a interface
´e uma descri¸ c˜ao dos parˆametros do m´odulo, enquanto corpo ´e a seq¨ uˆencia
de instru¸ c˜oes do m´odulo. A interface de uma fun¸ c˜ao tem a seguinte forma
geral:
fun¸ c˜ao <tipo de retorno> <nome> (<lista de parˆametros formais>)
onde
• nome ´e um identificador ´ unico que representa o nome da fun¸ c˜ao;
• lista de parˆ ametros formais ´e uma lista dos parˆametros da fun¸ c˜ao;
• tipo de retorno ´e o tipo do valor de retorno da fun¸ c˜ao.
Por exemplo:
fun¸ c˜ao real quadrado (real r)
Logo ap´os a descri¸ c˜ao da interface podemos descrever o corpo do algo-
ritmo. Para delimitar os comandos que fazem parte da fun¸ c˜ao, utilizamos
fimfun¸ c˜ao.
O corpo de uma fun¸ c˜ao ´e uma seq¨ uˆencia de comandos que comp˜oe a
fun¸ c˜ao e que sempre finaliza com um comando especial denominado co-
mando de retorno. O comando de retorno ´e da seguinte forma
retorna <valor de retorno>
onde valor de retorno ´e o valor de sa´ıda produzido pela fun¸ c˜ao. Por
exemplo:
retorna x
103
6.4. Criando Fun¸ c˜oes e Procedimentos UFMS
Vejamos um exemplo de uma fun¸ c˜ao. Suponha que desejemos construir
uma fun¸ c˜ao para calcular o quadrado de um n´ umero. O n´ umero deve ser
passado para a fun¸ c˜ao, que calcular´a o seu quadrado e o devolver´a para o
algoritmo que a solicitou. Vamos denominar esta fun¸ c˜ao de quadrado, como
mostrado a seguir:
// fun¸ c˜ao para calcular o quadrado de um n´ umero
fun¸ c˜ao real quadrado (real r)
// declara¸ c˜ao de vari´aveis
real x
// calcula o quadrado
x ← r ∗ r
// retorna o quadrado calculado
retorna x
fimfun¸ c˜ao
A interface de um procedimento tem a seguinte forma geral:
procedimento <nome> (<lista de parˆametros formais>)
onde
• nome ´e um identificador ´ unico que representa o nome do procedimento;
• lista de parˆ ametros formais ´e uma lista dos parˆametros do procedi-
mento.
Por exemplo,
procedimento ler n´ umero (ref real val)
O corpo de um procedimento ´e uma seq¨ uˆencia de comandos que n˜ao pos-
sui comando de retorno, pois apenas fun¸ c˜oes possuem tal tipo de comando.
Para delimitar os comandos que fazem parte do procedimento, utilizamos
fimprocedimento.
Vejamos um exemplo de um procedimento. Suponha que desejemos cons-
truir um procedimento para ler um n´ umero e passar o n´ umero lido para o
104
6.5. Chamando Fun¸ c˜oes e Procedimentos UFMS
algoritmo que solicitou a execu¸ c˜ao do algoritmo atrav´es de um parˆametro
de sa´ıda. Denominemos este procedimento de ler n´ umero, como mostrado a
seguir:
// procedimento para ler um n´ umero
procedimento ler n´ umero (ref real val)
// Solicita a entrada do n´ umero
escreva “Entre com um n´ umero:”
leia val
fimprocedimento
Aqui, val ´e o parˆametro de sa´ıda que conter´a o valor de entrada que
ser´a passado para o algoritmo que solicitar a execu¸ c˜ao do procedimento
ler n´ umero. A palavra-chave ref, que antecede o nome da vari´avel na lista
de parˆametros formais do procedimento, ´e utilizada para definir val como
parˆametro de sa´ıda ou entrada e sa´ıda.
6.5 Chamando Fun¸c˜oes e Procedimentos
Fun¸ c˜oes e procedimentos n˜ao s˜ao diferentes apenas na forma como s˜ao
implementados, mas tamb´em na forma como a solicita¸ c˜ao da execu¸ c˜ao deles,
ou simplesmente chamada, deve ser realizada. A chamada de uma fun¸ c˜ao
´e usada como um valor constante que deve ser atribu´ıdo a uma vari´avel ou
como parte de uma express˜ao, enquanto a chamada de um procedimento ´e
realizada como um comando a parte.
Como exemplo, considere um algoritmo para ler um n´ umero e exibir o
seu quadrado. Este algoritmo deve utilizar o procedimento ler n´ umero e a
fun¸ c˜ao quadrado, vistos antes, para ler o n´ umero e obter o seu quadrado,
respectivamente. O algoritmo segue abaixo:
// algoritmo para calcular e exibir o quadrado de um n´ umero
// fornecido como entrada
algoritmo calcula quadrado
// declara¸ c˜ao de vari´aveis
real num, x
// lˆe um n´ umero
105
6.6. Passagem de Parˆametros UFMS
ler n´ umero(num)
// calcula o quadrado do n´ umero lido
x ← quadrado(num)
// escreve o quadrado
escreva “O quadrado do n´ umero ´e:”, x
fimalgoritmo
Note a diferen¸ ca da chamada do procedimento ler n´ umero para a cha-
mada da fun¸ c˜ao quadrado. Na chamada do procedimento, temos uma ins-
tru¸ c˜ao por si s´o. Por outro lado, a chamada da fun¸ c˜ao ocupa o lugar de um
valor ou express˜ao em uma instru¸ c˜ao de atribui¸ c˜ao. Isto porque a chamada
quadrado(num)
´e substitu´ıda pelo valor de retorno da fun¸ c˜ao.
Tanto na chamada do procedimento ler n´ umero quanto na chamada da
fun¸ c˜ao quadrado, temos um parˆametro: a vari´avel num. Na chamada do
procedimento ler n´ umero, num ´e um parˆametro de sa´ıda, como definido na
interface do procedimento, e, portanto, ap´os a execu¸ c˜ao do procedimento,
num conter´a o valor lido dentro do procedimento. J´a na chamada da fun¸ c˜ao
quadrado, num ´e um parˆametro de entrada, como definido na interface da
fun¸ c˜ao, e, assim sendo, o valor de num ´e passado para a fun¸ c˜ao.
A vari´avel num ´e denominada parˆametro real. Um parˆametro real
especifica um valor passado para o m´odulo pelo algoritmo que o chamou
ou do m´odulo para o algoritmo que o chamou. Os parˆametros formais s˜ao
aqueles da declara¸ c˜ao do m´odulo. A lista de parˆametros reais deve concordar
em n´ umero, ordem e tipo com a lista de prˆametros formais.
6.6 Passagem de Parˆametros
Os valores dos parˆametros reais de entrada s˜ao passados por um meca-
nismo denominado c´ opia, enquanto os valores dos parˆametros reais de sa´ıda
e entrada e sa´ıda s˜ao passados por um mecanismo denominado referˆencia.
O mecanismo de passagem por c´opia funciona da seguinte forma. O
valor do parˆametro real (uma constante ou o valor de uma vari´avel ou ex-
press˜ao) de entrada ´e atribu´ıdo ao parˆametro formal quando da chamada do
procedimento/fun¸ c˜ao. Por exemplo, na chamada
106
6.7. Escopo de Dados e C´odigo UFMS
x ← quadrado(num)
o valor da vari´avel num ´e atribu´ıdo ao parˆametro formal r da fun¸ c˜ao qua-
drado.
No mecanismo de passagem por referˆencia, quando da chamada do pro-
cedimento/fun¸ c˜ao, o parˆametro formal passa a compartilhar a mesma ´area
de armazenamento de parˆametro real, assim, qualquer altera¸ c˜ao no valor
do parˆaemtro formal feita pelo procedimento/fun¸ c˜ao acarretar´a uma mo-
difica¸ c˜ao no parˆametro real quando do t´ermino do procedimento/fun¸ c˜ao.
Sendo assim, quando a chamada
ler n´ umero(num)
´e executada, a vari´avel real num e a vari´avel formal val (que est´a precedida
da palavra chave ref) compartilham uma mesma ´area de armazenamento,
assim, num e val contˆem o mesmo valor. Quando ´e feita a leitura do dado
e armazenada em val, esta atualiza¸ c˜ao afetar´a o valor de num. Ao t´ermino
do procedimento a vari´avel num conter´a o valor atualizado.
Devemos observar que os parˆametros reais de sa´ıda e de entrada e sa´ıda
devem obrigatoriamente ser vari´aveis, uma vez que n˜ao faz sentido modificar
o valor de uma constante ou de uma express˜ao.
6.7 Escopo de Dados e C´odigo
O escopo de um m´odulo (ou vari´avel) de um algoritmo ´e a parte ou
partes do algoritmo em que o m´odulo (ou vari´avel) pode ser referenciado.
Quando iniciamos o estudo de modulariza¸ c˜ao ´e natural nos perguntarmos
qual ´e o escopo de um dado m´odulo e das constantes ou vari´aveis nele presen-
tes. Em particular, o escopo de um m´odulo determina quais s˜ ao os demais
m´odulos do algoritmo que podem chamar-lhe e quais ele pode chamar.
Os m´odulos de um algoritmo s˜ao organizados por n´ıveis. No primeiro
n´ıvel, temos apenas o algoritmo principal. Aqueles m´odulos que devem ser
acessados pelo algoritmo principal devem ser escritos dentro dele e, nesta
condi¸ c˜ao, s˜ao ditos pertencerem ao segundo n´ıvel. Os m´odulos escritos den-
tro de m´odulos de segundo n´ıvel s˜ao ditos m´odulos de terceiro n´ıvel. E assim
sucessivamente. Por exemplo:
// algoritmo para calcular o quadrado de um n´ umero fornecido
// como entrada
107
6.7. Escopo de Dados e C´odigo UFMS
algoritmo calcula quadrado
// m´odulo para c´alculo do quadrado de um n´ umero
fun¸ c˜ao real quadrado (quadrado r)
// declara¸ c˜ao de vari´aveis
real x
// calcula o quadrado
x ← r ∗ r
// passa para o algoritmo chamador o valor obtido
retorna x
fimfun¸ c˜ao
// m´odulo para ler um n´ umero
procedimento ler n´ umero (ref real val)
// solicita um n´ umero ao usu´ario
escreva “Entre com um n´ umero: ”
leia val
fimprocedimento
// declara¸ c˜ao de constantes e vari´aveis
real num, x
// lˆe um n´ umero
ler n´ umero(num)
// calcula o quadrado
x ← quadrado(num)
// escreve o quadrado
escreva “O quadrado do n´ umero ´e: ”, x
fimalgoritmo
Aqui, desej´avamos que a fun¸ c˜ao quadrado e o procedimento ler n´ umero
fossem chamados pelo m´odulo principal e, por isso, escrevemos tais m´odulos
dentro do m´odulo principal, no segundo n´ıvel da hierarquia modular do
108
6.8. Problemas e Solu¸ c˜oes UFMS
algoritmo.
A regra para determinar o escopo de um m´odulo ´e bastante simples: um
m´odulo X escrito dentro de um m´odulo A qualquer pode ser acessado apenas
pelo m´odulo A ou por qualquer m´odulo escrito dentro de A ou descendente
(direto ou n˜ao) de algum m´odulo dentro de A.
Como exemplo, considere um algoritmo no qual o m´odulo principal
cont´em outros quatro m´odulos, S1, S2, F1, F2. Por sua vez, S1 cont´em
mais dois m´odulos, S3 e F3; e F2 cont´em os m´odulos S4 e F4. Esta si-
tua¸ c˜ao ´e ilustrada por um diagrama na Figura ??. De acordo com as regras
de escopo descritas anteriormente, o m´odulo F3 s´o pode ser chamado por
S1 e S3, enquanto o m´odulo F1 pode ser acessado por todos os m´odulos.
Vari´aveis podem ser locais ou globais. Uma vari´avel (constante) ´e dita
local a um m´odulo se ela ´e declarada naquele m´odulo. Por exemplo, a
vari´avel x da fun¸ c˜ao quadrado ´e uma vari´avel local a esta fun¸ c˜ao. Uma
vari´avel ´e dita global a um m´odulo quando ela n˜ao est´a declarada no
m´odulo, mas pode ser referenciada a partir dele. Neste curso, considera-
remos que vari´aveis s˜ao sempre locais, isto ´e, nenhum m´odulo poder´a refe-
renciar uma vari´avel declarada em outro m´odulo.
6.8 Problemas e Solu¸c˜oes
Nesta se¸ c˜ao, veremos trˆes problemas envolvendo fun¸ c˜oes e procedimentos
e suas respectivas solu¸ c˜oes.
1. Escreva um algoritmo para ler dois n´ umeros e exibir o menor dos
dois. A verifica¸ c˜ao de qual deles ´e o menor deve ser realizada por uma
fun¸ c˜ao.
// algoritmo para o encontrar e exibir o menor de dois n´ umeros
algoritmo encontra menor de dois
// m´odulo para encontrar o menor de dois n´ umeros
fun¸ c˜ao inteiro menor de dois (inteiro a, b)
// declara¸ c˜ao de vari´aveis
inteiro menor
menor ← a
se a > b ent˜ao
menor ← b
109
6.8. Problemas e Solu¸ c˜oes UFMS
fimse
retorna menor
fimfun¸ c˜ao
// declara¸ c˜ao de constantes e vari´aveis
inteiro x, y, z
// lˆe dois n´ umeros
escreva “Entre com dois n´ umeros: ”
leia x, y
// obt´em o menor dos dois
z ← menor de dois(x, y)
// escreve o menor dos dois
escreva “O menor dos dois ´e: ”, z
fimalgoritmo
2. Escreva um algoritmo para ler trˆes n´ umeros e exibir o maior e o menor
dos trˆes. A obten¸ c˜ao do maior e do menor n´ umero deve ser realizada
por um procedimento.
// algoritmo para o encontrar e exibir o menor e o maior de trˆes
// n´ umeros
algoritmo encontra min max
// m´odulo para encontrar o menor e o maior de trˆes n´ umeros
procedimento min max(inteiroa, b, c,
ref inteiro min, max)
// encontra o maior dos trˆes
se a ≥ b e a ≥ c ent˜ao
max ← a
sen˜ao
se b ≥ c ent˜ao
max ← b
sen˜ao
max ← c
fimse
fimse
110
6.8. Problemas e Solu¸ c˜oes UFMS
// encontra o menor dos trˆes
se a ≤ b e a ≤ c ent˜ao
min ← a
sen˜ao
se b ≤ c ent˜ao
min ← b
sen˜ao
min ← c
fimse
fimse
fimprocedimento
// declara¸ c˜ao de constantes e vari´aveis
inteiro x, y, z, menor, maior
// lˆe trˆes n´ umeros
escreva “Entre com trˆes n´ umeros: ”
leia x, y, z
// obt´em o menor e o maior dos trˆes
min max(x, y, z, menor, maior)
// escreve o menor e o maior dos trˆes
escreva “O menor dos trˆes ´e: ”, menor
escreva “O maior dos trˆes ´e: ”, maior
fimalgoritmo
3. Escreva um algoritmo para ler trˆes n´ umeros e escrevˆe-los em ordem n˜ao
decrescente. Utilize, obrigatoriamente, um procedimento para trocar
o valor de duas vari´aveis.
// algoritmo para ler trˆes n´ umeros e escrevˆe-los em ordem
// n˜ao decrescente
algoritmo ordena trˆes
// m´odulo para trocar o valor de duas vari´aveis
procedimento troca(ref inteiro a, b)
// declara¸ c˜ao de vari´aveis
inteiro aux
111
6.8. Problemas e Solu¸ c˜oes UFMS
// troca os valores
aux ← a
a ← b
b ← aux
fimprocedimento
// declara¸ c˜ao de constantes e vari´aveis
inteiro l, m, n
// lˆe os trˆes n´ umeros
escreva “Entre com trˆes n´ umeros: ”
leia l, m, n
// encontra o menor e p˜oe em l
se l > m ou l > n ent˜ao
se m ≤ n ent˜ao
troca(l, m)
sen˜ao
troca(l, n)
fimse
fimse
se m > n ent˜ao
troca(m, n)
fimse
escreva “Os n´ umeros em ordem n˜ao decrescente: ”, l, m, n
fimalgoritmo
Neste algoritmo, os parˆametros do procedimento troca s˜ao parˆametros
de entrada e sa´ıda, pois para trocar os valores dos parˆametros reais
dentro de um procedimento, estes valores devem ser copiados para
os parˆametros formais e as mudan¸ cas nos parˆametros formais devem
ser refletidas nos parˆametros reais, uma vez que as vari´aveis precisam
retornar do procedimento com os valores trocados.
Bibliografia
O texto deste cap´ıtulo foi elaborado a partir dos livros abaixo relaciona-
dos:
112
6.8. Problemas e Solu¸ c˜oes UFMS
1. Farrer, H. et. al. Algoritmos Estruturados. Editora Guanabara, 1989.
2. Shackelford, R.L. Introduction to Computing and Algorithms. Addison-
Wesley Longman, Inc, 1998.
113
Lista de Exerc´ıcios
1. Para se determinar o n´ umero de lˆampadas necess´arias para cada cˆomodo
de uma residˆencia, existem normas que fornecem o m´ınimo de potˆencia
de ilumina¸ c˜ao exigida por metro quadrado (m
2
) conforme a utiliza¸ c˜ao
deste cˆomodo. Suponha que s´o ser˜ao usadas lˆampadas de 60W.
Seja a seguinte tabela:
Utiliza¸ c˜ao Classe Potˆencia/m
2
quarto 1 15
sala de TV 1 15
salas 2 18
cozinha 2 18
varandas 2 18
escrit´orio 3 20
banheiro 3 20
(a) Fa¸ ca um m´odulo (fun¸ c˜ao ou um procedimento) que recebe a classe
de ilumina¸ c˜ao de um cˆomodo e suas duas dimens˜oes e devolve o
n´ umero de lˆampadas necess´arias para o cˆomodo.
(b) Fa¸ ca um algoritmo que leia um n´ umero indeterminado de in-
forma¸ c˜oes, contendo cada uma o nome do cˆomodo da residˆencia,
sua classe de ilumina¸ c˜ao e as suas duas dimens˜oes e, com base no
m´odulo anterior, imprima a ´area de cada cˆomodo, sua potˆencia
de ilumina¸ c˜ao e o n´ umero total de lˆampadas necess´arias. Al´em
disso, seu algoritmo deve calcular o total de lˆampadas necess´arias
e a potˆencia total para a residˆencia.
2. A comiss˜ao organizadora de um rallye automobil´ıstico decidiu apurar
os resultados da competi¸ c˜ao atrav´es de um processamento eletrˆonico.
Um dos programas necess´arios para a classifica¸ c˜ao das equipes ´e o
que emite uma listagem geral do desempenho das equipes, atribuindo
pontos segundo determinadas normas.
(a) Escreva um m´odulo (fun¸ c˜ao ou procedimento) que calcula os pon-
tos de cada equipe em cada uma das etapas do rallye, seguindo
o seguinte crit´erio. Seja ∆ o valor absoluto da diferen¸ ca entre
o tempo-padr˜ao e o tempo despendido pela equipe numa etapa
(fornecidos como parˆametros):
114
Lista de Exerc´ıcios UFMS
∆ < 3 minutos atribuir 100 pontos `a etapa
3 ≤ ∆ ≤ 5minutos atribuir 80 pontos `a etapa
∆ > 5 atribuir 80 −
∆−5
5
pontos `a etapa
(b) Fa¸ ca um algoritmo que leia os tempos-padr˜ao (em minutos deci-
mais) para as trˆes etapas da competi¸ c˜ao, leia um n´ umero indeter-
minado de informa¸ c˜oes, contendo para cada equipe o seu n´ umero
de inscri¸ c˜ao e os tempos (em minutos decimais) despendidos para
cumprir as trˆes etapas e, utilizando o m´odulo anterior, calcule os
pontos obtidos por cada equipe em cada etapa, a soma total de
pontos por equipe, e a equipe vencedora.
3. (a) Fa¸ ca uma fun¸ c˜ao quantosdias que recebe o dia, o mˆes e o ano de
uma data e retorna um valor que cont´em o n´ umero de dias do
ano at´e a data fornecida.
(b) Fa¸ ca um algoritmo que recebe n pares de datas, onde cada par
deve ser fornecido no formato dia1, mˆes1, ano1, dia2, mˆes2,
ano2, verifique se as datas est˜ao corretas e mostre a diferen¸ ca,
em dias, entre essas duas datas. Utilize a fun¸ c˜ao anterior para o
c´alculo do total de dias de cada data.
4. (a) Escreva uma fun¸ c˜ao que recebe dois n´ umeros inteiros positivos e
determina o produto dos mesmos, utilizando o seguinte m´etodo
de multiplica¸ c˜ao:
i. dividir, sucessivamente, o primeiro n´ umero por 2, at´e que se
obtenha 1 como quociente;
ii. paralelamente, dobrar, sucessivamente, o segundo n´ umero;
iii. somar os n´ umeros da segunda coluna que tenham um n´ umero
´ımpar na primeira coluna. O total obtido ´e o produto pro-
curado.
Exemplo: 9 6
9 6 → 6
4 12
2 24
1 48 → 48
54
(b) Escreva um programa que leia n pares de n´ umeros e calcule os
respectivos produtos, utilizando a fun¸ c˜ao anterior.
5. Um n´ umero a ´e dito ser permuta¸c˜ ao de um n´ umero b se os d´ıgitos de
a formam uma permuta¸ c˜ao dos d´ıgitos de b.
Exemplo:
5412434 ´e uma permuta¸ c˜ao de 4321445, mas n˜ao ´e uma per-
muta¸ c˜ao de 4312455.
115
Lista de Exerc´ıcios UFMS
Observa¸ c˜ ao: considere que o d´ıgito 0 (zero) n˜ao aparece nos
n´ umeros.
(a) Fa¸ ca uma fun¸ c˜ao contad´ıgitos que, dados um inteiro n e um inteiro
d, 0 < d ≤ 9, devolve quantas vezes o d´ıgito d aparece em n;
(b) Utilizando a fun¸ c˜ao do item anterior, fa¸ ca um algoritmo que leia
dois n´ umeros a e b e responda se a ´e permuta¸ c˜ao de b.
6. Um n´ umero b ´e dito ser sufixo de um n´ umero a se o n´ umero formado
pelos ´ ultimos d´ıgitos de a s˜ao iguais a b.
Exemplo:
a b
567890 890 → sufixo
1234 1234 → sufixo
2457 245 → n˜ao ´e sufixo
457 2457 → n˜ao ´e sufixo
(a) Construa uma fun¸ c˜ao sufixo que dados dois n´ umeros inteiros a e
b verifica se b ´e um sufixo de a.
(b) Utilizando a fun¸ c˜ao do item anterior, escreva um algoritmo que
leia dois n´ umeros inteiros a e b e verifica se o menor deles ´e
subseq¨ uˆencia do outro.
Exemplo:
a b
567890 678 → b ´e subseq¨ uˆencia de a
1234 2212345 → a ´e subseq¨ uˆencia de b
235 236 → Um n˜ao ´e subseq¨ uˆencia do outro
7. Uma seq¨ uˆencia de n n´ umeros inteiros n˜ao nulos ´e dita m-alternante
se ´e constitu´ıda por m segmentos: o primeiro com um elemento, o
segundo com dois elementos e assim por diante at´e a m-´esima, com M
elementos. Al´em disso, os elementos de um mesmo segmento devem ser
todos pares ou todos ´ımpares e para cada segmento, se seus elementos
forem todos pares (´ımpares), os elementos do segmento seguinte devem
ser todos ´ımpares (pares).
Por exemplo:
A seq¨ uˆencia com n = 10 elementos: 8 3 7 2 10 4 5 13 4 11 ´e 4-
alternante.
A seq¨ uˆencia com n = 3 elementos: 7 2 8 ´e 2-alternante.
A seq¨ uˆencia com n = 8 elementos: 1 12 4 2 13 5 12 6 n˜ao ´e alternante,
pois o ´ ultimo segmento n˜ao tem tamanho 4.
116
Lista de Exerc´ıcios UFMS
(a) Escreva uma fun¸ c˜ao bloco que recebe como parˆametro um inteiro
n e lˆe n inteiros do teclado, devolvendo um dos seguintes valores:
0, se os n n´ umeros lidos forem pares;
1, se os n n´ umeros lidos forem ´ımpares;
-1, se entre os n n´ umeros lidos h´a n´ umeros com paridades diferentes.
(b) Utilizando a fun¸ c˜ao do item anterior, escreva um algoritmo que,
dados um inteiro n (n ≥ 1) e uma seq¨ uˆencia de n n´ umeros intei-
ros, verifica se ela ´e m-alternante. O algoritmo deve imprimir o
valor de m ou dar uma resposta dizendo que a seq¨ uˆencia n˜ao ´e
alternante.
8. Considere as seguintes f´ormulas de recorrˆencia:

F
1
= 2;
F
2
= 1;
F
i
= 2 ∗ F
i−1
+G
i−2
i ≥ 3.

G
1
= 1;
G
2
= 2;
G
i
= G
i−1
+ 3 ∗ F
i−2
i ≥ 3.
Podemos ent˜ao montar a seguinte tabela:
i 1 2 3 4 5 . . .
F
i
2 1 3 8 24 . . .
G
i
1 2 8 11 20 . . .
Este exerc´ıcio est´a dividido em trˆes partes.
(a) S´o para ver se vocˆe entendeu as f´ormulas, qual ´e o valor de F
6
e
G
6
?
(b) Fa¸ ca um procedimento de nome valor que recebe um inteiro K ≥
1 e devolve F
k
e G
k
.
Exemplo:
Para k = 2, o procedimento deve retornar os valores 1 e
2. Para k = 3, a fun¸ c˜ao deve devolver os valores 3 e 8.
Para k = 4, a fun¸ c˜ao deve devolver os valores 8 e 11.
Observa¸ c˜ ao: n˜ao utilize vetores neste exerc´ıcio.
(c) Fa¸ ca um algoritmo que lˆe um inteiro n > 2 e imprime os valores
F
n−2
+ G
n+200
e F
n+200
+ G
n−2
. Seu algoritmo deve obrigatori-
amente utilizar o procedimento do item anterior.
9. Um conjunto pode ser representado por um vetor da seguinte forma:
V [0] ´e o tamanho do conjunto; V [1], V [2], . . . s˜ao os elementos do con-
junto (sem repeti¸ c˜oes).
(a) Fa¸ ca uma fun¸ c˜ao intersec¸ c˜ ao que dados dois conjuntos de n´ umeros
inteiros A e B, constr´oi um terceiro conjunto C que ´e a intersec¸ c˜ao
de A e B. Lembre-se de que em C[0] a sua fun¸ c˜ao deve colocar o
tamanho da intersec¸ c˜ao.
117
Lista de Exerc´ıcios UFMS
(b) Fa¸ ca um algoritmo que leia um inteiro n ≥ 2 e uma seq¨ uˆencia de
n conjuntos de n´ umeros inteiros (cada um com no m´aximo 100
elementos) e construa e imprima o vetor INTER que representa
a intersec¸ c˜ao dos n conjuntos.
NOTE que N
˜
AO ´e preciso ler todos os conjuntos de uma s´o vez. Vocˆe
pode ler os dois primeiros conjuntos e calcular a primeira instersec¸ c˜ao.
Depois, leia o pr´oximo conjunto e calcule uma nova intersec¸ c˜ao entre
esse conjunto lido e o conjunto da intersec¸ c˜ao anterior, e assim por
diante.
10. (a) Escreva uma fun¸ c˜ao que recebe como parˆametros um vetor real
A com n elementos e um vetor B com m elementos, ambos re-
presentando conjuntos, e verifica se A est´a contido em B (A ⊂
B).
(b) Utilizando a fun¸ c˜ao anterior verifique se dois conjuntos s˜ao iguais
(A = B se e somente se A ⊂ B e B ⊂ A).
11. (a) Escreva uma fun¸ c˜ao que troca o conte´ udo de duas vari´aveis.
(b) Escreva uma fun¸ c˜ao que recebe dois inteiros, i e j, uma matriz
real A
m×n
e troca a linha i pela linha j. Utilize o procedimento
do item anterior.
12. Dizemos que uma matriz A
n×n
´e um quadrado latino de ordem n se em
cada linha e em cada coluna aparecem todos os inteiros 1, 2, 3, . . . , n
(ou seja, cada linha e coluna ´e permuta¸ c˜ao dos inteiros 1, 2, . . . , n).
Exemplo:

¸
¸
¸
1 2 3 4
2 3 4 1
4 1 2 3
3 4 1 2
¸

A matriz acima ´e um quadrado latino de ordem 4.
(a) Escreva uma fun¸ c˜ ao que recebe como parˆametro um vetor inteiro
V com n elementos e verifica se em V ocorrem todos os inteiros
de 1 a n.
(b) Escreva uma fun¸ c˜ao que recebe como parˆametros uma matriz
inteira A
n×n
e um´ındice j e verifica se na coluna j de A ocorrem
todos os inteiros de 1 a n.
(c) Utilizando as fun¸ c˜oes acima, verifique se uma dada matriz inteira
A
n×n
´e um quadrado latino de ordem n.
118
Ponteiros 7
A mem´oria do computador ´e constitu´ıda de muitas posi¸ c˜oes (geralmente
milh˜oes), cada qual pode armazenar um peda¸ co de dado. Cada posi¸ c˜ao
de mem´oria ´e denominada c´elula. Estas posi¸ c˜oes s˜ao muito similares `as
vari´aveis que temos utilizado, com uma diferen¸ ca: ao escrever nossos algo-
ritmos, criamos nossas vari´aveis simplesmente dando nome a elas, enquanto
que no computador estas c´elulas existem fisicamente.
Estas c´elulas de mem´oria s˜ao numeradas seq¨ uencialmente. Quando o
processador do computador precisa acessar uma c´elula de mem´oria, ele a re-
ferencia pelo seu n´ umero, que tamb´em conhecemos como endere¸ co. Quando
um algoritmo ´e escrito em uma linguagem de programa¸ c˜ao para ser usado
em um computador, cada identificador de vari´avel usado no algoritmo ´e as-
sociado com o endere¸ co da c´elula de mem´oria que ser´a alocada para aquela
vari´avel. Nas linguagens de programa¸ c˜ao modernas, o programador n˜ao pre-
cisa se preocupar com isto. No ambiente da linguagem de programa¸ c˜ao ´e
mantida uma lista dos identificadores usados pelo programador e que associa
automaticamente estes com os endere¸ cos das c´elulas de mem´oria.
Um ponteiro ´e uma c´elula que armazena o endere¸ co de outra c´elula de
dados. Olhando o valor do ponteiro, o computador determina onde olhar na
mem´oria pelo valor do dado apontado pelo ponteiro. De fato, um ponteiro ´e
um tipo especial de vari´avel cujo conte´ udo ´e um endere¸ co de mem´oria. Veja
um exemplo na Figura 7.
8900
8900 8900 p
p
Figura 7.1: Ponteiro p armazenando o endere¸ co 8900 e sua representa¸ c˜ao
esquem´atica
Usaremos a seguinte nota¸ c˜ao para declarar uma vari´avel tipo ponteiro
119
UFMS
tipododado ˆ<identificador>
Este comando declara uma vari´avel de nome identificador que aponta
para uma c´elula armazenando um dado tipodado. Por exemplo, na de-
clara¸ c˜ao
inteiro ˆp,ˆq
as vari´aveis p e q s˜ao do tipo ponteiro para inteiro, isto ´e, ambas poder˜ao
apontar para uma vari´avel do tipo inteiro. Como a quantidade de c´elulas
de mem´oria utilizada por um tipo varia conforme o tipo, a vari´avel ponteiro
aponta para a primeira posi¸ c˜ao e pelo tipo ele sabe quantas c´elulas a partir
daquela posi¸ c˜ao contˆem o dado.
Para podermos entender a base de ponteiros, consideraremos a Figura 7,
onde mostramos as vari´aveis p e q e seu respectivo conte´ udos, bem como sua
representa¸ c˜ao esquem´atica. Nesta figura, mostramos duas vari´aveis p e q,
ambos s˜ao vari´aveis do tipo ponteiro, isto ´e armazenam endere¸ cos, e ambas
apontam para uma vari´avel inteira que armazena o valor 4.
4
4 300 300
p
p
q
q
Figura 7.2: A representa¸ c˜ao esquem´atica dos ponteiros p e q e seus respec-
tivos conte´ udo: o endere¸ co 300
Assim, o algoritmo pode acessar o valor n´ umerico 4 referenciando o valor
apontado por p ou referenciando o valor apontado por q. Isto ´e feito atrav´es
do operador un´ario ˆ. Ao referenciarmos um ponteiro estamos seguindo o
ponteiro e vendo para onde ele aponta. Como p ´e um ponteiro para o tipo
inteiro, isto ´e armazena o valor do endere¸ co de mem´oria onde este valor
inteiro se encontra, precisamos de um mecanismo para que ele possa alterar
o valor da c´elula de mem´oria para onde aponta. Assim ˆp ← 9 altera o valor
da vari´avel para a qual p aponta. Neste caso, o valor da vari´avel apontada
por q foi tamb´em alterada, uma vez que ambos apontam para o mesmo
endere¸ co.
Na Figura 7 mostramos o que ocorre se atribuirmos o valor 9 `a vari´avel
apontada por p: estaremos mudando tamb´em o valor o qual q aponta.
120
UFMS
9
p q
Figura 7.3: Altera¸ c˜ao do conte´ udo para onde p aponta acarreta mudan¸ ca no
conte´ udo para onde q aponta
A vari´avel ponteiro cont´em um endere¸ co. Para alterar o valor de um
ponteiro devemos atribuir um novo valor a ele. Por exemplo, quando mu-
damos o valor de q para fazˆe-lo apontar para a mesma c´elula que r aponta,
utilizaremos o seguinte comando:
q ← r
Este comando significa que “n´os mudamos o valor de q de forma que
ele aponta para o endere¸ co de mem´oria para o quel r aponta.” Isto tem o
mesmo significado de “copie o endere¸ co armazenado em r para q.”
A Figura 7.4(a) mostra o que acontecer´a se a vari´avel q apontar para a
vari´avel inteira apontada por r. O algoritmo poder´a obter o valor armaze-
nado nela referenciando tanto r quanto q.
9 3 p
q
r
9
3
p
q
r
Figura 7.4: Manipulando ponteiros
Se agora quisermos que r aponte para a posi¸ c˜ao para a qual p aponta,
usaremos o comando
r ← p.
Devemos notar que q n˜ao s´o referenciou diferentes valores mas tamb´em ar-
mazenou diferentes c´elulas de mem´oria (Figura 7).
9
3 p q
r
Figura 7.5: Manipulando ponteiros
Se um ponteiro n˜ao estiver apontando para nenhuma c´elula, diremos que
seu valor ´e nulo. O valor nulo n˜ao ´e a mesma coisa que nenhum valor. Ao
121
UFMS
inv´es disso, ele ´e um valor particular que significa que “este ponteiro n˜ao
est´a apontando para nada”.
Atribu´ımos o valor nulo para uma vari´avel apontador r atrav´es do se-
guinte comando:
r ← nulo
Na Figura 7 desenhamos um ponteiro nulo como um aterramento (ele-
tricidade).
9 3 p
q
r
Figura 7.6: O ponteiro r apontando para nulo
Ao referenciarmos um ponteiro ele deve estar apontando para alguma
c´elula. Assim, neste contexto, o seguinte comando ´e incorreto ˆr ← 5 uma
vez que r n˜ao aponta para nenhuma posi¸ c˜ao de mem´oria. Para corrigir isto
poder´ıamos fazer
r ← p
ˆr ← 5 e ter´ıamos p e r apontando para o endere¸ co de mem´oria cujo valor
´e 5 (Figura 7).
5
3 p q r
Figura 7.7: Resultado depois dos comandos r ← p e ˆr ← 5
Se quisermos obter o endere¸ co de mem´oria de uma vari´avel devemos
utilizar o operador un´ario &. Assim se tivermos uma vari´avel do tipo inteiro
val, contendo o valor 7, o resultado do comando
p ← &val
´e a atribui¸ c˜ao do endere¸ co de vari´aval val `a p (Figura 7).
122
7.1. Tipos Base UFMS
5
7
3
p q r
val
Figura 7.8: Atribui¸ c˜ao do endere¸ co de uma vari´avel tipo inteiro para um
ponteirp p
7.1 Tipos Base
At´e o presente momento, consideramos que cada vari´avel ocupa uma
regi˜ao da mem´oria e n˜ao nos preocupamos com a quantidade de mem´oria
ocupada por cada um dos tipos. Vimos que um ponteiro aponta para a
primeira posi¸ c˜ao de mem´oria que cont´em o dado. Para sabermos quantas
posi¸ c˜oes de mem´oria, a partir da inicial, contˆem o valor armazenado devemos
olhar o tipo base da vari´avel ponteiro.
Cada linguagem de programa¸ c˜ao define uma quantidade de mem´oria
utilizada por cada um de seus tipos b´asicos. O conceito de ponteiros ´e
implementado em linguaguem de programa¸ c˜ao considerando esta quantidade
de mem´oria, tanto para efeito de aloca¸ c˜ao quanto para movimenta¸ c˜ao de
ponteiros. Neste texto utilizaremos a seguinte conven¸ c˜ao
Tipo Unidades
de Mem´oria
caracter 1
l´ogico 1
inteiro 2
real 4
O objetivo de fixarmos uma quantidade de mem´oria que os diversos tipos
utilizam ser´a visto mais adiante.
7.2 Opera¸c˜oes com Ponteiros
Podemos utilizar duas opera¸ c˜oes com ponteiros: soma e subtra¸ c˜ao. De-
vemos lembrar que ponteiros armazenam endere¸ cos de mem´oria onde um
dado de um determinado tipo base est´a armazenado. Assim estas opera¸ c˜oes
123
7.3. Ponteiros e Vetores UFMS
levam em conta a quantidade de mem´oria necess´aria para armazenar o tipo
base. Por exemplo, se considerarmos um ponteiro p que aponta para uma
vari´avel do tipo inteiro armazenada no endere¸ co 200, a atribui¸ c˜ao
p ← p + 1
far´a com que p aponte para a primeria posi¸ c˜ao de mem´oria ap´os o inteiro.
Como convencionamos que um inteiro utiliza duas unidades de mem´oria,
o conte´ udo de p ser´a 202 ( e n˜ao 201!). O mesmo racioc´ınio vale para a
opera¸ c˜ao de subtra¸ c˜ao. Se o valor inicial de p for 200, o comando
p ← p −1
far´a com que o valor de p seja 198.
Cada vez que o valor de um ponteiro ´e incrementado ele aponta para
o pr´oximo elemento de seu tipo base. Cada vez que um ponteiro ´e decre-
mentado ela aponta para o elemento anterior. Em ambos os casos leva-se
em consider¸ c˜ao a quantidade utilizada pelo tipo base. Veja Figura 7.2 como
exemplo.
0204
0203
0202
0201
0199
0198
0200
Figura 7.9: Mem´oria ocupada por um inteiro e seus respectivos endere¸ cos
As opera¸ c˜oes aritm´eticas de ponteiros acima somente podem ser feitas
entre ponteiros e inteiros(constante, vari´aveis ou express˜oes). Nenhuma ou-
tra opera¸ c˜ao ´e permitida com ponteiros.
7.3 Ponteiros e Vetores
Nesta se¸ c˜ao vamos considerar os ponteiros de maneira similar ao que
ocorre na linguagem C. Quando utilizamos somento o nome de um vetor
124
7.4. Aloca¸ c˜ao Dinˆamica de Mem´oria UFMS
estamos, de fato, referenciando o endere¸ co da primeira posi¸ c˜ao do vetor.
Assim, se considerarmos um vetor A que cont´em elementos do tipo inteiro
e uma vari´avel p do tipo ponteiro para inteiro, a atribui¸ c˜ao
p ← A
´e v´alida e neste caso p armazenar´a o endere¸ co da primeira posi¸ c˜ao do
vetor A. Diante disto e considerando as opera¸ c˜oes aritm´eticas de ponteiros
podemos ver que p +1 ser´a um apontador para a pr´oxima posi¸ c˜ao do vetor.
Al´em disso, se considerarmos que A come¸ ca com ´ındice 1, A[5] e ˆ(p + 4)
acessam o mesmo elemento, neste caso o quinto elemento do vetor.
Observamos que ˆ(p + 4) ´e diferente de ˆp + 4, uma vez que o operador
ˆ tem precedˆencia sobre os demais.
Vimos duas formas de acessar os elementos de um vetor: usando a in-
dexa¸ c˜ao da matriz ou usando a artim´etica de ponteiros. Surge a quest˜ao:
qual delas utilizar?
7.4 Aloca¸c˜ao Dinˆamica de Mem´oria
Relembremos das se¸ c˜oes anteriores que, quando fazemos as declara¸ c˜oes
de vari´aveis, estamos fazendo aloca¸ c˜ao est´atica de mem´aria, ou ainda que
estamos alocando mem´aria em tempo de compila¸ c˜ao. Quando executamos
um programa, a ele ´e destinado um bloco de mem´oria disposto, em geral,
como ilustrado na Figura 7.4.
O c´odigo do programa gerado pelo compilador e ligador ´e carregado
na parte mais baixa do bloco de mem´oria. AS vari´aveis globais e a outras
vari´aveis tempor´arias criados pelo compilador ocupam uma ´area de mem´oria
imediatamente acima da ´area de c´odigo. O restante do bloco de mem´oria
´e dividido em duas ´areas: pilha e heap. A pilha ´e usada para armaze-
nar vari´aveis locais, parˆametros, valores de retorno e outras informa¸ c˜oes
necess´arias durante chamadas a m´odulos realizadas no programa. A pilha
e a heap s˜ao colocadas em posi¸ c˜oes opostas na ´area restante do bloco de
mem´oria, e cada uma delas cresce de tamanho em dire¸ c˜oees opostas (uma
em dire¸ c˜aoo aos endere¸ cos mais altos e outra em dire¸ c˜aoo aos endere¸ c˜os
mais baixos), de tal forma que cada uma delas possa mudar de tamanho
sem afetar uma `a outra. O ´ unico problema que ocorre ´e quando a quanti-
dade de mem´oria livre no bloco de mem´oria n˜ao ´e suficiente para comportar
o crescimento da pilha e da heap.
Em muitas situa¸ c˜oes, a quantidade de mem´oria que um programa neces-
125
7.4. Aloca¸ c˜ao Dinˆamica de Mem´oria UFMS
Pilha
Heap
Vari´aveis
Programa
000000 Baixa
111111 Alta
Figura 7.10: Organiza¸ c˜ao da Mem´oria
sita n˜ao ´e conhecida em tempo de compila¸ c˜ao. Considere o seguinte exemplo
bastante simples que ilustra essa situa¸ c˜ao. Seja S um conjunto de n´ umeros
inteiros. Deseja-se um programa para determinar os elementos de S que s˜ao
maiores que a m´edia aritm´etica dos inteiros em S. S˜ao dados de entrada do
programa: a quantidade de elementos em S e os elementos de S. Para re-
solver este problema ´e necess´ario que os elementos de S sejam armazenados.
O problema aqui ´e que desconhecemos, em tempo de compila¸ c˜ao, a quan-
tidade de mem´oria que ser´a necess´aria para armazenar S (essa informa¸ c˜ao
s´o ser´a conhecida em tempo de execu¸ c˜ao). At´e ent˜ao, temos resolvido esse
tipo de problema, considerando a existˆencia de um limitante superior para
o tamanho de S e ent˜ao alocando mem´oria grande o suficiente para com-
portar o maior tamanho esperado para S. Por exemplo, se o limitante para
o tamanho de S ´e 100, usamos um vetor de tamanho 100 para armazenar
os elementos de S. Obviamente, se o tamanho de S for menor que 100 o
programa teria alocado mais mem´oria do que necessitava.
A aloca¸ c˜ao dinˆamica de mem´oria resolve este problema. Ela consiste
no processo de alocar mem´oria em tempo de execu¸ c˜ao conforme a neces-
sidade do programa. A heap ´e a mem´oria reservada para ser usada pela
aloca¸ c˜ao dinˆamica. Para que a quantidade de mem´oria dispon´ıvel na heap
n˜ao sobreponha a ´area de pilha, ´e recomendado que a mem´oria alocada dina-
micamente seja liberada pelo programa `a medida que n˜ao ´e mais necess´aria.
As seguintes opera¸ c˜oes s˜ao usadas pelo algoritmo para aloca¸ c˜ao e libera¸ c˜ao
126
7.4. Aloca¸ c˜ao Dinˆamica de Mem´oria UFMS
de mem´oria dinˆamica:
• Aloque (p,n)
p ´e um ponteiro e n ´e a quantidade de mem´oria, em unidades relativas
ao tipo base de p, a ser alocada dinamicamente. Aloque ir´a alocar
n posi¸ c˜oes consecutivas de mem´oria, cada uma delas do tamanho ne-
cess´ario para armazenar um valor do tipo base de p, e atribuir a p o
endere¸ co inicial da mem´oria alocada. Pode ocorrer falha na aloca¸ c˜ao,
quando a quantidade de mem´oria requerida n˜ao pode ser alocada. Nes-
ses casos, Aloque atribui o valor nulo a p. O valor de p sempre deve
ser verificado ap´os uma chamada a Aloque, para que haja garantia de
que houve sucesso na aloca¸ c˜ao.
• Libere (p)
p ´e um ponteiro. Libere ir´a liberar a mem´oria anteriormente alocada,
cujo endere¸ co inicial est´a armazenado em p. O espa¸ co de mem´oria de-
salocado (liberado) torna-se livre para ser usado por futuras chamadas
a Aloque.
Desta forma, podemos evitar o desperd´ıcio de mem´oria alocando exatamente
a quantidade de mem´oria que o programa necessita. Em nosso exemplo an-
terior, podemos usar um ponteiro para inteiro no lugar do vetor de 100
posi¸ c˜oes e, ent˜ao, ap´os ler o tamanho de S efetuar uma chamada a Aloque
para alocar a quantidade de mem´oria necess´aria para armazenar os elemen-
tos de S. Essa id´eia est´a ilustrada no seguinte algoritmo:
Algoritmo Exemplo
inteiro ˆp, n, i, soma
real media
leia n
Aloque (p,n)
if p = nulo then
escreva “N˜ao h´a mem´oria suficiente”
else
soma ← 0
for i de 0 at´e n −1 do
leia ˆ(p +i) // o mesmo que p[i]
soma ← soma + ˆ(p +i)
end for
media ← soma / n
for i de 0 ate n −1 do
if ˆ(p +i) > media then
escreva ˆ(p +i)
127
7.5. Ponteiros para Ponteiros UFMS
end if
end for
end if
Libere (p)
Fimalgoritmo
7.5 Ponteiros para Ponteiros
Um ponteiro para ponteiro ´e como se vocˆe anotasse em sua agenda o
n´ umero do telefone de uma empresa que fornecesse n´ umero de telefones
residenciais. Quando vocˆe precisar do telefone de uma pessoa vocˆe consulta
sua agenda, depois consulta a empresa e ela te fornece o n´ umero desejado.
Entender ponteiro para ponteiro requer conhecimento de ponteiro. Chama-
se n´ıvel de indire¸ c˜ao ao n´ umero de vezes que temos que percorrer para obter
o conte´ udo da vari´avel final. As vari´aveis do tipo ponteiro tˆem n´ıvel de
indire¸ c˜ao um. As vari´aveis do tipo ponteiro para ponteiro tˆem n´ıvel de
indire¸ c˜ao dois. Se tivermos uma vari´avel que ´e um ponteiro para ponteiro
para inteiro, para obtermos o valor do inteiro precisamos fazer dois n´ıveis
de indire¸ c˜oes.
8900
8900 9100
9100
9100
8900 9100
p
p
Figura 7.11: Exemplo onde p ´e um ponteiro para ponteiro
Podemos declarar um ponteiro para um ponteiro com a seguinte nota¸ c˜ao:
tipodado ˆˆidentificador
onde: ˆˆ identificador ´e o conte´ udo da vari´avel apontada e ˆidentificador
´e o conte´ udo ponteiro intermedi´ario.
Algoritmo Exemplo 2
inteiro a, b, ˆp, ˆˆpp
a ← 2
b ← 3
p ← &a // p recebe endere¸ co de a
pp ← &p // pp aponta para o ponteiro p ou seja ”a”
ˆˆpp ← 5 // ”a”recebe valor 5 (duas indire¸ c˜oes)
ˆpp ← &b // pp aponta para b
ˆˆpp ← &6 // ”b”recebe valor 5
Fimalgoritmo
128
7.5. Ponteiros para Ponteiros UFMS
Ressaltamos que ponteiro para inteiro e ponteiro para ponteiro para
inteiro tem n´ıveis de indire¸ c˜oes diferentes. Em nosso, exemplo, o conte´ udo
de p ´e um endere¸ co de um inteiro e o conte´ udo de pp ´e um endere¸ co de um
ponteiro para inteiro. Em outras palavras s˜ao tipos diferentes. Assim um
comando da forma pp ← p n˜ao ´e v´alido.
Um fato interessante ´e que o n´ umero de indire¸ c˜oes ´e, teoricamente, inde-
terminado e depende da linguagem de programa¸ c˜ao o n´ umero de indire¸ c˜oes
permitidas, no entanto a l´ogica permanece a mesma. Assim podemos fazer
a seguinte declara¸ c˜ao
inteiro ˆˆˆˆˆˆp
Que significa que o ponteiro para ponteiro p possui seis indire¸ c˜oes.
129
Algoritmos de
Ordena¸c˜ao 8
Um dos problemas mais tradicionais da ´area de computa¸ c˜ao ´e o pro-
blema da ordena¸ c˜ao. Nesse problema, dada uma seq¨ uˆencia de n´ umeros,
precisamos coloc´a-la em uma certa ordem (num´erica ou lexicogr´afica). Na
pr´atica, os n´ umeros a serem ordenados raramente s˜ao valores isolados. Em
geral, cada um deles faz parte de uma cole¸ c˜ao de dados (registro). Cada
registro cont´em uma chave, que ´e o valor a ser ordenado, e o restante do
registro consiste em dados sat´elites. Assim, na pr´atica, quando permutamos
os n´ umeros, tamb´em devemos permutar os dados sat´elites. Por considerar-
mos a permuta¸ c˜ao dos dados sat´elites uma opera¸ c˜ao mecˆanica, suporemos
que a entrada do problema consiste somente de n´ umeros.
Definindo o problema da ordena¸ c˜ao formalmente, temos: dada uma
seq¨ uˆencia de n n´ umeros 'a
1
, a
2
, . . . , a
n
`, encontrar uma permuta¸ c˜ao 'a

1
, a

2
, . . . , a

n
`
dessa seq¨ uˆencia tal que a

1
≤ a

2
≤ . . . ≤ a

n
.
A seguir descrevemos alguns dos algoritmos simples de ordena¸ c˜ao. Nessa
descri¸ c˜ao, assumiremos que j´a existe um tipo denominado vet num que de-
fine um vetor de inteiros cujo limite inferior ´e 1 e limite superior ´e 100. Em
outras palavras, omitiremos nos algoritmos a seguir uma linha do tipo
definatipo vetor[1..100] de inteiro vet num
8.1 Bubble-sort
O algoritmo bubble-sort consiste em passar seq¨ uencialmente v´arias vezes
pelos elementos a
1
, a
2
, . . . , a
n
da seq¨ uˆencia de tal forma que, a cada passo, o
elemento a
j
seja comparado com o elemento a
j+1
. Se a
j
> a
j+1
, ent˜ao eles
s˜ao trocados.
Algoritmo bubble sort
130
8.2. Insertion-sort UFMS
inteiro i, j, n, temp
vet num a
leia n
for i de 1 at´e n do
leia a[i]
end for
for i de 1 at´e n −1 do
for j de 1 at´e n −1 do
if a[j] > a[j + 1] then
temp ← a[j]
a[j] ← a[j + 1]
a[j + 1] ← temp
end if
end for
end for
Fimalgoritmo
8.2 Insertion-sort
Para compreens˜ao do algoritmo Insertion-sort, imagine a seguinte si-
tua¸ c˜ao: vocˆe tem um conjunto de cartas em sua m˜ao esquerda e com a m˜ao
direita tenta ordenar as cartas. A id´eia ´e colocar cada carta, da esquerda
para a direita, em sua posi¸ c˜ao correta, fazendo inser¸ c˜oes. Neste algoritmo,
a cada passo, o elemento a
k
´e inserido em sua posi¸ c˜ao correta
Algoritmo insertion sort
inteiro i, j, c, n
vet num a
leia n
for i de 1 at´e n do
leia a[i]
end for
for i de 2 at´e n do
c ← a[i]
j ← i −1
while j > 0 E a[j] > c do
a[j + 1] ← a[j]
j ← j −1
end while
a[j + 1] ← c
end for
Fimalgoritmo
131
8.3. Selection-sort UFMS
8.3 Selection-sort
O m´etodo de ordena¸ c˜ao por sele¸ c˜ao tem o seguinte princ´ıpio de funcio-
namento: pegue o maior elemento da seq¨ uˆencia e troque-o com o elemento
que est´a na ´ ultima posi¸ c˜ao. A seguir, repita essa opera¸ c˜ao para os n − 1
elementos. Ou seja, encontre o maior elemento entre eles e coloque-o na
pen´ ultima posi¸ c˜ao. Depois, repita a opera¸ c˜ao para os n − 2 elementos e
assim sucessivamente. Ao final da execu¸ c˜ao, a seq¨ uˆencia estar´a em ordem
n˜ao-decrescente.
Algoritmo selection sort
inteiro imax, max, i, j
vet num a
leia n
for i de 1 at´e n do
leia a[i]
end for
for i de n at´e 2 passo −1 do
max ← a[1]
imax ← 1
for j ← 2 at´e i do
if a[j] > max then
max ← a[j]
imax ← j
end if
end for
a[imax] ← a[i]
a[i] ← max
end for
Fimalgoritmo
132
Um pouco sobre
complexidade de
algoritmos 9
At´e agora, estivemos interessados apenas no quesito corretude de um
algoritmo. Ou seja, dado um problema espec´ıfico, focalizamos as nossas
aten¸ c˜oes apenas no desenvolvimento e estudo de algoritmos que resolvesse
o problema, sem nos preocuparmos com a sua eficiˆencia.
Para podermos classificar um algoritmo como eficiente ou n˜ao, precisa-
mos definir precisamente um crit´erio para medirmos a sua eficiˆencia. Esse
crit´erio ´e o seu tempo de execu¸ c˜ao, que pode ser medido por meio da imple-
menta¸ c˜ao e execu¸ c˜ao do algoritmo utilizando-se v´arias entradas distintas.
Apesar de v´alida, essa estrat´egia experimental apresenta v´arios problemas.
O principal deles ´e o fato dela ser dependente da m´aquina (software e hard-
ware) em que o algoritmo est´a sendo executado. Precisamos ent˜ao encontrar
uma forma de medir o tempo de execu¸ c˜ao que nos permita comparar dois
algoritmos independentemente da m´aquina onde est˜ao sendo executados.
Uma forma de se fazer isso ´e contando o n´ umero de opera¸ c˜oes primitivas do
algoritmo. Dentre as opera¸ c˜oes primitivas est˜ao: atribuir um valor a uma
vari´avel, executar uma opera¸ c˜ao aritm´etica, chamar um m´odulo, comparar
dois n´ umeros, avaliar uma express˜ao e retornar de uma fun¸ c˜ao.
Em um ambiente computacional, cada opera¸ c˜ao primitiva corresponde a
uma ou mais instru¸ c˜oes de baixo-n´ıvel, as quais possuem tempo de execu¸ c˜ao
que depende da m´aquina, embora seja constante. Desde que o n´ umero
de instru¸ c˜oes de baixo n´ıvel correspondentes a cada opera¸ c˜ao primitiva ´e
constante, e desde que cada opera¸ c˜ao elementar possui tempo de execu¸ c˜ao
constante, os tempos de execu¸ c˜ao de duas opera¸ c˜oes primitivas quaisquer di-
ferem entre si por um fator constante. Isso nos permite considerar o tempo
de execu¸ c˜ao de cada opera¸ c˜ao primitiva como sendo o mesmo, o que im-
plica podermos nos concentrar apenas na quantidade e freq¨ uˆencia de tais
opera¸ c˜oes.
Tomemos ent˜ao como exemplo o seguinte algoritmo que lˆe um vetor de
133
UFMS
inteiro a, com n ≥ 1 posi¸ c˜oes, um inteiro x e procura por x dentro de A.
1: Algoritmo busca
2: definatipo vetor[1..10] de inteiro vet num
3: inteiro i, j, x, n
4: l´ogico achou
5: vet num a
6: achou ← F
7: i ← 1
8: leia n, x
9: for j de 1 at´e n do
10: leia a[j]
11: end for
12: while achou = F E i ≤ n do
13: if x = a[i] then
14: achou ← V
15: else
16: i ← i + 1
17: end if
18: end while
19: if achou = V then
20: escreva “O elemento de valor “, x, “est´a na posi¸ c˜ao ”, i, “do vetor.”
21: else
22: escreva “O elemento de valor “, x, “n˜ao se encontra no vetor”
23: end if
24: Fimalgoritmo
Nesse algoritmo, as linhas 6 e 7 contˆem uma opera¸ c˜ao primitiva (atri-
bui¸ c˜ao do valor “falso” `a vari´avel achou e do valor 1 `a vari´avel i). A
linha 9 ´e um la¸ co para..fa¸ ca que se repete exatamente n vezes. Na
primeira itera¸ c˜ao desse la¸ co, temos uma opera¸ c˜ao de atribui¸ c˜ao (j ← 1),
que corresponde a uma opera¸ c˜ao primitiva. No in´ıcio de cada uma das
itera¸ c˜oes desse la¸ co, a condi¸ c˜ao j ≤ n, que tamb´em corresponde a uma
opera¸ c˜ao primitiva, ´e avaliada uma vez. Como essa avalia¸ c˜ao ´e feita n + 1
vezes, a condi¸ c˜ao j ≤ n contribui com n + 1 opera¸ c˜oes primitivas. Ao final
de cada itera¸ c˜ao, temos duas opera¸ c˜oes primitivas: uma soma (j +1) e uma
atribui¸ c˜ao (j ← j + 1). Como essas duas opera¸ c˜oes est˜ao dentro do la¸ co,
elas se repetem n vezes. Uma outra opera¸ c˜ao que se encontra dentro do la¸ co
´e a indexa¸ c˜ao (a[i]) necess´aria durante a leitura do vetor. Essa indexa¸ c˜ao
corresponde a uma soma que se repete n vezes. Com tudo isso, o la¸ co em
quest˜ao corresponde a 4n + 2 opera¸ c˜oes primitivas.
A linha 12 determina o in´ıcio de um la¸ co que ser´a repetido, no m´ınimo,
uma vez e, no m´aximo, n vezes. No in´ıcio de cada itera¸ c˜ao desse la¸ co,
134
UFMS
a condi¸ c˜ao achou = F E i < n ´e avaliada, no m´ınimo, duas vezes e, no
m´aximo, n + 1 vezes. A condi¸ c˜ao do la¸ co cont´em trˆes opera¸ c˜oes primitivas:
a compara¸ c˜ao i < n, a avalia¸ c˜ao da express˜ao “achou = F” e a verifica¸ c˜ao do
resultado da express˜ao “achou = F E i < n”. Logo, a linha 12 corresponde
a, no m´ınimo, 6 e, no m´aximo, 3 (n + 1) opera¸ c˜oes primitivas.
A linha 13 cont´em duas opera¸ c˜oes primitivas: uma indexa¸ c˜ao (a[i]) e
uma compara¸ c˜ao (x = a[i]). Como essa linha est´a no corpo do la¸ co, ela
se repetir´a, no m´ınimo, um vez e, no m´aximo, n vezes. Logo, a linha 12
corresponde a, no m´ınimo duas e, no m´aximo 2n opera¸ c˜oes primitivas.
A linha 14 (achou ← V ) cont´em uma opera¸ c˜ao primitiva, que ser´a exe-
cutada, no m´aximo, uma vez. A linha 16 (i = i +1) cont´em duas opera¸ c˜oes
primitivas: a adi¸ c˜ao em si e a atribui¸ c˜ao do valor i + 1 `a vari´avel i. Al´em
disso, ela ´e executada no m´aximo n vezes, podendo n˜ao ser executada ne-
nhuma vez. Finalmente, a linha 19 se . . . ent˜ao cont´em uma opera¸ c˜ao primi-
tiva: a verifica¸ c˜ao da condi¸ c˜ao da estrutura condicional. Ela ser´a executada
uma ´ unica vez.
Pelas observa¸ c˜oes acima podemos notar que o tempo de execu¸ c˜ao do
algoritmo busca depende de n, o tamanho do vetor a ser processado. Iremos
ent˜ao represent´a-lo como uma fun¸ c˜ao f(n). Note que, se fixarmos n, f(n)
atingir´a seu menor valor quando x estiver na primeira posi¸ c˜ao do vetor (ou
seja, quando A[1] = x), e seu maior valor quando x n˜ao estiver em A (x / ∈ A).
Isto ´e, no melhor caso, temos que t(n) = 1+1+4n+6+2+1+1 = 4n+12.
No pior caso temos que t(n) = 1+1+4n+2+3(n+1)+2n+2n+1 = 11n+8.
Portanto, busca executa de 4n + 12 a 11n + 8 opera¸ c˜oes primitivas em uma
entrada de tamanho n ≥ 1.
N´os usualmente consideramos o pior caso de tempo de execu¸ c˜ao para
fins de compara¸ c˜ao da eficiˆencia de dois ou mais algoritmos. Uma an´alise
de pior caso, em geral, ajud´ a-nos a identificar o “gargalo” de um algoritmo
e pode nos dar pistas para melhorar a sua eficiˆencia.
A an´alise de tempo de execu¸ c˜ao vista at´e aqui ´e conhecida como an´alise
de complexidade de tempo, ou simplesmente, an´alise de complexidade.
135
Listas 10
No cap´ıtulo 5, onde falamos sobre vetores, definimos estruturas de da-
dos como a forma com que os valores componentes de um tipo complexo
(estruturado) se organizam as rela¸ c˜oes entre eles. Vetores (unidimensionais
e bidimensionais) s˜ao considerados estruturas de dados primitivas. Neste
cap´ıtulo estudaremos uma estrutura de dados n˜ao primitiva, que recebe o
nome de l ista linear.
10.1 Defini¸c˜oes b´asicas
Uma lista linear agrupa informa¸ c˜oes referentes a um conjunto de elemen-
tos que, de alguma forma, se relacionam entre si. Ela pode se constituir,
por exemplo, de informa¸ c˜oes sobre funcion´arios de uma empresa, notas de
compras, itens de estoque, notas de alunos, etc.
Definindo formalmente, uma lista linear ´e um conjunto de n > 0 ele-
mentos (n´os) L
1
, L
2
, . . . , L
n
com as seguintes propriedades estruturais, que
decorrem unicamente das posi¸ c˜oes relativas de seus n´os:
1. L
1
´e o primeiro n´o;
2. para 1 < k ≤ n, o n´o L
k
´e precedido pelo n´o L
k−1
;
3. L
n
´e o ´ ultimo n´o.
Em nossos estudos assumiremos que cada n´o ´e formado por v´arios cam-
pos, que armazenam as caracter´ısticas dos elementos da lista. Um desses
campos constitui o que chamamos de chave do n´o. O conceito de campo
chave ´e de extrema importˆancia pois ele constitui o principal objeto a ser
136
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
manipulado pelos algoritmos sobre listas. Para se evitar ambig¨ uidades, ire-
mos supor que todas as chaves s˜ao distintas.
As opera¸ c˜oes mais freq¨ uentes em listas s˜ao a busca, i nser¸ c˜ao de um n´o,
e remo¸ c˜ao de um n´o da lista. Al´em dessas opera¸ c˜oes vale mencionar outras
de relativa importˆancia como a combina¸ c˜ao de duas ou mais listas lineares
em uma ´ unica, a ordena¸ c˜ao dos n´os, a determina¸ c˜ao do tamanho da lista,
etc.
Podemos citar casos particulares de listas com base nas opera¸ c˜oes de
inser¸ c˜ao e remo¸ c˜ao. Se as inser¸ c˜oes e remo¸ c˜oes s˜ao relizadas somente em
um extremo, a lista ´e chamada pilha. Se as inser¸ c˜oes s˜ao relizadas em um
extremo, e as remo¸ c˜oes em outro, a lista ´e chamada f ila.
Existem duas formas de armazenar os n´os de uma lista no computador:
• aloca¸ c˜ao seq¨ uencial: os n´os s˜ao armazendos em posi¸ c˜oes consecutivas
da mem´oria;
• aloca¸ c˜ao encadeada: os n´os s˜ao armazendos em posi¸ c˜oes n˜ao consecu-
tivas da mem´oria.
A melhor maneira de armazenar listas lineares depende, basicamente,
das opera¸ c˜oes mais freq¨ uentes a serem executadas sobre ela. N˜ao existe, em
geral, uma ´ unica representa¸ c˜ao que atende, de maneira eficiente, todas as
opera¸ c˜oes acima mencionadas.
10.2 Aloca¸c˜ao seq¨ uencial
A maneira mais simples de manter uma lista no computador ´e alocando
posi¸ c˜oes consecutivas da mem´oria a cada um de seus n´os (vetor). Assim,
poder´ıamos definir uma lista L, com no m´aximo 1000 n´os de um certo tipo,
utilizando os seguintes comandos de nossa linguagem algor´ıtmica:
defina MAX 1000
definatipo registro
inteiro chave
tipo
1
campo
1
tipo
2
campo
2
. . .
tipo
m
campo
m
fimregistro tipo registro
137
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
definatipo vetor[1..MAX] de tipo registro lista
lista L
Note nas linhas acima que tipo registo ´e um tipo que define um registro
que possui um n´ umero qualquer de campos, sendo um deles o campo chave.
Em nosso exemplo, ele est´a definido como inteiro, mas pode ser de qualquer
tipo elementar conhecido.
Armazenada de forma seq¨ uencial, a seguinte fun¸ c˜ao pode ser utilizada
para a busca, por meio da chave, de um elemento na lista L. Ela recebe
como parˆametro uma vari´avel do tipo lista (um vetor), a chave x e o tama-
nho n da lista. Ela devolve o ´ındice na lista onde o elemento se encontra ou
-1 caso o elemento n˜ao esteja na lista.
fun¸ c˜ao inteiro Busca Lista Seq(lista L, inteiro x, inteiro n)
inteiro i
i ← 1
while L[i].chave = x E i ≤ n do
i ← i + 1
end while
if i = n + 1 then
retorne i
else
retorne -1
end if
fimfun¸ c˜ao
A fun¸ c˜ao acima executa, no m´ınimo, 8 (quando o elemento encontra-se
na primeira posi¸ c˜ao do vetor) e, no m´aximo 1 + 3(n+1) + 2n + 2 + 1 =
5n + 6 opera¸ c˜oes primitivas.
Sobre os procedimentos de inser¸ c˜ao (insere um novo registro no final da
lista) e remo¸ c˜ao (remove um registro da lista cuja chave ´e x) em uma lista
linear alocada seq¨ uencialmente, eles encontram-se detalhadas abaixo. Note
que ambos se utilizam da fun¸ c˜ao Busca Lista Seq. A fun¸ c˜ao de inser¸ c˜ao
insere um novo resgitra
procedimento Inser¸ c˜ao(lista L, tipo registro novo, ref inteiro n)
if n < MAX then
if BUSCA Lista Seq(L, novo.chave) = -1 then
L[n + 1] ← novo
n ← n + 1
else
escreva “Elemento j´a existe na lista”
end if
138
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
else
imprima “lista cheia (overflow)”
end if
fimprocedimento
O procedimento acima executa, no m´ınimo, 1 opera¸ c˜ao primitiva (quando
a lista est´a cheia) e, no m´aximo 1 + 2 + 2 = 5 opera¸ c˜oes primitivas (note
que o n´ umero de opera¸ c˜oes primtivas realizadas por esse procedimento n˜ao
depende de n).
procedimento Remo¸ c˜ao(lista L, inteiro x, ref inteiro n)
inteiro k
tipo registro valor
if n > 0 then
k ← BUSCA Lista Seq(L, x)
if k = −1 then
valor ← L[k]
for i de k at´e n −1 do
L
k
← L
k
+ 1
end for
n ← n −1
else
imprima “Elemento n˜ao se encontra na lista”
end if
else
imprima “underflow”
end if
fimprocedimento
A fun¸ c˜ao acima executa, no m´ınimo, 1 opera¸ c˜ao primitiva (quando a
lista est´a vazia) e, no m´aximo 1 + 2 + 1 + 1 + 1 + n + 2(n-1) + 2(n-1) +
1 = 5n + 3 opera¸ c˜oes primitivas.
10.2.1 Pilhas e Filas
Em geral, o armazenamento seq¨ uencial de listas ´e empregado quando
as estruturas sofrem poucas inser¸ c˜oes e remo¸ c˜oes ao longo do tempo, ou
quando inser¸ c˜oes e remo¸ c˜oes n˜ao acarretam movimenta¸c˜ao dos n´os. Esse
´ ultimo caso ocorre quando os elementos a serem inserido e removidos est˜ao
em posi¸ c˜oe especiais da lista, como a primeira ou a ´ ultima. Isso nos leva `a
defini¸ c˜ao de pilhas e filas.
139
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
10.2.1.1 Pilhas
Uma pilha ´e uma lista linear tal que as opera¸ c˜oes de inser¸ c˜ao e remo¸ c˜ao
s˜ao realizadas em um ´ unico extremo.
Em geral, a implementa¸ c˜ ao de uma pilha se faz por meio de um regis-
tro P contendo dois campos: P.topo, um inteiro indicando a quantidade de
elementos na pilha, e um vetor P.L, de tamanho MAX, contendo os P.topo
elementos. Assim, poder´ıamos definir uma pilha, com no m´aximo 1000 n´os
de um certo tipo, utilizando os seguintes comandos de nossa linguagem al-
gor´ıtmica:
defina MAX 1000
definatipo registro
inteiro chave
tipo
1
campo
1
tipo
2
campo
2
. . .
tipo
m
campo
m
fimregistro tipo registro
definatipo vetor[1..MAX] de tipo registro lista
definatipo registro
tipo
1
campo
1
lista L
fimregistro tipo pilha
tipo pilha P
Os seguintes procedimento podem ent˜ao ser utilizados para inserir e
remover elementos de uma pilha, respectivamente. Quando falamos nessa
estrutura de dados, ´e comum nos referenciarmos `as opera¸ c˜oes de inser¸ c˜ao e
remo¸ c˜ao de elementos como empilhar e desempilhar
procedimento Empilha(ref tipo pilha P, tipo registro novo)
if P.topo = MAX then
P.topo ← P.topo + 1
P.L[P.topo] ← novo
else
imprima “overflow”
end if
fimprocedimento
O procedimento acima executa, no m´ınimo, 1 opera¸ c˜ao primitiva (quando
a pilha est´a cheia) e, no m´aximo, 5 opera¸ c˜oes primitivas.
fun¸ c˜ao tipo registro Desempilha(ref tipo pilha P, removido)
tipo registro removido
140
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
if P.topo = 0 then
removido ← P.L[P.topo]
P.topo ← P.topo −1
else
imprima “underflow”
end if
fimfun¸ c˜ao
A fun¸ c˜ao acima executa, no m´ınimo, 1 opera¸ c˜ao primitiva (quando a
pilha est´a vazia) e, no m´aximo, 5 opera¸ c˜oes primitivas.
10.2.1.2 Filas
Uma fila ´e uma lista linear tal que as opera¸ c˜oes de inser¸ c˜ao s˜ao realizadas
em um extremo e as de remo¸ c˜ao s˜ao realizadas no outro extremo.
Em geral, a implementa¸ c˜ao de uma fila se faz por meio de um registro F
contendo trˆes campos: F.inicio, um inteiro indicando o in´ıcio da fila, F.fim,
um inteiro indicando o fim da fila, e um vetor F.L, de tamanho MAX, con-
tendo os F.inicio −F.fim+ 1 elementos da fila. Assim, poder´ıamos definir
uma fila, com no m´aximo 1000 n´os de um certo tipo, utilizando os seguintes
comandos de nossa linguagem algor´ıtmica:
defina MAX 1000
definatipo registro
inteiro chave
tipo
1
campo
1
tipo
2
campo
2
. . .
tipo
m
campo
m
fimregistro tipo registro
definatipo vetor[1..MAX] de tipo registro lista
definatipo registro
inteiro inicio
tipo
1
fim
lista L
fimregistro tipo fila
tipo fila F
Os seguintes procedimento podem ser utilizados para inserir (enfileirar)
e remover (desinfileirar) elementos de uma fila.
Note que, ap´os qualquer opera¸ c˜ao, deve-se sempre ter o ponteiro inicio
indicando o in´ıcio da fila e fim o final da fila. Isso implica incrementar
141
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
inicio quando de uma inser¸ c˜ ao e fim quando de uma remo¸ c˜ao da fila. Isso
faz com que a fila se “mova”, dando a falsa impress˜ao de mem´oria esgotada.
Para eliminar esse problema, consideram-se os n n´os alocados como se eles
estivessem em c´ırculo, com F.L[1] seguindo F.L[n]. No algoritmo de inser¸ c˜ao
em uma fila, a vari´avel auxiliar prov armazena provisoriamente a posi¸ c˜ao de
mem´oria calculada de forma a respeitar a circularidade, sendo que o ind´ıce
fim ´e movimentado somente se a posi¸ c˜ao for poss´ıvel. Os ´ındices inicio e
fim s˜ao ambos inicializados com zero.
procedimento Enfileira(ref tipo fila F, tipo registro novo)
prov ← (F.fim MOD MAX) + 1
if prov = F.inicio then
F.fim ← prov
F.L[F.fim] ← novo
if F.inicio = 0 then
F.inicio = 1
end if
else
imprima “overflow”
end if
fimprocedimento
O procedimento acima executa, no m´ınimo, 4 opera¸ c˜ao primitiva (quando
a fila est´a cheia) e, no m´aximo, 9 opera¸ c˜oes primitivas (quando o primeiro
elemento est´a sendo inserido).
fun¸ c˜ao tipo registro Desenfileira(ref fila F)
tipo registro recuperado
if F.inicio = 0 then
recuperado ← F.L[F.inicio]
if F.inicio = F.fim then
F.inicio ← 0
F.fim ← 0
else
F.inicio ← (F.inicio MOD MAX) + 1
end if
retorne recuperado
else
imprima “overflow”
end if
fimfun¸ c˜ao
A fun¸ c˜ao acima executa, no m´ınimo, 1 opera¸ c˜ao primitiva (quando a fila
est´a vazia) e, no m´aximo, 7 opera¸ c˜oes primitivas (quando o ´ unico elemento
est´a sendo removido).
142
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
10.2.2 Um exemplo de aplica¸c˜ao de uma pilha
Dentre as v´arias aplica¸ c˜ oes de uma pilha, existe uma de grande inte-
resse na ´area de compiladores. Suponha que queremos decidir se uma dada
seq¨ uˆencia de parˆenteses est´a bem formada ou n˜ao. Uma seq¨ uˆencia desse
tipo ´e dita bem formada quando os parˆenteses e colchetes se fecham perfei-
tamente. Por exemplo, a seq¨ uˆencia ( ( ) [ ( ) ] ) est´a bem formada, enquanto
que a seq¨ uˆencia ( [ ) ] n˜ao est´a bem formada.
Vamos ent˜ao escrever um algoritmo que leia um vetor de caracteres s
contendo a seq¨ uˆencia de parˆenteses e colchetes e determine a se a seq¨ uˆencia
est´a bem formada ou n˜ao.
algoritmo
definatipo vetor[1..1000] de caracteres vet carac
definatipo registro
inteiro topo
vet carac L
fimrgistro tipo pilha
vet carac s
tipo pilha P
l´ogico temp
inteiro i, n
temp ← V
P.topo ← 0
leia n
for i de 1 at´e n fa¸ ca do
leia s[i]
end for
i ← 1
while i ≤ n AND temp = V do
if s[i] =

)

then
if P.topo = 0 AND P.L[P.topo] =

(

then
P.topo ← P.topo −1
else
temp = F
end if
else
if s[i] =

]

then
if P.topo > 1 AND P.L.[P.topo −1] =

[

then
P.topo ← P.topo −1
else
temp ← F
end if
else
143
10.2. Aloca¸ c˜ao seq¨ uencial UFMS
P.topo ← P.topo + 1
P.L[P.topo] ← s[i]
end if
end if
i ← i + 1
end while
if temp = V then
escreva “A seq¨ uˆencia ´e bem formada!”
else
“A seq¨ uˆencia n˜ao ´e bem formada!”
end if
fimalgoritmo
144
Lista de Exerc´ıcios
ponteiros
1. Escreva um algoritmo que leia um vetor A de n n´ umeros inteiros e
ordene esse vetor. O vetor deve ser alocado dinamicamente e ordenado
utilizando apenas a nota¸ c˜ao de ponteiros.
2. Escreva um algoritmo que leia dois vetores A e B com n n´ umeros
inteiros, e crie um vetor C resultado da soma de A e B. Os vetores
devem ser alocados dinamicamente e todas as opera¸ c˜oes envolvendo os
seus elementos devem ser feitas utilizando a nota¸ c˜ao de ponteiros.
3. Escreva o algoritmo para uma fun¸ c˜ao que recebe como parˆ ametros dois
vetores de inteiros A e B e retorne um terceiro vetor C tal que:
• C ´e a diferen¸ ca entre X e Y ;
• C ´e o produto entre X e Y ;
• C ´e a intersec¸ ca˜o entre X e Y ;
• C ´e a uni˜ao de X com Y .
Ordena¸c˜ao
1. Um algoritmo de ordena¸ c˜ao ´e dito est´avel se n˜ao altera a posi¸ c˜ao
relativa de elementos com mesmo valor. Por exemplo, se o vetor de
inteiros v tiver dois elementos iguais a 222, primeiro um azul e depois
um vermelho, um algoritmo de ordena¸ c˜ao est´avel mant´em o 222 azul
antes do vermelho. Com base nessa defini¸ c˜ao, para cada um dos algo-
ritmos vistos em sala de aula (bolha, sele¸ c˜ao, inser¸ c˜ao), determine se o
algoritmo ´e est´avel ou n˜ao. Em caso afirmativo, escreva “sim”.Em caso
negativo, escreva “n˜ao” e forne¸ ca uma seq¨ uˆencia de n´ umeros (entrada
para o algoritmo) que comprove o fato do algoritmo n˜ao ser est´avel.
2. Seja S uma seq¨ uˆencia de n n´ umeros tal que cada elemento representa
um voto diferente para presidente do centro acadˆemico do curso de
Bacharelado em An´alise de Sistemas da UFMS. O voto ´e um n´ umero
inteiro que representa, de forma ´ unica, o estudante escolhido para
145
Lista de Exerc´ıcios UFMS
o cargo. Escreva um algoritmo que receba S e n como entrada e
determine o n´ umero que representa o candidato mais votado.
dica: ordene a seq¨ uˆencia
Listas
1. Escreva um m´odulo que, dados como parˆametros uma lista alocada
seq¨ uencialmente L, o seu tamanho n e um valor x, devolva o n´ umero
de elementos da lista cuja chave possui valor maior ou igual a x.
2. Escreva um m´odulo que, dados como parˆametros uma lista ORDE-
NADA alocada seq¨ uencialmente L, o seu tamanho n e um elemento
novo cujo valor da chave ´e x, insira novo dentro da lista (logicamente,
a lista deve permanecer ordenada ap´os a inser¸ c˜ao).
3. Escreva um m´odulo que, dados como parˆametros uma lista ORDE-
NADA alocada seq¨ uencialmente L, o seu tamanho n e o valor x, re-
mova o elemento cujo valor da chave ´e x.
4. Escreva um m´odulo que, dados como parˆametros uma lista alocada
seq¨ uencialmente L e o seu tamanho n, inverta a ordem dos elementos
dessa lista.
5. Escreva um m´odulo que, dados como parˆametros duas listas alocadas
seq¨ uencialmente L
1
e L
2
e o tamanho de cada lista, (m e n, respecti-
vamente), devolva uma terceira lista L
3
resultado da combina¸ c˜ao das
listas L
1
e L
2
.
6. Escreva um m´odulo que, dados como parˆametros duas listas ORDE-
NADAS alocadas seq¨ uencialmente L
1
e L
2
e o tamanho de cada lista,
(m e n, respectivamente), devolva uma terceira lista L
3
, tamb´em OR-
DENADA, resultado da combina¸ c˜ao das listas L
1
e L
2
.
Pilhas
1. Utilizando uma pilha (e as fun¸ c˜oes Empilha e Desempilha asso-
ciadas), escreva um algoritmo que leia uma seq¨ uˆencia de caracteres e
imprima essa seq¨ uˆencia de forma invertida.
2. Uma palavra constru´ıda sob o alfabeto Σ = ¦a, b¦ ´e dita bacana se ela
cont´em o mesmo n´ umero de a

s e b

s. A palavra abab, por exemplo,
´e bacana, enquanto que a palavra abb n˜ao ´e bacana. Escreva um
algoritmo que leia uma palavra e determine se ela ´e bacana ou n˜ao.
146
Lista de Exerc´ıcios UFMS
3. Na nota¸ c˜ao usual de express˜oes aritm´eticas, os operadores s˜ao escritos
entre os operandos; por isso, a nota¸ c˜ao ´e chamada infixa. Na nota¸ c˜ao
polonesa, ou posfixa, os operadores s˜ao escritos depois dos operandos.
Exemplo:
Infixa Posfixa
(A+B*C) ABC*+
(A*(B+C)/D-E) ABC+*D/E-
(A+B*(C-D*(E-F)-G*H)-I*3) ABCDEF-*-GH*-*+I3*-
Escreva um algoritmo que leia uma express˜ao em nota¸ c˜ao infixa e a
traduza para a express˜ao posfixa. Para simplificar, suponha que a ex-
press˜ao infixa est´a correta e consiste apenas de letras, abre-parˆentese,
fecha-parˆentese e s´ımbolos para as quatro opera¸ c˜oes aritm´eticas. Al´em
disso, suponha que a express˜ao toda est´a “embrulhada” em um par de
parˆenteses.
4. Seja 1, 2, . . . , n uma seq¨ uˆencia de elementos que ser˜ao inseridos e pos-
teriormente removidos de uma pilha P, um de cada vez. A ordem de
inser¸ c˜ao dos elementos na pilha ´e 1, 2, . . . , n, enquanto que a remo¸ c˜ao
depende da ordem na qual as opera¸ c˜oes de remo¸ c˜ao s˜ao realizadas.
Exemplo:
Com n = 3, a seq¨ uˆencia de opera¸ c˜oes
incluir em P
incluir em P
remover de P
incluir em P
remover de P
remover de P
produzir´a uma permuta¸ c˜ao 2, 3, 1 a partir da entrada 1, 2, 3.
Representando por I e R, respectivamente, as opera¸ c˜oes de inser¸ c˜ao
e remo¸ c˜ao, a permuta¸ c˜ao 2, 3, 1 do exemplo acima pode ser deno-
tada por IIRIRR. De modo geral, uma permuta¸ c˜ao ´e chamada ad-
miss´ıvel quando puder ser obtida mediante uma sucess˜ao de inser¸ c˜oes
e remo¸ c˜oes em uma pilha a partir da permuta¸ c˜ao 1, 2, . . . , n. Assim, a
permuta¸ c˜ao 2, 3, 1 do exemplo acima ´e admiss´ıvel.
(a) Determine a permuta¸ c˜ao correspondente a IIIRRIRR, com n =
4.
(b) Dˆe um exemplo de uma permuta¸ c˜ao n˜ao admiss´ıvel.
(c) Escreva uma rela¸ c˜ao de permuta¸ c˜oes admiss´ıveis de 1, 2, 3, 4.
147
Lista de Exerc´ıcios UFMS
Filas
(a) Mostre o estado de uma fila cujos elementos s˜ao inteiros e onde
cabem, no m´aximo, 10 elementos, ap´os a seguinte seq¨ uˆencia de
opera¸ c˜oes, insere o elemento 10, insere o elemento 9, retira um ele-
mento, insere o elemento 6, insere o elemento 7, insere o elemento
13, retira um elemento, insere o elemento 14, insere o elemento
15.
(b) Repita o ´ ultimo exerc´ıcio da se¸ c˜ao anterior utilizando uma fila
(ao inv´es de uma pilha).
148

Apresenta¸˜o ca
A disciplina de Algoritmos e Estrutura de Dados I, oferecida na primeira s´rie dos cursos de Bacharelado em Ciˆncia da Computa¸˜o, Bacharelado em e e ca An´lise de Sistemas e Bacharelado em Sistemas de Informa¸˜o da UFMS, a ca possui uma importˆncia fundamental no que diz respeito ` aprendizagem dos a a conceitos introdut´rios de racioc´ o ınio l´gico e matem´tico, resolu¸˜o de proo a ca blemas e programa¸˜o de computadores. No decorrer desses cursos, muitas ca outras disciplinas fazem uso e aprofundam os conceitos estudados inicialmente aqui. Esta apostila re´ne um conjunto de conceitos e exerc´ u ıcios introdut´rios o e deve ser usada apenas como suporte aos seus primeiros passos no desenvolvimento de sua capacidade de abstra¸˜o, resolu¸˜o de problemas e na ca ca habilidade de programa¸˜o de computadores. O texto foi desenvolvido com ca base em todos os materiais relacionadas na bibliografia deste documento. Dessa forma, esse material dever´ permanecer em constante atualiza¸˜o, a ca sendo importante a participa¸˜o dos alunos neste processo de corre¸˜o, atuca ca aliza¸˜o e reformula¸˜o dos t´picos, sempre que for necess´rio. ca ca o a Na disciplina de Algoritmos e Estrutura de Dados I ´ adotada uma pseue dolinguagem de programa¸˜o, semelhante ao PORTUGOL. Entretanto, exisca tem disciplinas pr´ticas no curso que far˜o uso de laborat´rio e de uma lina a o guagem de programa¸˜o espec´ ca ıfica (C, C++ ou JAVA). Vale ressaltar que, aqueles acadˆmicos que obtiverem sucesso na disciplina te´rica de Algorite o mos e Estrutura de Dados I e, ao final dela, puderem programar com desenvoltura na linguagem espec´ ıfica que foi trabalhada no curso, ter˜o maior a facilidade para aprender novos conceitos e novas linguagens de programa¸˜o. ca Por ultimo, mas n˜o menos importante, apesar desse material apresentar ´ a uma boa parte dos assuntos que ser˜o discutidos em sala de aula, ´ FORTEa e MENTE recomendado que os acadˆmicos SEMPRE procurem informa¸˜es e co em outras fontes (tais como livros, notas de aula, Internet, entre outros), podendo come¸ar pelas obras indicadas como referˆncias para a elabora¸˜o c e ca deste documento.

I

Para come¸ar... c
´ E imposs´ ıvel ensinar algu´m a pensar, j´ que todas as pessoas j´ nase a a cem com essa capacidade. Nosso objetivo aqui ´ o de compreender como e desenvolver e aperfei¸oar a t´cnica de pensamento, no que diz respeito ao c e racioc´ ınio l´gico e matem´tico. Isso ´ fundamental para desenvolvermos a o a e nossa capacidade de resolver problemas e de programar computadores. Impor disciplina ao c´rebro ´ um processo que, muitas vezes, produz e e resultados a longo prazo. No entanto, se o seu interesse ´ obter resultados e a curto e m´dio prazos, ´ fundamental que haja uma atividade mental e e constante e muita persistˆncia. Para isso, devemos estar preparados e e motivados para nos dedicarmos a uma pr´tica constante de todos os a conceitos vistos em sala de aula. Portanto, leitura, pesquisa e exerc´ ıcios nunca ser˜o demais nesse processo. a Na vida, se temos um objetivo e nos planejamos para alcan¸´-lo, a posca sibilidade de sucesso torna-se bem maior do que quando n˜o existe um plaa nejamento. A mesma id´ia pode ser aplicada ` resolu¸˜o de problemas e ao e a ca desenvolvimento de programas. Dessa forma, nunca devemos come¸ar a proc gramar a partir do nada, pois quando se come¸a a escrever um programa sem c termos pensado e refletido sobre o problema que deu origem a ele, fica dif´ ıcil visualiz´-lo como um todo. O entendimento adequado do programa, a coma preens˜o de sua solu¸˜o e a cria¸˜o de um “rascunho”pr´vio do programa a ca ca e (algoritmo) e da solu¸˜o s˜o necess´rios para a defini¸˜o da abordagem mais ca a a ca adequada para o problema. Al´m disso, esquematizar o programa ajuda a e fixar exatamente o que se deseja, a economizar tempo em frente ao monitor na tentativa de escrever um programa que cumpra o desejado e a superar as dificuldades que, por ventura, venham a ser encontradas. Como vocˆ j´ deve ter percebido, a constru¸˜o de um programa n˜o se e a ca a resume ao dom´ de uma linguagem de programa¸˜o e nem a simples ativiınio ca dade de digita¸˜o de uma seq¨ˆncia de linhas de c´digo em um computador. ca ue o Antes disso, existe um trabalho mental a ser desenvolvido at´ que se tenha e um projeto completo e acabado da solu¸˜o de um problema. Esse exerc´ ca ıcio intelectual ´ o que diferencia o trabalho desenvolvido por um analista ou e projetista de sistemas do trabalho de um digitador ou programador.

II

2. . . .1. . .2 Carga no AC . . . . . . . . . .3. . . . . . . . .1 Algoritmo . . . . . . . . . . . . . . .1. . . 2. . .1. . . . . . . . . . . .1. . . . . . . . . . . .3 Software . . . . . . . . . . . . . . .1. . . .8. . . . . 2. .8. . . . . . . . . . .3. . . . . .3. . 1. . 2. . . . . .7 Pare . . .6 Operador .6 Desvio Condicional . . . . . . . .4 Porta-Cart˜es . . . . . . . . . . . . . . . . . . . . . 2. . . . . . . . . . . . . .1. . . ca 1 1 3 4 6 8 11 12 13 16 16 17 17 17 18 18 18 19 20 21 21 21 22 22 22 23 23 25 28 28 28 29 29 30 30 30 . 2. . . . 2. . . .1 O Computador HV-1 . . . .8. . . . . . . . . . . . . . . . . . . . . . .4 Algoritmos e Computadores . .3. . . . . . . . . . . . 2.6 Instru¸˜es do HIPO . . . .2 CPU . .3. . . . . .4 Unidade de Entrada . . . o 2. . . . . . . . . . . . . . . . . . . . . . . . . . a 2. . . 2. . . . . . . o 2. . . . ca ca 1. . . . . . . . . . . . . . . . . . . . . . . . .5 Folha de Sa´ ıda . . . . . . . . . . .2 O Computador HV-2 . . . . .1. . . . . . . . . . . . . . . . .2 Calculadora . . . . . . .3 Resolu¸˜o de Problemas e Abstra¸˜o . . . . . . . . 1. . . . .7 Exemplo de Programa . .3 Armazenamento do AC 2. . . . . 2. . . . . . . . . . . . . . . . . ıda 2. . . . . . . . . . . . . . . . . . . III . . . . . . . . . . .7 Programando o HV-1 . . . . . 2. . . . . .8 Instru¸˜es do HV-1 . . . . . . . . . . . . . . . . . . 2. .1 Hardware . . . . . . . .5 Leitura .2 Algoritmos e Resolu¸˜o de Problemas ca 1. .1. . .1. . . .4. . . .3 EPI . . . . . . co 2. . . . . 2. .5 A Computa¸˜o Como Disciplina . . . . . . . . . .1. .8. . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 Soma . . . . . . . .2 Linguagens de Programa¸˜o . . .4. . . .3 O Computador HIPO . . . . . . . . . .8. . . . . . 2. . . . .5 Unidade de Sa´ . . . . . . . . . . . . . . . .3. . . . . . . . . . . . . . . . . . .1. . . . . . . 2. .3 EPI . . . . . .1. . . . . . . .1. . . . . . 2. . . 1. . 1. . . . . .4. . . . . . . . ca 1. . . .3. . . . . . . . . . . . . . . . . . . . . . . . . 2 Os Computadores HV-1. . . . . . . . HV-2 e HIPO 2. . .9 Exemplo de Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Conte´do u 1 Introdu¸˜o ` Computa¸˜o ca a ca 1. . . . .1 Mem´ria .1 Gaveteiro . . . . . . . . . . . . . . . .8. . . . . .4 Impress˜o . . .1. .8. . . . . . .1. . . . . . 2. . . co 2. . . . . . . . 2.1. . .

. . . . 3. .2 Declarando e Manipulando Vari´veis do Tipo Vetor a 5. . . . . . . .3. . . . . . . . . . . .3 Problemas e Solu¸˜es Envolvendo Vetores . . . .6. . . 5. e 3. 3. . . . . . . . . . . .1 Definindo uma Estrutura de Registro . . . . . . . . . . . . . 3. . . . . . .2 Operadores L´gicos . . . co 5 Estruturas de Dados 5. . 5. . . .4 Matrizes . 4. . . . . . . . . . 6 Modulariza¸˜o ca 100 6.2 Componentes de um m´dulo . . . . . . .2 Operadores Aritm´ticos . . . . 101 o 6.1. . . .Parte I 3. . . . . . . . . . .2 Matrizes . . . . . . . . . . . . . . . . . . .1 Estruturas Condicionais .1 Rela¸˜es . . . .6 Operadores . . . . . . . .2 Estruturas de Controle . . . . . . . . . . . . . . . 100 e e 6. . . . . . . . .4 Vari´veis . . . co 4. . . . . . . .Parte II 4.1. . . . . . . . . . . . . . 31 32 32 34 35 36 37 38 38 39 39 40 41 41 44 44 44 45 47 47 51 56 70 70 72 73 74 79 80 83 83 84 85 86 87 93 3 Desenvolvimento de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Desenvolvimento de Algoritmos . . . . . . . . .5 Um Problema Envolvendo Registros . .3. .2. . . . . . .4 Precedˆncia de Operadores . . . . . . .3 Vetores de Registros .3 Tipos de Dados . . . . . . . . . . . . . .2 Estruturas de Repeti¸˜o . .3. . . . . . . . . ca 3. . . .2 Criando e Manipulando Vari´veis de Registros . . . . . . . . .Conte´do u UFMS 2. . 5. . . . . . . . . . . . . . . . . . . 5. . . . . . . . . . . . . . . . . . . a 5. . . . . . . . . . . ca 4. . .6. . . . . .1 Vetores . . . . 5. . . . . .4 Registro de Tipos Complexos . . . . . . .1 Operador de Atribui¸˜o . . . . . . . . . . . 3. . . . . . . .3 Problemas e Solu¸˜es . . . . . . .3 Registros .7 Estrutura Geral de um Algoritmo . . . . . ca 3. .1 O Quˆ e Por Quˆ? . . . .5 Entrada e Sa´ ıda . . . . . . . . 102 ca IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6.6. . . .1 Express˜es Condicionais . . . . . . . .1 Definindo uma Estrutura de Dados Vetor . . . . . .1. . . . . . . . . . . . . .5 Constantes . e 3. . . . . . . . . . .3 Ferramentas para Modulariza¸˜o . .6. . . . . . . co 5. . . . . . . 5.2. . . a 3. . . 5. . . . .3 Comando de Atribui¸˜o .1 Componentes de um Algoritmo . . . . . . . . 4. . . . . .3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. .2 Uma Linguagem para Algoritmos . . . o 4. . . . .4 Bibliografia . . . . . . .3. . . o 4. . . . . . . . . . . . . . . .1 Problemas e Solu¸˜es Envolvendo Matrizes . . . . . . . . 3. . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . co 5. .2. . . . . . . . . . . . . . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . 130 8.5 6. . . . . . . . .1 Tipos Base .1. . . . . . . . . . . . . . . . . . . . 7. . . . . . . . 7. . . . . . . . . 103 105 106 107 109 119 123 123 124 125 128 7 Ponteiros 7. . . . . . . . . .2 Um exemplo de 133 136 136 137 139 140 141 143 . . . . . . . . . . . . . .1 Pilhas e Filas . . . . V . . . . . . . . 10. . . . . . . . . . . . . . . . . . . . . .4 6. . . . . . . . . . . . . . . . . .2 Insertion-sort . . . . . . .1 Pilhas 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . aplica¸˜o de uma pilha ca . . . . . . . . . . . . . . . . 8 Algoritmos de Ordena¸˜o ca 130 8. . . . . . . . . . . . . .1. . . . . . . . . . . . . . . . . . . . . . .4 Aloca¸˜o Dinˆmica de Mem´ria ca a o 7.3 Selection-sort . . .7 6.1 Defini¸˜es b´sicas . . . . . . . . .2.6 6. . . .2 Opera¸˜es com Ponteiros . . . .1 Bubble-sort . . . . . . . . . . . . . . co Chamando Fun¸˜es e Procedimentos co Passagem de Parˆmetros . . . . . . . . . . . . . . . . . co 7. . . . . . . a Escopo de Dados e C´digo . . . . . . . . . 131 8. . . . . . . . . . .2 Filas . . . . . . co a 10. . . . . . . . . . . . . ca u 10. . . . . . . . . . . . .2. . . . . . . . . o Problemas e Solu¸˜es . . . . . co . .Conte´do u UFMS 6. . . . . . . 10. . . . . . . . . . . . . . . .2. . . . . . .3 Ponteiros e Vetores . . . . . . . . . . . . 132 9 Um pouco sobre complexidade de algoritmos 10 Listas 10. . . . . . . . . . . . . . . . . . . . .8 Criando Fun¸˜es e Procedimentos . . . .5 Ponteiros para Ponteiros . . . . . .2 Aloca¸˜o seq¨encial . .2. . . . . .

a execu¸˜o do algoritmo ´ encerca rada e o problema ´ ent˜o tido como “resolvido”. introduziremos a no¸˜o de algoritmo. Entretanto. e ca Neste T´pico. abordaremos a rela¸˜o algoritmo-computador e discutiremos soca bre a Computa¸˜o e suas ´reas. todas estas defini¸˜es concordam que um co algoritmo ´ uma seq¨ˆncia de instru¸˜es para resolver um problema. por qualquer agente usando apenas l´pis e papel. a qual e ue co possui as seguintes propriedades: e co • Garantia de t´rmino: o problema a ser resolvido possui condi¸˜es e espec´ ıficas que. ca ca algoritmo ´ o conceito central da Computa¸˜o. estas e a e condi¸˜es devem ser satisfeitas ap´s uma quantidade finita de tempo. quando satisfeitas. pelo menos em princ´ ıpio. ca a 1. Al´m disso. Para cientistas da Computa¸˜o. de forma que n˜o haja ambig¨idade na interpreta¸˜o a u ca da inten¸˜o. co o a ser contado a partir do in´ da execu¸˜o do algoritmo.1 Algoritmo H´ tantas defini¸˜es diferentes para o termo algoritmo quanto autores a co escrevendo sobre elas.Introdu¸˜o ` ca a Computa¸˜o ca 1 Computadores s˜o dispositivos que s´ sabem fazer um tipo de coisa: exea o cutar algoritmos para processar informa¸˜o. ca • Efetividade: cada instru¸˜o deve ser b´sica o suficiente para ser execa a cutada. mostraremos alguns o ca exemplos. ıcio ca • Exatid˜o: a inten¸˜o de cada instru¸˜o no algoritmo deve ser suficia ca ca entemente clara. a 1 .

possuem muitas ocorrˆncias. nem toda seq¨ˆncia de instru¸˜es para resolver ue co um determinado problema pode ser considerada um algoritmo. considere o problema de enconca trar o m´ximo divisor comum (MDC) de dois n´meros naturais quaisquer e a u a seguinte seq¨ˆncia de instru¸˜es para resolver o problema: ue co 1. Um problema para o qual existe uma solu¸˜o na forma de algoritmo ´ ca e dito um problema algor´ ıtmico. Entretanto. em geral. nossa instru¸˜o n˜o pode ca e ca a ser executada por qualquer agente hoje em dia e. um problema algor´ u e ıtmico.1. para e 1 Se vocˆ n˜o acredita nisso. fazer parte de um algoritmo. n˜o pode fazer a parte de um algoritmo. Cada insca e tru¸˜o da seq¨ˆncia ´ clara e poss´ de ser executada por qualquer pessoa ca ue e ıvel que saiba. Se r ´ igual a zero ent˜o o MDC ´ igual a b e a execu¸˜o das instru¸˜es e a e ca co encerra aqui. perfeitamente. portanto. temos uma instru¸˜o ca que n˜o pode ser executada porque a execu¸˜o nunca terminar´. Chame o maior n´mero de a e o menor de b u 2. Algoritmo UFMS Para exemplificar a no¸˜o de algoritmo. portanto. Neste caso. ela s´ poder´ u ue o a ser executada se soubermos se a proposi¸˜o “todo n´mero inteiro par maior ca u que 2 ´ a soma de dois n´meros primos” ´ verdadeira ou falsa. siga para a pr´xima instru¸˜o. pelo menos. A execu¸˜o da seq¨ˆncia sempre p´ra e ca ue a ca ap´s uma quantidade finita de tempo. foi proposta ca em 1742 e continua sem solu¸˜o at´ hoje. Por exemplo. Logo.1. resolve u qualquer ocorrˆncia do problema1 . apesar de a ca a sabermos exatamente como determinar os n´meros ´ u ımpares. se a instru¸˜o “Divida x por y se todo n´mero inteiro par maior que 2 ´ a ca u e soma de dois n´meros primos” estiver presente na seq¨ˆncia. Isto ´ garantido pela instru¸˜o 3. se seguida. pode come¸ar a testar! e a c 2 . Por exemplo. ca Esta seq¨ˆncia de instru¸oes ´ um algoritmo para o problema de enconue c˜ e trar o MDC de dois n´meros naturais quaisquer. ela poderia. Caso contr´rio. conhecida como conjectura de Goldbach. e u e esta proposi¸˜o. Problemas algor´ ıtmicos. a o ca 4. Divida a por b e chame o resto de r 3. dividir dois n´meros. u Como era de se esperar. Pois. O problema de encontrar o MDC de dois n´meros naturais quaisquer ´. Volte para a instru¸˜o 2. Observe que se modific´ssemos a instru¸˜o para “Escreva todos os n´meros ´ a ca u ımpares menores do que 100”. Um outro exemplo de instru¸˜o que n˜o pode fazer parte de um algoritmo ca a ´ “Escreva todos os n´meros ´ e u ımpares”. Atribua o valor de b a a e o valor de r a b 5. que o e compara o valor de r a zero e termina a execu¸˜o se r ´ igual a 0.

pode ser imaginado como a especifica¸˜o de um proa ca cesso “mecˆnico” que. o algoritmo deve possuir um meio de obter os dados da entrada. A segunda. e Algoritmo. nem todo algoritmo pode ser executado por um computador. leva-nos ` solu¸˜o de algum proa a ca blema. construir um algoritmo para um dado problema significa. 3 . As pessoas utilizam algoritmos quando seguem receitas culin´rias ou insa tru¸˜es para programar um v´ co ıdeo cassete.2 Algoritmos e Resolu¸˜o de Problemas ca Todo algoritmo est´ relacionado com a solu¸˜o de um determinado proa ca blema. um processo e uma sa´da. algoritmos tem sido parte de nossas vidas desde a e ca primeira vez que uma pessoa explicou para outra como fazer alguma coisa. ent˜o. respectivamente. cada ocorrˆncia u e ´ uma dupla distinta de n´meros naturais cujo MDC queremos encontrar. tais como gema de ovo e v´ ıdeo cassete. O processo ´ a seq¨ˆncia de instru¸˜es e ue co que comp˜e o algoritmo. dois n´meros naturais e o u a u MDC deles.1. Portanto. a fim de realizar qualquer comı e puta¸˜o. Isto ca ´ conhecido como escrita dos dados da sa´ e ıda. temos de fazer algumas suposi¸˜es sobre o modelo de computa¸˜o entradaco ca processo-sa´da. ´ que o ale e goritmo deve possuir um meio de revelar o resultado da computa¸˜o. Quando escrevemos algoritmos para serem executados por computador. Este n˜o ´ o caso. Um computador pode executar apenas aqueles algoritmos cujas instru¸˜es envolvam tarefas que ele possa co entender e executar. 1. A sa´ o ıda ´ o resultado obtido com a execu¸˜o e ca do processo para a entrada fornecida. A primeira delas ´ que. de instru¸˜es como a e co “bata as gemas” e “ligue o v´ ıdeo cassete”. ca Esta tarefa ´ conhecida como leitura da entrada. a entrada e a sa´ ıda para uma computa¸˜o do algoritmo para o problema de encontrar o MDC ca de dois n´meros naturais s˜o. Algoritmos e Resolu¸˜o de Problemas ca UFMS o problema de encontrar o MDC de dois n´meros naturais. quando executado. Por exemplo. A execu¸˜o de um ca algoritmo por um computador ´ denominada processamento de dados e e consiste de trˆs partes: uma entrada. Embora o termo algoritmo esteja relacionado intimamente com Ciˆncia da Computa¸˜o. Entretanto. Todo e qualquer computador possui dispositivos atrav´s dos quais a leitura e a escrita de dados s˜o e a realizadas. A entrada e ı ´ um conjunto de informa¸˜es que ´ requisitada para que as instru¸˜es do e co e co algoritmo possam ser executadas.2. Computadores executam algoritmos que manipulam apenas dados e n˜o a coisas f´ ısicas. por exemplo. e u Um algoritmo ´ dito correto quando ele sempre termina e produz a resposta e correta para todas as ocorrˆncias de um dado problema.

identificando os dados e os resultados desejados. A capacidade para resolver problemas pode ser vista como uma habilidade a ser adquirida. • Solu¸˜o: desenvolver um algoritmo para o problema. em geca e ral.3 Resolu¸˜o de Problemas e Abstra¸˜o ca ca Talvez.1. Esta habilidade. ca • Teste de qualidade: executar o algoritmo desenvolvido com uma entrada para a qual o resultado seja conhecido.3. ao desenvolvermos um algoritmo devemos seguir os seguintes passos: • An´lise preliminar: entender o problema com a maior precis˜o a a poss´ ıvel. est´ relacionado a que t´ticas. A experiˆncia no uso do conhecia e mento nos d´ mais agilidade na resolu¸˜o de problemas. a A organiza¸˜o do procedimento de resolu¸˜o de problemas ´ extremamente ca ca e desej´vel. consequentemente. o fator mais determinante para o sucesso em resolver um problema seja abstra¸ao. • Altera¸˜o: se o resultado do teste de qualidade n˜o for satisfat´rio. encontrar uma solu¸˜o para o problema e descrevˆ-la ca e como uma sequˆncia finita de a¸˜es. Em termos de resolu¸˜o de ca problemas. Resolu¸˜o de Problemas e Abstra¸˜o ca ca UFMS antes de mais nada. ca a o altere o algoritmo e submeta-o a um novo teste de qualidade. 1. De acordo com o Webster’s New Dictionary of Americ˜ can Language (segunda edi¸˜o). dos quais raramente tomamos conhecimento. Identificadas as deficiˆncias. • Produto final: algoritmo conclu´ e testado. e co A tarefa de encontrar a solu¸˜o de um problema qualquer ´ . abstra¸˜o “´ alguma coisa independente de ca ca e 4 . a ca Independente do problema a ser resolvido. como qualquer outra. procuramos formas de corrigi-las a e e. pronto para ser apliıdo cado. • Destreza: adquirida pela pr´tica. pode ser obtida pela combina¸˜o de duas partes: ca • Conhecimento: adquirido pelo estudo. aumentamos a nossa capacidade de resolver problemas. realizada de forma emp´ ırica e um tanto quanto desorganizada. estrat´gias e planos usar e a a e quando usar. ocorrem v´rios procedimentos mentais. pois somente assim podemos verificar onde o procedimento n˜o a a est´ eficiente.

Quantas ma¸as eles c˜ a e c˜ tinham juntos? Provavelmente. ca o Para tal. Por exemplo. pois ca um mesmo algoritmo deve ser entendido por pessoas com diferentes graus de conhecimento. tal como fazer a leitura da entrada. e ca Para entender o papel da abstra¸˜o na resolu¸˜o de problemas. Isto a quer dizer que a receita dada para mim deveria conter maiores detalhes do processo de preparo da lazanha do que aquela dada para minha av´. dos palitinhos para chegar ` solu¸˜o. ıvel ca ca Algoritmos bem projetados s˜o organizados em n´ a ıveis de abstra¸˜o. se a a a mesma receita for dada para mim. Uma crian¸a poderia imaginar as cinco ma¸˜s de Maria como cinco u c ca palitinhos e as trˆs de Jo˜o como trˆs palitinhos. provavelmente. 5 . que agrupam instru¸˜es que realizam uma determinada o co tarefa no algoritmo. os elementos do a ca problema foram substitu´ ıdos por outros (n´meros e palitinhos) e a solu¸˜o u ca foi encontrada atrav´s da manipula¸˜o dos novos elementos. e ca O processo de abstra¸˜o pode ser visto como constando de n´veis. considere ca ca a seguinte ocorrˆncia de um problema que lembra nossos tempos de crian¸a: e c Maria tinha cinco ma¸as e Jo˜o tinha trˆs. Esta “nova entidade” ´ o que chamamos de abstra¸˜o. um adulto resolveria este problema fazendo uma abstra¸˜o ca das ma¸˜s como se elas fossem os n´meros 5 e 3 e faria a soma de tais ca u n´meros. minha ca ca av´ cozinha desde garota. logo se algu´m entreg´-la uma receita culin´ria o e a a de uma lazanha ao molho branco e n˜o mencionar como o molho branco ´ a e feito.3. o processo de constru¸˜o de algoritmos conta com ferramentas. as instru¸˜es a co est˜o organizadas de tal forma que podemos entender o algoritmo sem. Resolu¸˜o de Problemas e Abstra¸˜o ca ca UFMS qualquer ocorrˆncia particular” ou “o processo de identificar certas propriee dades ou caracter´ ısticas de uma entidade material e us´-las para especificar a uma nova entidade que representa uma simplifica¸˜o da entidade da qual ca ela foi derivada”. isto n˜o ser´ um problema para ela. Aqui. cona tudo. o a receita ´ uma abstra¸˜o e o n´ de detalhe da receita ´ proporcional ao e ca ıvel e n´ de simplifica¸˜o da abstra¸˜o. Quando um algoritmo est´ assim projetado. independente das demais. mas sim fornecendo-nos uma vis˜o da funcionalidade do grupo de a instru¸˜es. Em ambos os casos. ter de entender os detalhes de todas as instru¸˜o de uma s´ vez. ca tais como m´dulos. co 2 A menos que eu compre o molho branco no supermercado. eu n˜o saberei fazer a tal lazanha2 .1. Entretanto. Isto ca ı diz respeito ao grau de simplifica¸˜o de uma abstra¸˜o. Da´ faria uma contagem e a e ı. dispensando-nos de entender o detalhe de cada instru¸˜o separaca damente.

ele tentou construir c m´quinas para ajud´-lo em seu trabalho. e e O que ´ um computador? De acordo com o Webster’s New World Dictie onary of the American Language (segunda edi¸˜o). A unica diferen¸a ´ que um programa n˜o necessariamente a ´ c e a termina. Entretanto. um dos c e u principais produtos da ciˆncia do s´culo XX. Esta ´ a unica linguagem de a e ´ 6 . antes de co inserir as a¸˜es e os dados no computador. Algoritmos e Computadores UFMS 1. ca O termo programa ´ comumente empregado para designar o algoritmo e em uma linguagem de programa¸˜o. denoca o minada linguagem de m´quina.C. a ca u Esta informa¸˜o ´ referenciada como dado. O computador ´. por meio de instru¸˜es e informa¸˜es armazenadas. e com a inven¸˜o da calculadora denominada ´baco. “Como forneceremos a entrada do algoritmo?” e “Como receberemos o resultado do algoritmo?” O ato de instruir o computador para que ele resolva um determinado problema ´ conhecido como programa¸˜o.200 a. o Cada computador possui uma linguagem de programa¸˜o pr´pria. a o co co executa r´pida e frequentemente c´lculos complexos ou compila. a qual foi mais tarde ca a aperfei¸oada pelos chineses. Entretanto. O computador moderno ´ o rea a e sultado dessas tentativas que vˆm sendo realizadas desde o ano 1. n˜o h´ distin¸˜o conceica a a ca tual entre algoritmo e programa no que diz respeito ` linguagem em que eles a est˜o escritos. correlaciona a a e seleciona dados”. Esta tarefa nada mais ´ do e ca e que inserir no computador as a¸˜es do algoritmo que corresponde ` solu¸˜o co a ca do problema e os dados referenciados pelas a¸˜es. Um exemplo de programa que nunca termina ´ o sistema operacie onal de um computador. e. devemos reescrevˆ-las em uma co e linguagem apropriada para descrever algoritmos computacionais. Como os programas a serem estudados neste curso sempre terminar˜o. em geral. deparamo-nos com alguns problemas inerentes a este processo: “Como informaremos ao computador o algoritmo que deve ser executado para obtermos o resultado desejado?”. um computador pode ser imaginado como uma m´quina que manipula informa¸˜o na forma de n´meros e caracteres. em uma linguagem de programa¸˜o. distinta das linguagens de a m´quina dos demais modelos de computador.4. Basicamente.4 Algoritmos e Computadores Desde que o homem come¸ou a processar dados. n´s utilizaremos os termos programa e algoritmo como a o sinˆnimos. Quando desejamos utilizar um computador para nos auxiliar na tarefa de processamento de dados. O que faz dos computadores ca e uma m´quina not´vel ´ a extrema rapidez e precis˜o com que eles podem a a e a armazenar. sem d´vida alguma. um computador ´ “uma ca e m´quina eletrˆnica que. recuperar e manipular dados.1. ou seja.

vocˆ dever´ adquirir capacidade para: e a 7 . As instru¸˜es e os dados inseridos no computador atrav´s de um co e perif´rico de entrada s˜o armazenados em um dispositivo do computador e a denominado mem´ria. jogos. que n˜o ´ a linguagem de m´quina do compuca a e a tador. mais conhecido no mundo dos computadores pela sua abrevia¸˜o em Inglˆs: CPU ca e de Central Processing Unit. e a o Para aprender a criar softwares. pelo menos em princ´ a a ıpio. a o decodificar as instru¸˜es e executar a tarefa descrita por elas com os respecco tivos dados. A CPU pode ser imaginada como o “c´rebro” do computador. No entanto. muitas linguagens de programa¸˜o independentes de m´quina foram criadas. O v´ ıdeo e a impressora s˜o a exemplos de perif´ricos de sa´ e ıda. Vocˆ pode e aprender´ a criar seus pr´prios softwares. sistemas operacionais e compiladores. para evitar ca que n´s tenhamos de aprender a linguagem de m´quina de cada computao a dor diferente para o qual queremos programar. a programar qualquer computador. ca a a Tudo que n´s temos a fazer para executar um programa escrito em uma o linguagem de programa¸˜o.4. Se vocˆ aprende uma ca a e linguagem independente de m´quina. Tanto o algoritmo quanto os seus dados de entrada s˜o inseridos nos a computadores por meio de equipamentos eletrˆnicos conhecidos como peo rif´ricos de entrada. e No mundo dos computadores. um programa denominado compilador deve estar presente no compuo tador. O teclado e o mouse s˜o exemplos de perif´ricos de e a e entrada. O computador executa um determinado programa atrav´s de um dise positivo interno denominado unidade central de processamento. Os dados de sa´ resultantes da execu¸˜o do algoo ıda ca ritmo pelo computador s˜o apresentados tamb´m por meio de equipamentos a e eletrˆnicos denominados perif´ricos de sa´ o e ıda. Algoritmos e Computadores UFMS programa¸˜o que o computador realmente entende. estar´ apto. Hardware se refere ` m´quina propriamente dita e a todos a a os perif´ricos conectados a ela. A CPU ´ respons´vel por buscar as instru¸˜es e e a co os dados do programa que est˜o armazenados na mem´ria do computador. Software se refere aos programas que fazem e a m´quina realizar alguma tarefa. para que elas possam ser uteis para a ´ n´s. Muitos “pacotes” de software est˜o disa a pon´ ıveis nos dias atuais. Ent˜o. Um compilador para uma determinada linguagem de programa¸˜o reca aliza a tradu¸˜o autom´tica de um programa para a linguagem de m´quina.1. sistemas gerenciadores de banco de dados. As linguagens de programa¸˜o independentes de m´quina n˜o s˜o comca a a a preendidas pelos computadores. ´ compilar o nosso programa com o compilador espec´ e ıfico daquela linguagem. Eles incluem processadores de texto. vocˆ ouvir´ as pessoas falarem sobre harde a ware e software.

1 Hardware Toda transmiss˜o de dados.4. e e que s˜o grupos de oito bits. co o e O tamanho de cada posi¸˜o de mem´ria ´ dado em bytes. o a a A primeira ´ tamb´m conhecida como mem´ria principal ou mem´ria e e o o tempor´ria e tem como objetivo armazenar as instru¸˜es e os dados de a co um programa em execu¸˜o. sequˆncias a e e de 0’s e 1’s. as instru¸˜es e os dados maa co nipulados pelo computador nada mais s˜o do que sequˆncias de bytes que a e possuem significado para o computador. Cada sequˆncia. co a o Um computador possui dois tipos de mem´ria: a prim´ria e a secund´ria. manipula¸˜o. ´ organizada em 1 ou mais bytes.4. cada 1024M representam 1 gigabyte (1G) e cada 1024G representam 1 terabyte (1T). cada 1024K representam 1 megabyte (1M). ca o pois ´ uma sequˆncia de posi¸˜es de tamanho fixo.1. por sua vez. ca ca • Usar uma linguagem de programa¸˜o. seja de m´quina ou n˜o. Tanto as insa a ca ca tru¸˜es quanto os dados s˜o localizados na mem´ria atrav´s dos endere¸os co a o e c das posi¸˜es de mem´ria que os contˆm. cada qual possuindo um e e co identificador distinto denominado endere¸o. armazenagem e recupera¸˜o a ca ca ´ realmente realizada por um computador atrav´s de pulsos el´tricos e e e e magn´ticos representando sequˆncias de d´ e e ıgitos bin´rios (bits). Esta mem´ria se assemelha a um “gaveteiro”. A CPU se comunica constantemente com a mem´ria prim´ria para obter a pr´xima instru¸˜o do programa a ser o a o ca executada ou um dado necess´rio ` execu¸˜o da instru¸˜o. ca Inicialmente. o o n´mero de posi¸˜es de mem´ria ´ igual a 327. As instru¸˜es e os dados s˜o armazenados na mem´ria do computador. u co o e 8 . Uma vez que vocˆ possui esta capacidade.680. c Cada posi¸˜o da mem´ria prim´ria armazena uma instru¸˜o ou parte ca o a ca dela ou um dado do programa. Cada 1024 ca o e bytes representam 1 quilobyte (1K). isto ´. Algoritmos e Computadores UFMS • Desenvolver algoritmos para solucionar problemas envolvendo transforma¸˜o de informa¸˜o. Nada poderia ser mais enganoso! a co a A coisa mais importante que vocˆ pode fazer como um estudante e de Computa¸˜o ´ desenvolver sua habilidade para resolver proca e blemas. vocˆ deve imaginar que aprender uma linguagem de proe grama¸˜o. vocˆ pode aprender a e e escrever programas em diversas linguagens de programa¸˜o. ´ a tarefa mais dif´ porque seus proca a a e ıcil blemas ter˜o solu¸˜es relativamente f´ceis. Neste contexto. Se o tamanho de uma posi¸˜o de mem´ria de um computador ca o mede 2 bytes e a mem´ria possui 640 Kbytes de capacidade de armazenagem. ca 1.

ele os a transmite ao fabricante da mem´ria. em um dado instante. isto ´.1. em duas partes: • a Unidade de Controle (Control Unit . possui muito mais capacidade para armazenagem de informa¸˜o. Ela possui o prop´sito principal de armazenar inse o tru¸˜es e dados de um programa em execu¸˜o. ele ´ inserido antes e na mem´ria prim´ria. Ela ´ permanente. e o • Mem´ria apenas para leitura (Read Only Memory .ROM). devido a sua complexidade. s˜o o a co a identificadas e atrav´s da qual os dados s˜o obtidos da mem´ria.CU). ca do programa. isto co ca e o ´. Algoritmos e Computadores UFMS A mem´ria prim´ria perde todo o seu conte´do no momento em que o o a u computador ´ desligado. O conte´do de uma ROM ´ gravado durante seu processo u e de fabrica¸˜o. Os principais tipos nesta classifica¸˜o s˜o: u ca a • Mem´ria de acesso aleat´rio (Random Access Memory . podemos ter acesso a qualquer posi¸˜o diretamente. em a u e o geral.RAM). o computador pode ser desligado. As mem´rias tamb´m podem ser classificadas quanto ` permiss˜o ou n˜o o e a a a para alterarmos o seu conte´do. A mem´ria e ca o principal de um computador ´ uma mem´ria do tipo RAM. Uma vez que o ca a usu´rio decidiu quais dados devem ser armazenados na ROM. Ela ´ mais lenta do que a mem´ria principal e. e e a o 9 . como o pr´prio o o nome sugere. para fins de estudo e projeto. que representam as instru¸˜es a serem executadas. Os discos r´ ıgidos. onde as sequˆncias de e c´digo bin´rio. respectivamente. O acesso a qualquer posi¸˜o ´ aleat´rio. Toda vez que um programa deve ser executado. Este o o tipo de mem´ria permite a leitura e a escrita de seus dados em qualo quer de suas posi¸˜es. o a A mem´ria secund´ria possui caracter´ o a ısticas opostas `quelas da mem´ria a o prim´ria. os discos flex´ ıveis e os CD-ROM’s s˜o exemplos de a mem´ria secund´ria. Feita a grava¸˜o da ROM. da´ inicia a execu¸˜o a ca o ı. o computador primeiro transfere o programa a e os dados necess´rios a sua execu¸˜o para a mem´ria e. Quando um programa armazenado em mem´ria seo a o cund´ria precisa ser executado. ´ normalmente e dividida. Sua principal caracter´ co ca ıstica ´ e a rapidez com que as informa¸˜es nela armazenadas s˜o lidas e escritas pela co a CPU. de acordo com a vontade do usu´rio. u a a A CPU de um computador. o seu o ca conte´do n˜o poder´ mais ser alterado. O ca principal prop´sito da mem´ria secund´ria ´ armazenar programas e dados o o a e que o computador pode executar e utilizar.4. mas ela a e e n˜o perde o seu conte´do. Este tipo o de mem´ria permite apenas a leitura de seus dados.

em bits. os dados a serem imediatamente processados. alguns dos perif´ricos de sa´ mais comuns s˜o: e ıda a 10 . se houver referˆncia e e ca e a algum dado. como por exemplo. que servem para introduzir programas ou dados no computador. Alguns desses ca e e bits identificam a instru¸˜o propriamente dita e os demais contˆm o endere¸o ca e c da posi¸˜o de mem´ria dos dados usados pela instru¸˜o. co a Toda instru¸˜o ´ codificada como uma sequˆncia de bits. • Scanner e • Leitora ´tica. a o Com o avan¸o da microeletrˆnica ´ poss´ construir toda uma CPU em c o e ıvel uma unica pastilha de sil´ ´ ıcio. ca a o Os primeiros microprocessadores foram de 8 bits.4. que servem para receber programas ou dados do computador. • Unidade de disco. pois os resultados intermedi´rios da instru¸˜o ca co a ca n˜o precisam ser armazenados na mem´ria principal. em cada instante. mais recentemente.1. Os registradores possibilitam o aumento de velocidade o na execu¸˜o das instru¸˜es. isto ´. As unidades de entrada. • Mouse. Essa pastilha. Eles s˜o e o o denominados registradores. Algoritmos e Computadores UFMS • a Unidade L´gica e Aritm´tica (Arithmetic and Logic Unit . co e a A CPU tamb´m possui seus pr´prios elementos de mem´ria. sendo conhecido pelo nome de seu fabricante seguido de um determinado n´mero. a da unidade de informa¸˜o .ou comprimento. s˜o denominadas perif´ricos de ena e trada e perif´ricos de sa´ e ıda.que s˜o capazes de processar de uma s´ vez. e as unidades de sa´ ıda. o E. depois pelos de 32 bits e. Estas opera¸˜es s˜o o co a realizadas por um conjunto de circuitos l´gicos que comp˜e a CU. seguidos pelos de 16 bits. respectivamente. o e onde as instru¸˜es s˜o efetivamente executadas.ALU). ou chip. denomina-se microprocesador. A execu¸˜o o o ca das instru¸˜es ´ realizada pela ALU. Os microprocessadou res s˜o classificados pelo tamanho da palavra . pelos de 64 bits. A CU interpreta ca o ca a sequˆncia de bits e identifica qual ´ a instru¸˜o e. os dados refee renciados pela instru¸˜o processada no momento e que foram trazidos da ca mem´ria principal. Intel 80486. Os registradores armazenam. Os perif´ricos de entrada e mais comuns s˜o: a • Teclado. realiza a busca do dado na mem´ria.

denominados a mnemˆnicos. 1.2 Linguagens de Programa¸˜o ca A primeira gera¸˜o de linguagens de programa¸˜o remonta aos dias de ca ca codifica¸˜o em linguagem de m´quina.4. Esta linguagem ´ formada por insca a e tru¸˜es descritas como sequˆncias de bytes. ela ´ baseada em um co e e alfabeto que possui apenas dois elementos.4. `s vezes. que s˜o mais significativos para n´s humanos. na maioria das vezes. para programas onde o controle de tais dispositivos ´ essencial. um programa em linguagem de m´quina poderia se parecer com a seguinte sequˆncia de a e bytes: 01000011 00111010 00111011 01000001 00101011 01000100 O tamanho de uma instru¸˜o pode ser de 1 ou mais bytes. o a o a instru¸˜o na linguagem montadora do processador 8088 que soma o valor ca 11 . ou seja. Algoritmos e Computadores UFMS • V´ ıdeo. e • Unidade de disco. Portanto. a programa¸˜o em ca linguagem de m´quina ´. Para programar em linguagem de m´quina. e cada palavra (instru¸˜o) da linguagem ´ formada por grupos de oito bits denominados ca e bytes que possuem significado para o computador. Observe que com apenas 1 byte vocˆ pode codificar 256 ca e instru¸˜es! Os dados utilizados por um programa tamb´m s˜o codificados co e a com 0’s e 1’s. dependendo do ca n´mero total de instru¸˜es da linguagem e do n´mero m´ximo de operandos u co u a por instru¸˜o.1. e a e a indispens´vel. as instru¸˜es da co linguagem de m´quina recebem nomes compostos por letras. Por exemplo. o uso de linguagem de m´quina ´ mais apropriado ou. pois as instru¸˜es de uma linguagem de m´quina co a envolvem diretamente tais dispositivos. n´s devemos conhecer a a o sequˆncia de bits que determina cada instru¸˜o e tamb´m como codificar e ca e os dados em bin´rio. Como a maioria dos problemas resolvidos por computadores n˜o envolve a o conhecimento dos dispositivos internos do computador. inadequada. Nesta linguagem. a O pr´ximo passo na evolu¸˜o das linguagens de programa¸˜o foi a cria¸˜o o ca ca ca da linguagem montadora ou assembly. pois o desenvola e vedor perde mais tempo com os detalhes da m´quina do que com o pr´prio a o problema. • Impressora. vocˆ deve conhecer os dispositivos ina e e ternos do computador. o bit 0 e o bit 1. Al´m disso. Entretanto.

4.1. Este fato tamb´m pere mitiu a execu¸˜o do mesmo programa em computadores distintos sem haver ca altera¸˜o em seu “texto”. ca Outro aspecto importante da evolu¸˜o das linguagens de programa¸˜o diz ca ca respeito ` quantidade de detalhe que o programador deve fornecer ao coma putador para que ele realize as tarefas desejadas.BH . a O sucesso da linguagem montadora animou os pesquisadores a criarem linguagens em que a programa¸˜o fosse realizada atrav´s de instru¸˜es na ca e co l´ ıngua inglesa. deixando para o pr´prio computador a tarefa de traduzir o o c´digo escrito em tais linguagens para sua linguagem de m´quina. A grande vantagem de linguagens como a FORTRAN ´ e que o programador n˜o necessita se preocupar com os detalhes internos do a computador. surgiu em 1957 ca e ´ ainda hoje utilizada. A primeira destas linguagens. que teve ampla aceita¸˜o. Softwares b´sicos s˜o programas que administram o funcionaa a mento do computador e nos auxiliam a us´-lo. tais como os registradores. Ambas constituem uma evolu¸˜o na forma de estruturar as instru¸˜es ca co de um programa e seus respectivos dados em rela¸˜o as suas antecessoras. ca Na d´cada de 70 surgiu a linguagem C e. a linguagem e e C++.3 Software O software pode ser classificado como sendo de dois tipos: b´sico ou a aplicativo. Trata-se da linguagem FORTRAN (FORmula e TRANslation). 1.4. Para que o computador pudesse executar um programa escrito em linguagem montadora foi desenvolvido um compilador denominado montador ou assembler. Algoritmos e Computadores UFMS no registrador CL com o valor no registrador BH e armazena o resultado em CL ´ dada por: e ADD CL. Esta instru¸˜o equivale a seguinte sequˆncia de dois bytes na linguagem de ca e m´quina do 8088: a 00000010 11001111 . Isto o a foi poss´ ıvel devido ` cria¸˜o de compiladores mais complexos do que os a ca montadores. pois as instru¸oes da linguagem n˜o envolvem os elementos c˜ a internos do computador. na d´cada de 80. Softwares aplicativos s˜o a a 12 . o qual realiza a tradu¸˜o autom´tica de um c´digo escrito em ca a o linguagem montadora para o seu correspondente em linguagem de m´quina.

programas de automa¸˜o cont´bil. para cada instru¸˜o do programa. programas que realizam transferˆncia de dados entre computadores. • Depuradores: programas que auxiliam o programador a encontrar erros em seus programas. o Unix e o ca Windows NT. o DOS. CPU e pee e o rif´ricos. “Inform´tica” e e ca ca a 13 . “Engenharia da Computa¸˜o”. ca interpretam o seu significado e a executam imediatamente. Os principais softwares b´sicos s˜o: a a • Sistema Operacional: conjunto de programas que gerencia o computador e serve de interface entre os programas do usu´rio e a m´quina. e entre outros. A Computa¸˜o Como Disciplina ca UFMS programas que executam com o aux´ dos softwares b´sicos e realizam ılio a tarefas tipicamente resolvidas pelos computadores.5 A Computa¸˜o Como Disciplina ca A disciplina de Computa¸˜o ´ conhecida por v´rios nomes. Um software aplicativo ´ aquele que realiza tarefas mais especializadas e e que. – multitarefa: sistema operacional que permite mais de um programa em execu¸˜o simultaneamente. entre outros. as opera¸˜es com e co os perif´ricos e as transferˆncias de dados entre mem´ria. Por exemplo. Por exemplo. ca a 1. tais como ca e a “Ciˆncia da Computa¸˜o”. apoiado nos softwares b´sicos.5. controla o funcionamento do computador. torna o computador uma ferramenta a indispens´vel `s organiza¸˜es. Por exemplo. e Um sistema operacional pode ser classificado de acordo com a sua capacidade de execu¸˜o de tarefas como: ca – monotarefa: sistema operacional que permite a execu¸˜o de ca apenas um programa de cada vez. formatadores de disco. • Compiladores: programas que traduzem um programa em uma linguagem de programa¸ao espec´ c˜ ıfica para seu equivalente em uma linguagem de m´quina espec´ a ıfica. a a isto ´.1. programas a a co de desenho e pintura. • Interpretadores: programas que. editores de texto. a e • Utilit´rios: programas de uso gen´rico que funcionam em conjunto com o sistema operacional e que tˆm como objetivo executar fun¸˜es e co comuns em um computador. Por exemplo.

Isto ´. Qualquer que seja a denomina¸˜o. a Computa¸˜o envolve tamb´m o estudo de m´todos ca e ca e e para representar e armazenar dados a serem utilizados pelos algoritmos durante suas execu¸˜es. A Computa¸˜o Como Disciplina ca UFMS assim por diante. Cada a e ca ca uma destas partes ´ abordada em uma ´rea espec´ e a ıfica da Computa¸˜o. projeto. Aqui as pessoas perguntam e respondem ca quest˜es tais como: “Uma determinada tarefa pode ser realizada por o computador?” ou “Qual ´ o n´mero m´ e u ınimo de opera¸˜es necess´rias co a para qualquer algoritmo que execute uma certa tarefa?” • An´lise de Algoritmos. Esta ´rea estuda os m´todos para desena e volver algoritmos de forma r´pida. a a As aplica¸˜es envolvendo algoritmos s˜o respons´veis pelo surgimento de co a a outras ´reas da Computa¸˜o.1. n´s estudaremos m´todos para construir algoritmos e tamb´m o e e algumas estruturas de dados simples para representar. Computa¸˜o pode ca ca ser entendida como “ o estudo de processos sistem´ticos que descrevem e a transformam informa¸˜o: suas teorias. a ca saber: • Arquitetura. eficiente e confi´vel. Ent˜o. implementa¸˜o e aplica¸˜o deles. • Linguagens de Programa¸˜o. eficiˆncia. a De acordo com o que vimos neste texto. A quest˜o fundamental da Computa¸˜o ´ “O que ca ca a ca e pode ou n˜o ser automatizado?”. podemos dizer que a Computa¸˜o ´ o co ca e estudo de algoritmos e suas estruturas de dados. a ca e teoria. Neste curso. an´lise.5. os “processos sistem´ticos que a transformam a informa¸˜o” s˜o exatamente os algoritmos. no computador. impleca a e menta¸˜o e a aplica¸˜o”. e Observe que a defini¸˜o de Computa¸˜o dada acima tamb´m menciona ca ca e que a Computa¸˜o compreende os “os processos sistem´ticos que descrevem ca a a informa¸˜o”. os dados utilizados pelos algoritmos que construiremos. Esta ´rea estuda as v´rias formas de fabrica¸˜o e orgaa a ca niza¸˜o de m´quinas nas quais os algoritmos possam ser efetivamente ca a executados. vocˆs e 14 . eficiˆncia. Esta ´rea estuda os m´todos para ca a e projeto e tradu¸˜o de linguagens de programa¸˜o. entre outras. • Projeto de algoritmos. podemos ca a a dizer que a Computa¸˜o ´ o estudo de algoritmos. projeto. an´lise. tais como Sistemas Operacionais. Esta ´rea compreende o estudo da mea a dida do tempo e do espa¸o que os algoritmos necessitam para realizar c determinadas tarefas. Sendo assim. Inteligˆncia Artificial. mais especificamente. ca ca • Teoria da Computa¸˜o. Bancos de a ca Dados. No ano seguinte.

AddisonWesley Longman..L.D.W. D.P. G. W. 3. Nance. West Publishing Company... Bibliografia Este texto foi elaborado a partir dos livros abaixo relacionados: 1.J. A. G. 15 . McGraw-Hill. 1998. Problem Solving. Lambert. and Computers. Bernat. Fundamentals of Computing I .W. A.Logic.. Introduction to Computing and Algorithms. West Publishing Company. C++ Edition. 2. A Computa¸˜o Como Disciplina ca UFMS estudar˜o algoritmos e estruturas de dados conhecidos e bem mais complea xos do que aqueles que desenvolveremos neste ano.L.. Inc. T. Bradley.J. Scragg..5.A. 1995. K. Programs. Tucker. Introduction to Computer Science with C++. R. Cupper. R. Introduction to Data Structures and Algorithm Analysis with C++. Pothering. T. Shackelford. Naps.1.. 4. Naps. 1995. 1996.L.

o • Uma folha de sa´ ıda. HV-2 e HIPO 2 Neste T´pico. e • Um operador do sistema.Os Computadores HV-1. O estudo do funcionamento destes trˆs computadores nos auxiliar´ e a na compreens˜o do funcionamento dos computadores reais e tamb´m no a e aprendizado de conceitos fundamentais da programa¸˜o de computadores. HV-2 o e e e HIPO. Cada um dos trˆs computadores poder´ funcionar sem a interferˆncia e a e do usu´rio at´ que a solu¸˜o total do problema seja fornecida a ele. a Uma pessoa que denominaremos usu´rio utilizar´ os computadores mena a cionados anteriormente para resolver seus problemas de processamento de dados. • Um pequeno quadro-negro denominado EPI. • Uma calculadora com mostrador e teclado. com l´pis. 16 . ca tais como os conceitos de vari´vel e programa armazenado. a e ca 2. uma pessoa chamada CHICO.1 O Computador HV-1 O computador HV-1 ´ formado pelos seguintes componentes: e • Um gaveteiro com 100 gavetas. • Um porta-cart˜es. estudaremos trˆs computadores hipot´ticos: HV-1. a apagador de quadro-negro e giz.

) e outras informa¸˜es que veremos mais co tarde. a escrita de uma informa¸˜o no quadro-negro de uma gaveta ´ sempre ca e precedida do apagamento do mesmo. e O n´mero de cada gaveta ´ denominado seu endere¸o. H´ dois tipos de opera¸˜es efetuadas a co com essa calculadora: 1. onde ´ escrito um n´mero sempre com 3 algarise u mos (por exemplo. a leitura do quadro-negro de uma gaveta n˜o altera o que nele est´ a gravado. pressiona-se a tecla u ‘=’ (garantindo-se assim o encerramento de alguma opera¸ao pr´via) e c˜ e a seguir “digitam-se” os algarismos do n´mero a ser carregado. ca Assim como o gaveteiro. u teclas das quatro opera¸˜es aritm´ticas b´sicas. 2.2. Para isso. Cada gaveta cont´m u e c e um pequeno quadro-negro. 003. Esta ´ sempre feita entre o n´mero que est´ no ca e e u a acumulador e um segundo n´mero. N˜o h´ tecla de ponto (ou v´ a a ırgula) decimal ou outra tecla adicional qualquer. tecla ‘=’ e um mostrador. onde ser´ escrito um n´mero entre 00 e 99. a a 2. O resultado da opera¸˜o aparece no acumulador.1. O gaveteiro ´ constru´ de tal maneira que valem as seguintes regras e ıdo de utiliza¸˜o: ca 1. Para isso.1. no m´ximo uma gaveta pode estar aberta. etc. 3.1 Gaveteiro O gaveteiro consiste numa sequˆncia de gavetas numeradas de 00 a 99. com a forma 22. O Computador HV-1 UFMS 2.1. e 4. 2. opera¸˜o aritm´tica. digita-se o segundo n´mero e pressiona-se a tecla ca u ‘=’. pressiona-se a tecla da u opera¸˜o desejada. o 2. somente o operador CHICO tem acesso ao gaveteiro. carga de um n´mero no acumulador. correspondendo a um endere¸o a u c 17 . o qual u aparece no acumulador. com teclado para entrada de n´meros. em qualquer momento. co e a que denominaremos acumulador. a calculadora s´ pode ser utilizada pelo CHICO.3 EPI Trata-se de quadro-negro independente do gaveteiro.1.2 Calculadora Trata-se de uma calculadora usual. 102.

etc. executando alguma a¸˜o fora da especifica¸˜o o ca ca dessas ordens. um de cada vez. Estado de carga. Somente o CHICO pode escrever nessa folha. Ele executa estritamente ordens recebidas. a retirada de cart˜es s´ pode ser feita pelo CHICO. um a um. e ´ a e ´ o unico que pode retirar cart˜es do porta-cart˜es e escrever na folha e ´ o o de sa´ ıda. apareo a cendo na mesma ordem em que foram colocados no dispositivo. ao EPI.1. 2.2. O n´mero nele escrito indica sempre o “Endere¸o u c da Pr´xima Instru¸˜o”. utilizando-se sempre linhas consecutivas. e o o 4.1. 3. para gavetas do gaveteiro. 003. 2. o ca Somente o CHICO tem acesso ao EPI. cart˜es com informa¸˜es s˜o colocados exclusivamente pela parte suo co a perior. vemos que o operador CHICO ´ a unica pessoa que tem acesso ao gaveteiro. 101. o o 18 . a coloca¸˜o de cart˜es s´ pode ser feita pelo usu´rio. O CHICO trabalha sempre em um de dois estados diferentes: 1. donde sua abreviatura. lidos do porta-cart˜es. cart˜es s˜o retirados da extremidade inferior.4 Porta-Cart˜es o ´ E um dispositivo similar aos porta-cigarros onde s˜o empilhados ma¸os a c de cigarro a serem vendidos. a a 2. quando um cart˜o cont´m um n´mero. ca o o a 2. como por exemplo.5 Folha de Sa´ ıda Trata-se de uma folha de papel onde pode ser escrito um n´mero em u cada linha. ` calculadora. onde ele exclusivamente transcreve informa¸˜es de co cart˜es. n˜o podendo tomar a nenhuma iniciativa pr´pria. O porta-cart˜es funciona de acordo com as o seguintes regras: 1.1.6 Operador Resumindo as diversas caracter´ ısticas descritas. somente o usu´rio pode ler o que j´ foi escrito. O Computador HV-1 UFMS de gaveta do gaveteiro. este ´ sempre a e u e escrito com 3 algarismos.1.

2.1. O Computador HV-1

UFMS

2. Estado de execu¸˜o, onde ele executa ordens gravadas nas gavetas. ca Os detalhes do funcionamento desses estados ser˜o explicados adiante. a A comunica¸˜o entre o usu´rio e o operador ´ feita exclusivamente atrav´s ca a e e das unidades porta-cart˜es e folha de sa´ o ıda. O CHICO sabe fazer “de cabe¸a” uma unica opera¸˜o aritm´tica: incrementar de 1 o conte´do do c ´ ca e u EPI.

2.1.7

Programando o HV-1

Para resolver um problema usando o computador HV-1, o usu´rio deve a planejar uma sequˆncia de ordens (o programa) a serem executadas pelo e CHICO. Cada uma dessas ordens ´ denominada instru¸˜o. Um exemplo e ca de instru¸˜o ´ o seguinte: “some o conte´do da gaveta de endere¸o 41 ao ca e u c conte´do do acumulador”. A fim de se produzir a execu¸˜o correta das insu ca tru¸˜es e na sequˆncia adequada, elas s˜o escritas nas gavetas do gaveteiro. co e a Para executar uma instru¸˜o da sequˆncia, o CHICO segue os seguintes ca e passos: 1. consulta o EPI, onde est´ escrito o endere¸o E da pr´xima instru¸˜o; a c o ca 2. incrementa de 1 o conte´do do EPI, apagando o valor anterior e esu crevendo o novo valor (o qual neste caso ser´ E+1); a 3. abre a gaveta de endere¸o E; nesta gaveta ele deve encontrar uma c instru¸˜o I, que ´ lida; ca e 4. fecha a gaveta E; e 5. executa I. Ap´s finalizados esses passos, o CHICO recome¸a do passo 1, com exce¸˜o o c ca de um caso explicado a seguir. Se a execu¸˜o da instru¸˜o I n˜o acarretar ca ca a altera¸˜o no conte´do do EPI, a pr´xima instru¸˜o a ser executada ser´ a ca u o ca a da gaveta de endere¸o E+1, devido ao passo 2. Se uma instru¸˜o acarretar c ca altera¸˜o no EPI, mudando o seu conte´do para X, a pr´xima instru¸˜o a ca u o ca ser executada ser´ a da gaveta de endere¸o X; diz-se que houve um desvio a c para X. As instru¸˜es escritas nas gavetas do gaveteiro constituem um proco grama armazenado. Para conseguir a execu¸˜o de um programa, o usu´rio ca a deve produzir inicialmente o armazenamento desse programa no gaveteiro, passando portanto a constituir um programa armazenado. Isso ´ feito da e seguinte forma: 19

2.1. O Computador HV-1

UFMS

1. o usu´rio escreve cada instru¸˜o em um cart˜o, precedida de um ena ca a dere¸o; assim, cada cart˜o do programa cont´m um par ordenado (E,I), c a e onde E ´ um endere¸o e I uma instru¸˜o; e c ca 2. o CHICO ´ colocado em estado de carga de programa; e 3. o usu´rio coloca o conjunto de cart˜es do programa no porta-cart˜es, a o o em qualquer ordem; 4. como o CHICO est´ em estado de carga, ele lˆ um cart˜o com um a e a par (E,I); abre a gaveta de endere¸o E; escreve em seu quadro-negro a c instru¸˜o I; fecha essa gaveta; ca 5. o CHICO repete o passo 4 at´ ler o ultimo cart˜o de programa, ap´s e ´ a o o que ele ´ colocado em estado de execu¸˜o de programa. e ca Ap´s o encerramento da carga do programa, o CHICO ´ colocado em o e estado de execu¸˜o de programa. Isso ´ feito por meio de um cart˜o especial, ca e a a que deve encerrar o conjunto de cart˜es de programa. A forma desse cart˜o o ´ “EXECUTE X”, onde X ´ um n´mero escrito pelo usu´rio; ser´ o endere¸o e e u a a c da gaveta onde se encontra a primeira instru¸˜o a ser executada. ca Ao ler esse cart˜o, o CHICO apaga o EPI e escreve o mesmo valor X; a a seguir, ele vai para o passo 1 da execu¸˜o de uma instru¸˜o, como exposto ca ca no in´ deste item. ıcio Para completar este quadro, resta descrever como o CHICO entra em estado de carga de programa. Vamos supor que, na verdade, esse estado seja o estado “normal” do CHICO; ele s´ pode sair desse estado ao tentar o carregar um cart˜o “EXECUTE X”. Estando em estado de execu¸˜o, ele s´ a ca o sai desse estado nos dois casos seguintes: 1. atrav´s da execu¸˜o da instru¸˜o “pare a execu¸˜o”; e ca ca ca 2. se ocorrer algum erro durante a execu¸˜o. ca Um exemplo do caso 2 ´ o de o CHICO tentar executar uma instru¸˜o e ca inv´lida, isto ´, n˜o conhecida. a e a

2.1.8

Instru¸˜es do HV-1 co

O conte´do de uma gaveta de endere¸o E, isto ´, o n´mero gravado em u c e u seu quadro-negro, ser´ representado por cE. Assim, c10 indicar´ o conte´do a a u da gaveta 10. Indicaremos por cAC o conte´do do acumulador; este ser´ u a abreviado por AC. 20

2.1. O Computador HV-1

UFMS

2.1.8.1

Soma

• Instru¸˜o: “some o cE ao AC”. ca • Significado: some o cE ao cAC e coloque o resultado no AC; o cE n˜o a se altera. • Execu¸˜o: o CHICO efetua os seguintes passos: ca 1. 2. 3. 4. 5. digita a tecla ‘+’ da calculadora; abre a gaveta de endere¸o E; c lˆ o n´mero escrito nessa gaveta (cE) e digita-o na calculadora; e u fecha a gaveta E; e digita ‘=’ na calculadora.

Daqui em diante, em lugar de escrevermos “gaveta de endere¸o E”, escrec veremos simplesmente E. Tamb´m deixaremos de mencionar explicitamente e que ´ o CHICO quem efetua os passos da execu¸˜o. e ca 2.1.8.2 Carga no AC

• Instru¸˜o: “carregue o cE no AC”. ca • Significado: copie o cE no AC; o cE n˜o muda. a • Execu¸˜o: ca 1. 2. 3. 4. 2.1.8.3 digita ‘=’; abre E; lˆ cE e digita-o; e e fecha E. Armazenamento do AC

• Instru¸˜o: “armazene o cAC em E”. ca • Significado: copie o cAC em E; o cAC n˜o muda (oposto da instru¸˜o a ca anterior). • Execu¸˜o: ca 1. 2. 3. 4. abre E; apaga o cE; lˆ o cAC e o escreve em E; e e fecha a gaveta. 21

fecha a gaveta.8.6 Desvio Condicional • Instru¸˜o: “se cAC= 0. ca • Significado: se h´ um n´mero diferente de 0 no AC. a o CHICO aguarda at´ ser fornecida nova folha.8.1. No caso contr´rio.8. • Execu¸˜o: ca 1. 4. a o lˆ o conte´do do cart˜o e escreve o seu valor em E. 2.1. e ca • Execu¸˜o: ca 1. Note que supusemos haver espa¸o na folha de sa´ c ıda.2. abre E. 5. ca a o 2. e 3. retira um cart˜o do porta-cart˜es.4 Impress˜o a • Instru¸˜o: “imprima o cE”. e a fecha E. 2. a pr´xima insa u o tru¸˜o a ser executada est´ em E. lˆ o cAC. a pr´xima instru¸˜o a ser executada estar´ na gaveta seguinte e o ca a a ` que cont´m esta instru¸˜o). desvie para E”. ca • Significado: o cE ´ transcrito na folha de sa´ e ıda. lˆ cE e escreve seu valor na pr´xima linha da folha de sa´ e o ıda. e 2. se cAC=0 ent˜o apaga o EPI e escreve E no mesmo.1. caso contr´rio n˜o h´ nada a fazer ca a a a a (isto ´. e u a joga fora o cart˜o.5 Leitura • Instru¸˜o: “leia um cart˜o e guarde em E”. a 22 .1. e e 2. • Execu¸˜o: ca 1. ca a • Significado: o conte´do do pr´ximo cart˜o do porta-cart˜es ´ lido e u o a o e transcrito para E. a o a o CHICO aguarda a coloca¸˜o de pelo menos um cart˜o no porta-cart˜es. Em caso contr´rio. O Computador HV-1 UFMS 2. abre E. Note que supusemos haver cart˜o no porta-cart˜es. 3.

e ıda a 2.1. ca • Significado: encerra a execu¸˜o do programa.8. entra no estado de carga. ´ formada uma pilha de cart˜es com a seguinte ordem: programa e o EXECUTE 01 . cada n´mero da sequˆncia ´ escrito em um cart˜o.9 Exemplo de Programa Considere o seguinte problema: ´ e u “ E dada uma sequˆncia de n´meros inteiros positivos. dois cart˜es adicionais contendo o n´mero 0 s˜o colocados um imedio u a atamente antes do primeiro cart˜o da sequˆncia. ´ a 3.7 Pare • Instru¸˜o: “pare”. Essa pilha ´ colocada o e 23 . e o outro logo ap´s o a e o ultimo cart˜o. 2. ca • Execu¸˜o: ca 1.cart˜es conforme 1 e 2 acima. O Computador HV-1 UFMS 2. determinar sua soma”. Suponhamos que o usu´rio do computador HV-1 planeje resolver o proa blema da seguinte maneira: 1. o programa ´ escrito em cart˜es j´ no formato de carga de programa e o a como mostrado na tabela abaixo: endere¸o c 01 02 03 04 05 06 07 08 09 10 instru¸˜o ca leia um cart˜o e guarde em 11 a leia um cart˜o e guarde em 12 a imprima o c12 carregue no AC o c11 some o c12 ao AC armazene o cAC em 11 carregue o c12 no AC se cAC= 0. desvie para 02 imprima o c11 pare 4.2. u e e a 2. entrega a folha de sa´ para o usu´rio.1.1.

O Computador HV-1 UFMS no porta-cart˜es. 5 e 31. o Seja a sequˆncia 100. 031 e 000. os seguintes valores. e come¸a a executar as instru¸˜es do programa conforme u c co os passos 1 a 5 descritos no in´ daquela Sub-Se¸˜o.7. seguidos da soma procurada. pela ordem: 000.1. os cart˜es denomio o nados cart˜es de programa e cart˜es de dados. vejamos um exemplo concreto. ıcio ca Se n´s fizermos um acompanhamento do papel do CHICO na execu¸˜o o ca do programa. u e Para compreendermos como funciona o processo descrito pelo programa e pelos cart˜es de dados. o cart˜o EXECUTE. ´ recebida a folha de sa´ ca e ıda. Como vimos na Sub-Se¸˜o 2. portanto. terminada a execu¸˜o. escreve ca nele o n´mero 01. ele apaga o EPI. precedendo e seguindo. obteremos a tabela de execu¸˜o a seguir: ca 24 . o o respectivamente. 005.2. e a 5.1. conforme 1 e o a e 2. Os cart˜es de dados conter˜o. 100. Suponhamos que o CHICO tenha carregado o programa e tenha encontrado o cart˜o a EXECUTE 01. Teremos nesta unidade. onde estar˜o ima pressos os n´meros da sequˆncia.

2.000 100.000 100.000.031.005.031.005 100.005.005.005 100.005 100.000 031.031.136 100.005.031.005.000 005.031 100.031.100.031.005 100.2. e ıda e u 2.031.005.005.000 005.000 005.005 100.005. diferindo co a assim dos n´meros armazenados em outras gavetas.005.031.031.005.000 031.031 100.000 031.031.031 100.000 031.000 031.000 005.000 100.031.2 O Computador HV-2 As instru¸˜es do computador HV-1 est˜o escritas por extenso.000 005.031 100.000 100.000 100.005.000 100.000 031.031.031.000 100.005. O Computador HV-2 g 01 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 09 10 pc 000.005.005 100.031 100.031.000 005.005 100. como as de endere¸o 11 u c 25 . “pc” ´ o porta-cart˜es.005.000 000 000 000 000 000 000 000 cAC c11 000 000 000 000 000 100 100 100 100 100 100 100 105 105 105 105 105 105 105 136 136 136 136 136 136 136 136 136 136 136 136 12 fs UFMS cEPI 01 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 02 03 04 05 06 07 08 09 10 000 100 100 100 100 100 100 100 105 105 005 005 005 005 105 136 136 031 031 031 031 136 136 136 000 000 000 000 100 100 100 100 100 100 100 005 005 005 005 005 005 005 031 031 031 031 031 031 031 000 000 000 000 000 000 000 000 000 100 100 100 100 100 100 100 100.005.000 031.031.031. “fs” e u ca e o ´ a folha de sa´ e “cEPI” ´ o conte´do do EPI.005.000.000 005.031 100.005.031.031 100.136 onde “g” ´ o n´mero da gaveta com a instru¸˜o.

onde C ´ um d´ a e ıgito de 1 a 7 e corresponde ao c´digo o da instru¸˜o.2.9 codificado para o computador ca HV-2: 26 . denominado c´digo de enca ca o dere¸o.1. o u 152.1. com relativa facilidade.2. 015. As instru¸˜es vistas na Se¸˜o 2. para podermos grav´-las no gaveteiro. a No computador HV-2. onde o CHICO s´ pode escrever n´meros de 3 algarismos. u a Elas ter˜o a forma CEE. O Computador HV-2 UFMS e 12 no programa exemplo da Sub-Se¸˜o 2.1. as instru¸˜es dever˜o ser necessariamente codifico a cadas como n´meros de 3 algarismos. isso pere u mitir´ inclusive a substitui¸˜o.8 ser˜o codificadas conforme a c co ca a tabela dada a seguir: instru¸˜o codificada ca 1EE 2EE 3EE 4EE 5EE 6EE 7EE instru¸˜o ca carregue o cEE no AC armazene o cAC em EE leia um cart˜o e guarde em EE a imprima o cEE some o cEE ao AC se cAC= 0 desvie para EE pare Lembremos que cEE significa conte´do (agora sempre com 3 d´ u ıgitos) da gaveta de endere¸o EE. Consiguiremos uma grande ca simplifica¸˜o de nota¸˜o e de funcionamento se codificarmos as instru¸˜es. a instru¸˜o 512 encontrada pelo CHICO em alguma gaveta ca ´ interpretada por ele como “some o conte´do da gaveta 12 ao conte´do do e u u acumulador e guarde o resultado no acumulador”. O novo computador assim obtido receber´ a sigla HV-2. c ca Por exemplo. suponhamos o a que cada gaveta do gaveteiro contenha um quadro-negro da seguinte forma: 222.9. etc. como 001. EE ´ um n´mero de 00 a 99 e corresponde ao endere¸o da ca e u c gaveta empregada na execu¸˜o da instru¸˜o. Para simplificar a compreens˜o. Na instru¸˜o “pare” usamos sempre EE=0. Na tabela dada a seguir apresentamos o programa da Sub-Se¸˜o 2. do operador CHICO a ca por dispositivos eletrˆnicos. Como veremos mais tarde. ca ca co transformando-as tamb´m em n´mero.

Como pode o CHICO distinguir esses dois significados? Na verdade. o qual codificou numerie a a o camente teoremas sobre n´meros. que em e ıda a meados da d´cada de 1940 propˆs esse esquema. no modelo HV-2. de instru¸˜es que manipulam n´meros ca u co u ´. chegando ao seu famoso “teorema da incompletude” dos sistemas axiom´ticos. Por exemplo. a 11) ` procura da pr´xima instru¸˜o a ser executada. Uma id´ia an´loga foi aplicada na e e e e a d´cada de 1930 pelo matem´tico alem˜o G¨del. que a ca e gaveta 11 recebe o conte´do 105. Esse conceito foi um dos e o motivos que possibilitou a r´pida evolu¸˜o dos computadores da´ para frente. a distin¸˜o ´ feita atrav´s da situa¸˜o em que o CHICO se encontra ao se ca e e ca utilizar de uma gaveta (no caso. a 27 . distinguir-se o conte´do de uma gaveta como correspondendo a uma insu tru¸˜o codificada ou a um n´mero manipulado por certas instru¸˜es. Por outro lado.2. a 11).1. em essˆncia.2. o seu conte´do ser´ usado como um valor ca ca u a num´rico (no caso. permitindo assim se enunciar teoremas u sobre teoremas. correpondendo ao n´mero “cento e cinco” u u (resultado da soma at´ esse momento) e n˜o ` instru¸˜o “carregue no AC o e a a ca c05”. se ele estiver abrindo uma gaveta (no caso. o que ca u co n˜o era o caso do modelo HV-1. a id´ia fundamental. vemos. O Computador HV-2 endere¸o c 01 02 03 04 05 06 07 08 09 10 instru¸˜o codificada ca 311 312 412 111 512 211 112 602 411 700 UFMS Observe um fato muito importante: ´ imposs´ e ıvel. o a o ca seu conte´do ser´ interpretado como sendo uma instru¸˜o codificada (no u a ca caso.9. Assim. a ca ı A codifica¸˜o. seguindo a execu¸˜o do proa ca grama exemplo da Sub-Se¸˜o 2. o n´mero 105). por meio de n´meros. se essa gaveta for aberta durante ca a execu¸˜o de uma instru¸˜o. a instru¸˜o 105). na d´cima quarta linha. e u A id´ia de se armazenar as instru¸˜es da mesma maneira que os dados e co ´ atribu´ ao famoso matem´tico americano John Von Neumann.

3. sem sinal. representado u por complemento de 2 (dois). O CHICO interpretava as instru¸˜es escritas nas gavetas do HV-2.1. a unidade de controle do HIPO estar´ ca a um um desses dois estados em qualquer instante. No HIPO. que correse e pondem `s gavetas no gaveteiro. os valores num´ricos que podiam ser representados nas gavetas eram e muito restritos. permitindo apenas 3 algarismos. Este dispositivo cont´m partes. denominadas c´lulas. o mecanismo das gavetas e de outros componentes tamb´m era muito lento. Analogamente. o CHICO. esse papel ´ desempee nhado por um sistema de circuitos eletrˆnicos. Assim. Esse sistema ´ denominado de e Unidade de Controle ou simplesmente UC. O Computador HIPO UFMS 2. 3. As instru¸˜es interpretadas por co co essa UC do HIPO e armazenadas na mem´ria tˆm o formato mostrado a o e seguir: 28 . em um dado instante. 2.2. e c Em cada c´lula podem ser representadas instru¸˜es codificadas como e co especificado mais adiante ou um n´mero inteiro de -128 a 127. o HIPO disp˜e de um dispositivo eletrˆnico. de endere¸os 00 a 31. com regras de funcionamento an´logas `s do gaveteiro o a a do HV-2. da mesma maneira.2 CPU No caso do computador HV-2. propˆs-se a fabricar um outro come o putador. um operador. que denominou de HIPO (cuja sigla prov´m de “computador e hipot´tico”). seja gaveteiro ou calculadora. cujo funcionamento equivale o a co `s a¸˜es executadas pelo CHICO no HV-2. acionava todos os dispositivos. Na Se¸˜o 2. deo o nominado mem´ria. O modelo mais simples do HIPO ´ produzido com mem´ria de 32 e o c´lulas. Podemos descrever a sua organiza¸˜o comparando-a com e ca a do HV-2. 2. que eles tinham as seguintes desvantagens: 1.6 foi dito que o CHICO pode estar em um dos dois estados: ca “carga” e “execu¸˜o”.3 O Computador HIPO O fabricante dos computadores HV-2 percebeu. o operador CHICO era muito lento. Cada c´lula tem comprimento de 8 bits a e (1 byte).3.3.1 Mem´ria o Em lugar do gaveteiro. 2.

3 EPI O endere¸o da pr´xima instru¸˜o ´ um registrador eletrˆnico.2 e. cada linha de entrada cont´m duas partes. s´ ´ utilizada a parte I/D (iniciais de Instru¸˜o/ a ca o e ca Dado). Se a unidade de controle e e est´ em estado de execu¸˜o. n˜o possui exibi¸˜o visual. Uma instru¸˜o de leitura executada pela unidade de controle ca provoca a transcri¸˜o do n´mero dado pelo usu´rio na linha de entrada ca u a para uma c´lula da mem´ria. o computador HIPO realiza as opera¸˜es aritm´ticas co e por meio de um conjunto de circuitos denominado Unidade L´gica e o Aritm´tica ou simplesmente ULA. onde a o d´ ıgito mais significativo representa o sinal do n´mero (0-n˜o negativo e u a 1-negativo).3. O usu´rio especifica na mesma um n´mero de 8 d´ a u ıgitos bin´rios. iniciando uma sequˆncia de opera¸˜es que resulta na obe co ten¸˜o do resultado da opera¸˜o no acumulador. o HIPO cont´m uma unidade de entrada o e com capacidade para ler eletronicamente linhas de entrada com o formato apresentado a seguir: I/D :22222222 e E :22222. o endere¸o da c´lula de mem´ria ca c e o onde a instru¸˜o deve ser carregada. O endere¸o dessa c´lula ´ especificado pela e o c e e instru¸˜o de leitura. ca No estado de carga. a c e o No lugar da calculadora.3. com formato de um n´mero com 5 algarismos bin´rios. O Computador HIPO UFMS C C C E E E E E onde os d´ ıgitos bin´rios “CCC” representam o c´digo da instru¸˜o e os a o ca d´ ıgitos bin´rios “EEEEE” representam o endere¸o de uma c´lula de mem´ria. ıvel e a 2. podendo consult´-lo ou alterar seu a conte´do. u 2. impulsos eletrˆnicos s˜o encaminhados ` se¸˜o apropriada do o a a ca circuito da ALU. Somente u a a CPU do HIPO tem acesso ao EPI. Para executar uma opera¸˜o de soma. o usu´rio especifica em I/D uma instru¸˜o conforme a ca o formato dado na Se¸˜o 2. O mesmo esquema do HV-1 ´ usado ca e para se mudar a unidade de controle do estado de carga para o estado de execu¸˜o e vice-versa. em E.4 Unidade de Entrada Em lugar do porta-cart˜es.2. ca 29 . sem exibi¸˜o c o ca e o ca visual.3. isto ´. O acumulador ´ um regisca ca e ca trador acess´ eletronicamente.3. Isto ´. e ca por exemplo.

nenhum dispositivo de sa´ particular foi indicado.3.3. o HIPO cont´m uma unidade de ıda e sa´ com capacidade de gravar linhas de sa´ ıda ıda. etc.9 escrito na linguagem ca de m´quina do computador HIPO. 2. cart˜es marcados o a l´pis ou com tinta magn´tica. O Computador HIPO UFMS V´rios dispositivos podem ser usados como unidade de entrada: cart˜es a o perfurados (onde furos codificam os elementos das linhas). u a Novamente. a e a Todos eles transformam a representa¸˜o externa acess´ ca ıvel ao usu´rio em a impulsos eletrˆnicos que s˜o enviados pela unidade de controle ` mem´ria. o a a o posicionando os circuitos desta a fim de que as c´lulas envolvidas tenham e um conte´do equivalente ` representa¸˜o externa. a 30 .2.3. Cada uma destas consiste em um n´mero com 8 d´ u ıgitos bin´rios. u a ca 2.7 Exemplo de Programa A tabela a seguir ilustra o programa da Se¸˜o 2. um termia nal de v´ ıdeo.3. u instru¸˜o codificada ca 001EEEEE 010EEEEE 011EEEEE 100EEEEE 101EEEEE 110EEEEE 111EEEEE 000EEEEE significado carrega o cEEEEE no AC armazena o cAC em EEEEE lˆ uma linha de entrada e p˜e seu conte´do em EEEEE e o u grava o cEEEEE em uma linha de sa´ ıda soma o cEEEEE ao cAC e guarda o resultado em AC desvia para EEEEE se cAC= 0 pare inicia o estado de execu¸˜o com a instru¸˜o em EEEEE ca ca 2. uma impressora de linha.6 Instru¸˜es do HIPO co Vejamos algumas das instru¸˜es do computador HIPO. etc.5 Unidade de Sa´ ıda Em lugar da folha de sa´ do HV-2. Supomos que co as instru¸˜es tenham c´digo de endere¸o “EEEEE”. onde o d´ a ıgito mais significativo indica o sinal do n´mero (0-n˜o negativo e 1-negativo). podendo ıda o mesmo ser uma m´quina de escrever. Lembramos que cAC co o c abrevia “conte´do do acumulador”.1. teclado como de m´quina de escrever.

com fins did´tico.2. do Cap´ a ıtulo 2. 31 . publicado pela editora Makron Books do Brasil em 1992.4. Bibliografia endere¸o c 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 instru¸˜o ca 01101010 01101011 10001011 00101010 10101011 01001010 00101011 11000001 10001010 11100000 UFMS 2. do livro “Introdu¸˜o a ca a ` Computa¸˜o e ` Constru¸ao de Algoritmos” de autoria dos professores ca a c˜ Routo Terada e Waldemar W. Setzer.4 Bibliografia O texto apresentado neste Cap´ ıtulo foi retirado e adaptado. “O Computador ` Gaveta”.

o e os valores dos dados por ele manipulados devem ser armazenados em algum “dep´sito”. bem como da rela¸˜o entre suas ca o ca partes.Parte I 3 Neste t´pico. instru¸oes a c˜ de manipula¸ao de dados. Cada um destes tipos de componentes est˜o descritos brevemente o a a seguir: • Estrutura de dados. de modo que tais valores estejam dispon´ o ıveis para serem usados pelo algoritmo a qualquer momento. tipicamente. a. express˜es condicionais. constantes. vari´veis e constantes. isto ´. b e r s˜o a “dep´sitos” para valores de dados cujos conte´dos mudam durante a o u execu¸˜o do algoritmo. vocˆ encontrar´ uma breve descri¸˜o dos componentes de o e a ca um algoritmo e aprender´ a construir algoritmos utilizando os componentes a mais simples e uma linguagem de programa¸˜o virtual. desejamos que um “dep´sito” de dados o seja vari´vel. Dados s˜o reprea a senta¸˜es de informa¸˜es usadas por um algoritmo. no algoritmo para calcuca lar o MDC de dois n´meros naturais (ver Cap´ u ıtulo 1). vari´veis. com sete tipos de componentes: estruturas de dados. que o seu conte´do possa ser alterado durante a e u a execu¸˜o do algoritmo. ca 3. Por exemplo.1 Componentes de um Algoritmo Quando desenvolvemos algoritmos. queremos que o conte´do de um ca u 32 . ´ conhecida como estrutura de dados. e Na maior parte das vezes.Desenvolvimento de Algoritmos . estruturas de controle e c˜ o m´dulos. A defini¸˜o da orca ganiza¸˜o interna de tais “dep´sitos”. Outras vezes. Isto inclui dados co co de entrada e sa´ ıda. bem como dados gerados pelo algoritmo para seu pr´prio uso. trabalhamos. Quando um algoritmo ´ executado por um computador.

ca • Instru¸oes para Manipula¸˜o de Dados. a • Express˜es condicionais. co No algoritmo para calcular o MDC de dois n´meros naturais foi utiu lizada uma estrutura de controle condicional que permite encerrar ou n˜o a execu¸˜o do algoritmo. a partir do resultado de uma express˜o condicional. o a algoritmo pode tomar decis˜es diferentes. se a express˜o condicional “r ´ igual a zero” ´ verdadeira. No algoritmo para calcular o o MDC. a e a a o algoritmo ´ apenas uma lista de instru¸˜es que deve ser executada e co sequencialmente. o a e e algoritmo encerra sua execu¸˜o. Do contr´rio. ele continua a execu¸˜o. a compara¸˜o “r ´ igual a zero” ´ ca e e um exemplo de express˜o condicional. ca a ca • Estruturas de controle. executar algumas instru¸˜es ou o co n˜o. quando o a o avaliadas. Sem estruturas de controle. dependendo do resultado da avalia¸˜o a ca ca da express˜o condicional “r ´ igual a zero”: “se r ´ igual a zero ent˜o a e e a 33 . Estruturas de controle permitem que um algoritmo possa tomar decis˜es e. A capacidade de um algoritmo de tomar decis˜es ´ o que a o e o faz potente. o algoritmo pode agir de a e diferentes formas. Componentes de um Algoritmo UFMS “dep´sito” de dados seja constante. repetir a execu¸˜o de certas instru¸˜es e executar um grupo de a ca co instru¸˜es em detrimento de outro. a Tais decis˜es s˜o baseadas em express˜es condicionais que. entre outras. isto ´. resultam em apenas um dos seguintes dois valores: verdadeiro ou falso. Isto ´. o que adianta tomar o a e uma decis˜o se vocˆ n˜o pode efetu´-la? Sem estruturas de controle. O resultado desta compara¸˜o a ca pode ser apenas verdadeiro ou falso. copiem o valor de uma a e co e vari´vel para outra. dependendo se r ´ igual a zero ou e n˜o. Portanto. respectivamente. comuniquem os valores de dados a resultantes do algoritmo ao usu´rio. ent˜o um computador nada mais seria ´ ca a do que uma m´quina de calcular. a manipulem aqueles valores de dados. as decis˜es n˜o possuem qualquer valor. modifiquem o valor de e uma vari´vel atrav´s de opera¸˜es aritm´ticas. Os elementos de um algoritmo que governam o que ocorre depois que um algoritmo toma uma decis˜o s˜o a a denominados estruturas de controle. Qualquer algoritmo c˜ ca requer instru¸˜es que fa¸am o seguinte: obtenham valores de daco c dos fornecidos pelo usu´rio e armazenem-os em estruturas de dados. Por exemplo. ou seja. a partir delas. tal como executar certas instru¸˜es ou n˜o execut´co a a las.1. que ele n˜o seja alterado o a durante a execu¸˜o do algoritmo. a Se uma express˜o condicional ´ verdadeira. Algoritmos tamb´m apresentam “pontos o e de decis˜o”.3. no algoritmo para calcular o MDC de dois n´meros naturais (ver Cap´ u ıtulo 1). Se um algoritmo n˜o pudesse fazer mais do que seguir a uma unica lista de opera¸˜o.

pois eles ca o s˜o menores do que o algoritmo como um todo e podem ser entendidos a individualmente.3. • As linguagens de programa¸˜o incluem muitos detalhes t´cnicos que ca e 34 . desde que ca o a o m´dulo continuar´ fazendo o que ele fazia antes. desta forma. executar nossos algoritmos em um computador. para entendermos um deles n˜o precisamos. e a necessariamente. visto que eles s˜o partes indepena dentes do algoritmo. de ca e fato. incluindo qualo quer linguagem de programa¸˜o. Para evitar que isso ocorra. para o prop´sito de introduzir conceitos algor´ o ıtmicos. Caso contr´rio. entender os demais. de modo o que agrupar todos os seus componentes em uma unica unidade far´ ´ a com que o algoritmo seja dif´ de entender. o ıvel A utiliza¸˜o de m´dulos facilita o entendimento do algoritmo. Por ultimo. A vantagem de usar uma linguagem de programa¸˜o ´ que podemos. H´ muitas linguagens que e a poder´ ıamos utilizar com o prop´sito de escrever algoritmos. o a 3. enfatizam algumas caracter´ ısticas em detrimento de outras. siga e ca a para a pr´xima instru¸ao”. Uma Linguagem para Algoritmos UFMS o MDC ´ igual a b e a execu¸˜o encerra aqui. A manuten¸˜o do algoritmo tamb´m ´ facilitada. que seja a mais independente poss´ das demais. a exo a ´ tens˜o de um algoritmo pode ser feita mais facilmente se pudermos a reutilizar m´dulos j´ existentes. o c˜ • M´dulos. constru´ ımos nossos algoritmos utilizando m´dulos. A op¸˜o por qualquer uma delas resultaria ca em compromissos que omitem a diferen¸a entre propriedades imporc tantes de algoritmos e as propriedades de certos tipos de programas. dif´ de manter e dif´ ıcil ıcil ıcil de estender. N˜o h´ linguagem de programa¸˜o que possa ser a a ca considerada “a melhor”. tal como Portuguˆs. isto ´.2 Uma Linguagem para Algoritmos A experiˆncia tem mostrado que ´ necess´rio expressar id´ias algor´ e e a e ıtmicas em uma forma mais precisa e mais compacta do que aquela encontrada em uma “linguagem natural”. ca e e pois a modifica¸˜o de um m´dulo n˜o deve afetar os demais. esta abordagem possui trˆs e s´rias desvantagens: e • Linguagens de programa¸˜o s˜o criadas com algum prop´sito espec´ ca a o ıfico em mente e. Entretanto.2. que s˜o trechos de algoritmos que agrupam o a instru¸˜es e dados necess´rios para a realiza¸˜o de uma dada tarefa co a ca l´gica do algoritmo. Algoritmos podem se tornar muito complexos. as quais nos permitem escrever algoritmos ca em uma forma que os computadores podem entender.

Tipos de Dados UFMS introduzem dificuldades extras que n˜o est˜o relacionadas com o asa a pecto l´gico da resolu¸ao de problemas algor´ o c˜ ıtmicos. o tipo de dados num´rico pode ser imaginado como o conjunto de todos os n´meros e u e de todas as opera¸˜es que podem ser aplicadas aos n´meros. Por e e o u a a outro lado. os quais s˜o indivis´ a ıveis. o tipo num´rico ´ atˆmico. Por 1 Alguns autores utilizam o termo estruturado ao inv´s de complexo. a e • Os praticantes se tornam t˜o envolvidos com os aspectos t´cnicos das linguagens que desviam a aten¸˜o da importˆncia de um bom projeto ca a de algoritmo.3. Entre os tipos atˆmicos. algumas opera¸˜es podem ou n˜o fazer sentido quando aplicaco a das a eles. 1. co u Os tipos de dados manipulados por um algoritmo podem ser classificados em dois grupos: atˆmicos e complexos. os mais comuns s˜o: o a • num´rico: inclui os n´meros inteiros. frases. pois os n´meros n˜o s˜o compostos de partes.3 Tipos de Dados Os dados manipulados por um algoritmo podem possuir natureza distinta. Por exemplo. 7. Na nossa linco e u guagem de descri¸˜o de algoritmos. ca 3. 3. os algoritmos ser˜o descritos em pseuo a doc´digo (uma linguagem virtual de programa¸˜o). neste curso. Por exemplo. podem ser n´meros. o tipo cadeia ´ aquele cujos elementos do conjunto de valores s˜o frases e frases e a podem ser decompostas em caracteres. Por exemplo. O tipo de um dado define o conjunto de valores ao qual o valor do dado pertence. Por estas raz˜es. Entretanto. n˜o faz sentido falar em somar duas letras. 4. e 35 . Para a poder disting¨ir dados de naturezas distintas e saber quais opera¸˜es podem u co ser realizadas com eles. os algoritmos lidam com o conceito de tipo de dados.3. racionais e irracionais e as e u opera¸˜es aritm´ticas e relacionais para estes n´meros. oportunao ca mente. etc. Dependendo da natureza e u de um dado. Os tipos atˆmicos s˜o aqueles o o a cujos elementos do conjunto de valores s˜o indivis´ a ıveis. traduziremos alguns algoritmos que construiremos na sala de aula para seus equivalentes na linguagem de programa¸˜o C++. letras. 5. Por exemplo. 8 e 9. 6. os n´meros inteiros s˜o escritos ca u a apenas como a concatena¸˜o dos d´ ca ıgitos 0. os tipos complexos1 s˜o aqueles cujos elementos do conjunto de a valores podem ser decompostos em partes mais simples. isto ´. 2. bem como o conjunto de todas as opera¸˜es que podem atuar co sobre qualquer valor daquele conjunto de valores.

e temos o caracter a. temos o c n´mero inteiro um. utilizado no c´lculo da ´rea do c´ a a ırculo2 . Por outro lado. o a Entre os tipos complexos. um algoritmo manipula dados. ‘a’. . Uma vari´vel pode ser imaginada a a como um “dep´sito” para armazenar valores de dados. respectivamente. Note que “a” e ‘a’ s˜o valores pertencentes a tipos distintos. N˜o importa e a qual seja o raio do c´ ırculo. Por exemplo. entre aspas duplas. como. Por frase. o valor do n´mero u π.14159. Nos algoritmos. e a a Um algoritmo representa dados vari´veis e dados constantes atrav´s de a e vari´veis e constantes. cujo conjunto de valores ´ formado por frases ou cadeias.5. No a primeiro caso. . 9.. Por exemplo. 3. u • caracter: inclui os s´ ımbolos do alfabeto usado pela nossa linguagem de programa¸˜o virtual. o mesmo valor π ´ utilizado no c´lculo da ´rea. tais ca como ?. 100 e 1678. . vamos utilizar inicialmente apenas o tipo cadeia. Estes s´ ca ımbolos consistem das letras do alfabeto romano. Os n´meros com fra¸˜o devem ser escritos. As frases s˜o ca a escritas. dos caracteres de pontua¸˜o. Note a diferen¸a entre escrever 1 e ‘1’. . por exemplo. com a presen¸a do ponto decimal. tal como “Entre com algum valor: ”. No caso do n´mero ser negativo. 5. para o qual existe o um nome. 1. dos d´ ıgitos 0.3. o raio do c´ ırculo ´ um dado de entrada vari´vel. onde r ´ o raio do c´ e e ırculo. . entre aspas simples. que podem ser dados a vari´veis ou constantes. estes valores s˜o escritos como V e F. adicionamos o sinal “−” u na frente do n´mero. no segundo. conhecido como identificador. No primeiro caso.4 Vari´veis a Como dito antes. . o caracter representando o d´ u ıgito um. ´ uma constante. e entendemos uma concatena¸˜o de valores do tipo caracter. ca e As opera¸˜es definidas para este tipo s˜o igualdade e desigualdade. c 100. pois o valor do e a raio pode variar de c´ ırculo para c´ ırculo. nos algoritmos. nos u ca algoritmos. nos algoritmos. os n´meros inteiros e reais. Vari´veis a UFMS exemplo. respectivamente. 3. ‘1’ e ‘?’. em um algoritmo que calcula a ´rea de a um c´ ırculo. 36 . Os co a elementos do conjunto de valores do tipo caracter devem ser escritos.0 e 0. e cujo conte´do pode ser alterado u 2 A ´rea do c´ a ırculo ´ dada por πr 2 . no segundo. entre outros. dos s´ ımbolos de opera¸˜o aritm´tica + e −. . .. tal como −23.4. temos uma frase que cont´m apenas o caracter a. • l´gico: inclui apenas os valores verdadeiro e falso e as opera¸˜es o co l´gicas. Dentre os tipos num´ricos disu e tinguiremos os tipos inteiro e real que incluem.

a cada vari´vel a corresponde uma posi¸˜o distinta de mem´ria. como o valor da constante ´ e 37 . explia citamente. a e ca a Cada vari´vel utilizada em um algoritmo deve ter sido declarada antes de a ser utilizada pela primeira vez. c o 3. se uma vari´vel ´ u a a e declarada como sendo do tipo num´rico. Assim como uma a vari´vel.5 Constantes Uma constante faz exatamente o que o nome sugere: representa um dado cujo valor n˜o muda durante todo o algoritmo. como pudemos constatar no cap´ ıtulo anterior. conseq¨entemente. ela n˜o poder´ armazenar qualquer e a a outro valor que n˜o seja um n´mero. associar-lhe um tipo de dados.5. Ao criarmos uma vari´vel. pois. O identificador de uma vari´vel deve ser distinto daquele a das demais vari´veis do algoritmo. utilizamos os pr´prios ena o dere¸os de mem´ria para referenciar os dados manipulados pelo programa. Constantes UFMS pelo algoritmo. pois ´ atrav´s do identificador da vari´vel a e e a que o algoritmo a disting¨e das demais e tem acesso ao seu conte´do. a estrutura a u de dados que define o conte´do da vari´vel. segue-se o formato abaixo: a <tipo da vari´vel> <lista de identificadores> a a e a a onde tipo da vari´vel ´ o nome do tipo ao qual as vari´veis estar˜o associadas e lista de identificadores ´ uma lista de identificadores de vari´veis separados e a por v´ ırgula. Desta forma. u u O ato de criar uma vari´vel ´ conhecido como declara¸˜o de vari´vel. a u Para se declarar uma vari´vel. No entanto. em geral. temos de.3. denominadas ca a x do tipo inteiro e y do tipo real: inteiro x inteiro y Quando executamos um algoritmo em um computador. uma constante tamb´m possui um identificador unico e deve ser a e ´ declarada antes de ser utilizada. Vari´veis. o endere¸o da prica o c meira c´lula de mem´ria ocupada pelo conte´do da vari´vel. O uso de vari´veis ´ uma caracter´ o a e ıstica das linguagens de alto-n´ ıvel. e o u a a portanto. Como exemplo. quando programamos em linguagem de m´quina. considere a declara¸˜o de duas vari´veis. nada mais s˜o do que representa¸˜es simb´licas para posi¸˜es de a co o co mem´ria que armazenam dados. pois o tipo determina o conjunto de valores que a vari´vel pode armazenar e.

e 3. de modo e ıdo a ca que n˜o h´ necessidade de explicitarmos o tipo do valor da constante.6. identificador ´ o identificador da constante e e e valor ´ o valor da constante.1 Operador de Atribui¸˜o ca O ato de atribuir ou copiar um valor para uma vari´vel ´ conhecido como a e atribui¸˜o. as palavras-chaves sempre aparecer˜o sublinhadas. a a Como exemplo. Neste curso. a a Em nossa linguagem de escrita de algoritmos. ı 3.6. Entenda por palavra-chave qualquer palavra e que tenha um significado espec´ ıfico para o algoritmo e que n˜o deve ser a utilizada para qualquer outro prop´sito. temos a nossa disposi¸˜o v´rios tipos a ca a de operadores. P I ´ uma constante do tipo num´rico e M EN SAGEM ´ uma e e e constante do tipo cadeia. temos a declara¸˜o de duas constantes.14159 Defina M EN SAGEM “A ´rea do c´ a ırculo ´:” e Desta forma. M EN SAGEM ´ uma frase.3. tal como para dar um nome a uma o vari´vel.6 Operadores N´s declaramos vari´veis e constantes a fim de criar espa¸o para aro a c mazenar os valores dos dados manipulados pelo algoritmo. operadores aritm´ticos e a c˜ e operadores de entrada e sa´da. as seguintes instru¸˜es atribuem os valores ca co 4 e ‘a’ `s vari´veis x e y. Utilizaremos o operador de atribui¸˜o (←) como um s´ ca ca ımbolo para esta opera¸˜o. com os quais podemos atribuir valor a uma vari´vel e mania pular os valores armazenados em vari´veis e constantes. Operadores UFMS fixo. uma constante ´ declarada e da seguinte forma: defina <identificador> <valor> onde defina ´ uma palavra-chave. ele ´ atribu´ ` constante no momento de sua declara¸˜o. H´ trˆs categorias a a e b´sicas de operadores: operadores de atribui¸ao. ou seja. Por exemplo. respectivamente: a a x←4 y ←‘a’ 38 . Uma vez que declaramos as vari´veis e constantes. P I e M EN SAGEM : ca defina P I 3.

Por exemplo. DIV ´ o operador de divis˜o para e a n´meros inteiros.6. Lembre-se de que. n˜o importando se o n´mero ´ inteiro ou cont´m parte fracion´ria. suponha que as vari´veis a.6. representado pelo s´ • multiplica¸˜o. temos de declar´-la antes de seu primeiro uso. b e c tenham sido declaradas a como segue: inteiro a.3. e • divis˜o. c Ent˜o. J´ o operador MOD ´ utilizado para a e obtermos o resto de uma divis˜o inteira. ao u passo que 4/3 resulta em 1. ca ımbolo −. o resto da divis˜o inteira de 5 por 2. representado pelo s´ ca ımbolo +.333 . mesmo que os operandos sejam n´meros inteiros.2 Operadores Aritm´ticos e Os operadores aritm´ticos b´sicos s˜o quatro: e a a • adi¸˜o. x conter´ o valor 4 e o co ca a y. obteremos 1 como resultado. Este comando sempre envolve uma vari´vel. ´ a divis˜o real. a 3. a 3. o resultado ´ real. representada pelo s´ ca a ımbolo /. a u e e a Como exemplo. o valor ‘a’. • subtra¸˜o. podemos escrever express˜es como as seguintes: a o a+b+c a − b ∗ c/2 A opera¸˜o de divis˜o. Se fizermos 4 DIV 3. o a c˜ e 39 . . para qualquer vari´vel ser utilizada em um a algoritmo. . b. e u e Entretanto.6. Quando um comando de atribui¸ao ´ executado.3 Comando de Atribui¸˜o ca Um comando de atribui¸˜o ´ qualquer comando que inclua um opeca e rador de atribui¸˜o. existem e dois outros operadores: DIV e MOD. e a Isto ´. representado pelo s´ ca ımbolo ∗. que se ca a localiza ` esquerda do operador. Operadores UFMS Ap´s tais opera¸˜es de atribui¸˜o serem executadas. para podermos trabalhar apenas com aritm´tica inteira. e um valor ou uma express˜o que se locaa a liza ` direita do operador. 5 M OD 2 ´ igual a a e 1. representado pelo s´ a ımbolo /.. Estes operadores podem ser aplicados a express˜es envolvendo valores num´ricos o e quaisquer.

x. que pode ser uma constante. o comando de atribui¸˜o seria ca ca ca x ← (a + b) ∗ c Neste caso.6. Al´m de e e possu´ ırem prioridade m´xima perante os demais operadores aritm´ticos.6. y e z s˜o vari´veis. a temos as opera¸˜es de adi¸˜o e subtra¸˜o. a Como exemplo. considere o seguinte trecho algor´ ıtmico: inteiro inteiro inteiro inteiro a←2 b←3 c←4 x←a+b∗c Este trecho de c´digo armazenar´ o valor 14 na vari´vel x.4 Precedˆncia de Operadores e Assim como na aritm´tica padr˜o. A menos que os parˆnteses indiquem o contr´rio. a utiliza¸˜o ca de parˆnteses possui o mesmo significado visto no primeiro grau. como na express˜o e e a abaixo: a b c x 40 . Se fosse desejado o a a realizar a opera¸˜o de adi¸˜o primeiro. ca o conte´do de uma vari´vel ou o resultado de uma express˜o. a a 3. as opera¸˜es e e a de divis˜o e multiplica¸˜o s˜o executadas primeiro e na ordem em que forem a ca a encontradas ao lermos a express˜o da esquerda para a direita. o uso dos parˆnteses fez com que a opera¸˜o de adi¸˜o fosse reae ca ca lizada primeiro. Na nossa linguagem para escrita de algoritmos.3. c. considere os seguintes comandos de atribui¸˜o: ca x←a+2−c y←4 z←y onde a. a precedˆncia de operadores nas e a e express˜es aritm´ticas dos algoritmos tamb´m ´ governada pelo uso de o e e e co parˆnteses. ´ copiado para u a a e a vari´vel do lado esquerdo do operador. co ca ca Como exemplo. os a e parˆnteses tamb´m podem ocorrer de forma “aninhada”. Em seguida. Operadores UFMS valor do lado direito do operador de atribui¸˜o.

constantes e express˜es. sendo c˜ a a o que a declara¸˜o de constantes precede a declara¸˜o de vari´veis. realizadas.6. A declara¸ao de constantes e vari´veis ser´ o pr´ximo passo. A linha de cabe¸alho. indea o pendente de alguma ordem.5 Entrada e Sa´ ıda Qualquer algoritmo requer a obten¸˜o de dados do “mundo” (entrada) ca e tamb´m um meio de comunicar ao “mundo” o resultado por ele obtido e (sa´ ıda). O operador de leitura tem sempre um ou mais vari´veis como operandos. que ´ o nome escolhido para o algoritmo. que ´ a primeira linha do algoritmo. vari´veis e express˜es como operandos. 3.3. Estrutura Geral de um Algoritmo UFMS ((2 + 3) − (1 + 2)) ∗ 3 − (3 + (3 − 2)) que resulta no valor 2. pelos operadores leia e escreva. Para tal. respectivamente. seguida por um identificador. veremos algumas caracter´ ca ısticas que encontraremos nos algoritmos que estudaremos neste curso: 1. 2.7.7 Estrutura Geral de um Algoritmo Nesta Se¸˜o. ca ca a 41 . Como exemplo do uso dos operadores de entrada e sa´ ıda. temos: inteiro x leia x escreva x escreva “O valor de x ´:”. como o pr´prio nome j´ define ´ uma lista contendo o o a e identificadores (de constantes ou vari´veis). e lsita de identificadores e/ou constantes e/ou express˜es. existem duas opera¸˜es. enquanto o operaa dor de sa´ pode possuir constantes. x e 3. cont´m a c e e e palavra-chave algoritmo. denominadas entrada e sa´ co ıda. ıda a o A forma geral destes operadores ´: e a leia <lista de vari´veis> a o escreva <lista de vari´veis e/ou constantes e/ou express˜es > onde leia e escreva s˜o palavras-chave. lista de vari´veis ´ uma lista de a a e identificadores separados por v´ ırgula.

Estrutura Geral de um Algoritmo UFMS 3. A linha final. 3. considere um algoritmo para calcular e escrever a ´rea a de um c´ ırculo. Dentro do corpo do algoritmo. 4. a c ca visualmente. Como exemplo. area // leitura do raio do c´ ırculo leia raio // c´lculo da ´rea do c´ a a ırculo area ← P I ∗ raio ∗ raio // comunica¸˜o do resultado ca 42 . linhas em branco s˜o usadas para dividir a o algoritmo em partes logicamente relacionadas e tornar o algoritmo mais leg´ ıvel.3. As linhas e de coment´rio s˜o iniciadas com duas barras (“//”) e podem abrigar a a qualquer texto. dado o raio do c´ ırculo. Coment´rios s˜o linhas a a a que n˜o s˜o executadas e cujo prop´sito ´ apenas o de facilitar o ena a o e tendimento do algoritmo por parte de quem desejar lˆ-lo. 2. O algoritmo pode vir seguido de coment´rios. // algoritmo para calcular a ´rea do c´ a ırculo algoritmo area do circulo // declara¸˜o de constantes e vari´veis ca a defina P I 3.14159 a ırculo ´: ” e defina M EN SAGEM “O valor da ´rea do c´ real raio. O corpo do algoritmo cont´m as instru¸˜es que faze parte da descri¸˜o e co ca do algoritmo. cont´m a palavra-chave e ´ e fimalgoritmo para especificar onde o algoritmo termina. enquadra o corpo do algoritmo no olho humano e acaba com a confus˜o criada por n˜o sabermos onde o algoritmo come¸a ou a a c termina. Temos ainda alguns detalhes que servir˜o para deixar o algoritmo mais a claro e mais f´cil de ler: a 1. Os passos do algoritmo s˜o especificados atrav´s da identa¸ao dos a e c˜ v´rios comandos entre a linha de cabe¸alho e a linha final. A identa¸˜o. que ´ a ultima linha do algoritmo.7.

1998.J. Naps. R. 1995. 43 . Introduction to Computing and Algorithms.L.L. Shackelford. Introduction to Data Structures and Algorithm Analysis with C++.. West Publishing Company. G. Pothering.3. 2. Inc.7. Estrutura Geral de um Algoritmo UFMS escreva M EN SAGEM . AddisonWesley Longman. area fimalgoritmo Bibliografia O texto deste cap´ ıtulo foi elaborado a partir dos livros abaixo relacionados: 1. T.

´ uma coma ca e para¸˜o entre dois valores do mesmo tipo b´sico. constantes e/ou vari´veis do tipo l´gico. a co a 4.1 Express˜es Condicionais o Denomina-se express˜o condicional ou expres˜o l´gica a express˜o a a o a o cujos operandos s˜o rela¸˜es.Parte II 4 Neste t´pico. Como visto no o cap´ ıtulo anterior. que indicam a compara¸˜o a ser realizada ca entre os termos da rela¸˜o. as express˜es condicionais possibilitam os algoritmos too marem decis˜es que s˜o governadas pelas estruturas de controle. Estes valores s˜o represenca a a tados na rela¸˜o atrav´s de constantes.Desenvolvimento de Algoritmos .1. vari´veis ou express˜es aritm´ticas. ou simplesmente rela¸˜o. s˜o conhecidos da Matem´tica: ca a a Operador = = > < ≥ ≤ Descri¸˜o ca igual a diferente de maior que menor que maior ou igual a menor ou igual a 44 . ca e a o e Os operadores relacionais. o a 4.1 Rela¸˜es co Uma express˜o relacional. vocˆ estudar´ detalhadamente dois componentes dos alo e a goritmos: express˜es condicionais e estruturas de controle.

e Como exemplo. Express˜es Condicionais o UFMS O resultado da avalia¸˜o de uma rela¸˜o ´ sempre um valor l´gico. 4. e portanto. No nosso contexto. b. V ou F. ca co e O resultado da conjun¸˜o de duas proposi¸˜es ´ verdadeiro se e somente se ca co e ambas as proposi¸˜es s˜o verdadeiras.1. Quando h´ mais de uma proposi¸˜o em uma express˜o l´gica.4. considere as vari´veis a. e ca a o As express˜es condicionais ou l´gicas s˜o formadas por uma ou mais o o a proposi¸˜es. isto ca ca e o ´.2 Operadores L´gicos o Uma proposi¸˜o ´ qualquer senten¸a que possa ser avaliada como verca e c dadeira ou falsa. a o respectivamente. cone ca a c a sequentemente. co a ca a o elas est˜o relacionadas atrav´s de um operador l´gico. a > b + c. J´ a senten¸a “feche a porta!” n˜o pode e. Os operadores a e o l´gicos utilizados como conectivos nas express˜es l´gicas s˜o os seguintes: o o o a Operador E OU ˜ NAO Descri¸˜o ca para a conjun¸˜o ca para a disjun¸˜o ca para a nega¸˜o ca Duas proposi¸˜es podem ser combinadas pelo conectivo E para formar co uma unica proposi¸˜o denominada conjun¸˜o das proposi¸˜es originais. uma vari´vel e/ou uma constante do tipo l´gico. b e c definidas a seguir: a inteiro a. uma proposi¸˜o a e ca ca ´ uma rela¸˜o. n˜o ´ uma proposi¸˜o. c Agora. ´ uma proposi¸˜o. suponha as seguintes atribui¸˜es: co a←2 b←3 c←4 Ent˜o. Por exemplo. as express˜es a = 2. F e F. A ´ ca ca co conjun¸˜o das proposi¸˜es p e q ´ representada por p ∧ q e lemos “p e q”. co a 45 .1. c ≤ 5 − a e b = 3 valem V. F. a senten¸a “a popula¸˜o de Campo Grande c ca ´ de 500 mil habitantes” pode ser classificada como verdadeira ou falsa e. como mostrado na tabela a seguir.

c e x definidas a seguir: a inteiro a.1. p V F ¬p F V Agora. p V V F F q V F V F p∨q V V V F Dada uma proposi¸˜o p qualquer. ent˜o ¬p ´ verdadeira. pode ser formada escrevendo “E falso que” antes de p ou. A disjun¸˜o de duas proposi¸˜es e ca co ´ verdadeira se e somente se. pelo menos. se p ´ falsa. inserindo a palavra “n˜o” em p. como mostrado a e e a e na tabela a seguir. A disjun¸˜o de duas proposi¸˜es p ca c˜ ca co e q ´ representada por p∨q e lemos “p ou q”. podemos concluir que se p ´ verdaa e deira. chamada nega¸˜o ca ca ca ´ de p. uma delas for verdadeira. Express˜es Condicionais o p V V F F q V F V F p∧q V F F F UFMS Duas proposi¸˜es quaisquer podem ser combinadas pelo conectivo OU co (com o sentido de e/ou) para formar uma nova proposi¸˜o que ´ chamada ca e disjun¸˜o das duas proposi¸oes originais. Desta forma. como e mostrado na tabela a seguir. designamos a nega¸˜o de a ca p por ¬p e lemos “n˜o p”. c l´gico x o Agora. suponha as seguintes atribui¸˜es: co a←2 b←3 c←4 x←F 46 . vejamos alguns exemplos de express˜es l´gicas que utilizam os o o conectivos vistos antes. ent˜o ¬p ´ falsa. Simbolicamente. Considere as vari´veis a.4. b. uma outra proposi¸˜o. b. se poss´ ıvel.

≤. Estruturas de Controle UFMS ˜ Ent˜o. ı ca De forma an´loga. a = 2 E a > b + c. devemos primeiro resolver as rela¸˜es a = 2 e a > b + c a co para podermos resolver a express˜o l´gica a = 2 E a > b + c.ent˜o .2. Em particular. co e co por ultimo. respectivamente. F e V. ent˜o. DIV. depois as opera¸˜es relacionais e. c ≤ 5 − a OU b = 3. A tabela a seguir ilustra a prioridade de ´ co o todos os operadores vistos at´ aqui. a opera¸˜o l´gica a > b + c E c ≤ 5 − a ´ ca o e realizada primeiro e seu resultado ´.1 Estruturas Condicionais a A estrutura condicional mais simples ´ a se . reduzida para a e e a um valor V ou F. >. Na primeira express˜o. a = 2 e a > b + c s˜o a a rela¸˜es. A forma e geral desta estrutura ´ mostrada a seguir: e 47 . co e a e que devemos resolver primeiro para da´ podermos avaliar a rela¸˜o a > b+ c. Se quis´ssemos mudar a ca ca e ordem natural de avalia¸˜o. a > b + c cont´m uma express˜o aritm´tica. < ˜ NAO E OU Prioridade 1 (m´xima) a 2 3 4 5 6 (m´ ınima) Observe que entre os operadores l´gicos existe n´ o ıveis distintos de prioridade. − =. fazemos as opera¸˜es aritm´ticas. poder´ ca ıamos escrever a express˜o com o uso de a parˆnteses: (a = 2 OU a > b + c) E c ≤ 5 − a. =. ≥. e 4. Isto significa que na express˜o e a a = 2 OU a > b + c E c ≤ 5 − a. e NAO x valem a o F. as opera¸˜es l´gicas. combinado atrav´s do operador e a e de disjun¸˜o (OU) com aquele da rela¸˜o a = 2. Isto significa a o que estamos realizando as opera¸˜es em uma certa ordem: em primeiro co lugar. veremos dois tipos de estruturas co a de controle: estrutura condicional e estrutura de repeti¸ao.fimse. isto ´. assim como entre os operadores aritm´ticos. e Operador /.2.2 Estruturas de Controle Uma vez que a express˜o condicional foi avaliada. Daqui em diante. as express˜es a = 2 E a > b + c. c˜ 4.4. ∗. b + c. uma estrutura de controle ´ necess´ria para governar as a¸˜es que se suceder˜o. MOD +.

. . . caso e 48 . fornecido na entrada. . .4. Caso contr´rio. e u escrevˆ-los em ordem n˜o decrescente: e a // algoritmo para escrever dois n´meros em ordem n˜o decrescente u a u algoritmo ordena dois n´meros // declara¸˜o de vari´veis ca a inteiro a. Estruturas de Controle UFMS se <express˜o condicional> ent˜o a a comando1 comando2 . . depois disso. considere um algoritmo para ler dois n´meros. e ´ maior do que o valor de b. os comandos 1. comandon fimse Esta estrutura funciona da seguinte forma: se express˜o condicional for a verdadeira. . 2. n n˜o s˜o exee a a a cutados e o fluxo de execu¸ao do algoritmo segue com o comando imediac˜ tamente depois da estrutura de controle. os comandos 1. b // ordena os n´meros u a se a > b ent˜o temp ← a a←b b ← temp fimse // escreve os n´meros ordenados u escreva a. contidos dentro da estrutura. s˜o exea cutados e. . b fimalgoritmo Tudo que este algoritmo faz ´ verificar se o valor de a. temp // lˆ os n´meros e u leia a. dependendo de uma dada condi¸˜o ser ou n˜o u ca a satisfeita. b. se sim. 2. n. a e b. o comando imediatamente depois da estrutura de controle ´ executado. .2. Isto significa que esta forma de estrutura de controle permite que um algoritmo execute ou n˜o um determia nado n´mero de comandos. . Como exemplo. ele troca os valores de a e b.

a e Uma varia¸˜o da estrutura de controle se . consequentemente. .sen˜o . perdemos o valor que. Como a opera¸˜o de troca a a a ca deve ser realizada apenas quando a > b. os a comandos 1. comando′ n fimse Neste caso. . atribu´ a ımos o valor de b a a e. dada a nota obtida pelo candidato no exame: // algoritmo para escrever resultado de um exame 49 comando′ 1 . ele n˜o altera o valor destas vari´veis. . .fimse.2. . denominada temp. se o resultado o e a ′ .4.ent˜o . isto ´. se o resultado da express˜o condicional for verdadeiro. para podermos fazer com que este valor possa ser atribu´ a b. Esta estrutura permite ao algoritmo executar uma a a de duas seq¨ˆncias mutuamente exclusivas de comandos. Depois. . Logo. . 2′ . Esta e ca opera¸˜o ´ realizada com a ajuda de uma outra vari´vel. . estava retido em a. e se <express˜o condicional> ent˜o a a comando1 comando2 . ela foi inserida dentro da estrutura condicional se . ue A forma geral deste comando ´ dada a seguir. pois ao executarmos a ← b. . n′ s˜o executados e da express˜o condicional for falso. . 2. .fimse. os comandos 1 a a depois disso o pr´ximo comando a ser executado ´ aquele logo ap´s o fim da o e o estrutura de controle. comandon sen˜o a comando′ 2 . Notemos que as seq¨ˆncias de comandos corresponue dentes a ent˜o e sen˜o s˜o mutuamente exclusivas. caso contr´rio. n s˜o executados e depois disso o primeiro comando logo a ap´s o fim da estrutura de controle ´ executado. a a Como exemplo considere um algoritmo para escrever uma mensagem com o resultado de um exame. n′ s˜o executados. temos de utilizar uma outra vari´vel. . n s˜o executados ou os comandos 1′ . ou os comandos a a a e 1.fimse ´ a estrutura se ca . Isto n˜o pode ser feito de outra forma! A e e co a fim de atribuir o valor de a a b e o valor de b a a. a Um outro ponto importante deste exemplo ´ a opera¸˜o de troca. . ca e a e atrav´s de trˆs atribui¸˜es. . 2. anteriormente. . . guardamos o valor de a em um valor seguro: a vari´vel temp. . 2′ .ent˜o . ıdo antes de executarmos a ← b. . atribu´ a ımos o valor em temp a b. .ent˜o . Estruturas de Controle UFMS contr´rio. .

c. temp // lˆ os trˆs n´meros e e u leia a. isto ´. c // encontra o menor dos trˆs n´meros e guarda em a e u a se (a > b) OU (a > c) ent˜o se (b ≤ c) ent˜o a temp ← a a←b b ← temp sen˜o a temp ← a a←c c ← temp fimse fimse 50 . b.2. considere o seguinte algoritmo que lˆ trˆs n´meros e escreve-os em ordem n˜o decrescente: e e u a // algoritmo para ordenar trˆs n´meros e u e u algoritmo ordena trˆs n´meros // declara¸˜o de vari´veis ca a inteiro a. Como exemplo disto.0 real nota // lˆ a nota do candidato e leia nota // compara a nota lida e escreve resultado a se nota ≥ N OT AM IN IM A ent˜o escreva “candidato aprovado” sen˜o a escreva “candidato reprovado” fimse fimalgoritmo As estruturas condicionais podem estar “aninhadas”. b. elas podem e ocorrer umas dentro de outras.4. Estruturas de Controle UFMS // baseado na nota obtida pelo candidato algoritmo resultado exame // declara¸˜o de constantes e vari´veis ca a defina N OT AM IN IM A 6.

permite que um ca c grupo de comandos seja executado repetidamente um n´mero determinado u de vezes ou at´ que uma determinada condi¸˜o se torne verdadeira ou falsa. e ca Nesta Subse¸˜o. Se ele a e for menor ou igual a valor final. e 2. Caso contr´rio.fa¸a • a estrutura enquanto . a executa o comando imediatamente ap´s a estrutura de repeti¸˜o.4. atribui ` vari´vel. compara o valor de vari´vel com o valor num´rico valor final. c fimalgoritmo 4. que ´ o nome de uma vari´vel num´rica. o ca 51 .2. o valor a a e a e num´rico valor inicial. Estruturas de Controle UFMS // encontra o valor intermedi´rio e guarda em b a se (b > c) ent˜o a temp ← b b←c c ← temp fimse // escreve os n´meros em ordem n˜o descrescente u a escreva a. .fa¸a c • a estrutura repita .2 Estruturas de Repeti¸˜o ca A estrutura de repeti¸˜o.2.at´ e A estrutura de repeti¸˜o para .fa¸a possui a seguinte forma geral ca c para <vari´vel> de <valor inicial> at´ <valor final> fa¸a a e c comando1 comando2 . comandon fimpara e funciona como segue: 1. b. estudaremos trˆs estruturas de repeti¸˜o: ca e ca c • a estrutura para . ou simplesmente la¸o. vai para o passo 3. .

caso seja menor ou igual a 200. soma e fimalgoritmo Neste algoritmo. A cada itera¸˜o. Estruturas de Controle UFMS 3. inclusive: u e // algoritmo para somar os pares de 100 a 200 algoritmo soma pares 100 a 200 // declara¸˜o de vari´veis ca a inteiro soma. a Observe que a vari´vel soma recebe o valor 0 antes do la¸o ser executado. primeira vez os comandos dentro do la¸o e. considere o seguinte algoritmo para calcular e exibir a soma de todos os n´meros pares desde 100 at´ 200. i guarda um e valor de 100 a 200 a cada repeti¸˜o do la¸o. i // inicializa com 0 a vari´vel que guardar´ a soma a a soma ← 0 // calcula a soma para i de 100 at´ 200 fa¸a e c se i MOD 2 = 0 ent˜o a soma ← soma + i fimse fimpara // escreve o valor da soma escreva “A soma dos pares de 100 a 200 ´: ”. a cada itera¸˜o do e e ca 52 . Como exemplo. Deste ponto em diante. Da´ compara o valor de i com 200 e. o valor de i ´ comparado com e 200 e. incrementa c ca i de uma unidade.fa¸a inicia com a atribui¸˜o do valor 100 ` c c ca a vari´vel i. ao final da execu¸˜o. Como vocˆ pode ca e ca a e perceber. a 5. incrementa o valor de vari´vel de uma unidade. executa pela a ı. a c Esta atribui¸˜o ´ denominada inicializa¸˜o da vari´vel. Desta forma. o algoritmo ca c ca verifica se o valor de i ´ par ou ´ e ımpar. Este e c˜ processo se repete at´ que i seja igual a 201. executa os comandos 1 a n.4. volta para o passo 2. Se o valor de i for par. como i < 200.2. o valor de i ´ e adicionado ao valor na vari´vel soma. isto ´. uma nova itera¸˜o do la¸o ´ realizada ca c e e i ´ novamente incrementada de uma unidade ao final da itera¸ao. 4. o la¸o para . soma ´ utilizada como um acumulador.

resolver o problema de calcular a soma de todos os pares de 100 a 200 de uma forma mais elegante do que aquela vista anteriormente. o valor assumido para o incremento ´ 1 (um). se a inicializa¸˜o n˜o a ca a estivesse presente no algoritmo. o 53 . e Esta varia¸˜o da estrutura de repeti¸˜o para .fa¸a ´ aquela que nos ca ca possibilita controlar o valor do incremento da vari´vel contadora do la¸o: a c para <vari´vel> de <valor inicial> at´ <valor final> passo <incremento> fa¸a a e c comando1 comando2 .2. como podemos constatar a seguir: // algoritmo para somar os pares de 100 a 200 algoritmo soma pares 100 a 200 // declara¸˜o de vari´veis ca a inteiro soma. Quando a parte do comando passo <incremento> n˜o est´ preca sente. Estruturas de Controle UFMS la¸o. pois n˜o poder´ a ıamos prever o valor que est´ na posi¸˜o de a ca mem´ria do computador correspondente a soma. soma ´ incrementada de mais um n´mero par e isto ´ feito somando o c e u e valor atual de soma ao n´mero par em i e atribuindo o resultado novamente u a ` vari´vel soma: soma ← soma + i. i // inicializa com 0 a vari´vel que guardar´ a soma a a soma ← 0 // calcula a soma para i de 100 at´ 200 passo 2 fa¸a e c soma ← soma + i fimpara 1 Se vocˆ executasse este algoritmo em computador sem a inicializa¸˜o de soma. c e Uma varia¸˜o da estrutura de repeti¸˜o para .fa¸a nos permite. o e ca resultado seria imprevis´ ıvel. por ca ca c exemplo. quando o la¸o fosse executado pela primeira c vez. n˜o haveria um valor em soma e a atribui¸˜o soma ← soma + i n˜o a ca a faria sentido1 . . comandon fimpara onde incremento ´ o valor adicionado ao valor de vari´vel ao final de cada e a a a itera¸˜o. Entretanto.4. .

fa¸a possui a seguinte forma geral a c enquanto <express˜o condicional> fa¸a comando1 comando2 . Caso contr´rio. h´ problemas em que n˜o a a ´ poss´ e ıvel determinar. express˜o condicional ´ avaliada. 3. previamente. o coa mando imediatamente posterior ` estrutura de repeti¸˜o ´ executado. r. Estruturas de Controle UFMS // escreve o valor da soma e escreva “A soma dos pares de 100 a 200 ´: ”.4. c A estrutura enquanto .2. considere o seguinte algoritmo para ler um n´mero inu teiro n. m // lˆ o valor de um inteiro e leia n 54 . soma fimalgoritmo A estrutura de repeti¸˜o para . executa os comandos de 1 a n. o n´mero de repeti¸˜es. comandon fimenquanto A l´gica do funcionamento desta estrutura de repeti¸˜o ´ a seguinte: o ca e 1.at´. Neste caso. a ca e 2. .fa¸a deve ser utilizada apenas quando ca c queremos repetir a execu¸˜o de um ou mais comandos um n´mero conhecido ca u de vezes. u co c e devemos utilizar a estrutura enquanto . Entretanto. Se o resultado for verdadeiro. volta para o passo 1. como no exemplo anterior. ent˜o a e a o fluxo do algoritmo segue para o passo seguinte. . Como exemplo.fa¸a ou repita . e escrever um n´mero inteiro m que coru responde a n invertido: // algoritmo para inverter um nmero inteiro sem d´ ´ ıgito 0 u algoritmo inverte n´mero // declara¸˜o de vari´veis ca a inteiro n. que n˜o cont´m d´ a e ıgito 0.

comandon at´ <express˜o condicional> e a A l´gica do funcionamento desta estrutura de repeti¸˜o ´ a seguinte: o ca e 1. Entretanto. o c n´mero de repeti¸˜es. Neste ponto.at´ tem a seguinte forma geral: repita comando1 comando2 . sucessivamente.at´ ´ executada pelo menos uma vez. por 10. executa a seq¨ˆncia de instru¸˜es. o la¸o ´ repetido uma quantidade de vezes c e igual ao n´mero de d´ u ıgitos de n. A diferen¸a entre elas reside no fato que a seq¨ˆncia u co c ue de instru¸˜es da estrutura repita . ca c podemos encerrar o la¸o. logo n˜o saberemos prever o n´mero de repeti¸˜es do a a u co la¸o. antecipadamente.at´ ´ semelhante ` estrutura enquanto ca a a fa¸a. o que far´ n “perder” o d´ a cada repeti¸˜o do la¸o e se tornar 0 em algum momento. .4. podemos determinar o n´mero de d´ c u ıgitos de n ao longo da execu¸˜o do algoritmo e isto ´ feito indiretamente pelo algoritmo ao dividir ca e a ıgito menos significativo n. pois ambas s˜o utilizadas quando n˜o conhecemos. . co e e independentemente da express˜o condicional ser ou n˜o verdadeira. n˜o somos capazes de dizer.2. c ee a A estrutura de repeti¸˜o repita . Estruturas de Controle UFMS // inicializa a vari´vel que conter´ o inteiro invertido a a m←0 // encontra o n´mero invertido u c enquanto n > 0 fa¸a r ← n MOD 10 m ← m ∗ 10 + r n ← n DIV 10 fimenquanto // exibe o n´mero invertido u escreva m fimalgoritmo Observe que. neste algoritmo. ao escrevermos o algoritmo. a a e A estrutura repita . Como n ´ desconhecido at´ a execu¸˜o do e e ca algoritmo iniciar. a quantos d´ ıgitos n ter´. ue co 55 .

escrever uma tabela que forne¸a. express˜o condicional ´ avaliada. r. Caso contr´rio. Uma pessoa aplicou seu capital a juros e deseja saber. . i. supondo que nenhuma retirada tenha sido feita. n inteiro c.3. i. x 56 .4. veremos quatro problemas e suas respectivas solu¸˜es. a ca e Como exemplo. . para cada trimestre. a posi¸˜o de seu investimento inicial c. ca a a Os problemas e suas respectivas solu¸˜es s˜o os seguintes: co a 1. Asca co sociado a cada solu¸˜o est´ um breve coment´rio. o comando imediataca a mente posterior ` estrutura de repeti¸˜o ´ executada. Chamando de i a taxa de juros ca do trimestre. Se ela for falsa. a taxa de juros e n´meros de anos e u leia c. o objetivo do la¸o ´ garantir que a vari´vel n c e a receba um n´mero positivo. o c rendimento auferido e o saldo acumulado durante o per´ ıodo de x anos. trimestralmente. o algoritmo continuar´ solicitando a entrada. . enquanto o usu´rio entrar com um n´mero u a u menor ou igual a zero. repita escreva “entre com um n´mero positivo: ” u leia n at´ n > 0 e . Neste trecho de algoritmo. ent˜o o fluxo de a e a execu¸˜o volta para o passo 1. // algoritmo para calcular rendimento e montante de aplica¸˜o ca // trimestral algoritmo calcula rendimento // declara¸˜o de vari´veis ca a inteiro x. Problemas e Solu¸˜es co UFMS 2.3 Problemas e Solu¸˜es co Nesta Se¸˜o. a 4. considere o seguinte trecho algor´ ıtmico: . j // lˆ o capital inicial. .

menorpeso // lˆ os dados do primeiro boi e u ca escreva “entre com o n´mero de identifica¸˜o do primeiro boi: ” leia num escreva “entre com o peso do primeiro boi: ” leia peso // inicializa as vari´veis que conter˜o o resultado a a boigordo ← num boimagro ← num 57 . Cada boi traz em seu pesco¸o c um cart˜o contendo seu n´mero de identifica¸˜o e seu peso. “: ”. O la¸o para e e ca u c e u fa¸a ´ repetido n vezes. Fa¸a um a u ca c algoritmo que encontre e escreva o n´mero e o peso do boi mais gordo u e do boi mais magro.3. c e A cada repeti¸˜o do la¸o. onde n ´ o n´mero de trimestres encontrado. j. r escreva “montante do trimestre ”.4. a a 2. Em seguida. boigordo. real peso. Em um frigor´ ıfico existem 90 bois. Problemas e Solu¸˜es co UFMS // calcula o n´mero de trimestres em x anos u n←x∗4 // calcula e exibe rendimento e montante para j de 1 at´ n fa¸a e c r ←i∗c c ←c+r escreva “rendimento do trimestre ”. “: ”. boimagro. os valores e de r e c s˜o exibidos para o usu´rio. o rendimento r ´ calculado e o capital c ´ ca c e e somado a r para totalizar o montante do mˆs. // algoritmo para encontrar o n´mero e o peso do boi mais gordo e u // do boi mais magro de um conjunto de 90 bois u algoritmo encontra n´mero peso // declara¸˜o de vari´veis ca a inteiro num. c fimpara fimalgoritmo O algoritmo inicia com o c´lculo do n´mero de trimestres em x anos. a u j´ que o rendimento deve ser calculado por trimestre e a taxa de juros a i tamb´m ´ dada em fun¸˜o do n´mero de trimestres. j. maiorpeso.

as vari´veis que armazenam o ca a maior e o menor peso precisam possuir algum valor. a id´ia ´ ler e processar as informa¸˜es de cada boi e e co simultaneamente. o peso do boi mais gordo e o peso do boi mais magro. Esta leitura ´ realizada atrav´s de a e e um la¸o para . Problemas e Solu¸˜es co UFMS maiorpeso ← peso menorpeso ← peso // compara os pesos para encontrar o boi mais gordo e o boi mais magro para j de 2 at´ 90 fa¸a e c escreva “entre com o n´mero do pr´ximo boi: ” u o leia num escreva “entre com o peso do pr´ximo boi: ” o leia peso // compara o peso lido com o maior peso at´ ent˜o e a a se peso > maiorpeso ent˜o maiorpeso ← peso boigordo ← num sen˜o a se peso < menorpeso ent˜o a menorpeso ← peso boimagro ← num fimse fimse fimpara // escreve escreva “o escreva “o escreva “o escreva “o fimalgoritmo o n´mero e o peso do boi mais gordo e do boi mais magro u n´mero do boi mais gordo ´: ”. usamos quatro vari´veis. menorpeso e Neste algoritmo.4. a Para encontrar o n´mero e peso do boi mais gordo e o n´mero e peso u u do boi mais magro. boimagro u e peso do boi mais magro ´: ”. Da´ em diante. boigordo u e peso do boi mais gordo ´: ”. lemos as informa¸˜es sobre o primeiro boi separadamente e inicializamos ambas co as vari´veis com o peso do primeiro boi.3. pois n˜o necessitamos guardar as informa¸˜es dos a co 90 bois para depois process´-las.fa¸a. maiorpeso e n´mero do boi mais magro ´: ”. pois sabemos exatamente quantos bois existem: c c 90. Para guardar o n´mero do boi mais gordo. comparamos o peso do boi que acabamos de ler com os at´ ent˜o maior e menor pesos. o n´mero do boi mais u u magro. O problema ´ que para realie a e zarmos esta opera¸˜o pela primeira vez. Para tal. uma para cada dado. podemos prosa ı seguir como imaginamos: comparando tais vari´veis com os valores de a 58 .

feminino) • cor dos olhos (azuis. maioridade. castanhos) • cor dos cabelos (louros. A fim a de indicar o final da entrada. 3. // algoritmo para encontrar a maior idade de um conjunto de indiv´ ıduos // e o percentual de indiv´ ıduos do sexo feminino com idade entre 18 e // 35 anos. o que deve ser a a interpretado pelo algoritmo como fim de entrada. habitantes. castanhos. verdes.3. pretos) Para cada habitante s˜o informados os quatro dados acima. totalhabitantes real porcentagem cadeia sexo. o usu´rio entrar´ com o valor −1 para a idade. ap´s a seq¨ˆncia de dados dos habitano ue tes. e olhos verdes e cabelos louros algoritmo encontra maior idade e percentual // declara¸˜o de vari´veis ca a inteiro idade. cabelos // inicializa algumas vari´veis a maioridade ← −1 habitantes ← 0 totalhabitantes ← 0 // lˆ a idade do primeiro habitante e escreva “entre com a idade do habitante ou -1 para encerrar: ” leia idade // calcula os resultados c enquanto idade = −1 fa¸a escreva “entre com o sexo do habitante: ” leia sexo escreva “entre com a cor dos olhos do habitante: ” leia olhos escreva “entre com a cor dos cabelos do habitante: ” 59 . para serem analisados: • idade em anos • sexo (masculino. olhos. um a um. Uma pesquisa sobre algumas caracter´ ısticas f´ ısicas da popula¸˜o de ca uma determinada regi˜o coletou os seguintes dados.4. referentes a cada a habitante. Problemas e Solu¸˜es co UFMS cada boi. inclusive.

o que nos possibilita utilizar um la¸o do e c c tipo enquanto . isso u ´ poss´ e ıvel. a e quando maioridade for comparada com a idade do primeiro habitante. Entretanto. e c o problema diz que a entrada encerra quando for digitado o n´mero u −1 ao inv´s de uma idade. usamos um n´mero negativo. portanto n˜o a a a c podemos realizar a leitura atrav´s de um la¸o para . idade entre 18 e 35 anos. olhos verdes e cabelos louros) se idade ≥ 18 E (idade ≤ 35) E (sexo =“feminino”) E (olhos =“verdes”) E (cabelos =“louros”) ent˜o a habitantes ← habitantes + 1 fimse // lˆ a idade do pr´ximo habitante e o escreva “entre com a idade do habitante ou -1 para encerrar: ” leia idade fimenquanto // escreve a maior idade e a porcentagem pedida a se totalhabitantes > 0 ent˜o porcentagem ← (habitantes/totalhabitantes) ∗ 100 e escreva “a maior idade ´: ”. ao inv´s de lermos o primeiro habitante a e separadamente para inicializarmos o valor de maioridade com a idade do primeiro habitante. ela sempre vai receber este valor. Problemas e Solu¸˜es co UFMS leia cabelos // compara a idade lida com a maior idade at´ ent˜o e a a se idade > maioridade ent˜o maioridade ← idade fimse // conta o n´mero total de habitantes u totalhabitantes ← totalhabitantes + 1 // conta o n´mero total de habitantes que satisfazem as restri¸˜es u co // (sexo feminino.fa¸a. al´m disso.3. Quanto ` idade. porcentagem fimse fimalgoritmo Este algoritmo difere do anterior em dois aspectos importantes: a entrada de dados e a forma pela qual encontramos a maior idade. maioridade e escreva “a porcentagem ´: ”. pois n˜o existe um valor de idade negativo e. 60 . observe que. Neste caso.fa¸a para ler a entrada.4. Desta vez. n˜o sabemos quantos habitantes ser˜o processados. pois ele sempre ser´ maior do que o a valor negativo de maioridade.

ıvel 4.6 radiano de d´cimo em d´cimo de radiano. // algoritmo para calcular o seno de um n´mero por aproxima¸˜o u ca algoritmo calcula seno // declara¸˜o de vari´veis ca a real a. com A variando de 0 a 1. Problemas e Solu¸˜es co UFMS Finalmente. Escrever um algoritmo para fazer uma tabela de seno de A. sena. o algoritmo calcula a porcentagem pedida de habitantes a e escreve os resultados dentro de uma estrutura condicional se . n u a . O la¸o mais c 61 o seno obtido valor de a ´: ”. O la¸o mais exc c terno tem a finalidade de gerar todos os n´meros de 0 a 1. sena e n´mero de termos usados no c´lculo foi: ”. a e valor do seno de a ´: ”. o que seria um comando imposs´ de ser executado. Escrever tamb´m o n´mero de termos e u utilizado. temos um “aninhamento” de la¸os. dos quais desejamos calcular o seno.6. usando e e a s´rie e A3 A5 + + ··· sen A = A − 3! 5! com erro inferior a 0.1. Isto ´ necess´rio para evitar que o c´lculo de porcentagem e a a seja realizado com o valor de totalhabitantes igual a 0.0001) E (−t ≤ 0.4.ent˜o .3.6 passo 0.1 fa¸a // c´lculo do seno de a a sena ← 0 t←a n←0 repita sena ← sena + t n←n+1 t ← −t ∗ (a ∗ a)/(2 ∗ n ∗ (2 ∗ n + 1)) at´ (t ≤ 0.0001) e fimpara // escreve escreva “o escreva “o escreva “o fimalgoritmo Neste algoritmo. com u incremento de 0.0001.fimse. t inteiro n // gera todos os valores de a para c´lculo do seno a e c para a de 0 at´ 1.

por sua vez. Inc. Introduction to Computing and Algorithms. 1998. et. em valor absoluto. indicando que o valor at´ ent˜o em sena possui uma precis˜o de 0.0001) E (−t ≤ 0. Algoritmos Estruturados. um repita . e a a a5 a3 a2 =− × . 62 .L. Shackelford. tem a finalidade de calcular o seno do valor atual de a gerado pelo la¸o mais externo. Observe que se t ´ o n-´simo termo da s´rie. multiplicandoe e se por este o que falta para se obter aquele. a Um termo da s´rie ´ sempre calculado a partir do anterior. O valor do termo ´ are mazenado em t. um termo da s´rie ´ calculado e adicionado ` e e e a vari´vel sena. 2. 5! 3! 2 × 2 × (2 × 2 + 1) Bibliografia O texto deste cap´ ıtulo foi elaborado a partir dos livros abaixo relacionados: 1. Editora Guanabara. Farrer. Problemas e Solu¸˜es co UFMS interno.at´. A cada repeti¸˜o do la¸o mais c ca c interno. 1989. ent˜o o e e e a (n + 1)-´simo termo pode ser obtido da seguinte forma: e t=t× Por exemplo.0001. R.4.at´ encerra apenas quando o pr´ximo termo t a ser c e o adicionado a sena for inferior.3. 2 × n × (2 × n + 1) A express˜o condicional “(t ≤ 0. H. AddisonWesley Longman.0001. a2 . al. a 0.0001)” garante que a o la¸o repita .

a a 2. Dados trˆs n´meros naturais. 12. 9. u 11. determinar a soma ue u dos n´meros pares. calcular xn . 7. Dados trˆs n´meros inteiros. Exemplo: Para n = 6. Dados o n´mero n de alunos de uma turma de Programa¸˜o de Comu ca putadores I e suas notas de primeira prova. 8. Determinar o n´mero de dias e a u desse mˆs com temperaturas abaixo de zero. 6. ıda a 63 . Dado n. imprimir em ordem u a crescente os n primeiros naturais que s˜o m´ltiplos de i ou de j ou de a u ambos. determinar n!. imprimi-los em ordem crescente. MS. ıda a 6. 4. 2. 3. onde a nota m´ ınima ´ 0 e a nota e m´xima ´ 100. 3. e u 3. Dado n natural. u 5. Durante os 31 dias do mˆs de mar¸o foram tomadas as temperaturas e c m´dias di´rias de Campo Grande. 8. Dados n e dois n´meros naturais n˜o nulos i e j. i = 2 e j = 3 a sa´ dever´ ser 0. Dados n e uma seq¨ˆncia de n n´meros inteiros. 5. Determinar em que dia desse mˆs ocorreu e a maior venda e qual foi a quantidade de discos vendida nesse dia. Dada uma cole¸˜o de n´meros naturais terminada por 0.Lista de Exerc´ ıcios 1. a e 10. e 7. Dado n. 4. imprimir seus ca u quadrados. verificar se eles formam os lados de um e u triˆngulo retˆngulo. Dados x inteiro e n um natural. imprimir os n primeiros naturais ´ ımpares. Exemplo: Para n = 4 a sa´ dever´ ser 1. determinar a maior e a menor nota obtidas por essa turma. Uma loja de discos anota diariamente durante o mˆs de abril a quane tidade de discos vendidos. calcular a soma dos n primeiros n´meros naturais.

Considere o conjunto H = H1 ∪ H2 de pontos reais. Determinar o montante de cada mˆs durante este per´ e ıodo. pois 4 · 5 · 6 = 120. y) e c e ue verifica se cada ponto pertence ou n˜o ao conjunto H. determine o n´mero harmˆnico Hn definido por u o n Hn = k=1 1 . y ≥ 0 e x se cada ponto pertence ou n˜o a H. onde H1 = {(x. y) que pertencem ` figura H (veja a figura 4. O algoritmo a deve tamb´m contar o n´mero de pontos da seq¨ˆncia que pertencem e u ue a H. e Dado n natural. e 14. verificar se n ´ triangular. Dizemos que um n´mero natural ´ triangular se ´ produto de trˆs u e e e n´meros naturais consecutivos. calcular as ra´ u ızes de uma equa¸˜o do ca segundo grau da forma ax2 + bx + c = 0. y)|x ≥ 0. k 17. y ≤ 0. verifique que x ≥ 0. ıcio 18.1) s˜o tais a a 2 + y 2 ≤ 1.Lista de Exerc´ ıcios UFMS 13. Uma pessoa aplicou um capital de x reais a juros mensais de y durante 1 ano. y + x2 + 2x − 3 ≤ 0} H2 = {(x. Dados n pontos reais (x. a y H x ´ Figura 4. Dado um natural n. y)|x ≤ 0. y).1: Area H de um quarto de um c´ ırculo. 16. e 15. Veja o exerc´ 17. b e c. u Exemplo: 120 ´ triangular. Imprimir a solu¸˜o em uma ca das seguintes formas: 64 . Dados n´meros reais a. verificar se p ´ primo. Os pontos (x. y + x2 − 2x − 3 ≤ 0} Fa¸a um algoritmo que lˆ uma seq¨ˆncia de n pontos reais (x. Dado p inteiro. 19.

15) 23. Dados dois n´meros inteiros positivos. Calcular a m´dia aritm´tica das provas de cada aluno. Por isso. tinha o apelido de Bonacci. a c 22. Exemplo: 28 ´ perfeito. Naquela ´poca. este matem´tico ´ mais conhecido como Leonardo de Pisa ou Leonardo Pisano. dizemos que n ´ perfeito se for igual ` soma e a de seus divisores positivos diferentes de n. onde o u u crit´rio de aprova¸˜o ´ m´dia ≥ 5. a e 2 65 . o n´mero de aprovados e o n´mero de reprovados. u a Seu pai.0. a m´dia e e e da classe. O n-´simo ue e n´mero da seq¨ˆncia de Fibonacci Fn ´ dado pela seguinte f´rmula de u ue e o recorrˆncia: e Matem´tico italiano do s´culo XII. e 24. determinar o m´ximo divisor u a comum entre eles utilizando o algoritmo de Euclides.Lista de Exerc´ ıcios a. O nome do matem´tico era Leonardo Fibonacci (⋆ –† ). Para n alunos de uma determinada classe s˜o dadas as 3 notas das a provas. Leonardo Fibonacci2 conseguiu modelar o ritmo de crescimento da popula¸˜o de coelhos atrav´s de uma seq¨ˆncia de n´meros naturais que ca e ue u passou a ser conhecida como seq¨ˆncia de Fibonacci. que quer dizer “pessoa simples”. e uma pessoa ilustre tinha seu sobrenome associado ao lugar a que pertencia. pois 1 + 2 + 4 + 7 + 14 = 28 e Verificar se um dado inteiro positivo ´ perfeito. e ca e e 21. Dadas as popula¸˜es de Caarap´ (MS) e Rio Negro (MS) e sabendo que co o a popula¸˜o de Caarap´ tem um crescimento anual de x e a popula¸˜o ca o ca de Rio Negro tem um crescimento anual de y determine: (a) se a popula¸˜o da cidade menor ultrapassa a da maior. REAIS DISTINTAS raiz 1 raiz 2 c. Guglielmo. Leornardo foi postumamente conhecido como Fibonacci (filius Bonacci). ca (b) quantos anos passar˜o antes que isso aconte¸a. DUPLA raiz b. UFMS COMPLEXAS parte real parte imagin´ria a 20. conhecido pela descoberta dos n´meros de Fiboa e u nacci e pelo seu papel na introdu¸˜o do sistema decimal ar´bico para escrita e manipula¸˜o ca a ca de n´meros na Europa. Exemplo: 24 9 1 15 6 1 9 3 1 6 0 2 3 = mdc(24. Dado n inteiro positivo.

imprimi-lo na ordem inversa de seus d´ ıgitos. ıda a 28. Escreva um algoritmo que imprima todos os n´meros de quatro alu garismos cuja raiz quadrada seja a soma das dezenas formadas pela divis˜o acima. 2 27.Lista de Exerc´ ıcios   F1 = 1 F = 1  2 Fi = Fi−1 + Fi−2 para i ≥ 3. Dizemos que um n´mero i ´ congruente m´dulo m a j se i mod m = u e o j mod m. transform´-lo para a base u a a decimal. Exemplo: Dado 26578 a sa´ dever´ ser 87562. a Exemplo: 66 . Fa¸a um algoritmo que dado n calcula Fn . 5314 : 53 e 14. transform´-lo para a base u a bin´ria. Dado um n´mero inteiro positivo n que n˜o cont´m um d´ u a e ıgito 0. o 26. Dado um n´mero natural na base bin´ria. Exemplo: 35 ´ congruente m´dulo 4 a 39. Dados n. ıda a 29. Dado um n´mero natural na base decimal. a Exemplo: Dado 18 a sa´ dever´ ser 10010. pois 1 · 24 + 0 · 23 + 0 · 22 + 1 · ıda a 1 + 0 · 20 = 18. c UFMS 25. j e m naturais n˜o nulos. Qualquer n´mero natural de quatro algarismos pode ser dividido em u duas dezenas formadas pelos seus dois primeiros e dois ultimos d´ ´ ıgitos. Exemplo: Dado 10010 a sa´ ser´ 18. Exemplos: 1297 : 12 e 97. imprimir os n primeiros naturais a congruentes a j m´dulo m. pois 35 mod 4 = 3 = 39 mod e o 4.

Lista de Exerc´ ıcios √ UFMS 9801 = 99 = 98 + 01. u o ue Exemplo: A seq¨ˆncia 5 . u 31. 8... 9801 ´ um dos n´meros a ser impresso. determinar quantos ue u segmentos de n´meros iguais consecutivos comp˜em essa seq¨ˆncia. Dado um inteiro positivo n. o e (b) f´rmula do termo geral. 4. + n n−1 n−2 1 pelas seguintes maneiras: (a) f´rmula de recorrˆncia. 4. 5. a Exemplos: Na seq¨ˆncia 5. 2. 8. Portanto. 7. e ´ o segundo algarismo de n ´ igual ao se pen´ltimo algarismo. e u 30. 1. Exemplos: 567765 ´ pal´ e ındrome. calcular e imprimir o valor da seguinte soma 2 3 n 1 + + + . a e 32. 33. a e Na seq¨ˆncia 10. 4. 10. 32423 ´ pal´ e ındrome. 5 o comprimento do segue mento crescente m´ximo ´ 4. 9. e u e assim sucessivamente. Dado um n´mero natural n. ue u determinar o comprimento de um segmento crescente de comprimento m´ximo. Dizemos que um n´mero natural n com pelo menos 2 algarismos ´ u e pal´ ındrome se o primeiro algarismo de n ´ igual ao seu ultimo algarismo. 567675 n˜o ´ pal´ a e ındrome. 2. Dados um inteiro positivo n e uma seq¨ˆncia de n n´meros inteiros. verificar se n ´ pal´ u e ındrome. n ≥ 10. 2 . 2 o comprimento de um segmento ue crescente m´ximo ´ 1. 7. 4. Dados n e uma seq¨ˆncia de n n´meros inteiros. 1 ´ formada por 5 segue e mentos de n´meros iguais. o 67 . 4. 3.

0001. o 35. at´ que Ti < ε. o e (f) f´rmula do termo geral. 1! 3! 5! (2k + 1)! 2k+1 x incluindo todos os termos Ti = (−1)k (2k+1)! . π =4− + − + − 3 5 7 9 11 Fazer um algoritmo para calcular e imprimir o valor de π atrav´s da e s´rie acima. cada qual terminada por 0. 68 . calcular uma aproxima¸˜o para cos x atrav´s dos n primeiros termos da seguinte s´rie: e cos x = 1 − x2k x2 x4 x6 + − + . Dadas n seq¨ˆncias de n´meros inteiros. ue u calcular a soma dos n´meros pares de cada seq¨ˆncia. ca (c) adi¸˜o separada dos termos positivos e dos termos negativos da ca esquerda para a direita. . ca (b) adi¸˜o dos termos da esquerda para a direita. (e) f´rmula de recorrˆncia... 37.. Dados x real e n natural. .. ε > 0. Dados x e ε reais. + (−1)k + . adicionar apenas os termos cujo valor absoluto seja maior ou igual a 0. com precis˜o de 4 casas decimais. calcular uma aproxima¸˜o para sen x atrav´s ca e da seguinte s´rie infinita e sin x = x x2k+1 x3 x5 − + − . + (−1)k + . 2! 4! 6! (2k)! Compare com os resultados de sua calculadora..Lista de Exerc´ ıcios UFMS 34. Compare e com os resultados de sua calculadora. . determinar todos os inteiros entre u 1 e n que s˜o comprimento de hipotenusa de um triˆngulo retˆngulo a a a com catetos inteiros. Fa¸a um algoritmo que calcula a soma c 1− 1 1 1 1 1 + − + .. u ue 39... 38. Uma maneira de calcular o valor do n´mero π ´ utilizar a seguinte u e s´rie: e 4 4 4 4 4 + . + − 2 3 4 9999 10000 pelas seguintes maneiras: (a) adi¸˜o dos termos da direita para a esquerda. Para obter a precis˜o e a a desejada. (d) adi¸˜o separada dos termos positivos e dos termos negativos da ca direita para a esquerda. Dado um n´mero inteiro positivo n. . ca e 36.

determinar o m´ximo divisor comum entre a eles. Sabe-se que um n´mero da forma n3 ´ igual ` soma de n n´meros u e a u ´ ımpares consecutivos. y) tais que x ≤ m e y ≤ n. a a e a 41. Exemplo: 13 23 33 43 . 69 . Dados n inteiros positivos. entre todos os pares de n´meros u naturais (x. . 42. Dados dois naturais m e n. .Lista de Exerc´ ıcios UFMS 40. Dado um n´mero inteiro positivo. 43. Dados n n´meros inteiros positivos. calcular a soma dos que s˜o priu a mos. =1 =3+5 = 7 + 9 + 11 = 13 + 15 + 17 + 19 Dado m. determine os ´ ımpares consecutivos cuja soma ´ igual a n3 e para n assumindo valores de 1 a m. determine a sua decomposi¸˜o em u ca fatores primos. determinar. um par para o qual o valor da express˜o xy − x2 + y seja m´ximo e calcular tamb´m esse m´ximo. e 44. calculando tamb´m a multiplicidade de cada fator.

soma ← 0 e c para i de 1 at´ 5 fa¸a 70 . Como vocˆ bem sabe. n˜o admitem decomposi¸˜o. tais como vetores. mas que nos permitir˜o resolver a problemas mais complexos do que aqueles vistos at´ agora. Neste Cap´ ıtulo.1 Vetores Considere o seguinte problema: Calcule a m´dia aritm´tica das notas de 5 alunos de uma discie e plina e determine o n´mero de alunos que tiveram nota superior u a e ` m´dia calculada. ao inv´s a e e de elementar.Estruturas de Dados 5 Como visto no Cap´ ıtulo 3. matrizes e registros. o c´lculo da m´dia aritm´tica das notas de 5 alunos e a e e de uma disciplina pode ser resolvido atrav´s de uma estrutura de repeti¸˜o e ca como a que segue: . . tipos de dados elementares s˜o caracterizados a pelo fato que seus valores s˜o atˆmicos. caracter e l´gico est˜o entre os tipos de dados e o a elementares suportados pela maioria das linguagens de programa¸˜o. e a organiza¸˜o de cada componente e as rela¸˜es entre eles ca co constitui o que chamamos de estrutura de dados. a o e a ca Os tipos de dados num´rico. isto ´. e 5. se os valores de um tipo de dados admitem decomposi¸˜o em valores ca mais simples. Entreca tanto. estudaremos as estruturas de dados mais elementares. ent˜o o tipo de dados ´ dito complexo ou estruturado. .

5.1. Vetores

UFMS

leia nota soma ← soma + nota fimpara media ← soma/5 . . . Entretanto, se seguirmos com este trecho de algoritmo, como determinaremos quantos alunos obtiveram nota superior ` m´dia calculada? Isto porque a e n˜o temos as notas de cada um dos 5 alunos depois que o trecho acima for a executado. Logo, devemos optar por outro caminho, que pode ser este que segue abaixo: // algoritmo para calcular a m´dia de 5 notas e escrever e // quantos alunos obtiveram nota superior ` m´dia a e e algoritmo calcula m´dia e notas superiores // declara¸˜o de constantes e vari´veis ca a inteiro soma, media, nota1, nota2, nota3 inteiro nota4, nota5, num // leitura das notas leia nota1, nota2, nota3, nota4, nota5 // c´lculo a soma das notas a soma ← nota1 + nota2 + nota3 + nota4 + nota5 // c´lculo da m´dia a e media ← soma/5 // c´lculo das notas superiores ` m´dia a a e num ← 0 a se nota1 > media ent˜o num ← num + 1 fimse se nota2 > media ent˜o a num ← num + 1 fimse se nota3 > media ent˜o a num ← num + 1 fimse

71

5.1. Vetores

UFMS

se nota4 > media ent˜o a num ← num + 1 fimse se nota5 > media ent˜o a num ← num + 1 fimse // escreve o n´mero de alunos com nota superior ` m´dia u a e escreve “o n´mero de alunos com nota superior ` m´dia ´: ”, num u a e e fimalgoritmo Como podemos constatar, n˜o fomos capazes de utilizar uma estrutura de a repeti¸˜o para calcular quantas notas eram superiores ` m´dia, mesmo emca a e bora houvesse 5 estruturas condicionais idˆnticas, a menos da vari´vel com e a o valor da nota, para realizar o c´lculo desejado. No caso do problema a acima, esta redundˆncia n˜o chega a ser um “fardo”, mas se tiv´ssemos 100, a a e 1000, ou mesmo 1000000 de notas, esta solu¸˜o seria invi´vel, uma vez que ca a ter´ ıamos de escrever, respectivamente, 100, 1000 ou 1000000 de estruturas condicionais semelhantes, uma para cada nota. Felizmente, para problemas como este, temos uma forma eficaz de solu¸˜o, que utiliza uma estrutura de ca dados denominada vetor.

5.1.1

Definindo uma Estrutura de Dados Vetor

A estrutura de dados vetor ´ uma estrutura de dados linear utilizada e para armazenar uma lista de valores do mesmo tipo. Um dado vetor ´ e definido como tendo algum n´mero fixo de c´lulas idˆnticas. Cada c´lula u e e e armazena um, e somente um, dos valores de dados do vetor. Cada uma das c´lulas de um vetor possui seu pr´prio endere¸o, ou ´ndice, atrav´s do qual e o c ı e podemos referenci´-la. Por exemplo, a primeira c´lula de um vetor possui a e ´ ındice 1, a quarta possui ´ ındice 4, e assim por diante. Ao definirmos um vetor, estamos na verdade especificando a estrutura de dados de um novo tipo de dados, o tipo de dados vetor, pois este tipo, ao contr´rio dos tipos primitivos, n˜o est´ “pronto para uso” e, portanto, a a a deve ser definido explicitamente dentro do algoritmo. Temos tamb´m que a e defini¸˜o de uma estrutura de dados ´ parte da especifica¸˜o de um tipo de ca e ca dados complexo, que, como sabemos, tamb´m consiste na especifica¸˜o das e ca opera¸˜es sobre o conjunto de valores do tipo. Entretanto, no momento, veco remos a defini¸˜o de tipos complexos como composta apenas da especifica¸˜o ca ca da estrutura de dados. 72

5.1. Vetores

UFMS

N´s podemos definir um vetor atrav´s da especifica¸˜o de um identifio e ca cador para um tipo vetor, suas dimens˜es e o tipo de dados dos valores que o ele pode armazenar. Isto ´ feito da seguinte forma: e definatipo vetor[li ..ls ] de <tipo dos elementos> <nome do tipo> onde • definatipo e vetor s˜o palavras-chave; a • tipo dos elementos ´ o nome do tipo dos elementos do vetor; e • nome do tipo ´ um identificador para o tipo sendo definido; e • li e ls s˜o respectivamente os limites inferior e superior do vetor. a Por exemplo, para criarmos um vetor de 5 elementos inteiros chamado vetor notas, fazemos: definatipo vetor[1..5] de inteiro vetor notas O n´mero de elementos (c´lulas) de um vetor ´ dado por ls − li + 1 e u e e o´ ındice do primeiro elemento (c´lula) ´ li , do segundo ´ li + 1, e assim e e e por diante. Isto significa que dois vetores a e b com valores li e ls sejam 1 e 5 e 7 e 11, respectivamente, possuem o mesmo n´mero de elementos: u ındice 5 = 5 − 1 + 1 = 11 − 7 + 1; entretanto, o primeiro elemento de a possui ´ ındice 7. 1, enquanto o primeiro elemento de b possui ´

5.1.2

Declarando e Manipulando Vari´veis do Tipo Vetor a

Para declararmos uma vari´vel de um tipo vetor, procedemos exatamente a da mesma forma que para um tipo simples. Por exemplo, considere a cria¸˜o ca de uma vari´vel denominada notas do tipo vetor notas: a vetor notas notas Esta declara¸˜o significa que estamos criando uma vari´vel notas que ´ ca a e do tipo vetor notas, ou seja, um vetor de inteiros com 5 posi¸˜es de ´ co ındices 1 a 5. Uma vez declarada a vari´vel notas, podemos atribuir qualquer a conjunto de 5 valores num´ricos ` vari´vel. Entretanto, isto n˜o ´ feito da e a a a e forma mais natural, tal como

73

−10) mas sim individualmente. um valor por vez a cada c´lula do vetor. De forma geral. escrita.3 Problemas e Solu¸˜es Envolvendo Vetores co Vamos iniciar esta subse¸ao resolvendo de forma eficaz o problema estac˜ belecido no in´ deste Cap´ ıcio ıtulo: 1. 33. 0. atribui o valor −1 ` c´lula de ´ a e ındice 1 do vetor. No caso particular ca a do vetor notas. a c´lula de ´ e ındice i de notas.LS] de real vetor notas // declara¸˜o de vari´veis ca a vetor notas notas real soma. e assim por diante. usamos o nome da vari´vel. Vetores UFMS notas ← (−1. pode ser usada em qualquer parte de um algoritmo em que uma vari´vel inteira possa ser usada. o ´ a ındice da c´lula e uma sintaxe pr´pria. // algoritmo para calcular a m´dia de 5 notas e escrever e // quantos alunos obtiveram nota superior ` m´dia a e e algoritmo calcula m´dia e notas superiores // declara¸˜o de constantes ca defina LI 1 defina LS 5 // declara¸˜o de tipos ca definatipo vetor[LI.1.. a Isto significa que podemos ter comandos tais como leia notas[1]. Calcule a m´dia aritm´tica das notas de 5 alunos de uma disciplina e e e determine o n´mero de alunos que tiveram nota superior ` m´dia u a e calculada. sejam elas e a ca a leitura. ou seja. media inteiro num. as c´lulas. atribui¸˜o. e Para tal. express˜o. e o Por exemplo.5. i // lˆ e calcula a m´dia das notas e e soma ← 0 74 .1. notas[0] ← −1. notas[i]. escreva notas[1] e notas[2] ← notas[1] + 1. e n˜o a vari´vel do tipo vetor como um todo. 1. e a a ´ que s˜o utilizadas em qualquer opera¸˜o envolvendo a vari´vel. 5.

maior. leia 10 valores para esta vari´vel e ent˜o escreva a a o maior e o menor valor do vetor e suas respectivas posi¸˜es no vetor.5. pmenor.LS] de inteiro vetor10 // declara¸˜o de vari´veis ca a vetor10 n inteiro i.1.. co // algoritmo para ler um vetor de 10 elementos e depois escrever // o maior e o menor elemento e suas respectivas posi¸˜es co algoritmo encontra menor maior // declara¸˜o de constantes ca defina LI 1 defina LS 10 // cria um tipo vetor de n´meros u definatipo vetor[LI. pmaior // lˆ 10 n´meros e armazena-os em um vetor e u e c para i de LI at´ LS fa¸a escreva “Entre com o elemento ”. Escreva um algoritmo que declare uma vari´vel de um tipo vetor de a 10 elementos inteiros. “ do vetor: ” 75 . menor. num u a e e fimalgoritmo 2. i − LI + 1. Vetores UFMS para i de LI at´ LS fa¸a e c leia notas[i] soma ← soma + notas[i] fimpara // c´lculo da m´dia a e media ← soma/(LS − LI + 1) // c´lculo das notas superiores ` m´dia a a e num ← 0 para i de LI at´ LS fa¸a e c se notas[i] > media ent˜o a num ← num + 1 fimse fimpara // escreve o n´mero de alunos com nota superior ` m´dia u a e escreve “o n´mero de alunos com nota superior ` m´dia ´: ”.

5. pmenor e escreva “O maior valor ´: ”. simultaneamente. u a // algoritmo para determinar e escrever as matr´ ıcula iguais de duas // de duas disciplinas ıculas iguais // algoritmo determina matr´ 76 . ca ca a e ca Para tal.1. est˜o dispon´ a ıveis os n´meros de matr´ u ıcula dos alunos de Programa¸˜o de Computadores (no m´ximo 60) e de Introdu¸˜o ` Ciˆncia ca a ca a e da Computa¸˜o (no m´ximo 80). Vetores UFMS leia n[i] fimpara // determina menor e maior e suas posi¸˜es co menor ← n[LI] maior ← n[LI] pmenor ← 1 pmaior ← 1 e c para i de LI + 1 at´ LS fa¸a se menor > n[i] ent˜o a menor ← n[i] pmenor ← i − LI + 1 sen˜o a se maior < n[i] ent˜o a maior ← n[i] pmaior ← i − LI + 1 fimse fimse fimpara // escreve o menor e o maior valor e suas posi¸˜es co escreva “O menor valor ´: ”. maior escreva “A posi¸˜o do maior valor ´: ”. Considere que cada conjunto de n´meros u de matr´ ıcula encerre com a matr´ ıcula inv´lida 9999. as disciplinas Programa¸˜o de Computadores e Introdu¸˜o ` Ciˆncia da Computa¸˜o. menor e ca e escreva “A posi¸˜o do menor valor ´: ”. pmaior ca e fimalgoritmo 3. ca a Escreva um algoritmo que leia cada conjunto de n´meros de matr´ u ıcula dos alunos e escreva as matr´ ıculas daqueles que est˜o cursando as duas a disciplinas ao mesmo tempo. de forma que o a algoritmo saiba quando o conjunto de n´meros j´ foi lido. O Departamento de Computa¸˜o e Estat´ ca ıstica (DCT) da UFMS deseja saber se existem alunos cursando.

Vetores UFMS // declara¸˜o de constantes ca defina LI 1 defina LSP C 60 defina LSICC 80 // declara¸˜o de tipos ca definatipo vetor[LI. Se existirem. escreve // as matr´ ıculas iguais.LSP C] de inteiro vetorpc definatipo vetor[LI. j..LSICC] de inteiro vetoricc // declara¸˜o de vari´veis ca a vetorpc vpc vetoricc vicc inteiro i.5..1. para k de LI at´ i fa¸a e c l ← LI c enquanto l ≤ j fa¸a se vpc[k] = vicc[l] ent˜o a escreva vpc[k] l ←j+1 sen˜o a 77 . l. num // lˆ as matr´ e ıculas dos alunos de Programa¸˜o de Computadores ca i ← LI − 1 leia num enquanto num = 9999 fa¸a c i←i+1 vpc[i] ← num leia num fimenquanto // lˆ as matr´ e ıculas dos alunos de Introdu¸˜o ca // ` Ciˆncia da Computa¸˜o a e ca j ← LI − 1 leia num c enquanto num = 9999 fa¸a j ← j +1 vicc[j] ← num leia num fimenquanto // verifica se existem matr´ ıculas iguais. k.

// algoritmo para inverter a ordem dos elementos de um vetor sem // utilizar vetor auxiliar algoritmo inverte // declara¸˜o de constantes ca defina LI 1 defina LS 100 // cria um tipo vetor de n´meros u definatipo vetor[LI.1.LS] de inteiro vet int // declara¸˜o de vari´veis ca a vet int v inteiro i..5. Vetores UFMS l ← l+1 fimse fimenquanto fimpara fimalgoritmo 4. Escreva um algoritmo que recebe um inteiro 0 < n ≤ 100 e um vetor de n n´meros inteiros cuja primeira posi¸˜o ´ 1 e inverte a ordem dos u ca e elementos do vetor sem usar outro vetor. temp // entrada de dados leia n para i de 1 at´ n fa¸a e c leia v[i] fimpara // troca os elementos com seus sim´tricos e para i de 1 at´ n DIV 2 fa¸a e c temp ← v[i] v[i] ← v[n − i + 1] v[n − i + 1] ← temp fimpara // sa´ dos resultados ıda e c para i de 1 at´ n fa¸a escreva v[i] 78 .

. isto ´.. LI 2. enquanto LS 2 − LI 2 + 1. tabela ´ um tipo vetor de coluna. pois cada um e de seus elementos ´ do tipo vetor de n´meros do tipo coluna! e u Uma forma alternativa para definir o tipo tabela acima (e preferida pelos desenvolvedores de algoritmo) ´ a seguinte: e defina defina defina defina LI 1 1 LS 1 4 LI 2 1 LS 2 5 definatipo vetor[LI 1.LS 1.LS 2] de coluna tabela Neste exemplo. como estamos acostumados e a criar. um tipo cuja e estrutura de dados ´ um vetor bidimensional (uma matriz). Entretanto. Isto ´. os quais a denominamos matrizes. as constantes LI 1. coluna ´ um tipo vetor de n´meros. e a a podemos declarar e manipular vetores com mais de uma dimens˜o.. escrevendo as seguintes linhas: defina defina defina defina LI 1 1 LS 1 4 LI 2 1 LS 2 5 definatipo vetor[LI 1. um tipo cuja e u e estrutura de dados ´ um vetor unidimensional. denominada tabela. e u o n´mero de colunas.LS 1] de inteiro coluna definatipo vetor[LI 2. LS 1 − LI 1 + 1 ´ n´mero de linhas da tabela. podemos definir uma estrutura de dados matriz 4 por 5 (uma tabela com 4 linhas e 5 colunas). LI 2 e LS 2 estabelecem o n´mero de elementos da tabela.2.5. Matrizes UFMS fimpara fimalgoritmo 5. ou seja. ca u e LS 1.2 Matrizes Os vetores que estudamos at´ ent˜o s˜o todos unidimensionais. Por exemplo. u 79 .LS 2] de inteiro tabela Tanto em uma forma de defini¸˜o quanto na outra. Mas..

em vez de apenas 1. leia valores para esta vari´vel e escreva e a a soma dos elementos de cada linha da matriz. O primeiro ´ ındice identifica a posi¸˜o do elemento na primeira dimens˜o. Matrizes UFMS Uma vez definido o tipo tabela. enquanto o segundo. bem como a soma de todos os elementos.1 Problemas e Solu¸˜es Envolvendo Matrizes co 1. para referenciar cada elemento desta matriz. Por exemplo. Por ` exemplo. j] ← 0 fimpara fimpara . a a linha abaixo declara uma vari´vel denominada mat do tipo tabela: a tabela mat A partir da´ podemos manipular a vari´vel mat utilizando dois ´ ı. Se imagica a ındice corresponde ` linha a narmos mat como uma tabela. ent˜o o primeiro ´ da tabela em que o elemento se encontra. para i de LI 1 at´ LS 1 fa¸a e c para j de LI 2 at´ LS 2 fa¸a e c mat[i. Isto pode ser feito com o seguinte trecho de c´digo: o .2.5. podemos declarar uma vari´vel deste tipo a da mesma maneira que declaramos vari´veis dos demais tipos. 5. . j] ´ usada para a e referenciarmos o elemento da linha i e coluna j da matriz mat. a ındices. . enquanto o ca a a segundo identifica a posi¸˜o do elemento na segunda dimens˜o. A sintaxe mat[i. O la¸o mais externo ´ respons´vel por variar o ´ c e a ındice que representa a posi¸˜o do elemento na primeira dimens˜o da matriz. enquanto o la¸o ca a c mais interno ´ utilizado para variar o ´ e ındice que representa a posi¸˜o do ca elemento na segunda dimens˜o da matriz. a coluna. Escreva um algoritmo que declare uma vari´vel de um tipo matriz de a 4 por 5 elementos num´ricos. suponha que desejemos atribuir o valor 0 a todos os elementos da matriz mat. .2. . Observe que um aninhamento de la¸os foi utilizado para “varrer” toda a c matriz. // algoritmo para determinar e escrever a soma dos elementos das linhas // de uma matriz 4 por 5 e a soma de todos os elementos da matriz algoritmo soma por linha e de linhas de matriz 80 .

j − LI 2 + 1. LI 2. somalin. j. Matrizes UFMS // declara¸˜o de constantes ca defina LI 1 1 defina LS 1 4 defina LI 2 1 defina LS 2 5 // declara¸˜o de tipos ca definatipo vetor[LI 1. “ da matriz” leia mat[i. somalin // acumula a soma das linhas para encontrar a soma total somatot ← somatot + mat[i.“: ”.5. somatot // leitura dos elementos da matriz e c para i de LI 1 at´ LS 1 fa¸a para j de LI 2 at´ LS 2 fa¸a e c escreva “entre com o elemento ”.LS 1. j] fimpara fimpara // soma elementos por linha e totaliza somatot ← 0 e c para i de LI 1 at´ LS 1 fa¸a // calcula a soma da linha i − LI 1 + 1 somalin ← 0 para j de LI 2 at´ LS 2 fa¸a e c somalin ← somalin + mat[i. i − LI 1 + 1. j] fimpara // exibe a soma da linha i − LI 1 + 1 escreva “A soma dos elementos da linha ”. j] fimpara // exibe a soma total e escreva “A soma de todos os elementos ´: ”. somatot fimalgoritmo 81 ... i − LI 1 + 1.“ e ”.LS 2] de inteiro tabela // declara¸˜o de vari´veis ca a tabela mat inteiro i.2.

// algoritmo para multiplicar duas matrizes algoritmo produto de matrizes // defini¸˜o de constantes ca defina LI 1 defina LS 50 // defini¸˜o de tipos ca definatipo vetor[LI. j] ← 0 para k de 1 at´ m fa¸a e c C[i. j. Matrizes UFMS 2. com n ≤ 50.5. p para i de 1 at´ n fa¸a e c para j de 1 at´ m fa¸a e c leia A[i.2. Dadas duas matrizes An×m e Bm×p . m. LI.. k. j] fimpara fimpara // C´lculo da matriz produto a e c para i de 1 at´ n fa¸a para j de 1 at´ p fa¸a e c C[i.LS. p // entrada de dados leia n. j] + C[i. C inteiro i. m. j] ← A[i.LS] de inteiro matriz // declara¸˜o de vari´veis ca a matriz A. m ≤ 50 e p ≤ 50. B.. n. Obter a matriz matriz Cm×p onde C = AB. j] fimpara fimpara para i de 1 at´ m fa¸a e c para j de 1 at´ p fa¸a e c leia B[i. k] ∗ B[k. j] fimpara fimpara fimpara // escrita da matriz C e c para i de 1 at´ n fa¸a 82 .

5.3. Registros

UFMS

para j de 1 at´ p fa¸a e c escreva C[i, j] fimpara fimpara fimalgoritmo

5.3

Registros

Um registro ´ uma estrutura de dados que agrupa dados de tipos dise tintos ou, mais raramente, do mesmo tipo. Um registro de dados ´ composto e por um certo n´mero de campos de dado, que s˜o itens de dados individuu a ais. Por exemplo, suponha que desejemos criar um algoritmo para manter um cadastro dos empregados de uma dada companhia. Neste cadastro, temos os seguintes dados para cada empregado: • Nome do empregado. • CPF do empregado. • Sal´rio do empregado. a • Se o empregado possui ou n˜o dependentes. a Ent˜o, cada ficha deste cadastro pode ser representada por um registro a que cont´m os campos nome, CPF, sal´rio e indica¸˜o de existˆncia de e a ca e dependentes. Neste caso, a natureza dos campos ´ bem diversificada, pois e nome pode ser representado por uma cadeia, CPF e sal´rio por valores a num´ricos e existˆncia de dependentes por um valor l´gico. e e o

5.3.1

Definindo uma Estrutura de Registro

A sintaxe para defini¸˜o de um novo tipo registro ´ a seguinte: ca e definatipo registro < tipo do campo1 > < campo1 > < tipo do campo2 > < campo2 > . . . < tipo do campon > < campon > fimregistro <nome do tipo>

83

5.3. Registros

UFMS

onde nome do tipo ´ o nome do tipo registro cuja estrutura est´ sendo e a criada, campoi ´ o nome do i-´simo campo do registro e tipo do campoi ´ o e e e tipo do i-´simo campo do registro. e Como exemplo, vamos criar um registro para representar uma ficha do cadastro de empregados dado como exemplo anteriormente: definatipo registro cadeia nome inteiro CPF real salario l´gico temdep o fimregistro regficha

5.3.2

Criando e Manipulando Vari´veis de Registros a

Uma vez que um tipo registro tenha sido definido, podemos criar tantas vari´veis daquele tipo quanto desejarmos, assim como fazemos com qualquer a outro tipo complexo visto at´ ent˜o. Por exemplo, para criarmos trˆs fichas e a e de empregado para o nosso exemplo do cadastro, escrevemos: regficha ficha1, ficha2, ficha3

Cada uma dessas trˆs vari´veis ´ um registro do tipo regficha e, portanto, e a e cada uma delas possui quatro campos de dado: nome, CPF, salario e temdep. Assim como vari´veis de vetores e matrizes, vari´veis registros s˜o maa a a nipuladas atrav´s de suas partes constituintes. Em particular, uma vari´vel e a registro ´ manipulada atrav´s de seus campos. Ent˜o, se desejarmos atribuir e e a um valor a uma vari´vel registro, temos de efetuar a atribui¸˜o de valores a ca para seus campos constituintes, um de cada vez. Como exemplo, considere a seguinte atribui¸˜o do conjunto de valores “Beltrano de Tal”, 123456789, ca a a 1800000 e falso ` vari´vel f icha1: f icha1.nome ← “Beltrano de Tal” f icha1.CP F ← 123456789 f icha1.salario ← 180.00 f icha1.temdep ← falso A partir deste exemplo, podemos verificar que o acesso a cada campo de uma vari´vel registro ´ realizado atrav´s da escrita do nome da vari´vel a e e a 84

5.3. Registros

UFMS

registro seguido de um ponto (.) que, por sua vez, ´ seguido pelo nome do e campo.

5.3.3

Vetores de Registros

Registros nos fornecem uma forma de agrupar dados de natureza distinta. Entretanto, criarmos uma unica vari´vel de um registro complexo ´ a n˜o parece ser muito diferente de criarmos uma vari´vel para cada campo a a do registro e trat´-las individualmente. Isto ´, criar uma unica vari´vel de a e ´ a um registro complexo n˜o nos ajudaria a resolver nossos problemas mais a facilmente do que com o que aprendemos antes. A grande for¸a dos regisc tros reside no uso deles combinado com vetores. Por exemplo, um grupo de 100 empregados iria requerer um conjunto de 100 vari´veis registros, o a que pode ser conseguido atrav´s da cria¸˜o de um vetor de 100 elementos e ca do tipo registro em quest˜o! a Um vetor de registros ´ criado da mesma forma que criamos vetores de e qualquer dos tipos que aprendemos at´ ent˜o. Suponha, por exemplo, que e a e desejemos criar um vetor de 100 elementos do tipo regficha. Isto ´ feito da seguinte forma: defina LI 1 defina LS 100 definatipo registro cadeia nome inteiro CPF real salario l´gico temdep o fimregistro regficha definatipo vetor[LI..LS] de regficha vetcad Agora, considere a declara¸˜o de uma vari´vel do tipo vetcad: ca a vetcad cadastro Para manipular um registro individual do vetor cadastro, utilizamos o nome da vari´vel vetor e o ´ a ındice do elemento correspondente ao registro que queremos acessar, como fazemos com um vetor de qualquer outro tipo. Da´ ı em diante, procedemos como aprendemos na Subse¸˜o 5.3.2. Por exemplo, ca 85

3. Suponha. podemos ter um registro de cujo um ou mais campos s˜o de um outro a tipo de registro ou vetores.numcc ← 4555 86 . 00 cadastro[1].agencia ← 666 f icha.conta.banco ← “Banco de Pra¸a” c f icha. tamb´m. atrav´s de suas partes ca e e constituintes. n´mero da agˆncia e n´mero da conta banc´ria.nome ← “Sicrano de Tal” cadastro[1]. Vejamos u e u a como ficaria a nova defini¸˜o de regficha: ca definatipo registro cadeia banco inteiro agencia inteiro numcc fimregistro regbanco definatipo registro cadeia nome inteiro CPF real salario l´gico temdep o regbanco conta fimregistro regficha O fato do campo conta de regbanco ser um outro registro faz com que a manipula¸˜o deste campo seja realizada. por exemplo. 987654321.temdep ← verdadeiro 5.4 Registro de Tipos Complexos Assim como combinamos vetores e registros para criar vetores de registro.3.conta. fazemos: cadastro[1].5. 540. 00 e verdadeiro ao primeiro registro de cadastro. temos a a de manipular o campo conta de ficha como segue: f icha. Ent˜o. Este campo pode ser um outro registro contendo os campos nome do banco. se criarmos uma vari´vel ficha do tipo regficha.salario ← 540. que queremos adicionar um campo ao nosso registro regficha para representar a conta banc´ria do a empregado.CP F ← 987654321 cadastro[1].conta. Registros UFMS se quisermos atribuir o conjunto de valores “Sicrano de Tal”.

e um e registro que cont´m uma matriz e um vetor..NUMPROVAS] de caracter mat gab definatipo registro inteiro codigo mat gab X vet ac A fimregistro regcand definatipo vetor[1. Registros UFMS 5.5. De acordo com a descri¸˜o do a ca problema. Logo. ‘b’. temos um gabarito.. vocˆ dever´ escrever um algoe a ritmo que ler´ os dados de cada candidato e o gabarito das provas. O algoritmo ´ dado a seguir: e // algoritmo para calcular o n´mero de acertos de u // candidatos ao vestibular algoritmo vestibular // defini¸˜o de constantes ca defina NUMQUEST 40 defina NUMPROVAS 5 defina NUMCAND 5000 // defini¸˜o de tipos ca definatipo vetor[1. Para tal.. que ´ representado por uma matriz. Cada candidato possui um tal e registro. Considere a resposta a cada quest˜o de prova como sendo um dos cinco a caracteres ‘a’.3.. calcular´ a a o n´mero de acertos de cada candidato em cada prova e escrever´ o n´mero u a u de acertos dos candidatos em cada prova.NUMCAND] de regcand vet cand //declara¸˜o de vari´veis ca a 87 .5 Um Problema Envolvendo Registros Suponha que vocˆ tenha sido contratado pela Copeve para construir e parte de um programa para calcular o n´mero de acertos em prova dos u candidatos ao vestibular da UFMS.NUMQUEST. ‘d’ e ‘e’. o conjunto de todos os candidatos pode ser representado por um vetor de registros. 1.NUMPROVAS] de inteiro vet ac definatipo vetor[1.3. Vamos iniciar a constru¸˜o da solu¸˜o deste problema pela defini¸˜o ca ca ca dos tipos e estruturas de dados necess´rios. ‘c’.

n. “da prova”.A[j] ← soma fimpara fimpara //Sa´ dos resultados ıda e c para k de 1 at´ n fa¸a 88 .X[i. j. j] fimpara fimpara //leitura da quantidade de candidatos escreva “Quantidade de candidatos” leia n //leitura dos dados dos candidatos para k de 1 at´ n fa¸a e c escreva “C´digo do candidato:” o leia candidato[k].X[i][j] ent˜o a soma ← soma + 1 fimse fimpara candidato[k].5. soma //leitura da matriz de gabarito e c para j de 1 at´ N U M P ROV AS fa¸a para i de 1 at´ N U M QU EST fa¸a e c escreva “Resposta da quest˜o”. “da prova”. Registros UFMS mat gab G //matriz contendo o gabarito vet cand candidato // vetor de registros contendo os dados dos candidatos inteiro i. i. i.codigo e c para j de 1 at´ N U M P ROV AS fa¸a para i de 1 at´ N U M QU EST fa¸a e c escreva “Resposta da quest˜o”. j a leia G[i. j a leia candidato[k].3. j] fimpara fimpara fimpara //C´lculo dos acertos de cada candidato a e c para k de 1 at´ n fa¸a para j de 1 at´ N U M P ROV AS fa¸a e c soma ← 0 para i de 1 at´ N U M QU EST fa¸a e c se G[i][j] = candidato[k]. k.

5.A[j]. et.3.L. candidato[k]. 1998. Farrer. Shackelford. 89 . Inc. al.codigo o e c para j de 1 at´ N U M P ROV AS fa¸a escreva candidato[k]. 1989. Algoritmos Estruturados. AddisonWesley Longman. “acertos na prova”. H. Editora Guanabara. Registros UFMS escreva “C´digo:”. j fimpara fimpara fimalgoritmo Bibliografia O texto deste cap´ ıtulo foi elaborado a partir dos livros abaixo relacionados: 1. Introduction to Computing and Algorithms. 2. R.

Deseja-se calcular e imprimir sem repeti¸˜o os raios das circunferˆncias centradas ca e no ponto (x. un n´mero natural a u n e as coordenadas reais de n pontos. Exemplo: 90 . imprimi-la em ordem inversa ` de ue u a leitura. 2. Deseja-se publicar o n´mero de acertos de cada aluno em uma prova em u forma de testes. Para isso. ambos com n elementos. A prova consta de 30 quest˜es. Para isso s˜o dados: a o cart˜o gabarito. c Sabendo que uma roleta cont´m 37 n´meros (de 0 a 36). ele fez n lan¸amentos nesta roleta. D e E. 3. a o cart˜o de respostas de cada aluno. a e u 7. p ´ subn´mero de q. Um jogador viciado de cassino deseja fazer um levantamento estat´ ıstico simples sobre uma roleta. sendo que o n´mero a u u de d´ ıgitos de p ´ menor ou igual ao n´mero de d´ e u ıgitos de q. S˜o dadas as coordenadas reais x e y de um ponto. cada uma com cinco o alternativas identificadas por A. q = 57238. 6. Tentando descobrir se um dado era viciado. com 1 ≤ n ≤ 100. determinar o produto escalar desses vetores.Lista de exerc´ ıcios Vetores 1. Dados os n resultados dos lan¸amentos. q = 258347. e u Exemplos: p = 23. Dada uma seq¨ˆncia de n n´meros. S˜o dados dois n´meros inteiros positivos p e q. y) que passem por pelo menos um dos n pontos dados. p n˜o ´ subn´mero de q. u e 4. contendo o seu n´mero a u e suas respostas. Verificar se p ´ um subn´ mero de q. ue u c 5. um dono de cassino o lan¸ou n vezes. e u p = 23. B. Dados dois vetores x e y. C. determinar o c c n´mero de ocorrˆncias de cada face. calcular a e u freq¨ˆncia de cada n´mero desta roleta nos n lan¸amentos realizados.

e assim por diante .12. Exemplo: 91 . 3.5). com n par. u Exemplo: Para a palavra ANA e a frase: ANA E MARIANA GOSTAM DE BANANA. determinar os n´meros que ue u u comp˜em a seq¨ˆncia e o n´mero de vezes que cada um deles ocorre o ue u na mesma.3. (b) Dois pontos est˜o na mesma circunferˆncia se est˜o ` mesma a e a a distˆncia do centro. Dizemos que uma seq¨ˆncia de n elementos. 9.7 ocorre ocorre ocorre ocorre ocorre 3 1 2 1 1 vezes vez vezes vez vez 10.0.0).0. −1. . (1.0. . 1. Temos que a palavra ocorre 4 vezes na frase.162. −2.0 1. y) = (1. ´ balanceada ue e se as seguintes somas s˜o todas iguais: a a soma do maior elemento com o menor elemento. a soma do terceiro maior elemento com o terceiro menor elemento.Lista de exerc´ ıcios UFMS   (x. 1.2). n = 5.0). 0.5. −1. a e e Observa¸˜es: co (a) A distˆncia entre os pontos (a.01 e 3. (0.0 0. (0. Dada uma seq¨ˆncia de n n´meros reais.  Pontos:(−1. determine o n´mero de vezes que a palavra ocorre na frase. 1. Exemplo: n=8 Seq¨ˆncia: ue Sa´ ıda: −1.0. a 8. (4.0.7 3. 0. d) ´ a e (a − c)2 + (b − d)2 .0). Dadas duas cadeias (uma contendo uma frase e outra contendo uma palavra).5 2.3 −1.7.0. 2. b) e (c. a soma do segundo maior elemento com o segundo menor elemento.0) Nesse caso h´ trˆs circunferˆncias de raios 1.0.7.0. 0. 2.5. 2. 2.

an (coeficientes reais do polinˆmio). 1 5 4 3 5 2 5 3 4 5 1 92 . dois fich´rios em a ca a uma biblioteca. Dado o polinˆmio p(x) = a0 + a1 x + . por exemplo. obter uma unica seq¨ˆncia ordenada contendo u ´ ue todos os elementos das seq¨ˆncias originais sem repeti¸˜o. o 16. + an xn e q(x) = b0 + b1 x + . . x2 . determine os coeficientes reais da primeira derivada de p(x). Chama-se seq¨ˆncia de Farey relativa ` n a seq¨ˆncia de fra¸˜es ue a ue co racionais irredut´ ıveis. calcular a seq¨ˆncia u ue de n´meros que representa a soma dos dois inteiros. . u Exemplo: n = 8. . . a1 . + bm xm determinar o produto desses dois polinˆmios. os valores de n e o e de a0 . Dados dois polinˆmios reais o p(x) = a0 + a1 x + . . . + an xn em k o pontos distintos. xn . 12. . de k e dos pontos o x1 . Calcule o valor do polinˆmio p(x) = a0 + a1 x + . . . os termos α da seq¨ˆncia de Farey. 14. . 15. . Dados n (n par) e uma seq¨ˆncia de n n´meros inteiros. . verificar se ue u essa seq¨ˆncia ´ balanceada. interpretaue u das como dois n´meros inteiros de n algarismos. a o de a0 . . . . isto ´. dispostas em ordem crescente. . . 1a seq¨ˆncia ue 2a seq¨ˆncia ue 8 3 1 2 3 6 4 7 1 3 5 8 4 2 6 2 3 5 5 3 8 1 7 8 + 1 13. com denominadores positivos e n˜o maiores que n. . . . . .Lista de exerc´ ıcios UFMS 2 12 3 6 16 15 ´ uma seq¨ˆncia balanceada. . . an . s˜o: a 0 1 1 1 2 1 3 2 3 4 1 . . . Dados dois n´meros naturais m e n e duas seq¨ˆncias ordenadas com u ue m e n n´meros inteiros. ue e 11. pois 16 + 2 = e ue 15 + 3 = 12 + 6. a Exemplo: Se n = 5. . . an xn . Dadas duas seq¨ˆncias com n n´meros inteiros entre 0 e 9. tais que 0 ≤ ue α ≤ 1. . ue ca Sugest˜o: imagine uma situa¸˜o real. S˜o dados os valores de n (grau do polinˆmio). a1 .

Dada uma seq¨ˆncia x1 . determine os termos α. x2 . 8. −6. a 17. podemos utilizar o seguinte processo. . ue Utilizando o m´todo descrito. . . . 0 ≤ α ≤ 1. −3. Come¸amos com as fra¸˜es c co 0 1 i k co 1 e 1 . 4. isto ´. . 1]? 93 . xi+m−1 = xi+m . xi+1 . os valores de i e m. .5. Quando ca n˜o for mais poss´ introduzir novas fra¸˜es teremos gerados todos a ıvel co os termos α da seq¨ˆncia de Farey relativa a n. da e seq¨ˆncia de Farey relativa a n. . xi+2m−1 . 9. 3. e entre cada duas fra¸˜es consecutivas j e m . 5. x1 . Exemplo: Na seq¨ˆncia 7. 14. ue Sugest˜o: gere os numeradores e os denominadores em dois vetores. Imprima. 5]? u (c) Qual o conte´do da vari´vel x ap´s a execu¸˜o do comando x = u a o ca A[3. com n inteiro positivo. determinar ue u um segmento de soma m´xima. . . e 5. 9. . Matrizes UFMS Para gerarmos os termos α de uma seq¨ˆncia de Farey tais que 0 ≤ α ≤ ue 1. . −7. xk−1 de k n´meros inteiros.4 Matrizes 1. . Seja a seguinte matriz A: 175 98 40 402 21 225 100 301 4211 3 10 363 302 7213 2 9000 432 6381 992 1 37 156 1 442 9000 475 18 0 7321 2000 (a) Quantos elementos fazem parte do conjunto? (b) Qual o conte´do do elemento identificado por A[4. . tais que 0 ≤ α ≤ 1. Dada uma seq¨ˆncia x0 . introduzimos i+k a fra¸˜o j+m e assim sucessivamente enquanto j + m ≤ n. xi+m+1 .4. 6 existem i = 3 e m = 2. 2] + A[4. xk de n´meros inteiros. ue 18. . 5. . verifique se ue u e existem dois segmentos consecutivos iguais nesta seq¨ˆncia. a soma do ue segmento ´ 33. a Exemplo: Na seq¨ˆncia 5. 10. 2. 4. se ue existem i e m tais que xi . −2. 4. 1. caso existam. .

3] + A[1. j] representa a popula¸˜o do j-´simo munic´ ca e ıpio do i-´simo estado). de 100 linhas e 200 colunas. Um vetor real x com n elementos ´ apresentado como resultado de um e sistema de equa¸˜es lineares Ax = b cujos coeficientes s˜o representaco a dos em uma matriz real Am×n e os lados direitos das equa¸˜es em um co vetor real b de m elementos. calcular a m´dia da popula¸˜o das capitais dos e ca 26 estados. 2.5. E a o n´mero de sua conta e o seu saldo. 2] + A[2. uma letra ca u C ou D indicando se a opera¸˜o ´ de cr´dito ou d´bito e o valor da ca e e e opera¸˜o. 4] + A[2. Dada uma matriz real Am×n . para cada cliente. 3] + A[2. Deseja-se atualizar as contas correntes dos clientes de uma agˆncia e ´ dado o cadastro de n clientes contendo. 1] em um programa em linguagem C? (e) Somar os elementos da quarta coluna (A[1. determine At . 5]). Seja A26×10 uma matriz fornecida. 1] + A[2. determinar o produto de A por V . 3] + A[2. 6. Fazer um programa que dada uma matriz An×m . para cada opera¸˜o. Dada uma matriz real A com m linhas e n colunas e um vetor real V com n elementos. 8. Considerando que a primeira coluna sempre cont´m a popula¸˜o e ca da capital do estado. fazer um programa o que calcule a matriz Cn×m = A + B. Dadas duas matrizes A e B. Verificar se o vetor x ´ realmente solu¸˜o e ca do sistema dado. 1] + A[2. 10. Em seguida.4. calcular o produto de A por B. o cadastro est´ ordenado pelo u a n´mero da conta. 5. 3] + A[3. Emitir o extrato atualizado dos clientes. Dada uma matriz real B. (f) Somar os elementos da terceira linha (A[2. o n´mero da conta. o e 3. escrever um programa que calcule o somat´rio dos elementos da quadrag´sima coluna o e e que calcule o somat´rio da trig´sima linha. 9. banc´ria. Determinar o e n´mero do munic´ u ıpio mais populoso e o n´mero do estado a que peru tence. 3] + A[4. ca 94 . ´ dado o n´mero m de opera¸˜es u e u co efetuadas no dia e. 4. 3]). verificar se existem elementos repetidos em A. Dadas duas matrizes reais Am×n e Bn×p . 7. Matrizes UFMS (d) O que aconteceria caso fosse referenciado o elemento A[5. cujo conte´do ´ a popula¸˜o dos 10 u e ca munic´ ıpios mais populosos dos 26 estados brasileiros (A[i. de dimens˜es n × m.

05 ∗ Sal´rio M´ a ılia a ınimo vigente. e os descontos efetuados: INSS = 0. a Horas Extras = HED ∗ SAL/160 + HEN ∗ 1. Refei¸˜es. Dizemos que uma matriz inteira An×n ´ uma matriz de permuta¸˜o e ca se em cada linha e em cada coluna houver n − 1 elementos nulos e um unico elemento 1. Imposto de Renda = 0. Sal´rio. Descontos Eventuais. co Vales.4.08 ∗ SAL. Faltas = FAL ∗ SAL/160. Sal´rio Bruto = Sal´rio + Horas Extras + Sal´rio Fam´ a a a ılia. a 12. a e finalmente o seu Sal´rio L´ a ıquido: Sal´rio L´ a ıquido = Sal´rio Bruto .5. Sal´rio Fam´ = ND ∗ 0. ´ Exemplo: A matriz  0  0   1 0 abaixo ´ de permuta¸˜o e ca  1 0 0 0 1 0   0 0 0  0 0 1 95 .Descontos.2 ∗ SAL/160. emitir as seguintes informa¸˜es: a co Nome. Deseja-se fazer a emiss˜o da folha de pagamento de uma empresa. a Para cada um dos n funcion´rios s˜o dadas as seguintes informa¸˜es: a a co C´digo o NOME SAL HED HEN ND FAL DE REF VAL Descri¸˜o ca Nome do funcion´rio a Sal´rio do funcion´rio a a Horas extras diurnas Horas extras noturnas N´mero de dependentes u Faltas em horas Descontos eventuais Gastos com refei¸˜es feitas na empresa co Vales retirados durante o mˆs e Para cada funcion´rio.08 ∗ Sal´rio Bruto. Matrizes UFMS 11.

Dizemos que uma matriz quadrada inteira ´ um quadrado m´gico1 e a se a soma dos elementos de cada linha. Exemplo: m=4en=4  1 0 2 3  4 0 5 6   0 0 0 0 0 0 0 0 tem 2 linhas nulas     e 1 coluna nula.4. 14. Dada uma matriz Am×n . a e ca Dada uma matriz inteira An×n . a 1 3 6 10 1 4 10 1 5 1 O primeiro registro conhecido de um quadrado m´gico vem da China e data do segundo a s´culo antes de Cristo. imprimir o n´mero de linhas e o n´mero de u u colunas nulas da matriz. e a Dada uma matriz quadrada inteira An×n . Exemplo: A matriz   8 0 7  4 5 6  3 10 2 ´ um quadrado m´gico. Matrizes UFMS Observe que   2 −1 0  −1 2 0  0 0 1 n˜o ´ de permuta¸˜o. e ca 13.5. a 15. (a) Imprimir as 1 1 1 1 2 1 3 1 4 1 4 . a e 96 . verificar se A ´ um quadrado e m´gico. a soma dos elementos de cada coluna e a soma dos elementos da diagonal principal e secund´ria s˜o a a todas iguais. . . 1 n primeiras linhas do triˆngulo de Pascal2 . verificar se A ´ de permuta¸˜o. e 2 Descoberto em 1654 pelo matem´tico francˆs Blaise Pascal.

e 97 . 1 indica uma casa ocupada por uma pe¸a branca e −1 indica uma casa ocupada por uma pe¸a c c preta. u o n´mero de gols marcados. considerando que uma palavra deve ter pelo menos duas letras.5. u saldo de gols (GM . c (c) n˜o podem se mover. 1 por empate e 0 por derrota). Supondo que as pe¸as pretas est˜o se movendo no sentido cresc a cente das linhas da matriz D. Indicar na matriz as posi¸˜es que s˜o in´ de palavras horico a ıcio zontais e/ou verticais nos quadrados correspondentes (substituindo os zeros). Um jogo de palavras cruzadas pode ser representado por uma matriz Am×n onde cada posi¸ao da matriz corresponde a um quadrado do c˜ jogo. co Exemplo: Dada a matriz  0 −1 0  0 0 0   0 0 −1   −1 0 0 0 0 −1 a sa´ dever´ ser ıda a  1 −1 2  5 6 0   8 0 −1   −1 10 0 13 0 −1  −1 −1 0 −1 0 0 −1 0 0 0 −1 0 0 −1 0 0 0 −1 0 0 0 0 0 −1 −1 −1 −1 3 −1 4 0 −1 7 0 0 −1 9 0 −1 0 11 0 −1 12 0 14 0 0 −1 −1            17. Para isso. n´mero de vit´rias. a 18. numere consecutivamente tais posi¸˜es. c (b) podem mover-se sem tomar pe¸as.GS). sendo que 0 indica uma casa vazia. u o goal average ou m´dia de gols (GM / GS). u n´mero de gols sofridos. Uma matriz D8×8 pode representar a posi¸˜o atual de um jogo de daca mas. 16.4. Matrizes UFMS (b) Imprimir as n primeiras linhas do triˆngulo de Pascal usando a apenas um vetor. sendo que 0 indica um quadrado branco e −1 indica um quadrado preto. Um campeonato de futebol foi disputado por n times identificados pelos seus nomes. determinar as posi¸˜es das pe¸as pretas co c que: (a) podem tomar pe¸as brancas. Para cada time s˜o considerados os seguintes dados: a PG GM GS S V GA n´mero de pontos ganhos (3 por vit´ria.

Cada resultado certo vale 5 pontos (inclusive o placar) ou 3 pontos (apenas o vencedor ou empate). calcular o custo total para cada itiner´rio. A classifica¸˜o ´ ca ´ pelo n´mero de pontos ganhos (PG) e em segundo lugar pelo e u saldo de gols (S). A figura abaixo mostra um exemplo para n = 4. a Exemplo:   4 1 2 3  5 2 1 400     2 1 3 8  7 1 2 5 O custo do itiner´rio 0 3 1 3 3 2 1 0 ´ a e a03 +a31 +a13 +a33 +a32 +a21 +a10 = 3+1+400+5+2+1+5 = 417. . Exemplo: S˜o Paulo. GA. Os elementos aij de uma matriz inteira An×n representam os custos de transporte da cidade i para a cidade j. (c) Um grupo de t torcedores organizou um bol˜o sobre os resultados a dos m jogos. e classifique os times envolvidos como quiser. S. n2 ) e cuja interpreta¸˜o ´ a seguinte: no jogo t1 × t2 o resultado foi ca e n1 × n2 . a 19. 1. q2 ). conforme exista ou n˜o estrada a direta que saia da cidade i e chegue ` cidade j. 3. Por conve¸˜o a ca lii = 1.4. (b) Com os mesmos dados do item (a). V. . cada a um com k cidades. 2 a Palmeiras. qm ). (pm . . Com os dados do item (a) e mais os palpites que s˜o compostos de m a pares de n´meros inteiros (p1 . Assim. Cada resultado ´ representado na forma (t1 . GM. Considere n cidades numeradas de 0 a n − 1 que est˜o interligadas por a uma s´rie de estradas de m˜o unica. cujos elementos lij assumem o valor 1 ou 0. Matrizes UFMS (a) Dados os resultados de m jogos. 2 u . os elementos a da coluna j indicam as estradas que chegam ` cidade j. descubra o nome e e do ganhador do bol˜o. . igual `quela que sai no jornal) dos a n times. onde o iu ´simo par representa o palpite do i-´simo jogo. t2 .5. As liga¸˜es entre as cidades s˜o e a ´ co a representadas pelos elementos de uma matriz quadrada Ln×n . 20. . n1 . q1 ). Se houver empate segundo os dois crit´rios. (p2 . imprima a classifica¸˜o dos ca times no campeonato (do primeiro para o ultimo). imprima uma tabela com todos os dados (PG. Dados n itiner´rios. GS. Milan. 98 . Crici´ma. .

(b) A qual das cidades chega o maior n´mero de estradas? u (c) Dado k. ii. ´ imposs´ (g) Dados k e p. o roteiro representado pela seq¨ˆncia 2 3 2 1 0. ue e ıvel. a ıda (f) Dada uma seq¨ˆncia de m inteiros cujos valores est˜o entre 0 e ue a n − 1. iii. As cidades das quais h´ sa´ sem haver entrada.4. Vocˆ consegue encontrar o menor e caminho entre as duas cidades? 99 . verificar se todas as liga¸˜es diretas entre a cidade k e co outras s˜o de m˜o dupla.5. a a (d) Relacionar as cidades que possuem sa´ ıdas diretas para a cidade k. As cidades isoladas. apesar de haver entrada. As cidade das quais n˜o h´ sa´ a a ıda. determinar se ´ poss´ ir da cidade k para a cidade e ıvel p pelas estradas existentes. com m = 5. No e ıvel exemplo dado. (e) Relacionar. isto ´. Matrizes UFMS (a) Dado k. determinar quantas estradas saem e quantas chegam ` a cidade k. verificar se ´ poss´ realizar o roteiro correspondente. se existirem: i. as que n˜o tˆm liga¸˜o com nee a e ca nhuma outra.

Neste t´pico. durante a execu¸˜o ıvel o ca do algoritmo. realiza uma tarefa espec´ ıfica da solu¸˜o do problema e. ao inv´s de tentar resolver ca e o problema como um todo de uma s´ vez. a constru¸˜o ca o ca de algoritmos atrav´s de modulariza¸˜o possui uma s´rie de vantagens: e ca e • Torna o algoritmo mais f´cil de escrever. O desenvolvedor pode a focalizar pequenas partes de um problema complicado e escrever a solu¸˜o para estas partes. Desta forma. A constru¸˜o de algoritmos compostos por m´dulos. vari´veis. uma de cada vez. cuja solu¸˜o pode ser vista como formada de v´rias ca a subtarefas ou m´dulo.1 O Quˆ e Por Quˆ? e e Um m´dulo nada mais ´ do que um grupo de comandos que constitui o e um trecho de algoritmo com uma fun¸˜o bem definida e o mais independente ca poss´ das demais partes do algoritmo.Modulariza¸˜o ca 6 Os algoritmos que temos constru´ at´ ent˜o s˜o muito simples. veremos como escrever um algoritmo constitu´ de v´rios o ıdo a m´dulos e como estes m´dulos trabalham em conjunto para resolver um o o determinado problema algor´ ıtmico. ılio o a execu¸˜o de um algoritmo contendo v´rios m´dulos pode ser vista como ca a o um processo cooperativo. a maioria dos algoritmos resolve problemas complicados. para ca tal. pode contar com o aux´ de outros m´dulos do algoritmo. cada qual resolvendo uma parte espec´ o ıfica do problema. Cada m´dulo. express˜es condicionais e a o estruturas de controle. ou seja. Entretanto. pois ıdo e a a resolvem problemas simples e apresentam apenas os componentes mais elementares dos algoritmos: constantes. 6. o 100 .

a o ca recebem dados do m´dulo principal e. ele pode. entender cada um deles separadamente ´ menos come plicado do que tentar entender o algoritmo como um todo de uma s´ o vez. • Eleva o n´ ıvel de abstra¸˜o. O corpo de um m´dulo ´ o grupo de comandos que o e comp˜e o trecho de algoritmo correspondente ao m´dulo. como vereo mos mais adiante. evitando que escrevamos a mesma tarefa mais de uma vez no algoritmo. pois como cada m´dulo ´ menor e mais o o e simples do que o algoritmo monol´ ıtico correspondente ao algoritmo modularizado. Uma vez que um m´dulo foi escrito. e a ca o 101 . que organiza e e e ca o coordena o trabalho dos demais m´dulos. J´ a interface o o a de um m´dulo pode ser vista como a descri¸˜o dos dados de entrada e de o ca sa´ do m´dulo. Uma vez que um m´dulo foi criado. que n˜o seja o seu autor. a • Economia de tempo. E poss´ entender o que um algoritmo ca ´ ıvel faz por saber apenas o que os seus m´dulos fazem. sabemos exatamente onde examin´-los. co 6. ser “chamado” quantas vezes quisermos e de onde quisermos no algoritmo. o que nos poupar´ tempo.6. O conhecimento da interface de um m´dulo ´ tudo o que ıda o o e ´ necess´rio para a utiliza¸˜o correta do m´dulo em um algoritmo. podemos o utiliz´-lo em outros algoritmos sem que eles sejam modificados. da a mesma forma que usamos os operadores leia e escreva em nossos algoritmos. espa¸o e esfor¸o. Componentes de um m´dulo o UFMS • Torna o algoritmo mais f´cil de ler. antes de iniciar a execu¸˜o. O fato do algoritmo estar a dividido em m´dulos permite que algu´m. devolvem o o ca resultado de suas computa¸˜es. A maneira mais intuitiva de proceder ` modulariza¸˜o de problemas a ca ´ realizada atrav´s da defini¸˜o de um m´dulo principal. necesc c u sitamos executar uma mesma tarefa em v´rios lugares de um mesmo a algoritmo. o e a possa entender o algoritmo mais rapidamente por tentar entender os seus m´dulos separadamente.2.2 Componentes de um m´dulo o Os m´dulos que estudaremos daqui em diante possuem dois componeno tes: corpo e interface. O m´dulo principal solicita a execu¸˜o dos o ca v´rios m´dulos em uma dada ordem. os quais. e de m´dulos espec´ o o ıficos para cada uma das subtarefas do algoritmo. a c c • Estende a linguagem. o e se os detalhes nos interessam. espa¸o e esfor¸o. Al´m disso. sem que haja a o necessidade de entender os detalhes internos aos m´dulos. ao final da execu¸˜o. Freq¨entemente.

pois ele vai produzir um valor de sa´ ca ıda. n˜o produzindo valores de sa´ a a ıda. assim como uma fun¸˜o em Matem´tica. Ela pode ser vista como uma express˜o que ´ avaliada para um unico a e ´ valor. ele deve ser implementado como uma u e a fun¸˜o. As diferen¸as entre as defini¸˜es de fun¸˜o e procedimento permitem c co ca determinar se um m´dulo para uma dada tarefa deve ser implementado como o uma fun¸˜o ou procedimento. se um m´dulo para determinar ca o o menor de dois n´meros ´ necess´rio.3 Ferramentas para Modulariza¸˜o ca H´ dois tipos de m´dulos: a o • fun¸˜o: uma fun¸˜o ´ um m´dulo que produz um unico valor de sa´ ca ca e o ´ ıda. o ca • parˆmetros de sa´ a ıda. ele deve ser implementado como um procedimento. que permitem que valores sejam passados do m´dulo para o algoritmo que solicitou sua execu¸˜o. Qualquer algoritmo o que use um m´dulo deve utilizar os parˆmetros que s˜o especificados na ino a a terface do m´dulo para se comunicar com ele. Por outro lado. o 6. que permitem tanto a passagem de valores para o m´dulo quanto a passagem de valores do m´dulo para o o o algoritmo que solicitou sua execu¸˜o.6. que permitem que valores sejam passados a para um m´dulo a partir do algoritmo que solicitou sua execu¸˜o. Existem o a trˆs tipos de parˆmetros: e a • parˆmetros de entrada. Ferramentas para Modulariza¸˜o ca UFMS A interface de um m´dulo ´ definida em termos de parˆmetros. sua sa´ ıda. Por exemplo. Veremos mais adiante que os parˆmetros de sa´ e de entrada e sa´ modificam a ıda ıda 102 . ca Quando criamos um m´dulo. e o ca • parˆmetros de entrada e sa´ a ıda.3. Vamos considerar que a produ¸˜o de um valor de sa´ por uma fun¸˜o ca ıda ca ´ diferente da utiliza¸˜o de parˆmetros de sa´ ou de entrada e sa´ e ca a ıda ıda. Isto determina a interface do m´dulo. Um o e a parˆmetro ´ um tipo especial de vari´vel que o valor de um dado seja a e a passado entre um m´dulo e qualquer algoritmo que possa us´-lo. se um m´dulo o para determinar o maior e o menor valor de uma seq¨ˆncia de n´meros ´ ue u e requerido. pois ele vai produzir dois valores de sa´ ıda. especificamos o n´mero e tipos de parˆmetros o u a que ele necessita. ca a • procedimento: um procedimento ´ um tipo de m´dulo usado para e o v´rias tarefas.

ca a 6. enquanto corpo ´ a seq¨ˆncia e ca a o e ue de instru¸˜es do m´dulo. ca O corpo de uma fun¸˜o ´ uma seq¨ˆncia de comandos que comp˜e a ca e ue o fun¸˜o e que sempre finaliza com um comando especial denominado coca mando de retorno. a interface ´ uma descri¸˜o dos parˆmetros do m´dulo. Como dito antes. A interface de uma fun¸˜o tem a seguinte forma co o ca geral: fun¸˜o <tipo de retorno> <nome> (<lista de parˆmetros formais>) ca a onde • nome ´ um identificador unico que representa o nome da fun¸˜o. Por e ıda ca exemplo: retorna x 103 . Criando Fun¸˜es e Procedimentos co UFMS o valor de uma vari´vel do algoritmo que a chamou. O comando de retorno ´ da seguinte forma e retorna <valor de retorno> onde valor de retorno ´ o valor de sa´ produzido pela fun¸˜o.4. a e a ca • tipo de retorno ´ o tipo do valor de retorno da fun¸˜o. e ca Por exemplo: fun¸˜o real quadrado (real r) ca Logo ap´s a descri¸˜o da interface podemos descrever o corpo do algoo ca ritmo. precisamos consca truir as seguintes partes: interface e corpo. e ´ ca • lista de parˆmetros formais ´ uma lista dos parˆmetros da fun¸˜o.6. utilizamos ca fimfun¸˜o. diferentemente do valor a de sa´ produzido por uma fun¸˜o que ser´ um valor a ser usado em uma ıda ca a atribui¸˜o ou evolvido em alguma express˜o.4 Criando Fun¸˜es e Procedimentos co A fim de escrevermos uma fun¸˜o ou procedimento. Para delimitar os comandos que fazem parte da fun¸˜o.

Vamos denominar esta fun¸˜o de quadrado. que calcular´ o seu quadrado e o devolver´ para o ca a a algoritmo que a solicitou. Suponha que desejemos construir um procedimento para ler um n´mero e passar o n´mero lido para o u u 104 . utilizamos fimprocedimento. Por exemplo. Suponha que desejemos construir ca uma fun¸˜o para calcular o quadrado de um n´mero. e ´ • lista de parˆmetros formais ´ uma lista dos parˆmetros do procedia e a mento.4. pois apenas fun¸˜es possuem tal tipo de comando.6. como ca mostrado a seguir: // fun¸˜o para calcular o quadrado de um n´mero ca u fun¸˜o real quadrado (real r) ca // declara¸˜o de vari´veis ca a real x // calcula o quadrado x←r∗r // retorna o quadrado calculado retorna x fimfun¸˜o ca A interface de um procedimento tem a seguinte forma geral: a procedimento <nome> (<lista de parˆmetros formais>) onde • nome ´ um identificador unico que representa o nome do procedimento. O n´mero deve ser ca u u passado para a fun¸˜o. Criando Fun¸˜es e Procedimentos co UFMS Vejamos um exemplo de uma fun¸˜o. co Para delimitar os comandos que fazem parte do procedimento. procedimento ler n´mero (ref real val) u O corpo de um procedimento ´ uma seq¨ˆncia de comandos que n˜o pose ue a sui comando de retorno. Vejamos um exemplo de um procedimento.

O algoritmo segue abaixo: // algoritmo para calcular e exibir o quadrado de um n´mero u // fornecido como entrada algoritmo calcula quadrado // declara¸˜o de vari´veis ca a real num. x // lˆ um n´mero e u 105 . Denominemos este procedimento de ler n´mero. ca u respectivamente. como mostrado a seguir: // procedimento para ler um n´mero u procedimento ler n´mero (ref real val) u // Solicita a entrada do n´mero u u escreva “Entre com um n´mero:” leia val fimprocedimento Aqui.5. que antecede o nome da vari´vel na lista u a de parˆmetros formais do procedimento. Como exemplo.5 Chamando Fun¸˜es e Procedimentos co Fun¸˜es e procedimentos n˜o s˜o diferentes apenas na forma como s˜o co a a a implementados. A chamada de uma fun¸˜o a ´ usada como um valor constante que deve ser atribu´ a uma vari´vel ou e ıdo como parte de uma express˜o. deve ser realizada. val ´ o parˆmetro de sa´ que conter´ o valor de entrada que e a ıda a ser´ passado para o algoritmo que solicitar a execu¸˜o do procedimento a ca ler n´mero. enquanto a chamada de um procedimento ´ a e realizada como um comando a parte. e ca ca ca ou simplesmente chamada. considere um algoritmo para ler um n´mero e exibir o u u seu quadrado. mas tamb´m na forma como a solicita¸˜o da execu¸˜o deles. Chamando Fun¸˜es e Procedimentos co UFMS algoritmo que solicitou a execu¸˜o do algoritmo atrav´s de um parˆmetro ca e a u de sa´ ıda. vistos antes. A palavra-chave ref. Este algoritmo deve utilizar o procedimento ler n´mero e a fun¸˜o quadrado. para ler o n´mero e obter o seu quadrado.6. ´ utilizada para definir val como a e parˆmetro de sa´ ou entrada e sa´ a ıda ıda. 6.

portanto. ordem e tipo com a lista de prˆmetros formais. Os parˆmetros formais s˜o o a a aqueles da declara¸˜o do m´dulo. ap´s a execu¸˜o do procedimento. Na chamada do procedimento. assim sendo. num ´ um parˆmetro de sa´ u e a ıda. ca e ca A vari´vel num ´ denominada parˆmetro real.6. u a 6. como definido na interface do procedimento. o ca num conter´ o valor lido dentro do procedimento. A lista de parˆmetros reais deve concordar ca o a em n´mero. Um parˆmetro real a e a a especifica um valor passado para o m´dulo pelo algoritmo que o chamou o ou do m´dulo para o algoritmo que o chamou. Por exemplo. e. O o valor do parˆmetro real (uma constante ou o valor de uma vari´vel ou exa a press˜o) de entrada ´ atribu´ ao parˆmetro formal quando da chamada do a e ıdo a procedimento/fun¸˜o. temos uma insca tru¸˜o por si s´. na chamada ca 106 . e ıda ca u Tanto na chamada do procedimento ler n´mero quanto na chamada da fun¸˜o quadrado. temos um parˆmetro: a vari´vel num. J´ na chamada da fun¸˜o a a ca quadrado. o valor de num ´ passado para a fun¸˜o.6 Passagem de Parˆmetros a Os valores dos parˆmetros reais de entrada s˜o passados por um mecaa a nismo denominado c´pia. num ´ um parˆmetro de entrada. como definido na interface da e a fun¸˜o. e. x fimalgoritmo Note a diferen¸a da chamada do procedimento ler n´mero para a chac u mada da fun¸˜o quadrado. ıda a e O mecanismo de passagem por c´pia funciona da seguinte forma. a chamada da fun¸˜o ocupa o lugar de um ca o ca valor ou express˜o em uma instru¸˜o de atribui¸˜o.6. Na chamada do ca a a procedimento ler n´mero. Por outro lado. Isto porque a chamada a ca ca quadrado(num) ´ substitu´ pelo valor de retorno da fun¸˜o. Passagem de Parˆmetros a UFMS ler n´mero(num) u // calcula o quadrado do n´mero lido u x ← quadrado(num) // escreve o quadrado u e escreva “O quadrado do n´mero ´:”. enquanto os valores dos parˆmetros reais de sa´ o a ıda e entrada e sa´ s˜o passados por um mecanismo denominado referˆncia.

nesta condi¸˜o. ca a e ca Sendo assim. Quando ´ feita a leitura do dado e e e armazenada em val. assim. temos apenas o algoritmo principal. Os m´dulos escritos deno tro de m´dulos de segundo n´ s˜o ditos m´dulos de terceiro n´ o ıvel a o ıvel. num e val contˆm o mesmo valor. s˜o ditos pertencerem ao segundo n´ ca a ıvel. Em particular. o parˆmetro formal passa a compartilhar a mesma ´rea ca a a de armazenamento de parˆmetro real.6. o escopo de um m´dulo determina quais s˜o os demais o a m´dulos do algoritmo que podem chamar-lhe e quais ele pode chamar. E assim sucessivamente. quando da chamada do proe cedimento/fun¸˜o. quando a chamada u ler n´mero(num) ´ executada.7 Escopo de Dados e C´digo o O escopo de um m´dulo (ou vari´vel) de um algoritmo ´ a parte ou o a e partes do algoritmo em que o m´dulo (ou vari´vel) pode ser referenciado. qualquer altera¸˜o no valor a ca do parˆemtro formal feita pelo procedimento/fun¸˜o acarretar´ uma moa ca a difica¸˜o no parˆmetro real quando do t´rmino do procedimento/fun¸˜o. uma vez que n˜o faz sentido modificar a a o valor de uma constante ou de uma express˜o. o Os m´dulos de um algoritmo s˜o organizados por n´ o a ıveis. a assim. No mecanismo de passagem por referˆncia. Aqueles m´dulos que devem ser o acessados pelo algoritmo principal devem ser escritos dentro dele e. a a Devemos observar que os parˆmetros reais de sa´ e de entrada e sa´ a ıda ıda devem obrigatoriamente ser vari´veis. No primeiro n´ ıvel. esta atualiza¸˜o afetar´ o valor de num. Por exemplo: // algoritmo para calcular o quadrado de um n´mero fornecido u // como entrada 107 . o a Quando iniciamos o estudo de modulariza¸˜o ´ natural nos perguntarmos ca e qual ´ o escopo de um dado m´dulo e das constantes ou vari´veis nele presene o a tes. Ao t´rmino ca a e do procedimento a vari´vel num conter´ o valor atualizado.7. a 6. Escopo de Dados e C´digo o UFMS x ← quadrado(num) o valor da vari´vel num ´ atribu´ ao parˆmetro formal r da fun¸˜o quaa e ıdo a ca drado. a vari´vel real num e a vari´vel formal val (que est´ precedida e a a a da palavra chave ref) compartilham uma mesma ´rea de armazenamento.

Escopo de Dados e C´digo o UFMS algoritmo calcula quadrado // m´dulo para c´lculo do quadrado de um n´mero o a u fun¸˜o real quadrado (quadrado r) ca // declara¸˜o de vari´veis ca a real x // calcula o quadrado x←r∗r // passa para o algoritmo chamador o valor obtido retorna x fimfun¸˜o ca // m´dulo para ler um n´mero o u u procedimento ler n´mero (ref real val) // solicita um n´mero ao usu´rio u a u escreva “Entre com um n´mero: ” leia val fimprocedimento // declara¸˜o de constantes e vari´veis ca a real num. desej´vamos que a fun¸˜o quadrado e o procedimento ler n´mero a ca u fossem chamados pelo m´dulo principal e. x fimalgoritmo Aqui. escrevemos tais m´dulos o o dentro do m´dulo principal. por isso.6. x // lˆ um n´mero e u u ler n´mero(num) // calcula o quadrado x ← quadrado(num) // escreve o quadrado u e escreva “O quadrado do n´mero ´: ”.7. no segundo n´ o ıvel da hierarquia modular do 108 .

mas pode ser referenciada a partir dele. De acordo com as regras ca e de escopo descritas anteriormente. S1 cont´m e o e mais dois m´dulos. enquanto o m´dulo F 1 pode ser acessado por todos os m´dulos. S2. A regra para determinar o escopo de um m´dulo ´ bastante simples: um o e m´dulo X escrito dentro de um m´dulo A qualquer pode ser acessado apenas o o pelo m´dulo A ou por qualquer m´dulo escrito dentro de A ou descendente o o (direto ou n˜o) de algum m´dulo dentro de A. F 1. ca // algoritmo para o encontrar e exibir o menor de dois n´meros u algoritmo encontra menor de dois // m´dulo para encontrar o menor de dois n´meros o u fun¸˜o inteiro menor de dois (inteiro a. considere um algoritmo no qual o m´dulo principal o cont´m outros quatro m´dulos. veremos trˆs problemas envolvendo fun¸˜es e procedimentos ca e co e suas respectivas solu¸˜es. Problemas e Solu¸˜es co UFMS algoritmo. F 2. Escreva um algoritmo para ler dois n´meros e exibir o menor dos u dois. A verifica¸˜o de qual deles ´ o menor deve ser realizada por uma ca e fun¸˜o. Neste curso. co 1. Esta sio e o tua¸˜o ´ ilustrada por um diagrama na Figura ??. Vari´veis podem ser locais ou globais.6. a o 6. b) ca // declara¸˜o de vari´veis ca a inteiro menor menor ← a se a > b ent˜o a menor ← b 109 . Uma a ca e a ca vari´vel ´ dita global a um m´dulo quando ela n˜o est´ declarada no a e o a a m´dulo.8 Problemas e Solu¸˜es co Nesta se¸˜o. o m´dulo F 3 s´ pode ser chamado por o o o o S1 e S3. nenhum m´dulo poder´ refea a e o a renciar uma vari´vel declarada em outro m´dulo. S3 e F 3. a o e o vari´vel x da fun¸˜o quadrado ´ uma vari´vel local a esta fun¸˜o. Por sua vez. a o Como exemplo. S1. considerao remos que vari´veis s˜o sempre locais. e F 2 cont´m os m´dulos S4 e F 4. isto ´. Por exemplo.8. Uma vari´vel (constante) ´ dita a a e local a um m´dulo se ela ´ declarada naquele m´dulo.

// algoritmo para o encontrar e exibir o menor e o maior de trˆs e // n´meros u algoritmo encontra min max // m´dulo para encontrar o menor e o maior de trˆs n´meros o e u procedimento min max(inteiroa. z e fimalgoritmo 2. y) // escreve o menor dos dois escreva “O menor dos dois ´: ”. max) // encontra o maior dos trˆs e se a ≥ b e a ≥ c ent˜o a max ← a sen˜o a se b ≥ c ent˜o a max ← b sen˜o a max ← c fimse fimse 110 . c. Escreva um algoritmo para ler trˆs n´meros e exibir o maior e o menor e u dos trˆs.6. ref inteiro min. Problemas e Solu¸˜es co UFMS fimse retorna menor fimfun¸˜o ca // declara¸˜o de constantes e vari´veis ca a inteiro x. y. b. y // obt´m o menor dos dois e z ← menor de dois(x. A obten¸˜o do maior e do menor n´mero deve ser realizada e ca u por um procedimento. z // lˆ dois n´meros e u escreva “Entre com dois n´meros: ” u leia x.8.

8. menor. y. menor e e escreva “O maior dos trˆs ´: ”. Escreva um algoritmo para ler trˆs n´meros e escrevˆ-los em ordem n˜o e u e a decrescente.6. maior) // escreve o menor e o maior dos trˆs e e e escreva “O menor dos trˆs ´: ”. Utilize. y. z. maior // lˆ trˆs n´meros e e u e u escreva “Entre com trˆs n´meros: ” leia x. Problemas e Solu¸˜es co UFMS // encontra o menor dos trˆs e se a ≤ b e a ≤ c ent˜o a min ← a sen˜o a se b ≤ c ent˜o a min ← b sen˜o a min ← c fimse fimse fimprocedimento // declara¸˜o de constantes e vari´veis ca a inteiro x. maior fimalgoritmo 3. b) // declara¸˜o de vari´veis ca a inteiro aux 111 . y. a // algoritmo para ler trˆs n´meros e escrevˆ-los em ordem e u e // n˜o decrescente a e algoritmo ordena trˆs // m´dulo para trocar o valor de duas vari´veis o a procedimento troca(ref inteiro a. z // obt´m o menor e o maior dos trˆs e e min max(x. z. menor. um procedimento para trocar o valor de duas vari´veis. obrigatoriamente.

6. m) sen˜o a troca(l. estes valores devem ser copiados para os parˆmetros formais e as mudan¸as nos parˆmetros formais devem a c a ser refletidas nos parˆmetros reais. m. Problemas e Solu¸˜es co UFMS // troca os valores aux ← a a←b b ← aux fimprocedimento // declara¸˜o de constantes e vari´veis ca a inteiro l. n // lˆ os trˆs n´meros e e u e u escreva “Entre com trˆs n´meros: ” leia l. n) fimse fimse se m > n ent˜o a troca(m. m. Bibliografia O texto deste cap´ ıtulo foi elaborado a partir dos livros abaixo relacionados: 112 . n u a fimalgoritmo Neste algoritmo. n) fimse escreva “Os n´meros em ordem n˜o decrescente: ”. n // encontra o menor e p˜e em l o a se l > m ou l > n ent˜o se m ≤ n ent˜o a troca(l.8. m. uma vez que as vari´veis precisam a a retornar do procedimento com os valores trocados. os parˆmetros do procedimento troca s˜o parˆmetros a a a de entrada e sa´ ıda. pois para trocar os valores dos parˆmetros reais a dentro de um procedimento. l.

R. AddisonWesley Longman. Algoritmos Estruturados. al. 1998. 113 . Shackelford. 1989. Editora Guanabara. Problemas e Solu¸˜es co UFMS 1. 2. et. Introduction to Computing and Algorithms.6. Inc.8. Farrer. H.L.

Lista de Exerc´ ıcios
1. Para se determinar o n´mero de lˆmpadas necess´rias para cada cˆmodo u a a o de uma residˆncia, existem normas que fornecem o m´ e ınimo de potˆncia e de ilumina¸˜o exigida por metro quadrado (m2 ) conforme a utiliza¸˜o ca ca deste cˆmodo. Suponha que s´ ser˜o usadas lˆmpadas de 60W. o o a a Seja a seguinte tabela: Utiliza¸˜o ca quarto sala de TV salas cozinha varandas escrit´rio o banheiro Classe 1 1 2 2 2 3 3 Potˆncia/m2 e 15 15 18 18 18 20 20

(a) Fa¸a um m´dulo (fun¸˜o ou um procedimento) que recebe a classe c o ca de ilumina¸˜o de um cˆmodo e suas duas dimens˜es e devolve o ca o o n´mero de lˆmpadas necess´rias para o cˆmodo. u a a o (b) Fa¸a um algoritmo que leia um n´mero indeterminado de inc u forma¸˜es, contendo cada uma o nome do cˆmodo da residˆncia, co o e sua classe de ilumina¸˜o e as suas duas dimens˜es e, com base no ca o m´dulo anterior, imprima a ´rea de cada cˆmodo, sua potˆncia o a o e de ilumina¸˜o e o n´mero total de lˆmpadas necess´rias. Al´m ca u a a e disso, seu algoritmo deve calcular o total de lˆmpadas necess´rias a a e a potˆncia total para a residˆncia. e e 2. A comiss˜o organizadora de um rallye automobil´ a ıstico decidiu apurar os resultados da competi¸˜o atrav´s de um processamento eletrˆnico. ca e o Um dos programas necess´rios para a classifica¸˜o das equipes ´ o a ca e que emite uma listagem geral do desempenho das equipes, atribuindo pontos segundo determinadas normas. (a) Escreva um m´dulo (fun¸˜o ou procedimento) que calcula os pono ca tos de cada equipe em cada uma das etapas do rallye, seguindo o seguinte crit´rio. Seja ∆ o valor absoluto da diferen¸a entre e c o tempo-padr˜o e o tempo despendido pela equipe numa etapa a (fornecidos como parˆmetros): a 114

Lista de Exerc´ ıcios ∆ < 3 minutos 3 ≤ ∆ ≤ 5minutos ∆>5

UFMS atribuir 100 pontos ` etapa a atribuir 80 pontos ` etapa a atribuir 80 − ∆−5 pontos ` etapa a 5

(b) Fa¸a um algoritmo que leia os tempos-padr˜o (em minutos decic a mais) para as trˆs etapas da competi¸˜o, leia um n´mero indetere ca u minado de informa¸˜es, contendo para cada equipe o seu n´mero co u de inscri¸˜o e os tempos (em minutos decimais) despendidos para ca cumprir as trˆs etapas e, utilizando o m´dulo anterior, calcule os e o pontos obtidos por cada equipe em cada etapa, a soma total de pontos por equipe, e a equipe vencedora. 3. (a) Fa¸a uma fun¸˜o quantosdias que recebe o dia, o mˆs e o ano de c ca e uma data e retorna um valor que cont´m o n´mero de dias do e u ano at´ a data fornecida. e (b) Fa¸a um algoritmo que recebe n pares de datas, onde cada par c deve ser fornecido no formato dia1, mˆs1, ano1, dia2, mˆs2, e e ano2, verifique se as datas est˜o corretas e mostre a diferen¸a, a c em dias, entre essas duas datas. Utilize a fun¸˜o anterior para o ca c´lculo do total de dias de cada data. a 4. (a) Escreva uma fun¸ao que recebe dois n´meros inteiros positivos e c˜ u determina o produto dos mesmos, utilizando o seguinte m´todo e de multiplica¸˜o: ca i. dividir, sucessivamente, o primeiro n´mero por 2, at´ que se u e obtenha 1 como quociente; ii. paralelamente, dobrar, sucessivamente, o segundo n´mero; u iii. somar os n´meros da segunda coluna que tenham um n´mero u u ´ ımpar na primeira coluna. O total obtido ´ o produto proe curado. Exemplo: 9 × 6 9 6 → 6 4 12 2 24 1 48 → 48 54 (b) Escreva um programa que leia n pares de n´meros e calcule os u respectivos produtos, utilizando a fun¸˜o anterior. ca 5. Um n´mero a ´ dito ser permuta¸ao de um n´mero b se os d´ u e c˜ u ıgitos de a formam uma permuta¸˜o dos d´ ca ıgitos de b. Exemplo: 5412434 ´ uma permuta¸˜o de 4321445, mas n˜o ´ uma pere ca a e muta¸˜o de 4312455. ca 115

Lista de Exerc´ ıcios

UFMS

Observa¸ao: considere que o d´ c˜ ıgito 0 (zero) n˜o aparece nos a n´meros. u (a) Fa¸a uma fun¸˜o contad´gitos que, dados um inteiro n e um inteiro c ca ı d, 0 < d ≤ 9, devolve quantas vezes o d´ ıgito d aparece em n;

(b) Utilizando a fun¸ao do item anterior, fa¸a um algoritmo que leia c˜ c dois n´meros a e b e responda se a ´ permuta¸˜o de b. u e ca

6. Um n´mero b ´ dito ser sufixo de um n´mero a se o n´mero formado u e u u pelos ultimos d´ ´ ıgitos de a s˜o iguais a b. a Exemplo: a 567890 1234 2457 457 b 890 1234 245 2457 → → → → sufixo sufixo n˜o ´ sufixo a e n˜o ´ sufixo a e

(a) Construa uma fun¸˜o sufixo que dados dois n´meros inteiros a e ca u b verifica se b ´ um sufixo de a. e (b) Utilizando a fun¸˜o do item anterior, escreva um algoritmo que ca leia dois n´meros inteiros a e b e verifica se o menor deles ´ u e subseq¨ˆncia do outro. ue Exemplo: a 567890 1234 235 b 678 2212345 236 → → → b ´ subseq¨ˆncia de a e ue a ´ subseq¨ˆncia de b e ue Um n˜o ´ subseq¨ˆncia do outro a e ue

7. Uma seq¨ˆncia de n n´meros inteiros n˜o nulos ´ dita m-alternante ue u a e se ´ constitu´ por m segmentos: o primeiro com um elemento, o e ıda segundo com dois elementos e assim por diante at´ a m-´sima, com M e e elementos. Al´m disso, os elementos de um mesmo segmento devem ser e todos pares ou todos ´ ımpares e para cada segmento, se seus elementos forem todos pares (´ ımpares), os elementos do segmento seguinte devem ser todos ´ ımpares (pares). Por exemplo: e A seq¨ˆncia com n = 10 elementos: 8 3 7 2 10 4 5 13 4 11 ´ 4ue alternante. A seq¨ˆncia com n = 3 elementos: 7 2 8 ´ 2-alternante. ue e A seq¨ˆncia com n = 8 elementos: 1 12 4 2 13 5 12 6 n˜o ´ alternante, ue a e pois o ultimo segmento n˜o tem tamanho 4. ´ a 116

Este exerc´ est´ dividido em trˆs partes. Exemplo: Para k = 2. V [1]. a fun¸˜o deve devolver os valores 8 e 11. verifica se ela ´ m-alternante. . . ca 117 .Lista de Exerc´ ıcios UFMS (a) Escreva uma fun¸˜o bloco que recebe como parˆmetro um inteiro ca a n e lˆ n inteiros do teclado. Lembre-se de que em C[0] a sua fun¸˜o deve colocar o ca tamanho da intersec¸˜o. ca Observa¸ao: n˜o utilize vetores neste exerc´ c˜ a ıcio.. -1. Para k = 3. ca Para k = 4. Podemos ent˜o montar a seguinte tabela: a i Fi Gi 1 2 1 2 1 2 3 3 8 4 8 11 5 24 20 . 9. u a u (b) Utilizando a fun¸ao do item anterior. escreva um algoritmo que. co (a) Fa¸a uma fun¸˜o intersec¸ao que dados dois conjuntos de n´meros c ca c˜ u inteiros A e B.. Gi = Gi−1 + 3 ∗ Fi−2 i ≥ 3. se os n n´meros lidos forem pares.  G1 = 1. devolvendo um dos seguintes valores: e 0.. V [2]. 8. qual ´ o valor de F6 e o e o e G6 ? (b) Fa¸a um procedimento de nome valor que recebe um inteiro K ≥ c 1 e devolve Fk e Gk . . se os n n´meros lidos forem ´ u ımpares. constr´i um terceiro conjunto C que ´ a intersec¸˜o o e ca de A e B...  2  2 Fi = 2 ∗ Fi−1 + Gi−2 i ≥ 3. . o procedimento deve retornar os valores 1 e 2. s˜o os elementos do cone a junto (sem repeti¸˜es). ıcio a e (a) S´ para ver se vocˆ entendeu as f´rmulas. Considere as seguintes f´rmulas de recorrˆncia: o e    F1 = 2. G = 2.. u 1. (c) Fa¸a um algoritmo que lˆ um inteiro n > 2 e imprime os valores c e Fn−2 + Gn+200 e Fn+200 + Gn−2 . Seu algoritmo deve obrigatoriamente utilizar o procedimento do item anterior. . Um conjunto pode ser representado por um vetor da seguinte forma: V [0] ´ o tamanho do conjunto. F = 1. c˜ dados um inteiro n (n ≥ 1) e uma seq¨ˆncia de n n´meros inteiue u ros. se entre os n n´meros lidos h´ n´meros com paridades diferentes. O algoritmo deve imprimir o e valor de m ou dar uma resposta dizendo que a seq¨ˆncia n˜o ´ ue a e alternante. a fun¸˜o deve devolver os valores 3 e 8.

(a) Escreva uma fun¸˜o que recebe como parˆmetros um vetor real ca a A com n elementos e um vetor B com m elementos. e (a) Escreva uma fun¸ao que recebe como parˆmetro um vetor inteiro c˜ a V com n elementos e verifica se em V ocorrem todos os inteiros de 1 a n. 3. 11. n (ou seja. 2. 10. Dizemos que uma matriz An×n ´ um quadrado latino de ordem n se em e cada linha e em cada coluna aparecem todos os inteiros 1. c˜ u a (b) Escreva uma fun¸˜o que recebe dois inteiros. (b) Escreva uma fun¸˜o que recebe como parˆmetros uma matriz ca a inteira An×n e um ´ ındice j e verifica se na coluna j de A ocorrem todos os inteiros de 1 a n. 12. Utilize o procedimento do item anterior. 2. e 118 . e assim por ca diante. . ca ˜ e NOTE que NAO ´ preciso ler todos os conjuntos de uma s´ vez. .Lista de Exerc´ ıcios UFMS (b) Fa¸a um algoritmo que leia um inteiro n ≥ 2 e uma seq¨ˆncia de c ue n conjuntos de n´meros inteiros (cada um com no m´ximo 100 u a elementos) e construa e imprima o vetor INTER que representa a intersec¸˜o dos n conjuntos. e verifica se A est´ contido em B (A ⊂ a B). ca Depois. Vocˆ o e pode ler os dois primeiros conjuntos e calcular a primeira instersec¸˜o. . (c) Utilizando as fun¸˜es acima. i e j. e ca Exemplo:  1  2   4 3 2 3 1 4 3 4 2 1  4 1   3  2 A matriz acima ´ um quadrado latino de ordem 4. (a) Escreva uma fun¸ao que troca o conte´do de duas vari´veis. (b) Utilizando a fun¸˜o anterior verifique se dois conjuntos s˜o iguais ca a (A = B se e somente se A ⊂ B e B ⊂ A). uma matriz ca real Am×n e troca a linha i pela linha j. ambos representando conjuntos. . . cada linha e coluna ´ permuta¸˜o dos inteiros 1. verifique se uma dada matriz inteira co An×n ´ um quadrado latino de ordem n. leia o pr´ximo conjunto e calcule uma nova intersec¸˜o entre o ca esse conjunto lido e o conjunto da intersec¸˜o anterior. . n). . .

Veja a u e c o um exemplo na Figura 7. que tamb´m conhecemos como endere¸o. cada identificador de vari´vel usado no algoritmo ´ asa e sociado com o endere¸o da c´lula de mem´ria que ser´ alocada para aquela c e o a vari´vel. Estas posi¸˜es s˜o muito similares `s o e e co a a vari´veis que temos utilizado. No ambiente da linguagem de programa¸˜o ´ ca e mantida uma lista dos identificadores usados pelo programador e que associa automaticamente estes com os endere¸os das c´lulas de mem´ria. De fato. Quando u e c um algoritmo ´ escrito em uma linguagem de programa¸˜o para ser usado e ca em um computador. criamos nossas vari´veis simplesmente dando nome a elas. Cada posi¸˜o o c ca de mem´ria ´ denominada c´lula.Ponteiros 7 A mem´ria do computador ´ constitu´ de muitas posi¸˜es (geralmente o e ıda co milh˜es). enquanto a que no computador estas c´lulas existem fisicamente. Olhando o valor do ponteiro. cada qual pode armazenar um peda¸o de dado. o computador determina onde olhar na mem´ria pelo valor do dado apontado pelo ponteiro.1: Ponteiro p armazenando o endere¸o 8900 e sua representa¸˜o c ca esquem´tica a Usaremos a seguinte nota¸˜o para declarar uma vari´vel tipo ponteiro ca a 119 . e Estas c´lulas de mem´ria s˜o numeradas seq¨encialmente. Quando o e o a u processador do computador precisa acessar uma c´lula de mem´ria. um ponteiro ´ o e um tipo especial de vari´vel cujo conte´do ´ um endere¸o de mem´ria. ele a ree o ferencia pelo seu n´mero. 8900 p 8900 p 8900 Figura 7. Nas linguagens de programa¸˜o modernas. com uma diferen¸a: ao escrever nossos algoa c ritmos. c e o Um ponteiro ´ uma c´lula que armazena o endere¸o de outra c´lula de e e c e dados. o programador n˜o prea ca a cisa se preocupar com isto.

a vari´vel ponteiro o a aponta para a primeira posi¸ao e pelo tipo ele sabe quantas c´lulas a partir c˜ e daquela posi¸˜o contˆm o dado. c Na Figura 7 mostramos o que ocorre se atribuirmos o valor 9 ` vari´vel a a apontada por p: estaremos mudando tamb´m o valor o qual q aponta.ˆq as vari´veis p e q s˜o do tipo ponteiro para inteiro. ca e Para podermos entender a base de ponteiros. e ambas a a e c apontam para uma vari´vel inteira que armazena o valor 4. onde mostramos as vari´veis p e q e seu respectivo conte´dos. e 120 . Por exemplo. na dee clara¸˜o ca inteiro ˆp. precisamos de um mecanismo para que ele possa alterar o valor da c´lula de mem´ria para onde aponta. uma vez que ambos apontam para o mesmo e endere¸o. a p 4 q 300 p 4 300 q Figura 7. Neste caso. Nesta figura. isto ´ armazena o valor do endere¸o de mem´ria onde este valor e c o inteiro se encontra.2: A representa¸˜o esquem´tica dos ponteiros p e q e seus respecca a tivos conte´do: o endere¸o 300 u c Assim. Isto ´ feito atrav´s e e do operador un´rio ˆ. ambas poder˜o a a e a apontar para uma vari´vel do tipo inteiro. mostramos duas vari´veis p e q. isto ´. o valor da vari´vel apontada a a por q foi tamb´m alterada. Como a quantidade de c´lulas a e de mem´ria utilizada por um tipo varia conforme o tipo. Como p ´ um ponteiro para o tipo e inteiro.UFMS tipododado ˆ<identificador> Este comando declara uma vari´vel de nome identificador que aponta a para uma c´lula armazenando um dado tipodado. Ao referenciarmos um ponteiro estamos seguindo o a ponteiro e vendo para onde ele aponta. isto ´ armazenam endere¸os. bem como sua a u representa¸˜o esquem´tica. Assim ˆp ← 9 altera o valor e o da vari´vel para a qual p aponta. o algoritmo pode acessar o valor n´merico 4 referenciando o valor u apontado por p ou referenciando o valor apontado por q. consideraremos a Figura 7. ca a a ambos s˜o vari´veis do tipo ponteiro.

Ao e a e 121 . e o p 9 q 3 r Figura 7.5: Manipulando ponteiros Se um ponteiro n˜o estiver apontando para nenhuma c´lula.UFMS p 9 q Figura 7. Por exemplo. ca usaremos o comando r ← p. p p 9 9 q q 3 3 r r Figura 7.4: Manipulando ponteiros Se agora quisermos que r aponte para a posi¸˜o para a qual p aponta. quando mudamos o valor de q para fazˆ-lo apontar para a mesma c´lula que r aponta. Devemos notar que q n˜o s´ referenciou diferentes valores mas tamb´m ara o e mazenou diferentes c´lulas de mem´ria (Figura 7). diremos que a e seu valor ´ nulo. O algoritmo poder´ obter o valor armazea a nado nela referenciando tanto r quanto q.” c A Figura 7. O valor nulo n˜o ´ a mesma coisa que nenhum valor.4(a) mostra o que acontecer´ se a vari´vel q apontar para a a a vari´vel inteira apontada por r. e e utilizaremos o seguinte comando: q←r Este comando significa que “n´s mudamos o valor de q de forma que o ele aponta para o endere¸o de mem´ria para o quel r aponta.3: Altera¸˜o do conte´do para onde p aponta acarreta mudan¸a no ca u c conte´do para onde q aponta u A vari´vel ponteiro cont´m um endere¸o. Para alterar o valor de um a e c ponteiro devemos atribuir um novo valor a ele.” Isto tem o c o mesmo significado de “copie o endere¸o armazenado em r para q.

UFMS inv´s disso.7: Resultado depois dos comandos r ← p e ˆr ← 5 Se quisermos obter o endere¸o de mem´ria de uma vari´vel devemos c o a utilizar o operador un´rio &. Assim se tivermos uma vari´vel do tipo inteiro a a val.6: O ponteiro r apontando para nulo Ao referenciarmos um ponteiro ele deve estar apontando para alguma c´lula. neste contexto. Assim. o resultado do comando p ← &val ´ a atribui¸˜o do endere¸o de vari´val val ` p (Figura 7). contendo o valor 7. o seguinte comando ´ incorreto ˆr ← 5 uma e e vez que r n˜o aponta para nenhuma posi¸˜o de mem´ria. a Atribu´ ımos o valor nulo para uma vari´vel apontador r atrav´s do sea e guinte comando: r ← nulo Na Figura 7 desenhamos um ponteiro nulo como um aterramento (eletricidade). e p 5 q 3 r Figura 7. Para corrigir isto a ca o poder´ ıamos fazer r←p ˆr ← 5 e ter´ ıamos p e r apontando para o endere¸o de mem´ria cujo valor c o ´ 5 (Figura 7). e ca c a a 122 . ele ´ um valor particular que significa que “este ponteiro n˜o e e a est´ apontando para nada”. p 9 q 3 r Figura 7.

1 Tipos Base At´ o presente momento.7. Neste texto utilizaremos a seguinte conven¸˜o ca Tipo caracter l´gico o inteiro real Unidades de Mem´ria o 1 1 2 4 O objetivo de fixarmos uma quantidade de mem´ria que os diversos tipos o utilizam ser´ visto mais adiante. O conceito de ponteiros ´ a e implementado em linguaguem de programa¸˜o considerando esta quantidade ca de mem´ria. Tipos Base UFMS p 5 q 3 r val 7 Figura 7. tanto para efeito de aloca¸˜o quanto para movimenta¸˜o de o ca ca ponteiros. a Cada linguagem de programa¸˜o define uma quantidade de mem´ria ca o utilizada por cada um de seus tipos b´sicos. Para sabermos quantas ca o e posi¸˜es de mem´ria. Vimos que um ponteiro aponta para a primeira posi¸˜o de mem´ria que cont´m o dado.1. a partir da inicial. consideramos que cada vari´vel ocupa uma e a regi˜o da mem´ria e n˜o nos preocupamos com a quantidade de mem´ria a o a o ocupada por cada um dos tipos. Deco ca vemos lembrar que ponteiros armazenam endere¸os de mem´ria onde um c o dado de um determinado tipo base est´ armazenado.2 Opera¸˜es com Ponteiros co Podemos utilizar duas opera¸˜es com ponteiros: soma e subtra¸˜o. contˆm o valor armazenado devemos co o e olhar o tipo base da vari´vel ponteiro.8: Atribui¸˜o do endere¸o de uma vari´vel tipo inteiro para um ca c a ponteirp p 7. a 7. Assim estas opera¸˜es a co 123 .

7.9: Mem´ria ocupada por um inteiro e seus respectivos endere¸os o c As opera¸˜es aritm´ticas de ponteiros acima somente podem ser feitas co e entre ponteiros e inteiros(constante. O mesmo racioc´ u a a ınio vale para a opera¸˜o de subtra¸˜o.3 Ponteiros e Vetores Nesta se¸˜o vamos considerar os ponteiros de maneira similar ao que ca ocorre na linguagem C. Em ambos os casos leva-se em consider¸˜o a quantidade utilizada pelo tipo base.3. a Cada vez que o valor de um ponteiro ´ incrementado ele aponta para e o pr´ximo elemento de seu tipo base. Ponteiros e Vetores UFMS levam em conta a quantidade de mem´ria necess´ria para armazenar o tipo o a base. Se o valor inicial de p for 200. o comando ca ca p←p−1 far´ com que o valor de p seja 198. ca e 7. vari´veis ou express˜es). 0198 0199 0200 0201 0202 0203 0204 Figura 7. o o conte´do de p ser´ 202 ( e n˜o 201!). se considerarmos um ponteiro p que aponta para uma vari´vel do tipo inteiro armazenada no endere¸o 200. a ca o o Como convencionamos que um inteiro utiliza duas unidades de mem´ria. Veja Figura 7. Cada vez que um ponteiro ´ decreo e mentado ela aponta para o elemento anterior. a atribui¸˜o a c ca p←p+1 far´ com que p aponte para a primeria posi¸˜o de mem´ria ap´s o inteiro. Por exemplo. Nenhuma oua o tra opera¸˜o ´ permitida com ponteiros.2 como ca exemplo. Quando utilizamos somento o nome de um vetor 124 .

A pilha ´ usada para armazee a e nar vari´veis locais. AS vari´veis globais e a outras o a vari´veis tempor´rias criados pelo compilador ocupam uma ´rea de mem´ria a a a o imediatamente acima da ´rea de c´digo. Surge a quest˜o: ca e a qual delas utilizar? 7. de fato. em geral. ou ainda que a ca a a estamos alocando mem´ria em tempo de compila¸˜o. neste caso o quinto elemento do vetor. O unico problema que ocorre ´ quando a quantia ´ e dade de mem´ria livre no bloco de mem´ria n˜o ´ suficiente para comportar o o a e o crescimento da pilha e da heap. Aloca¸˜o Dinˆmica de Mem´ria ca a o UFMS estamos. Em muitas situa¸˜es.7. e cada uma delas cresce de tamanho em dire¸˜ees opostas (uma o co em dire¸˜oo aos endere¸os mais altos e outra em dire¸˜oo aos endere¸˜s ca c ca co mais baixos). valores de retorno e outras informa¸˜es a a co necess´rias durante chamadas a m´dulos realizadas no programa.4. Quando executamos a ca um programa. O restante do bloco de mem´ria a o o ´ dividido em duas ´reas: pilha e heap. O c´digo do programa gerado pelo compilador e ligador ´ carregado o e na parte mais baixa do bloco de mem´ria. se considerarmos um vetor A que cont´m elementos do tipo inteiro e e uma vari´vel p do tipo ponteiro para inteiro. referenciando o endere¸o da primeira posi¸˜o do vetor. A pilha a o e a heap s˜o colocadas em posi¸˜es opostas na ´rea restante do bloco de a co a mem´ria. e o como ilustrado na Figura 7. Observamos que ˆ(p + 4) ´ diferente de ˆp + 4. a o ca Al´m disso. Diante disto e considerando as opera¸˜es aritm´ticas de ponteiros co e podemos ver que p + 1 ser´ um apontador para a pr´xima posi¸˜o do vetor. e Vimos duas formas de acessar os elementos de um vetor: usando a indexa¸˜o da matriz ou usando a artim´tica de ponteiros. a ele ´ destinado um bloco de mem´ria disposto. se considerarmos que A come¸a com ´ e c ındice 1. parˆmetros.4 Aloca¸˜o Dinˆmica de Mem´ria ca a o Relembremos das se¸˜es anteriores que. c ca Assim. estamos fazendo aloca¸˜o est´tica de mem´ria. a atribui¸˜o a ca p←A ´ v´lida e neste caso p armazenar´ o endere¸o da primeira posi¸˜o do e a a c ca vetor A. de tal forma que cada uma delas possa mudar de tamanho sem afetar uma ` outra. quando fazemos as declara¸˜es co co de vari´veis.4. a quantidade de mem´ria que um programa necesco o 125 . uma vez que o operador e ˆ tem precedˆncia sobre os demais. A[5] e ˆ(p + 4) acessam o mesmo elemento.

Para resolver este problema ´ necess´rio que os elementos de S sejam armazenados. usamos um vetor de tamanho 100 para armazenar e os elementos de S. Considere o seguinte exemplo a e ca bastante simples que ilustra essa situa¸˜o. Para que a quantidade de mem´ria dispon´ na heap ca a o ıvel n˜o sobreponha a ´rea de pilha. se o limitante para o tamanho de S ´ 100. ´ recomendado que a mem´ria alocada dinaa a e o micamente seja liberada pelo programa ` medida que n˜o ´ mais necess´ria.10: Organiza¸˜o da Mem´ria ca o sita n˜o ´ conhecida em tempo de compila¸˜o. S˜o dados de entrada do e e a programa: a quantidade de elementos em S e os elementos de S. Ela consiste ca a o no processo de alocar mem´ria em tempo de execu¸˜o conforme a neceso ca sidade do programa.7. e a O problema aqui ´ que desconhecemos. A heap ´ a mem´ria reservada para ser usada pela e o aloca¸˜o dinˆmica. se o tamanho de S for menor que 100 o programa teria alocado mais mem´ria do que necessitava. temos resolvido esse o a ca e a tipo de problema. Obviamente. Seja S um conjunto de n´meros ca u inteiros. a quane ca tidade de mem´ria que ser´ necess´ria para armazenar S (essa informa¸˜o o a a ca s´ ser´ conhecida em tempo de execu¸˜o). o A aloca¸˜o dinˆmica de mem´ria resolve este problema. em tempo de compila¸˜o. At´ ent˜o. Deseja-se um programa para determinar os elementos de S que s˜o a maiores que a m´dia aritm´tica dos inteiros em S. Por exemplo. Aloca¸˜o Dinˆmica de Mem´ria ca a o 111111 Alta Pilha UFMS Heap Vari´veis a Programa 000000 Baixa Figura 7. a a e a As seguintes opera¸˜es s˜o usadas pelo algoritmo para aloca¸˜o e libera¸˜o co a ca ca 126 . considerando a existˆncia de um limitante superior para e o tamanho de S e ent˜o alocando mem´ria grande o suficiente para coma o portar o maior tamanho esperado para S.4.

n) p ´ um ponteiro e n ´ a quantidade de mem´ria. e a o cujo endere¸o inicial est´ armazenado em p. ca • Libere (p) p ´ um ponteiro. O valor de p sempre deve ser verificado ap´s uma chamada a Aloque. ent˜o. a ser alocada dinamicamente. Aloque atribui o valor nulo a p. O espa¸o de mem´ria dec a c o salocado (liberado) torna-se livre para ser usado por futuras chamadas a Aloque. Aloca¸˜o Dinˆmica de Mem´ria ca a o UFMS de mem´ria dinˆmica: o a • Aloque (p. ap´s ler o tamanho de S efetuar uma chamada a Aloque co a o para alocar a quantidade de mem´ria necess´ria para armazenar os elemeno a tos de S. Pode ocorrer falha na aloca¸˜o. Aloque ir´ alocar a n posi¸˜es consecutivas de mem´ria. podemos usar um ponteiro para inteiro no lugar do vetor de 100 posi¸˜es e. e atribuir a p o a endere¸o inicial da mem´ria alocada. Neso a ses casos.n) if p = nulo then a a o escreva “N˜o h´ mem´ria suficiente” else soma ← 0 for i de 0 at´ n − 1 do e leia ˆ(p + i) // o mesmo que p[i] soma ← soma + ˆ(p + i) end for media ← soma / n for i de 0 ate n − 1 do if ˆ(p + i) > media then escreva ˆ(p + i) 127 . Essa id´ia est´ ilustrada no seguinte algoritmo: e a Algoritmo Exemplo inteiro ˆp. em unidades relativas e e o ao tipo base de p. podemos evitar o desperd´ de mem´ria alocando exatamente ıcio o a quantidade de mem´ria que o programa necessita.7. c o ca quando a quantidade de mem´ria requerida n˜o pode ser alocada. i. Desta forma. para que haja garantia de o que houve sucesso na aloca¸˜o. Libere ir´ liberar a mem´ria anteriormente alocada. n. soma real media leia n Aloque (p. Em nosso exemplo ano terior. cada uma delas do tamanho neco o cess´rio para armazenar um valor do tipo base de p.4.

7. para obtermos o valor do inteiro precisamos fazer dois n´ ıveis de indire¸˜es. co 8900 9100 8900 9100 9100 p p 8900 9100 Figura 7. Quando vocˆ precisar do telefone de uma pessoa vocˆ consulta e e sua agenda.11: Exemplo onde p ´ um ponteiro para ponteiro e Podemos declarar um ponteiro para um ponteiro com a seguinte nota¸˜o: ca tipodado ˆˆidentificador onde: ˆˆ identificador ´ o conte´do da vari´vel apontada e ˆidentificador e u a ´ o conte´do ponteiro intermedi´rio.5 Ponteiros para Ponteiros Um ponteiro para ponteiro ´ como se vocˆ anotasse em sua agenda o e e n´mero do telefone de uma empresa que fornecesse n´mero de telefones u u residenciais. Chamase n´ de indire¸˜o ao n´mero de vezes que temos que percorrer para obter ıvel ca u o conte´do da vari´vel final.5. u Entender ponteiro para ponteiro requer conhecimento de ponteiro. b. ˆp. Ponteiros para Ponteiros UFMS end if end for end if Libere (p) Fimalgoritmo 7. e u a Algoritmo Exemplo 2 inteiro a. ˆˆpp a←2 b←3 p ← &a // p recebe endere¸o de a c pp ← &p // pp aponta para o ponteiro p ou seja ”a” ˆˆpp ← 5 // ”a”recebe valor 5 (duas indire¸˜es) co ˆpp ← &b // pp aponta para b ˆˆpp ← &6 // ”b”recebe valor 5 Fimalgoritmo 128 . As vari´veis do tipo ponteiro tˆm n´ u a a e ıvel de indire¸˜o um. As vari´veis do tipo ponteiro para ponteiro tˆm n´ ca a e ıvel de indire¸˜o dois. Se tivermos uma vari´vel que ´ um ponteiro para ponteiro ca a e para inteiro. depois consulta a empresa e ela te fornece o n´mero desejado.

indee u co e terminado e depende da linguagem de programa¸˜o o n´mero de indire¸˜es ca u co permitidas. Assim podemos fazer o a seguinte declara¸˜o ca inteiro ˆˆˆˆˆˆp Que significa que o ponteiro para ponteiro p possui seis indire¸˜es. Em outras palavras s˜o tipos diferentes. co 129 . o conte´do co u de p ´ um endere¸o de um inteiro e o conte´do de pp ´ um endere¸o de um e c u e c ponteiro para inteiro. Ponteiros para Ponteiros UFMS Ressaltamos que ponteiro para inteiro e ponteiro para ponteiro para inteiro tem n´ ıveis de indire¸˜es diferentes. teoricamente. Em nosso.5. exemplo.7. a e a Um fato interessante ´ que o n´mero de indire¸˜es ´. Assim um a comando da forma pp ← p n˜o ´ v´lido. no entanto a l´gica permanece a mesma.

an .Algoritmos de Ordena¸˜o ca 8 Um dos problemas mais tradicionais da ´rea de computa¸˜o ´ o proa ca e blema da ordena¸˜o. o ue elemento aj seja comparado com o elemento aj+1 . que ´ o valor a ser ordenado. a cada passo. Na a e a pr´tica. . a′ . . . . Cada ca registro cont´m uma chave. omitiremos nos algoritmos a seguir uma linha do tipo definatipo vetor[1. ca ue u precisamos coloc´-la em uma certa ordem (num´rica ou lexicogr´fica). Assim. ue n 2 A seguir descrevemos alguns dos algoritmos simples de ordena¸˜o. an da seq¨ˆncia de tal forma que. na pr´tica. Nesse problema. Em a u a geral.. .100] de inteiro vet num 8. suporemos ca e ca a que a entrada do problema consiste somente de n´meros. os n´meros a serem ordenados raramente s˜o valores isolados. . ≤ a′ . encontrar uma permuta¸˜o a′ . . e o restante do e e registro consiste em dados sat´lites. . dada uma seq¨ˆncia de n´meros.1 Bubble-sort O algoritmo bubble-sort consiste em passar seq¨encialmente v´rias vezes u a pelos elementos a1 . Nessa ca descri¸˜o. . a′ ue u ca n 1 2 ′ dessa seq¨ˆncia tal que a1 ≤ a′ ≤ . . a Algoritmo bubble sort 130 . . Por consideraru e e mos a permuta¸˜o dos dados sat´lites uma opera¸˜o mecˆnica. a2 . ent˜o eles a s˜o trocados. Em e e outras palavras. quando permutamos e a os n´meros. temos: dada uma ca seq¨ˆncia de n n´meros a1 . a2 . . Se aj > aj+1 . u Definindo o problema da ordena¸˜o formalmente. . tamb´m devemos permutar os dados sat´lites. cada um deles faz parte de uma cole¸˜o de dados (registro). . assumiremos que j´ existe um tipo denominado vet num que deca a fine um vetor de inteiros cujo limite inferior ´ 1 e limite superior ´ 100.

imagine a seguinte sia tua¸˜o: vocˆ tem um conjunto de cartas em sua m˜o esquerda e com a m˜o ca e a a direita tenta ordenar as cartas.8. Neste algoritmo. n. c. da esquerda e e para a direita.2 Insertion-sort Para compreens˜o do algoritmo Insertion-sort. fazendo inser¸˜es. j.2. o elemento ak ´ inserido em sua posi¸˜o correta Algoritmo insertion sort inteiro i. n vet num a leia n for i de 1 at´ n do e leia a[i] end for for i de 2 at´ n do e c ← a[i] j ←i−1 while j > 0 E a[j] > c do a[j + 1] ← a[j] j ← j −1 end while a[j + 1] ← c end for Fimalgoritmo 131 . A id´ia ´ colocar cada carta. temp vet num a leia n for i de 1 at´ n do e leia a[i] end for for i de 1 at´ n − 1 do e for j de 1 at´ n − 1 do e if a[j] > a[j + 1] then temp ← a[j] a[j] ← a[j + 1] a[j + 1] ← temp end if end for end for Fimalgoritmo 8. ca co e ca a cada passo. j. Insertion-sort UFMS inteiro i. em sua posi¸˜o correta.

Depois. max. Ou seja. repita a opera¸˜o para os n − 2 elementos e u ca ca assim sucessivamente.3 Selection-sort O m´todo de ordena¸˜o por sele¸˜o tem o seguinte princ´ e ca ca ıpio de funcionamento: pegue o maior elemento da seq¨ˆncia e troque-o com o elemento ue que est´ na ultima posi¸˜o. Selection-sort UFMS 8. a Algoritmo selection sort inteiro imax.8.3. encontre o maior elemento entre eles e coloque-o na pen´ltima posi¸˜o. j vet num a leia n for i de 1 at´ n do e leia a[i] end for for i de n at´ 2 passo −1 do e max ← a[1] imax ← 1 for j ← 2 at´ i do e if a[j] > max then max ← a[j] imax ← j end if end for a[imax] ← a[i] a[i] ← max end for Fimalgoritmo 132 . Ao final da execu¸˜o. i. A seguir. repita essa opera¸˜o para os n − 1 a ´ ca ca elementos. a seq¨ˆncia estar´ em ordem ca ue a n˜o-decrescente.

a e a O principal deles ´ o fato dela ser dependente da m´quina (software e harde a ware) em que o algoritmo est´ sendo executado. executar uma opera¸˜o aritm´tica. u a ca Em um ambiente computacional. Dentre as opera¸oes primitivas est˜o: atribuir um valor a uma c˜ a vari´vel. e Para podermos classificar um algoritmo como eficiente ou n˜o. co Tomemos ent˜o como exemplo o seguinte algoritmo que lˆ um vetor de a e 133 . chamar um m´dulo. o que imca ca plica podermos nos concentrar apenas na quantidade e freq¨ˆncia de tais ue opera¸˜es. essa estrat´gia experimental apresenta v´rios problemas. Precisamos ent˜o encontrar a a uma forma de medir o tempo de execu¸˜o que nos permita comparar dois ca algoritmos independentemente da m´quina onde est˜o sendo executados. dado um problema espec´ ıfico. os tempos de execu¸˜o de duas opera¸˜es primitivas quaisquer dica co ferem entre si por um fator constante. ca ca a Apesar de v´lida. avaliar uma express˜o e retornar de uma fun¸˜o. focalizamos as nossas aten¸˜es apenas no desenvolvimento e estudo de algoritmos que resolvesse co o problema. embora seja constante. Esse e e crit´rio ´ o seu tempo de execu¸˜o. precisaa mos definir precisamente um crit´rio para medirmos a sua eficiˆncia. sem nos preocuparmos com a sua eficiˆncia. e desde que cada opera¸˜o elementar possui tempo de execu¸˜o ca ca constante. estivemos interessados apenas no quesito corretude de um e algoritmo. comparar a ca e o dois n´meros. a a Uma forma de se fazer isso ´ contando o n´mero de opera¸˜es primitivas do e u co algoritmo. Isso nos permite considerar o tempo de execu¸˜o de cada opera¸˜o primitiva como sendo o mesmo. Ou seja.Um pouco sobre complexidade de algoritmos 9 At´ agora. que pode ser medido por meio da implee e ca menta¸˜o e execu¸˜o do algoritmo utilizando-se v´rias entradas distintas. Desde que o n´mero a u de instru¸˜es de baixo n´ co ıvel correspondentes a cada opera¸˜o primitiva ´ ca e constante. cada opera¸˜o primitiva corresponde a ca uma ou mais instru¸˜es de baixo-n´ co ıvel. as quais possuem tempo de execu¸˜o ca que depende da m´quina.

“n˜o se encontra no vetor” a 23: end if 24: Fimalgoritmo Nesse algoritmo. “est´ na posi¸˜o ”. x. No in´ ca ıcio de cada uma das itera¸˜es desse la¸o. uma vez e.UFMS inteiro a. temos uma opera¸˜o de atribui¸˜o (j ← 1). Essa indexa¸˜o e ca a ca corresponde a uma soma que se repete n vezes. x. x. temos duas opera¸˜es primitivas: uma soma (j + 1) e uma ca co atribui¸˜o (j ← j + 1). A ca a a a a linha 9 ´ um la¸o para. n vezes. ca co a c elas se repetem n vezes. i. co 1: Algoritmo busca 2: definatipo vetor[1. “do vetor. o la¸o em c quest˜o corresponde a 4n + 2 opera¸˜es primitivas.. no m´ ıcio c a ınimo. Como essas duas opera¸˜es est˜o dentro do la¸o. no m´ximo. x 9: for j de 1 at´ n do e 10: leia a[j] 11: end for 12: while achou = F E i ≤ n do 13: if x = a[i] then 14: achou ← V 15: else 16: i ← i+1 17: end if 18: end while 19: if achou = V then 20: escreva “O elemento de valor “.. Ao final ca co de cada itera¸˜o. ca c ca ca que corresponde a uma opera¸˜o primitiva. ca c 134 . a co A linha 12 determina o in´ de um la¸o que ser´ repetido. j. que tamb´m corresponde a uma co c ca e opera¸˜o primitiva. No in´ a ıcio de cada itera¸˜o desse la¸o. ´ avaliada uma vez. n 4: l´gico achou o 5: vet num a 6: achou ← F 7: i ← 1 8: leia n. a condi¸˜o j ≤ n contribui com n + 1 opera¸˜es primitivas. a condi¸˜o j ≤ n. com n ≥ 1 posi¸˜es. as linhas 6 e 7 contˆm uma opera¸˜o primitiva (atrie ca bui¸˜o do valor “falso” ` vari´vel achou e do valor 1 ` vari´vel i). Na e c c primeira itera¸˜o desse la¸o. um inteiro x e procura por x dentro de A.fa¸a que se repete exatamente n vezes. Uma outra opera¸˜o que se encontra dentro do la¸o ca c ´ a indexa¸˜o (a[i]) necess´ria durante a leitura do vetor.” a ca 21: else 22: escreva “O elemento de valor “. Como essa avalia¸˜o ´ feita n + 1 ca e ca e vezes.10] de inteiro vet num 3: inteiro i. Com tudo isso.

no m´ximo. Logo. . e seu maior valor quando x n˜o estiver em A (x ∈ A). Uma an´lise ca e a de pior caso. a 135 . ou simplesmente. no m´ ca e ınimo. Finalmente. no m´ ınimo. ela ca a c se repetir´. n + 1 vezes. Al´m ca ca a a e disso. no m´ximo. no m´ximo. e No pior caso temos que t(n) = 1+1+4n+2+3(n+1)+2n+2n+1 = 11n+8. ela ´ executada no m´ximo n vezes. A linha 16 (i = i + 1) cont´m duas opera¸˜es a e co primitivas: a adi¸˜o em si e a atribui¸˜o do valor i + 1 ` vari´vel i. temos que t(n) = 1 + 1 + 4n + 6 + 2 + 1 + 1 = 4n + 12. Portanto. a co e ca a A linha 14 (achou ← V ) cont´m uma opera¸˜o primitiva. n vezes. ajud´-nos a identificar o “gargalo” de um algoritmo a e pode nos dar pistas para melhorar a sua eficiˆncia. duas vezes e.UFMS a condi¸˜o achou = F E i < n ´ avaliada. A condi¸˜o do la¸o cont´m trˆs opera¸˜es primitivas: a ca c e e co a compara¸˜o i < n. no m´ a ınimo. an´lise de complexidade. a avalia¸ao da express˜o “achou = F ” e a verifica¸˜o do ca c˜ a ca resultado da express˜o “achou = F E i < n”. no melhor caso. se fixarmos n. no m´ ınimo duas e. . o tamanho do vetor a ser processado. Logo. um vez e. quando A[1] = x). Iremos ent˜o represent´-lo como uma fun¸˜o f (n). 6 e. f (n) a a ca ca atingir´ seu menor valor quando x estiver na primeira posi¸˜o do vetor (ou a a / seja. que ser´ executada. 3 × (n + 1) opera¸˜es primitivas. a co A linha 13 cont´m duas opera¸˜es primitivas: uma indexa¸˜o (a[i]) e e co ca uma compara¸˜o (x = a[i]). Isto ´. e A an´lise de tempo de execu¸˜o vista at´ aqui ´ conhecida como an´lise a ca e e a de complexidade de tempo. Como essa linha est´ no corpo do la¸o. ´ Pelas observa¸˜es acima podemos notar que o tempo de execu¸˜o do co ca algoritmo busca depende de n. N´s usualmente consideramos o pior caso de tempo de execu¸˜o para o ca fins de compara¸˜o da eficiˆncia de dois ou mais algoritmos. a linha 19 se . podendo n˜o ser executada nee a a nhuma vez. no m´ximo 2n opera¸˜es primitivas. em geral. no m´ximo. a linha 12 corresponde a a. Ela ser´ executada ca ca a uma unica vez. Note que. ent˜o cont´m uma opera¸˜o primia e ca tiva: a verifica¸˜o da condi¸˜o da estrutura condicional. busca executa de 4n + 12 a 11n + 8 opera¸˜es primitivas em uma co entrada de tamanho n ≥ 1. uma vez. a linha 12 a corresponde a.

por exemplo. . notas de alunos. .1 Defini¸˜es b´sicas co a Uma lista linear agrupa informa¸˜es referentes a um conjunto de elemenco tos que. que armazenam as caracter´ ısticas dos elementos da lista. definimos estruturas de dados como a forma com que os valores componentes de um tipo complexo (estruturado) se organizam as rela¸˜es entre eles. Ln ´ o ultimo n´. de alguma forma. o e o 3. Definindo formalmente. L1 ´ o primeiro n´. Um desses campos constitui o que chamamos de chave do n´. Vetores (unidimensionais co e bidimensionais) s˜o considerados estruturas de dados primitivas. que o decorrem unicamente das posi¸˜es relativas de seus n´s: co o 1. . e ´ o Em nossos estudos assumiremos que cada n´ ´ formado por v´rios camoe a pos. notas de co a compras. onde falamos sobre vetores. Ela pode se constituir. de informa¸˜es sobre funcion´rios de uma empresa. itens de estoque. e o 2. L2 . o n´ Lk ´ precedido pelo n´ Lk−1 . O conceito de campo o chave ´ de extrema importˆncia pois ele constitui o principal objeto a ser e a 136 . uma lista linear ´ um conjunto de n > 0 elee mentos (n´s) L1 . se relacionam entre si. . que recebe o a nome de lista linear. 10. Ln com as seguintes propriedades estruturais. Neste a cap´ ıtulo estudaremos uma estrutura de dados n˜o primitiva.Listas 10 No cap´ ıtulo 5. para 1 < k ≤ n. etc.

ireu mos supor que todas as chaves s˜o distintas. e as remo¸˜es em outro. Aloca¸˜o seq¨encial ca u UFMS manipulado pelos algoritmos sobre listas.2 Aloca¸˜o seq¨ encial ca u A maneira mais simples de manter uma lista no computador ´ alocando e posi¸˜es consecutivas da mem´ria a cada um de seus n´s (vetor). uma unica representa¸˜o que atende. a determina¸˜o do tamanho da lista. o A melhor maneira de armazenar listas lineares depende. tipom campom fimregistro tipo registro 137 . a lista ´ chamada pilha.. Para se evitar ambig¨idades. a o utilizando os seguintes comandos de nossa linguagem algor´ ıtmica: defina M AX 1000 definatipo registro inteiro chave tipo1 campo1 tipo2 campo2 . com no m´ximo 1000 n´s de um certo tipo. a lista ´ chamada f ila. em co u a geral. a ordena¸˜o dos n´s. Al´m dessas opera¸˜es vale mencionar outras ca o e co de relativa importˆncia como a combina¸˜o de duas ou mais listas lineares a ca em uma unica. co u a ca o e r emo¸˜o de um n´ da lista. das opera¸˜es mais freq¨entes a serem executadas sobre ela..10. todas as ´ ca opera¸˜es acima mencionadas. ´ ca o ca etc. N˜o existe. inser¸˜o de um n´. co o o poder´ ıamos definir uma lista L. Podemos citar casos particulares de listas com base nas opera¸˜es de co inser¸˜o e remo¸˜o. o • aloca¸˜o encadeada: os n´s s˜o armazendos em posi¸˜es n˜o consecuca o a co a tivas da mem´ria. co 10. basicamente. de maneira eficiente. Se as inser¸˜es e remo¸˜es s˜o relizadas somente em ca ca co co a um extremo. Se as inser¸˜es s˜o relizadas em um e co a extremo. Assim. a As opera¸˜es mais freq¨entes em listas s˜o a busca. co e Existem duas formas de armazenar os n´s de uma lista no computador: o • aloca¸˜o seq¨encial: os n´s s˜o armazendos em posi¸˜es consecutivas ca u o a co da mem´ria.2.

Ela devolve o ´ ındice na lista onde o elemento se encontra ou -1 caso o elemento n˜o esteja na lista. Armazenada de forma seq¨encial. tipo registro novo..chave) = -1 then L[n + 1] ← novo n← n+1 else escreva “Elemento j´ existe na lista” a end if 138 . a seguinte fun¸˜o pode ser utilizada u ca para a busca. A fun¸˜o de inser¸˜o ca insere um novo resgitra ca procedimento Inser¸˜o(lista L. Note u ca ca que ambos se utilizam da fun¸˜o Busca Lista Seq. no m´ ca ınimo.M AX] de tipo registro lista lista L Note nas linhas acima que tipo registo ´ um tipo que define um registro e que possui um n´mero qualquer de campos. Ela recebe como parˆmetro uma vari´vel do tipo lista (um vetor). novo.2. inteiro x. de um elemento na lista L. eles encontram-se detalhadas abaixo.10. sendo um deles o campo chave. Aloca¸˜o seq¨encial ca u UFMS definatipo vetor[1. co Sobre os procedimentos de inser¸˜o (insere um novo registro no final da ca lista) e remo¸˜o (remove um registro da lista cuja chave ´ x) em uma lista ca e linear alocada seq¨encialmente. a chave x e o tamaa a nho n da lista. inteiro n) ca inteiro i i←1 while L[i].chave = x E i ≤ n do i←i+1 end while if i = n + 1 then retorne i else retorne -1 end if fimfun¸˜o ca A fun¸˜o acima executa. 8 (quando o elemento encontra-se na primeira posi¸˜o do vetor) e. u Em nosso exemplo. no m´ximo 1 + 3(n+1) + 2n + 2 + 1 = ca a 5n + 6 opera¸˜es primitivas. ref inteiro n) if n < M AX then if BUSCA Lista Seq(L. a fun¸˜o inteiro Busca Lista Seq(lista L. ele est´ definido como inteiro. mas pode ser de qualquer a tipo elementar conhecido. por meio da chave.

co 10. no m´ ınimo. inteiro x. como a primeira ou a ultima. Isso nos leva ` co ´ a defini¸˜o de pilhas e filas. ref inteiro n) inteiro k tipo registro valor if n > 0 then k ← BUSCA Lista Seq(L. x) if k = −1 then valor ← L[k] for i de k at´ n − 1 do e Lk ← Lk + 1 end for n← n−1 else a imprima “Elemento n˜o se encontra na lista” end if else imprima “underflow” end if fimprocedimento A fun¸˜o acima executa. 1 opera¸˜o primitiva (quando ca a lista est´ cheia) e. no m´ximo 1 + 2 + 1 + 1 + 1 + n + 2(n-1) + 2(n-1) + a a 1 = 5n + 3 opera¸˜es primitivas.10.2. no m´ximo 1 + 2 + 2 = 5 opera¸˜es primitivas (note a a co que o n´mero de opera¸˜es primtivas realizadas por esse procedimento n˜o u co a depende de n). ca procedimento Remo¸˜o(lista L. Esse co co a ca o ultimo caso ocorre quando os elementos a serem inserido e removidos est˜o ´ a em posi¸˜e especiais da lista. ca 139 . Aloca¸˜o seq¨encial ca u UFMS else imprima “lista cheia (overflow)” end if fimprocedimento O procedimento acima executa.1 Pilhas e Filas Em geral. o armazenamento seq¨encial de listas ´ empregado quando u e as estruturas sofrem poucas inser¸˜es e remo¸˜es ao longo do tempo. ou co co quando inser¸˜es e remo¸˜es n˜o acarretam movimenta¸˜o dos n´s. 1 opera¸˜o primitiva (quando a ca lista est´ vazia) e.2. no m´ ca ınimo.

poder´ ıamos definir uma pilha. respectivamente.2. 5 opera¸˜es primitivas.. 1 opera¸˜o primitiva (quando ca a pilha est´ cheia) e.topo ← P.L.2.topo] ← novo else imprima “overflow” end if fimprocedimento O procedimento acima executa. Assim. de tamanho M AX.1 Pilhas Uma pilha ´ uma lista linear tal que as opera¸˜es de inser¸˜o e remo¸˜o e co ca ca s˜o realizadas em um unico extremo. ´ comum nos referenciarmos `s opera¸˜es de inser¸˜o e e a co ca remo¸˜o de elementos como empilhar e desempilhar ca procedimento Empilha(ref tipo pilha P . a ´ Em geral.1.topo.L[P. Aloca¸˜o seq¨encial ca u UFMS 10. com no m´ximo 1000 n´s a o de um certo tipo. contendo os P.topo + 1 P. um inteiro indicando a quantidade de elementos na pilha.M AX] de tipo registro lista definatipo registro tipo1 campo1 lista L fimregistro tipo pilha tipo pilha P Os seguintes procedimento podem ent˜o ser utilizados para inserir e a remover elementos de uma pilha.topo elementos. no m´ximo. tipo registro novo) if P.topo = M AX then P. removido) ca tipo registro removido 140 . a implementa¸ao de uma pilha se faz por meio de um regisc˜ tro P contendo dois campos: P.. Quando falamos nessa estrutura de dados.. a a co fun¸˜o tipo registro Desempilha(ref tipo pilha P . no m´ ınimo. tipom campom fimregistro tipo registro definatipo vetor[1. utilizando os seguintes comandos de nossa linguagem algor´ ıtmica: defina M AX 1000 definatipo registro inteiro chave tipo1 campo1 tipo2 campo2 . e um vetor P.10.

utilizando os seguintes a o comandos de nossa linguagem algor´ ıtmica: defina M AX 1000 definatipo registro inteiro chave tipo1 campo1 tipo2 campo2 ..2. de tamanho M AX..L. 1 opera¸˜o primitiva (quando a ca pilha est´ vazia) e.topo] P. um inteiro indicando o in´ da fila. tipom campom fimregistro tipo registro definatipo vetor[1.L[P.f im. ca a Em geral. e um inteiro indicando o fim da fila.M AX] de tipo registro lista definatipo registro inteiro inicio tipo1 f im lista L fimregistro tipo f ila tipo f ila F Os seguintes procedimento podem ser utilizados para inserir (enfileirar) e remover (desinfileirar) elementos de uma fila.2. conıamos definir tendo os F. e um vetor F.topo = 0 then removido ← P.inicio − F.2 Filas Uma fila ´ uma lista linear tal que as opera¸˜es de inser¸˜o s˜o realizadas e co ca a em um extremo e as de remo¸˜o s˜o realizadas no outro extremo. no m´ximo.inicio. a implementa¸˜o de uma fila se faz por meio de um registro F ca ıcio contendo trˆs campos: F.10. Isso implica incrementar 141 . ap´s qualquer opera¸˜o.1. a a co 10. poder´ uma fila. deve-se sempre ter o ponteiro inicio o ca indicando o in´ ıcio da fila e f im o final da fila. Aloca¸˜o seq¨encial ca u UFMS if P..topo − 1 else imprima “underflow” end if fimfun¸˜o ca A fun¸˜o acima executa. Note que.topo ← P.f im + 1 elementos da fila. 5 opera¸˜es primitivas. com no m´ximo 1000 n´s de um certo tipo. F. no m´ ca ınimo. Assim.

inicio ← (F. consideram-se os n n´s alocados como se eles o estivessem em c´ ırculo.inicio = 0 then F.inicio = 1 end if else imprima “overflow” end if fimprocedimento O procedimento acima executa.f im] ← novo if F. 7 opera¸˜es primitivas (quando o unico elemento a a co ´ est´ sendo removido). 9 opera¸˜es primitivas (quando o primeiro a a co elemento est´ sendo inserido). a fun¸˜o tipo registro Desenfileira(ref fila F ) ca tipo registro recuperado if F. a 142 .f im then F. tipo registro novo) prov ← (F. 4 opera¸˜o primitiva (quando ca a fila est´ cheia) e. a vari´vel auxiliar prov armazena provisoriamente a posi¸˜o de a ca mem´ria calculada de forma a respeitar a circularidade.inicio MOD M AX) + 1 end if retorne recuperado else imprima “overflow” end if fimfun¸˜o ca A fun¸˜o acima executa. a procedimento Enfileira(ref tipo f ila F .inicio ← 0 F. 1 opera¸˜o primitiva (quando a fila ca est´ vazia) e.f im MOD M AX) + 1 if prov = F.L[F. com F. Os ´ ındices inicio e f im s˜o ambos inicializados com zero. a o Para eliminar esse problema. dando a falsa impress˜o de mem´ria esgotada.inicio = F.inicio] if F.10.inicio = 0 then recuperado ← F.L[1] seguindo F. Isso c˜ ca faz com que a fila se “mova”. no m´ximo.inicio then F.L[n].f im ← prov F.f im ← 0 else F. no m´ ınimo.L[F. Aloca¸˜o seq¨encial ca u UFMS inicio quando de uma inser¸ao e f im quando de uma remo¸˜o da fila. sendo que o ind´ o ıce f im ´ movimentado somente se a posi¸˜o for poss´ e ca ıvel.2. no m´ximo. no m´ ca ınimo. No algoritmo de inser¸˜o ca em uma fila.

10. Por exemplo. Aloca¸˜o seq¨encial ca u UFMS 10.topo ← P.topo − 1] =′ [′ then P.L.topo − 1 else temp ← F end if else 143 . n temp ← V P.2.2 Um exemplo de aplica¸˜o de uma pilha ca Dentre as v´rias aplica¸oes de uma pilha. Uma seq¨ˆncia desse ue e a a ue tipo ´ dita bem formada quando os parˆnteses e colchetes se fecham perfeie e tamente. a seq¨ˆncia ( ( ) [ ( ) ] ) est´ bem formada.[P.topo > 1 AND P. Suponha que queremos decidir se uma dada a seq¨ˆncia de parˆnteses est´ bem formada ou n˜o. a a algoritmo definatipo vetor[1.. enquanto ue a que a seq¨ˆncia ( [ ) ] n˜o est´ bem formada.2. ue a a Vamos ent˜o escrever um algoritmo que leia um vetor de caracteres s a contendo a seq¨ˆncia de parˆnteses e colchetes e determine a se a seq¨ˆncia ue e ue est´ bem formada ou n˜o.topo ← P. existe uma de grande intea c˜ resse na ´rea de compiladores.topo] =′ (′ then P.topo − 1 else temp = F end if else if s[i] =′ ]′ then if P.topo ← 0 leia n for i de 1 at´ n fa¸a do e c leia s[i] end for i←1 while i ≤ n AND temp = V do if s[i] =′ )′ then if P.1000] de caracteres vet carac definatipo registro inteiro topo vet carac L fimrgistro tipo pilha vet carac s tipo pilha P l´gico temp o inteiro i.topo = 0 AND P.L[P.

10.L[P.topo + 1 P. Aloca¸˜o seq¨encial ca u UFMS P.2.topo] ← s[i] end if end if i←i+1 end while if temp = V then ue e escreva “A seq¨ˆncia ´ bem formada!” else “A seq¨ˆncia n˜o ´ bem formada!” ue a e end if fimalgoritmo 144 .topo ← P.

determine se o ca ca algoritmo ´ est´vel ou n˜o. primeiro um azul e depois um vermelho.Lista de Exerc´ ıcios ponteiros 1. Com base nessa defini¸˜o. de forma unica. escreva “n˜o” e forne¸a uma seq¨ˆncia de n´meros (entrada a c ue u para o algoritmo) que comprove o fato do algoritmo n˜o ser est´vel. ca 2. ca 3. e a • C ´ o produto entre X e Y . Seja S uma seq¨ˆncia de n n´meros tal que cada elemento representa ue u um voto diferente para presidente do centro acadˆmico do curso de e Bacharelado em An´lise de Sistemas da UFMS. O vetor deve ser alocado dinamicamente e ordenado utilizando apenas a nota¸˜o de ponteiros. Escreva um algoritmo que leia dois vetores A e B com n n´meros u inteiros. e crie um vetor C resultado da soma de A e B. Um algoritmo de ordena¸˜o ´ dito est´vel se n˜o altera a posi¸˜o ca e a a ca relativa de elementos com mesmo valor. O voto ´ um n´mero a e u inteiro que representa. se o vetor de inteiros v tiver dois elementos iguais a 222. e c • C ´ a intersec¸a˜ entre X e Y . Escreva um algoritmo que leia um vetor A de n n´meros inteiros e u ordene esse vetor. o estudante escolhido para ´ 145 . Os vetores devem ser alocados dinamicamente e todas as opera¸˜es envolvendo os co seus elementos devem ser feitas utilizando a nota¸˜o de ponteiros. sele¸˜o. Em caso afirmativo. e Ordena¸˜o ca 1.Em caso e a a negativo. escreva “sim”. inser¸˜o). um algoritmo de ordena¸˜o est´vel mant´m o 222 azul ca a e antes do vermelho. Por exemplo. a a 2. e c o • C ´ a uni˜o de X com Y . Escreva o algoritmo para uma fun¸˜o que recebe como parˆmetros dois ca a vetores de inteiros A e B e retorne um terceiro vetor C tal que: • C ´ a diferen¸a entre X e Y . para cada um dos algoca ritmos vistos em sala de aula (bolha.

Lista de Exerc´ ıcios UFMS o cargo. devolva uma terceira lista L3 . respectiu vamente). reu mova o elemento cujo valor da chave ´ x. respectivamente). Utilizando uma pilha (e as fun¸˜es Empilha e Desempilha assoco ciadas). ue 2. dados como parˆmetros duas listas alocadas o a seq¨encialmente L1 e L2 e o tamanho de cada lista. e 4. dados como parˆmetros uma lista alocada o a seq¨encialmente L. u (m e n. e a lista deve permanecer ordenada ap´s a inser¸˜o). Escreva um m´dulo que. tamb´m ORe DENADA. o ca 3. dados como parˆmetros uma lista alocada o a seq¨encialmente L e o seu tamanho n. 6. o seu tamanho n e o valor x. resultado da combina¸˜o das listas L1 e L2 . e u ´ bacana. dados como parˆmetros uma lista ORDEo a NADA alocada seq¨encialmente L. escreva um algoritmo que leia uma seq¨ˆncia de caracteres e ue imprima essa seq¨ˆncia de forma invertida. o seu tamanho n e um elemento u novo cujo valor da chave ´ x. Escreva um m´dulo que. u dica: ordene a seq¨ˆncia ue Listas 1. Escreva um m´dulo que. o seu tamanho n e um valor x. e a 146 . devolva o n´mero u u de elementos da lista cuja chave possui valor maior ou igual a x. Escreva um m´dulo que. Escreva um e a e algoritmo que leia uma palavra e determine se ela ´ bacana ou n˜o. dados como parˆmetros uma lista ORDEo a NADA alocada seq¨encialmente L. b} ´ dita bacana se ela ıda e cont´m o mesmo n´mero de a′ s e b′ s. 5. ca Pilhas 1. (m e n. Uma palavra constru´ sob o alfabeto Σ = {a. por exemplo. Escreva um m´dulo que. Escreva um m´dulo que. devolva uma terceira lista L3 resultado da combina¸˜o das ca listas L1 e L2 . 2. A palavra abab. Escreva um algoritmo que receba S e n como entrada e determine o n´mero que representa o candidato mais votado. insira novo dentro da lista (logicamente. inverta a ordem dos elementos u dessa lista. dados como parˆmetros duas listas ORDEo a NADAS alocadas seq¨encialmente L1 e L2 e o tamanho de cada lista. enquanto que a palavra abb n˜o ´ bacana.

A ordem de inser¸˜o dos elementos na pilha ´ 1. . a Exemplo: Infixa (A+B*C) (A*(B+C)/D-E) (A+B*(C-D*(E-F)-G*H)-I*3) Posfixa ABC*+ ABC+*D/EABCDEF-*-GH*-*+I3*- Escreva um algoritmo que leia uma express˜o em nota¸˜o infixa e a a ca traduza para a express˜o posfixa. . respectivamente. a seq¨ˆncia de opera¸˜es incluir em P incluir em P remover de P incluir em P remover de P remover de P produzir´ uma permuta¸˜o 2. . (c) Escreva uma rela¸˜o de permuta¸˜es admiss´ ca co ıveis de 1. n uma seq¨ˆncia de elementos que ser˜o inseridos e posue a teriormente removidos de uma pilha P . os operadores s˜o escritos depois dos operandos. 1 do exemplo acima ´ admiss´ ca e ıvel. um de cada vez. enquanto que a remo¸˜o ca e ca depende da ordem na qual as opera¸˜es de remo¸˜o s˜o realizadas. 3. . 2. Para simplificar. 2. 2. a permuta¸˜o 2. e 4. os operadores s˜o escritos ca o e a entre os operandos. uma permuta¸˜o ´ chamada adca e miss´ ıvel quando puder ser obtida mediante uma sucess˜o de inser¸˜es a co e remo¸˜es em uma pilha a partir da permuta¸˜o 1. a a e fecha-parˆntese e s´ e ımbolos para as quatro opera¸˜es aritm´ticas. 4. . 1 do exemplo acima pode ser denoca ca tada por IIRIRR. Seja 1. 147 . . co ca a Exemplo: ue co Com n = 3. 2. 1 a partir da entrada 1. . . 2. . as opera¸˜es de inser¸˜o co ca e remo¸˜o. a ca Representando por I e R. a nota¸˜o ´ chamada infixa. Assim. . De modo geral. com n = ca 4. Na nota¸˜o usual de express˜es aritm´ticas. 3. Al´m co e e disso. . suponha que a express˜o toda est´ “embrulhada” em um par de a a parˆnteses. por isso. 3. suponha que a exa press˜o infixa est´ correta e consiste apenas de letras. ou posfixa. Na nota¸˜o ca e ca polonesa. n.Lista de Exerc´ ıcios UFMS 3. 3. . a co ca permuta¸˜o 2. 3. n. (b) Dˆ um exemplo de uma permuta¸˜o n˜o admiss´ e ca a ıvel. abre-parˆntese. (a) Determine a permuta¸˜o correspondente a IIIRRIRR.

insere o elemento 13. insere o elemento 9. e 148 . insere o elemento 7. ap´s a seguinte seq¨ˆncia de a o ue opera¸˜es. retira um eleco mento. (b) Repita o ultimo exerc´ ´ ıcio da se¸˜o anterior utilizando uma fila ca (ao inv´s de uma pilha). insere o elemento 14. 10 elementos. insere o elemento 10. retira um elemento. insere o elemento 15. no m´ximo. insere o elemento 6.Lista de Exerc´ ıcios UFMS Filas (a) Mostre o estado de uma fila cujos elementos s˜o inteiros e onde a cabem.

Sign up to vote on this title
UsefulNot useful