Você está na página 1de 178

DIM0320 - Algoritmos e Programao de Computadores

(Notas de Aula)
Prof. Marcelo Ferreira Siqueira
mfsiqueira@dimap.ufrn.br
DIMAp - CCET - UFRN
Maro 2011
Copyright c _2011 Marcelo Ferreira Siqueira
Permission is granted to copy, distribute and/or modify this document under the terms of
the GNU Free Documentation License, Version 1.2 or any later version published by the Free
Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled GNU Free Documentation
License.
SUMRIO
1 Informaes Gerais 1
1.1 Professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Bibliograa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Introduo 4
2.1 Algoritmos e problemas computacionais . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Representao de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Resoluo de Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Tipos de Dados e Variveis 12
3.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4 Nomes de variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.6 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 Entrada e Sada 19
4.1 Instrues de entrada e sada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 A estrutura de um algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5 Expresses Aritmticas Parte 1 24
5.1 Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.2 Precedncia de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
i
5.3 Alterao de prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.4 A instruo de atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.5 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.6 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6 Prova de Avaliao de Conhecimento Prvio 31
7 Expresses Aritmticas Parte 2 32
7.1 Operadores aritmticos sobre os reais . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2 Regras semnticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3 Um algoritmo envolvendo constantes e variveis reais . . . . . . . . . . . . . . . . 34
7.4 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.5 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
8 Expresses Relacionais 38
8.1 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
8.2 Relaes e expresses aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
8.3 Relaes envolvendo tipos no inteiros . . . . . . . . . . . . . . . . . . . . . . . . 39
8.4 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.5 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
9 Exerccios para a Primeira Avaliao 43
10 Primeira Avaliao 45
11 Correo da Primeira Avaliao 51
12 Estruturas Condicionais - Parte 1 57
12.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
12.2 Comando se-entao-senao-mse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
12.3 Aninhamento de comandos condicionais . . . . . . . . . . . . . . . . . . . . . . . 60
12.4 Comando se-entao-mse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
12.5 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
12.6 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
13 Expresses Lgicas 66
13.1 Lgica proposicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
ii
13.2 Proposies compostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
13.3 Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
13.4 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
13.5 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
14 Estruturas Condicionais - Parte 2 74
14.1 Usando proposies compostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
14.2 Troca de contedo entre duas variveis . . . . . . . . . . . . . . . . . . . . . . . . 75
14.3 O comando escolha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
14.4 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
15 Estruturas de Repetio - Parte 1 81
15.1 O comando enquanto-faca-menquanto . . . . . . . . . . . . . . . . . . . . . . . . 81
15.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
15.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
16 Estruturas de Repetio - Parte 2 87
16.1 A seqncia de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
16.2 Inverso da ordem dos dgitos de um nmero . . . . . . . . . . . . . . . . . . . . 88
16.3 Teste de primalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
16.4 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
17 Estruturas de Repetio - Parte 3 95
17.1 O clculo da mdia aritmtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
17.2 O maior elemento de uma seqncia . . . . . . . . . . . . . . . . . . . . . . . . . . 96
17.3 Os mltiplos de posio na seqncia . . . . . . . . . . . . . . . . . . . . . . . . . 97
17.4 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
18 Estruturas de Repetio - Parte 4 102
18.1 O lao repita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
18.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
18.3 Lao repita versus lao enquanto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
18.4 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
19 Vetores 109
19.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
iii
19.2 Denio e manipulao de variveis . . . . . . . . . . . . . . . . . . . . . . . . . 110
19.3 O clculo do desvio padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
19.4 O comando para-faca-mpara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
19.5 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
20 Segunda Avaliao 118
21 Correo da Segunda Avaliao 122
22 Aninhamento de Laos 126
22.1 Laos aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
22.2 Ordenao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
22.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
23 Matrizes - Parte 1 138
23.1 Denio e Manipulao de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 138
23.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
23.2.1 Soma de duas matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
23.2.2 Clculo de norma matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
23.2.3 Clculo da matriz transposta . . . . . . . . . . . . . . . . . . . . . . . . . . 144
23.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
24 Matrizes - Parte 2 147
24.1 Mais exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
24.1.1 Multiplicao de duas matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 147
24.1.2 Quadrado mgico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
24.2 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
25 Modularizao - Parte 1 156
25.1 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
26 Modularizao - Parte 2 157
26.1 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
27 Recursividade 158
27.1 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
28 Fluxogramas 159
iv
28.1 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
29 Terceira Avaliao 160
30 Correo da Terceira Avaliao 165
v
AULA 1
INFORMAES GERAIS
Professor
Nome Marcelo Ferreira Siqueira
Email mfsiqueira@dimap.ufrn.br
Sala DIMAp 16 (primeiro andar)
Telefone 3215 3814/3816 Ramal 228
Horrio de atendimento por demanda e marcado com antecipao
Local e Horrio de Aulas
Local Setor 3, sala G3
Horrio Teras e quintas das 10h50min s 12h30min (35M56)
Contedo Programtico
1. Problemas computacionais, algoritmos e computadores
2. Tipos de dados, variveis
3. Expresses aritmticas
4. Entrada e sada
5. Expresses relacionais
6. Expresses lgicas
7. Estrutura condicional
8. Estruturas de repetio
9. Vetores
10. Matrizes
1
1.1 PROFESSOR 2
11. Modularizao
12. Recursividade
13. Fluxogramas
Os tpicos 1, 2, 3, 4, 5 e a primeira parte de 7 sero cobertos na Unidade I da disciplina. Os
tpicos 6, a segunda parte de 7, 8 e 9 sero vistos na Unidade II. Os tpicos 10, 11, 12 e 13 sero
estudados na Unidade III.
Sistema de Avaliao
A disciplina contar com trs provas escritas, denotadas por P1, P2 e P3. As notas das
unidades I, II e III sero as notas obtidas nas provas P1, P2 e P3, respectivamente. As datas
das provas P1, P2 e P3, assim como a data do exame nal, j foram informadas no SIGAA e
so as seguintes:
Primeira prova: 5 de abril de 2011.
Segunda prova: 17 de maio de 2011.
Terceira prova: 16 de junho de 2011.
Exame nal: 5 de julho de 2011.
Todas as provas, inclusive o exame nal, sero realizadas na sala de aula da disciplina e
durante o horrio de aula (das 10h50min s 12h30min). Por favor, atente-se ao horrio das
aulas e provas, pois nenhum aluno ter permisso para entrar em sala depois que a prova j
tiver sido iniciada.
1.1 Professor
Nome Marcelo Ferreira Siqueira
Email mfsiqueira@dimap.ufrn.br
Sala DIMAp 16 (primeiro andar)
Telefone 3215 3814/3816 Ramal 228
Horrio de atendimento por demanda e marcado com antecipao
1.2 Bibliograa
Nesta disciplina, no adotaremos nenhum livro-texto em particular, pois nenhum deles
sucientemente adequado para as necessidades da disciplina. No entanto, notas de aula sero
disponibilizadas para os alunos medida que os tpicos da disciplina forem cobertos. Os
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
1.2 BIBLIOGRAFIA 3
alunos tambm tero acesso aos eventuais slides utilizados pelo professor durantes as. Tanto
as notas de aula quanto os slides sero disponibilizados, na forma de arquivos em formato
PDF, para download no SIGAA. Apesar de no adotarmos nenhum livro-texto em particular,
recomendamos o uso do livro em [3] para complementar as notas de aula e como fonte de
exerccios.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 2
INTRODUO
2.1 Algoritmos e problemas computacionais
A palavra algoritmo tem origem no sobrenome do matemtico, astrnomo, gelogo, ge-
grafo e autor persa Mohammed ibn-Musa al-Khwarizmi, que viveu entre 780 e 850 d.C [2].
No sculo XII, sua obra sobre numerais indianos foi traduzida para o latim e apresentou a no-
tao posicional decimal para o Mundo Ocidental. Ele tambm apresentou a primeira soluo
sistemtica das equaes lineares e quadrticas e considerado um dos fundadores da lge-
bra [1]. O radical de algarismo e algoritmo vem de Algoritmi, a forma latina do sobrenome
al-Khwarizmi.
H tantas denies diferentes para o termo algoritmo quanto autores escrevendo sobre
elas. No entanto, todas essas denies concordam que um algoritmo uma seqncia nita
de instrues, bemdenidas e no-ambguas, para resolver umdado problema. Cada instruo
de um algoritmo deve ser executada por um perodo de tempo nito. Em geral, a denio de
algoritmo ilustrada atravs de qualquer processo mecnico, tal como uma receita culinria
ou a troca de pneu de um automvel. No entanto, aqui, estamos interessados em algoritmos
computacionais, ou seja, algoritmos que descrevem instrues a serem executadas por com-
putador.
Para exemplicar o que entendemos por algoritmo computacional, vamos considerar o
problema de se calcular a rea A de um quadrado Q de lado l. No ensino mdio, aprendemos
que
A = l
2
. (2.1)
Ento, dado o comprimento l dos lados do quadrado Q, uma forma de resolver o problema
usar a frmula acima, ou seja, multiplicar o valor de l por ele prprio. Note que a frmula em
(2.1) pode ser usada para calcular a rea A de qualquer quadrado. Tudo o que precisamos saber
para utilizar a frmula para obter a rea A de qualquer quadrado o comprimento l do lado
do quadrado.
Suponha, agora, que devemos escrever uma seqncia de instrues para calcular A, a qual
deve ser seguida por uma criana que sabe multiplicar dois nmeros e sempre faz isso de
forma correta. A criana deve nos solicitar o comprimento l do lado do quadrado Q e, depois
de calcular A, ela deve nos informar o valor de Aobtido por ela. Este valor deve ser escrito, pela
criana, em uma folha de papel usando lpis ou caneta. Uma possvel seqncia de instrues

1. Solicite o comprimento l do lado do quadrado.


4
2.1 ALGORITMOS E PROBLEMAS COMPUTACIONAIS 5
2. Multiplique l por l
3. Escreva o resultado da multiplicao na folha de papel.
A seqncia acima, por mais simples que seja, ilustra todos os elementos essenciais da
denio de algoritmo. A seqncia nita (h apenas trs instrues). Cada uma delas est
bem denida, no deixa nenhuma dvida sobre o que deve ser feito e pode ser realizada em
umperodo nito de tempo. H ainda, no nosso exemplo, dois componentes fundamentais dos
algoritmos computacionais: entrada e sada. Aentrada consiste do conjunto de dados que deve
ser fornecido ao algoritmo, enquanto a sada o conjunto de dados produzidos pelo algoritmo.
No exemplo acima, a entrada o comprimento l do lado do quadrado e a sada a rea A do
quadrado.
O exemplo acima tambm ilustra uma caracterstica importante dos algoritmos computa-
cionais: eles so agentes transformadores de dados de entrada em dados de sada. Este processo
de transformao comumente denominado processamento. Da, o termo processamento de
dados. No exemplo, o valor de l foi processado para gerar o valor de A. O processamento,
neste caso, consiste na multiplicao de l por l. importante perceber que um algoritmo no
a soluo de um problema, mas sim um processo para se obter a soluo. Um problema que pode ser
resolvido por um algoritmo computacional denominado problema computacional. Isto ,
um problema computacional aquele que pode ser resolvido por um computador atravs de
um algoritmo.
Algoritmo Entrada Sada
Figura 2.1: A transformao de entrada em sada por um algoritmo.
Um problema computacional possui vrias ocorrncias (ou instncias). Uma ocorrncia de
um problema computacional uma instncia qualquer da entrada do problema. Por exemplo,
no problema do clculo da rea do quadrado, sabemos que a entrada do problema o com-
primento l do lado do quadrado. Ento, qualquer valor vlido para l, ou seja, qualquer real
positivo, uma instncia do problema, por exemplo l = 2. Um algoritmo deve sempre ser
construdo para resolver todas as possveis ocorrncias de um problema. O algoritmo do nosso
exemplo contm instrues para o clculo da rea A do quadrado para qualquer valor de l
dado.
Um algoritmo dito correto se ele sempre termina e produz a resposta correta para todas
as ocorrncias de um dado problema. O algoritmo do nosso exemplo, portanto, correto.
Obviamente, a criana que executa as instrues deve saber cumpri-las de forma correta. Na
nossa analogia, a criana o computador. Os computadores que usamos na prtica sempre
cumprem as instrues que lhes damos de forma correta. Se houver algum erro na tentativa de
solucionar um problema computacional atravs de um computador, este erro est nas prprias
instrues que lhe demos. O computador apenas executa, elmente, as instrues que lhe
damos.
Quando comeamos a construir algoritmos, umas das habilidades mais importantes
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.2 REPRESENTAO DE ALGORITMOS 6
aquela de identicar qual a entrada e qual a sada do algoritmo a partir da descrio (ou
declarao) do problema. Voc deve procurar adquirir e aprimorar esta habilidade sem se pre-
ocupar em como resolver o problema ou escrever o algoritmo. Muitas vezes, o enunciado de
um problema computacional descreve, de forma explcita, qual a entrada e qual a sada do
algoritmo:
Escreva um algoritmo que recebe, como entrada, a base e a altura de um retngulo qualquer e
produz como sada a rea do retngulo.
Note que o prprio enunciado torna evidente que a entrada consiste dos comprimentos da base
e altura de um retngulo e a sada, da rea do retngulo. No entanto, o problema poderia ser
descrito como
Dados a base e a altura de um retngulo qualquer, calcule e escreva a rea do retngulo.
Note que, em ambos os casos, no preciso saber calcular a rea do retngulo ou escrever o
algoritmo que faz este clculo para determinar que a entrada do algoritmo a base e a altura
de um retngulo e a sada, ou seja, o dado que o algoritmo deve produzir como resposta, a
rea do retngulo.
2.2 Representao de algoritmos
Em geral, algoritmos so descritos atravs de uma linguagem que se assemelha quela que
usamos para nos comunicar. O vocabulrio das linguagens destinadas descrio de algo-
ritmos extremamente pequeno quando comparado ao das linguagens coloquiais, mas rico
o suciente para resolvermos uma gama enorme de problemas computacionais. Aqui, de-
screveremos algoritmos com uma linguagem conhecida como Portugol, que utilizada pela
ferramenta VISUALG , que ser utilizada na disciplina como forma de apoio ao aprendizado
de algoritmos.
Por exemplo, usando a linguagem Portugol da VISUALG, o algoritmo que vimos na seo
anterior para calcular a rea de um quadrado a partir do comprimento de seus lados descrito
como em 2.1:
Algoritmo 2.1: Algoritmo para calcular a rea de um quadrado.
1 algoritmo "Area do quadrado
2 var lado, area : real
3 inicio
4 escreva ( "Entre com o comprimento dos lados do quadrado: " )
5 leia ( lado )
6 area <- lado
*
lado
7 escreva ( "A area do quadrado e: " , area )
8 fimalgoritmo
H uma srie de detalhes sintticos da linguagem Portugol da ferramenta VISUALG que
devem ser dominados para que voc possa escrever seus algoritmos usando esta linguagem.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.3 RESOLUO DE PROBLEMAS 7
Parte do processo de aprendizado de construo de algoritmos dedicada familiarizao
com os aspectos sintticos de alguma linguagem de descrio de algoritmos. Felizmente, as
linguagens de descrio de algoritmos possuem estruturas sintticas bastante parecidas entre
si. Isto faz com que o uso de outra linguagem, aps o aprendizado da primeira, seja bastante
facilitado.
Uma outra forma de descrevermos algoritmos atravs do uso de uxogramas, que so di-
agramas com guras que identicam as vrias instrues do algoritmo. Nesta disciplina, tam-
bmutilizaremos uxogramas, embora a principal forma de descrio seja mesmo a linguagem
Portugol.
area < lado * lado
fim
area
lado
inicio
Figura 2.2: Fluxograma do algoritmo de clculo da rea do quadrado.
2.3 Resoluo de Problemas
Todo algoritmo est relacionado com a soluo de um determinado problema computa-
cional. Portanto, construir umalgoritmo para umdado problema signica, antes de mais nada,
determinar uma forma para solucionar um problema e descrev-la como uma seqncia nita
de instrues em alguma linguagem. A tarefa de encontrar a soluo de um problema qual-
quer , muitas vezes, realizada de forma emprica e um tanto quanto desorganizada; ocorrem
vrios procedimentos mentais, dos quais raramente tomamos conhecimento. Aorganizao do
processo de resoluo de problemas extremamente desejvel, pois somente assim podemos
vericar onde o processo no eciente. Identicadas as decincias deste processo, procu-
ramos formas de corrigi-las e, consequentemente, aumentamos a nossa capacidade de resolver
problemas.
A capacidade para resolver problemas pode ser vista como uma habilidade a ser adquirida.
Esta habilidade, como qualquer outra, pode ser obtida essencialmente pela combinao de
duas partes:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.4 COMPUTADORES 8
conhecimento e
destreza.
Conhecimento adquirido pelo estudo. Em termos de resoluo de problemas, est rela-
cionado a que tticas e estratgias usar e quando usar. Destreza adquirida pela prtica. A
experincia no uso do conhecimento (prtica) nos d mais agilidade na resoluo de proble-
mas.
2.4 Computadores
O que um computador? De acordo com o Websters New World Dictionary of the American
Language (segunda edio), um computador uma mquina eletrnica que, por meio de in-
strues e informaes armazenadas, executa rpida e frequentemente clculos complexos ou
compila, correlaciona e seleciona dados. Basicamente, um computador pode ser imaginado
como uma mquina que manipula informao na forma de nmeros e caracteres. Ainformao
denominada, de maneira geral, de dado. O que faz dos computadores mquinas notveis
a extrema rapidez e preciso com que eles podem armazenar, recuperar, manipular e produzir
dados.
Quando desejamos utilizar, pela primeira vez, um computador para nos auxiliar na tarefa
de processamento de dados, deparamo-nos com algumas questes inerentes a este processo:
Como informamos ao computador o algoritmo que deve ser executado para obtermos o resul-
tado desejado?, Como fornecemos a entrada do algoritmo? e Como recebemos o resultado
do algoritmo?
O ato de instruir o computador para que ele resolva um determinado problema con-
hecido como programao. Esta tarefa nada mais do que inserir no computador as aes
do algoritmo e os dados referenciados pelas aes. Estas, quando executadas pelo coputador,
produzema soluo do problema. Entretanto, antes de inserir as aes e os dados no computa-
dor, devemos reescrev-las em uma linguagem apropriada para descrever algoritmos com-
putacionais, ou seja, em uma linguagem de programao. O termo programa comumente
empregado para designar o algoritmo em uma linguagem de programao. Entretanto, no h
distino conceitual entre algoritmo e programa
1
. O Algoritmo 2.1 escrito em linguagem C
mostrado no Programa 2.1. Compare os dois!
Cada modelo de computador possui uma linguagemde programao prpria, denominada
linguagem de mquina, e, em geral, distinta das linguagens de mquina dos demais modelos
de computador. Esta a nica linguagem de programao que o computador realmente en-
tende. No entanto, para evitar que ns tenhamos de aprender a linguagem de mquina de
cada computador diferente para o qual queremos programar, muitas linguagens de progra-
mao independentes de mquina foram criadas. Se voc aprende uma linguagem indepen-
dente de mquina, estar apto, pelo menos em princpio, a programar qualquer computador
usando essa linguagem.
As linguagens de programao independentes de mquina no so compreendidas pelos
computadores. Ento, para que elas possam ser teis para ns, um programa denominado
1
Em Teoria da Computao, existe uma distino, mas ela no ser levada em conta aqui.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.4 COMPUTADORES 9
compilador deve estar presente no computador. Um compilador para uma determinada lin-
guagem de programao realiza a traduo automtica de um programa escrito em uma certa
linguagem para um programa equivalente escrito na linguagem de mquina. Tudo que pre-
cisamos fazer para executar um programa escrito em uma linguagem de programao que no
seja a linguagem de mquina do computador compilar o nosso programa com um compi-
lador especco para aquela linguagem e, em seguida, executar o programa produzido pelo
compilador.
Programa 2.1: Programa em linguagem C para calcular a rea de um quadrado.
1 #include <stdio.h>
2 void main()
3 {
4 double lado, area ;
5 printf( "Entre com o comprimento dos lados do quadrado:" ) ;
6 scanf( "%f\n" , &lado ) ;
7 area = lado
*
lado ;
8 printf( "A area do quadrado e: %f\n" , area ) ;
9 return ;
10 }
Tanto o algoritmo quanto os seus dados de entrada so inseridos nos computadores por
meio de equipamentos eletrnicos conhecidos como perifricos de entrada. O teclado e o
mouse so exemplos de perifricos de entrada. As instrues e os dados inseridos no computa-
dor atravs de um perifrico de entrada so armazenados em um dispositivo do computador
denominado memria (primria ou secundria). Os dados de sada resultantes da execuo
do algoritmo pelo computador so apresentados tambm por meio de equipamentos eletrni-
cos denominados perifricos de sada. O monitor de vdeo e a impressora so exemplos de
perifricos de sada.
O computador executa um determinado programa atravs de um dispositivo interno de-
nominado unidade central de processamento, mais conhecido no mundo dos computadores
pela sua abreviao em ingls: CPU (Central Processing Unit). A CPU responsvel por buscar
as instrues e os dados do programa que esto armazenados na memria do computador, de-
codicar as instrues e executar a tarefa descrita por elas com os respectivos dados. A CPU
pode ser vista como o crebro do computador.
No mundo dos computadores, voc ouvir as pessoas falarem sobre hardware e software.
Hardware se refere mquina propriamente dita e a todos os perifricos conectados a ela.
Software se refere aos programas que fazem a mquina realizar alguma tarefa. Muitos pa-
cotes de software esto disponveis nos dias atuais. Eles incluem processadores de texto,
planihas eletrnicas, sistemas gerenciadores de banco de dados, jogos, sistemas operacionais e
compiladores. Voc pode e aprender a criar seus prprios softwares. Para criar software, voc
dever adquirir competncias e habilidades para: (1) desenvolver algoritmos para solucionar
problemas computacionais e (2) usar uma linguagem de programao. Aqui, dedicamo-nos
(1).
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.5 EXERCCIOS PROPOSTOS 10
2.5 Exerccios propostos
1. O primeiro passo no desenvolvimento de um algoritmo para um dado problema com-
putacional o entendimento da entrada e da sada do problema. Este entendimento deve
preceder qualquer tentativa de desenvolvimento de uma soluo para o problema. Neste
exerccio, voc deve descrever qual a entrada e qual a sada de cada umdos problemas
listados abaixo:
(a) Dado um nmero inteiro qualquer, calcule e escreva o antecessor e o sucessor do
nmero dado.
(b) Dados trs nmeros reais no-negativos, calcule e escreva a mdia aritmtica dos
nmeros dados.
(c) Dado um nmero real qualquer, calcule e escreva a tera parte do nmero dado.
(d) Dados o termo inicial e a razo de uma PA, bem como um nmero inteiro positivo
n, calcule e escreva o valor do n-simo termo dessa PA.
(e) Escreva um algoritmo para ler o valor de uma temperatura em graus centrgados e
escrever a mesma temperatura em graus Fahrenheit. Se c o valor da temperatura
em graus centrgados, ento a temperatura, f, em Fahrenheit dada por
f =
9 c + 160
5
.
(f) Chico Bento deseja calcular o saldo atual de uma de suas aplicaes nanceiras. Para
tal, ele conhece o saldo anterior ao reajuste e sabe que este saldo foi reajustado em
1%. Escreva um algoritmo para calcular e escrever esse saldo atual.
(g) Chico Bento est preocupado com o consumo de energia de sua residncia e deseja
escrever um algoritmo para ajud-lo a controlar suas despesas com energia. Chico
Bento sabe que 100 quilowatts de energia equivalem a um stimo do salrio mn-
imo. Ento, dados o valor do salrio mnimo e a quantidade de quilowatts gasta na
residncia de Chico Bento, calcule e escreva (a) o valor em reais de cada quilowatt,
(b) o valor em reais a ser pago e (c) o novo valor em reais a ser pago se Chico Bento
ganhar um desconto de 10% por pagar em dia.
(h) Chico Bento possui um carro que faz, em mdia, 12 km com um litro de gasolina.
Ele realizou uma viagem com seu carro e est interessado emsaber quantos litros de
combustvel o carro consumiu. Para tal, ele dispe de duas informaes: o tempo
gasto dirigindo e a velocidade mdia do carro. Escreva um algoritmo para calcular
quantos litros de combustvel o carro de Chico Bento consumiu.
(i) Escreva umalgoritmo para ler umvalor de hora, emtermos de trs nmeros inteiros,
hora, minuto e segundos, e calcular e escrever o nmero de segundos que se passou
desde o comeo do dia at o valor da hora que foi fornecido como entrada para o
algoritmo.
(j) Dada uma centena, isto , um nmero inteiro positivo da forma xyz tal que x um
dgito de 1 a 9 e tanto y quanto z so dgitos de 0 a 9, calcule e escreva a unidade do
nmero dado.
Por exemplo, se o nmero dado igual a 147, a soluo do problema 7. Observe
que a entrada do problema consiste de um nico valor, que um nmero inteiro
positivo representando uma centena, e no os trs dgitos da centena.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.5 EXERCCIOS PROPOSTOS 11
2. Se voc puder, escreva umalgoritmo (ou seja, uma seqncia de instrues) para resolver
cada um dos problemas acima. Voc no precisa escrever as instrues na linguagem
do VISUALG, mas sim de forma livre, como na primeira seqncia de instrues que foi
dada para o problema da rea do quadrado.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 3
TIPOS DE DADOS E VARIVEIS
3.1 Tipos de dados
Os dados manipulados por um algoritmo podem possuir natureza distinta, isto , podem
ser nmeros, letras, frases, etc. Dependendo da natureza de um dado, algumas operaes
podem ou no fazer sentido quando aplicadas a eles. Por exemplo, no faz sentido falar em
somar duas letras. Para poder distinguir dados de naturezas distintas e saber quais operaes
podem ser realizadas com eles, os algoritmos utilizam o conceito de tipo de dados.
O tipo de um dado dene o conjunto de valores ao qual o dado pertence, bem como o con-
junto de todas as operaes que podematuar sobre qualquer valor daquele conjunto de valores.
Por exemplo, como veremos mais adiante, a linguagem que utilizaremos para descrever nos-
sos algoritmos possui o tipo de dado inteiro, que consiste no conjunto de todos os nmeros
inteiros, denotado por Z, e todas as operaes que podem ser aplicadas aos nmeros inteitos
(isto , adio, subtrao, multiplicao, diviso inteira e resto).
A seguir, descrevemos os tipos de dados oferecidos pela linguagem Portugol do VISUALG.
Na nossa descrio, o nome de umtipo escrito no formato tipo, assimcomo as demais palavras
reservadas da linguagem Portugol. Alm disso, ao denirmos um dado tipo de dados, no
fornecemos uma descrio detalhada das operaes que atuam sobre seus valores, pois tais
operaes sero objetos de estudo das prximas aulas.
inteiro: consiste dos nmeros inteiros e das operaes de adio, subtrao, multipli-
cao, diviso inteira e resto. Na linguagem Portugol, os nmeros inteiros so escritos
apenas como a concatenao dos dgitos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, tal como em 5, 100 e
1678. Nmeros negativos so representados com o sinal na frente do nmero, tal
como 23.
real: consiste dos nmeros reais e das operaes de adio, subtrao, multiplicao,
diviso. Na linguagemPortugol, os nmeros reais so caracterizados por possuremuma
parte inteira e uma parte fracionria. Por exemplo, as partes inteira e fracionria do nmero
real 3.141596 so 3 e 141596, respectivamente. Note que um ponto e no uma vrgula
usado para separar as partes inteira e fracionria.
Como sabemos, os nmeros reais incluem os nmeros inteiros. No entanto, para evitar
ambigidades na escrita de algoritmos, assumimos que todo nmero escrito sem a parte
fracionria do tipo inteiro. Por exemplo, 5 e 5.0 se referem ao mesmo nmero (cinco),
mas o primeiro do tipo inteiro e o segundo, do tipo real. Assim como os nmeros
inteiros negativos, nmeros reais negativos so representados com o sinal na frente
do nmero, tal como 3.141596.
12
3.2 VARIVEIS 13
caractere: consiste de um nico smbolo ou de uma concatenao de smbolos do alfabeto
usado pela linguagem Portugol. Este alfabeto inclui todas as letras do alfabeto romano,
todos os dgitos, 0, 1, . . . , 9 e os caracteres de pontuao, tais como ?, ., . . ., entre muitos
outros smbolos. Os elementos do conjunto de valores do tipo caractere devem ser es-
critos, nos algoritmos, entre aspas duplas, como, por exemplo, "a, "Esta e uma frase
formada por caracteres. H um elemento especial, , que denominado de palavra
vazia, pois no possui nenhum smbolo.
logico: inclui apenas os valores lgicos falso e verdadeiro e as operaes de negao,
conjuno e disjuno. Ns estudaremos este tipo em maiores detalhes mais adiante.
3.2 Variveis
Um algoritmo manipula dados, que podem ser dados variveis ou constantes. Dados var-
iveis so representados por variveis, enquanto dados constantes so representados por con-
stantes
1
.
Uma varivel pode ser imaginada como umcaixa para armazenar valores de dados. Esta
caixa s pode armazenar um nico valor por vez. No entanto, o valor armazenado na caixa
pode mudar inmeras vezes durante a execuo do algoritmo. Em um ambiente computa-
cional de verdade, a caixa correspondente a uma varivel uma posio da memria do com-
putador.
Uma varivel possui nome, tipo e contedo. O nome de uma varivel deve ser nico,
isto , identicar, de forma nica, a varivel no algoritmo. O tipo de uma varivel dene os
valores que podem ser armazenados na varivel. O contedo de uma varivel o valor que
ela armazena. importante lembrar que uma varivel s pode armazenar um valor de cada
vez. No entanto, ela pode assumir vrios valores distintos do mesmo tipo durante a execuo
do algoritmo.
O ato de se criar uma varivel conhecido como declarao de varivel.
Na linguagem Portugol, declararamos uma varivel usando uma sentena da seguinte
forma:
var nome : tipo
onde nome o nome da varivel e tipo o tipo da varivel.
Por exemplo, a sentena
var lado : real
declara uma varivel de nome lado do tipo real.
Podemos declarar mais de uma varivel do mesmo tipo emuma mesma linha. Por exemplo,
var lado, area : real
1
No discutiremos constantes neste momento.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.2 VARIVEIS 14
Note que nenhumcontedo (isto , valor) foi associado varivel durante a sua declarao.
Esta associao denominada denio e deve ser realizada aps a declarao da varivel
usando uma instruo de leitura ou um comando de atribuio. Vamos detalhar essas duas
formas.
A instruo de leitura tem a forma
leia ( nome )
onde nome o nome de uma varivel. Por exemplo,
leia ( lado )
uma instruo de leitura que atribui um valor varivel lado. O valor atribudo pela in-
struo deve ser fornecido como entrada para o algoritmo durante a sua execuo. Para voc
ter uma idia mais concreta do que estamos falando, demonstraremos, em sala de aula, a exe-
cuo da instruo de leitura do comprimento dos lados de umquadrado que escrevemos para
o Algoritmo 2.1.
A instruo de atribuio possui a forma
nome <- valor
onde nome o nome de uma varivel e valor um valor do mesmo tipo de dados da varivel.
Por exemplo,
lado <- 2.5
atribui o valor 2.5 varivel de nome lado. Para que uma instruo de atribuio faa sentido,
a varivel lado deve ser do tipo real e deve ter sido declarada antes da instruo de atribuio
ser executada.
O smbolo <- conhecido como operador de atribuio.
Muitas vezes, o valor atribudo a uma varivel atravs de uma instruo de atribuio
resultante de uma expresso aritmtica ou outro tipo de expresso que estudaremos mais adiante.
Por exemplo,
area <- lado * lado
uma instruo de atribuio que atribui o valor da varivel lado ao quadrado varivel area.
Oque vemos no lado direito do operador de atribuio, lado * lado, umexemplo de expresso
aritmtica.
Um valor atribudo a uma varivel permanece associado a ela at que uma instruo de
atribuio, que o substitua por outro, seja executada. Em qualquer dado instante de tempo
durante a execuo de umalgoritmo, o valor armazenado emuma qualquer varivel (se algum)
denominado valor atual (ou valor corrente) da varivel. Enquanto no atribuirmos um valor
a uma varivel, a varivel permanecer com valor desconhecido. Finalmente, importante
lembrar que uma varivel s poder receber uma valor atravs de uma instruo de leitura ou
atribuio.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.3 EXEMPLOS 15
3.3 Exemplos
Seguem abaixo alguns exemplos de declarao de variveis:
var fruta : caractere
var letra : caractere
var resultado : logico
var altura : real
var idade : inteiro
A seguir, temos exemplos de instrues de atribuio que atribuem valores a essas var-
iveis:
fruta <- "ma"
letra <- "c"
resultado <- falso
altura <- 1.83
idade <- 5
As mesmas variveis podem ter valores atribudos a elas atravs de instrues de leitura
como segue:
leia ( fruta )
leia ( letra )
leia ( altura )
leia ( idade )
Note que no escrevemos uma instruo de leitura para a varivel resultado. Isto se deve ao
fato de instrues de leitura no poderem ser aplicadas a variveis do tipo logico.
3.4 Nomes de variveis
Na linguagem Portugol, usamos as seguintes regras para criar um nome de varivel:
1. Nomes de variveis devem possuir como primeiro caractere uma letra ou o smbolo _
(sublinhado). Os demais caracteres, se algum, devem ser letras, nmeros ou sublinhado.
2. Nomes de variveis no podem ser iguais a palavras reservadas.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.4 NOMES DE VARIVEIS 16
3. Nomes de variveis podem ter, no mximo, 127 caracteres.
4. No h diferena entre letras maisculas e minsculas em nomes de variveis.
De acordo com a regra 1, nomes de variveis no podem conter espaos em branco. De
acordo com a regra 2, nomes de variveis no podem ser palavras reservadas da linguagem
Portugol. Uma palavra reservada uma palavra que possui um signicado especial para a
linguagem Portugol. Em geral, uma palavra reservada identica uma instruo. Neste texto,
tais palavras aparecem sublinhas. O conjunto de palavras reservadas do Portugol mostrado
na Tabela 3.1.
aleatorio e grauprad passo
abs eco inicio pausa
algoritmo enquanto int pi
arcos entao interrompa pos
arcsen escolha leia procedimento
arctan escreva literal quad
arquivo exp log radpgrau
asc faca logico raizq
ate falso logn rand
caractere malgoritmo maiusc randi
caso menquanto mensagem repita
compr mescolha minusc se
copia mfuncao nao sen
cos mpara numerico senao
cotan mprocedimento numpcarac timer
cronometro mrepita ou tan
debug mse outrocaso var
declare funcao para verdadeiro
xou
Tabela 3.1: Palavras reservadas da linguagem Portugol.
Por exemplo,
_12234, fruta e x123
so nomes vlidos para variveis, mas
maria bonita, pi, fru?ta e 1xed
no so. O nome maria bonita contm um espao em branco. O nome pi uma palavra reser-
vada. O nome fru?ta contm um caractere que no letra, nmero nem sublinhado, ?. O nome
1xed inicia com um nmero. Com exceo de pi, que viola a regra 2, os demais nomes violam a
regra 1.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.5 EXERCCIOS RESOLVIDOS 17
3.5 Exerccios Resolvidos
1. Escreva a declarao de uma varivel do tipo real de nome x.
soluo:
var x : real
2. Escreva a declarao de uma varivel do tipo caractere de nome carro.
soluo:
var carro : caractere
3. Escreva a instruo de atribuio que atribui o valor 2.3 varivel do problema 1.
soluo:
x <- 2.3
4. Escreva a instruo de atribuio que atribui o valor "corsa" varivel do problema 2.
soluo:
carro <- "corsa"
5. Quais dos seguintes nomes so vlidos como nomes de variveis?
(a) xyz_2
(b) _
(c) ____
(d) x123
(e) 123y
(f) 1_2
soluo:
(a), (b), (c) e (d).
3.6 Exerccios propostos
1. Escreva a declarao de uma varivel do tipo caractere de nome rua.
2. Escreva a instruo de atribuio que atribui o nome de sua rua varivel do problema
1.
3. Escreva a declarao de uma varivel do tipo logico de nome achou.
4. Escreva a instruo de atribuio que atribui a palavra reservada verdadeiro varivel
do problema 3.
5. Quais dos seguintes nomes so vlidos como nomes de variveis?
(a) meucarro
(b) salute!
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.6 EXERCCIOS PROPOSTOS 18
(c) x_y_1
(d) ___
(e) 34
6. Escreva o tipo de dado ideal para se representar cada uma das seguintes informaes:
(a) O nome de uma rua
(b) A data de nascimento de uma pessoa
(c) Se uma pessoa diabtica ou no
(d) O saldo de uma conta bancria
(e) O resultado de uma operao de raiz quadrada
7. Identique o tipo de dados dos seguintes valores:
(a) "9 de agosto de 1968"
(b) 1.3
(c) falso
(d) 31
(e) "?"
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 4
ENTRADA E SADA
4.1 Instrues de entrada e sada
Todo algoritmo necessita de uma forma de obteno dos dados de entrada do problema,
assim como uma forma de comunicao da sada por ele produzida. Para tal, os algoritmos
contam com instrues de entrada e sada. Na linguagem Portugol, a instruo de leitura leia
e a instruo de sada escreva. Como vimos na aula anterior, a instruo de leitura requer o
nome de uma varivel para armazenar o dado de entrada a ser obtido.
Por exemplo,
leia( lado )
onde lado o nome de uma varivel. Quando a instruo acima executada, o valor lido passa
a ser o contedo de lado. Logo, para acessar o valor lido, basta usarmos o nome da varivel.
importante lembrar que a varivel tem de ser declarada antes de seu uso pela instruo de
leitura.
A instruo de escrita, na linguagem Portugol, denominada escreva. Esta instruo tam-
bm requer um argumento, que corresponde ao valor a ser escrito como sada. Este valor pode
ser o contedo de uma varivel ou uma constante do tipo inteiro, real ou caractere.
Por exemplo,
escreva( lado )
escreve como sada o valor da varivel de nome lado.
interessante frisar que a instruo de escrita no usada apenas para escrever o resultado
do algoritmo, mas sim para escrever qualquer informao que auxilie a comunicao entre o
algoritmo e o mundo exterior. Por exemplo, comum escrevermos uma mensagem antes de
uma instruo de leitura. Esta mensagem, em geral, uma descrio muito sucinta do valor
que o algoritmo espera receber do mundo exterior para atribuir varivel na instruo de
leitura.
Por exemplo, a instruo
escreva( "Entre com o comprimento dos lados do quadrado: ")
pode preceder a instruo
leia( lado )
para indicar ao mundo exterior que o algoritmo espera um valor correspondente ao com-
primento dos lados de um quadrado. A mensagem Entre com o comprimento dos lados do
19
4.2 A ESTRUTURA DE UM ALGORITMO 20
quadrado: um valor constante, ou seja, um valor do conjunto de valores do tipo caractere.
Quando a instruo de escrita acima executada, a sada correspondente a sentena entre
aspas duplas:
Entre com o comprimento dos lados do quadrado:
O uso da instruo de escrita para emitir mensagens motivado pelo fato de um programa
de computador, em geral, interagir com o ser humano durante sua execuo; isto , o mundo
exterior , em geral, um humano. Mais especicamente, bastante comum que a entrada de
um programa seja fornecida por um ser humano. Neste caso, as mensagens de sada tm como
objetivo auxiliar a comunicao entre o programa e o ser humano, que conhecido por usurio.
Em um ambiente de programao tpico, as mensagens de sada aparecem em um monitor de
vdeo e os dados de entrada so fornecidos ao programa por meio de um teclado ou mouse.
4.2 A estrutura de um algoritmo
Um algoritmo escrito em Portugol pode ser tipicamente dividido nas seguintes partes:
A linha de cabealho, que a primeira linha do algoritmo, contm a palavra
algoritmo
seguida por um texto que identica o algoritmo.
A declarao de variveis, que a seo em que as variveis so declaradas, iniciada
pela palavra var e seguida por uma ou mais declaraes de variveis.
O corpo do algoritmo, que contmas instrues que, de fato, fazem o trabalho descrito
pelo algoritmo.
O corpo do algoritmo se inicia com a palavra
inicio
A linha nal, que obrigatoriamente a ltima linha do algoritmo, contm a palavra
malgoritmo
que especica o trmino do algoritmo.
Os algoritmos escritos na linguagem Portugol tambm possuem algumas particularidades
que os tornam mais claros e mais fceis de serem lidos e entendidos. As principais caractersti-
cas so:
Cada instruo do algoritmo escrita em uma linha dedicada apenas instruo.
As declaraes de variveis e o contedo do corpo do algoritmo so identados comrelao
linha de cabealho e a linha nal. Alm disso, pode ser que haja linhas em branco
entre uma seqncia de linhas. Essas linhas em branco servem para separar partes do
algoritmo que esto menos relacionadas.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.2 A ESTRUTURA DE UM ALGORITMO 21
O algoritmo pode conter comentrios. Comentrios so linhas no executveis, ou seja,
elas no fazem parte do processo de produo da sada do algoritmo e servem apenas
para nos auxiliar na leitura e entendimento da soluo do algoritmo. As linhas de co-
mentrio se iniciam obrigatoriamente com o smbolo //.
O Algoritmo 4.1 l o valor de uma varivel, denominada num, e escreve este mesmo valor
como sada.
Algoritmo 4.1: Algoritmo para ler um numero inteiro e escrever o valor lido.
1 //
2 // Este algoritmo exemplifica as instrucoes de entrada e saida
3 //
4 algoritmo "Leitura e escrita"
5 var
6 //
7 // Secao de declaracao de variaveis
8 //
9 num : inteiro
10 inicio
11 // Escreve uma mensagem para indicar o que deve ser lido pelo algoritmo
12 escreva ( "Entre com um numero inteiro: " )
13
14 // Realiza a leitura de um numero inteiro e o associa a uma variavel
15 leia ( num )
16
17 // Escreve o valor do numero lido
18 escreva ( "O numero que voce forneceu foi: " , num )
19 fimalgoritmo
Alguns comentrios sobre o algoritmo acima:
O nome do algoritmo foi escrito cercado por aspas duplas:
algoritmo Leitura e escrita
Devemos declarar uma varivel para cada dado de entrada. No problema computacional
acima, a entrada consiste apenas de um nmero inteiro. Logo, declaramos apenas uma
varivel para a entrada do problema: num.
A instruo de sada foi utilizada para emitir uma mensagem,
escreva ( Entre com um numero inteiro: )
e para escrever a sada do algoritmo:
escreva ( O numero que voce forneceu foi: , num )
Note que a linha acima possui dois dados separados por vrgula. O primeiro a men-
sagem e o segundo a varivel num. Neste caso, os dados so escritos no dispositivo de
sada em uma mesma linha, separados por um espao e sem a vrgula.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.3 EXERCCIOS RESOLVIDOS 22
4.3 Exerccios resolvidos
1. Considere o Algoritmo 4.2 para ler e escrever um nmero e uma palavra:
Algoritmo 4.2: Algoritmo para ler um numero e uma palavra e escrever ambos.
1 //
2 // Este algoritmo le e escreve um numero e uma palavra
3 //
4 algoritmo "Leitura e escrita de numero e palavra"
5 var
6 //
7 // Secao de declaracao de variaveis
8 //
9 num : inteiro
10 pal : caractere
11 inicio
12 // Escreve uma mensagem para solicitar um numero
13 escreva ( "Entre com um numero inteiro: " )
14
15 // Realiza a leitura de um numero inteiro e o atribui a uma variavel
16 leia ( num )
17
18 // Escreve uma mensagem para solicitar uma palavra
19 escreva ( "Entre com uma palavra: " )
20
21 // Realiza a leitura de uma palavra e a atribui a uma variavel
22 leia ( pal )
23
24 // Escreve numero e palavra lidos
25 escreva ( "O numero e a palavra fornecidos foram: " , num , " e ", pal )
26 fimalgoritmo
Ento, responda:
(a) Quais so os dados de entrada do algoritmo?
(b) Qual(is) (so) a(s) varivel(is) que armazena(m) o(s) valor(es) de entrada?
(c) Se fornecermos o o nmero inteiro 5 e a palavra algoritmo como entrada para o
algoritmo, o que o algoritmo escreve como sada?
soluo:
1. (a) Um nmero inteiro e uma palavra.
(b) num e pal.
(c) O numero e a palavra fornecidos foram: 5 e algoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.4 EXERCCIOS PROPOSTOS 23
4.4 Exerccios propostos
1. Escreva um algoritmo para ler um nmero real e uma letra e escrever o nmero e a letra
lidos.
2. Use a ferramenta VISUALG para executar o algoritmo que voc escreveu para o problema
anterior.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 5
EXPRESSES ARITMTICAS PARTE 1
5.1 Operadores aritmticos
Os operadores aritmticos denemas operaes aritmticas que podemser realizadas sobre
os nmeros inteiros e reais. Para os inteiros, as operaes aritmticas so a adio, subtrao,
multiplicao e resto. Para os nmeros reais, as operaes aritmticas so a adio, subtrao,
multiplicao e diviso. Nesta aula, restringiremos nossa ateno aos nmeros inteiros apenas.
Na linguagem Portugol, os operadores aritmticos correspondentes s operaes denidas so-
bre os inteiros so
+ (adio)
(subtrao ou menos unrio)
(multiplicao)
(diviso inteira)
% (resto aplicado apenas aos valores inteiros).
Comos operadores acima, podemos escrever expresses aritmticas que envolvemconstantes
e variveis inteiras. Por exemplo, suponha que a, b e c sejam variveis do tipo inteiro. Ento,
temos que
a +b +c, a b c %2, e 5 + 3 8 2
so todas expresses aritmticas vlidas na linguagem Portugol.
Nos exemplos acima, tivemos o cuidado de usar operandos do mesmo tipo. A razo para
tal que, por denio, cada operador aritmtico atua sobre valores de um mesmo tipo e o
resultado da operao deve sempre ser um valor do mesmo tipo dos operandos. Logo, no
faz sentido escrevermos algo como a + 2 quando a uma varivel ou constante do tipo real,
pois existe uma ambigidade em relao ao resultado da operao. No entanto, como veremos
mais adiante, podemos denir regras semnticas associadas aos operadores que nos permitem
interpretar, de forma nica, o resultado da operao aritmtica correspondente. Tais regras nos
permitiro escrever expresses aritmticas envolvendo variveis e constantes dos tipos inteiro
e real.
24
5.2 PRECEDNCIA DE OPERADORES 25
5.2 Precedncia de operadores
Qual o valor da expresso aritmtica
5 3 %2 ?
Podemos dizer que o valor da expresso igual a 1, se avaliarmos 5 3 primeiro e, depois,
15 %2, ou podemos dizer que igual a 5 se avaliarmos 3 %2 primeiro e, depois, 5 1. As duas
respostas so igualmente vlidas. No entanto, como no podemos permitir ambigidades em
algoritmos, devemos denir regras de precedncia de operadores, que so regras para denir a
ordememque os operadores aritmticos que vimos so aplicados emuma expresso aritmtica
qualquer.
Na linguagem Portugol, os operadores possuem prioridades associadas com eles. A op-
erao associada a um operador com prioridade p sempre executada antes da operao as-
sociada a um operador com prioridade q sempre que p > q. Quando p = q, a operao cor-
respondente ao operador mais esquerda executado. O operador de maior prioridade o
menos unrio, . Em seguida, temos os operadores , e %. Finalmente, com a prioridade
mais baixa, temos os operadores + e , onde + e so os operadores de adio e subtrao,
respectivamente. A Tabela 5.1 resume essas prioridades.
Operador Smbolo Prioridade
menos unrio mais alta
multiplicao, diviso inteira e resto , e %
adio e subtrao +, mais baixa
Tabela 5.1: Operadores aritmticos sobre os inteiros e suas prioridades.
Por exemplo, em
a +b +c ,
a operao a + b realizada e, em seguida, o resultado dela adicionado ao valor de c, pois os
operadores possuem a mesma prioridade e, portanto, as operaes so realizadas da esquerda
para a direita.
Na expresso aritmtica
a b c %2 ,
a operao b c efetuada primeiro e, em seguida, o resto da diviso de b c por 2 calculado.
Finalmente, o resto subtrado de a. Note que a multiplicao foi efetuada antes da diviso,
pois os operadores e % possuem a mesma prioridade, mas est mais esquerda.
Uma boa forma de se familiarizar com os operadores aritmticos e as regras de precedncia
escrevendo algoritmos para escrever o resultado de expresses aritmticas. O Algoritmo 5.1
calcula e escreve, usando a instruo escreval, o resultado de expresses envolvendo nmeros
inteiros. A instruo escreval faz o mesmo que a instruo escreva, mas gera um salto de
linha aps a escrita. Um algoritmo mais interessante, o Algoritmo 5.2, recebe, como entrada,
trs inteiros quaisquer e calcula e escreve o resultado de algumas expresses aritmticas envol-
vendo os inteiros lidos.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.3 ALTERAO DE PRIORIDADES 26
5.3 Alterao de prioridades
Algumas vezes desejvel alterar a ordem (imposta pelas regras de precedncia) segundo
a qual as operaes so realizadas em uma expresso aritmtica. Para tal, fazemos uso de
parnteses. Por hiptese, todo operador possui prioridade mais baixa do que a dos parnteses.
Isto garante que os operandos correspondentes ao valor das expresses entre parnteses se-
jam calculados antes de serem usados pelos demais operadores. importante destacar que os
parnteses devem ocorrer em pares (um aberto e um fechado) nas expresses e podem ocorrer
aninhados em diversos nveis.
Algoritmo 5.1: Algoritmo para calcular algumas expresses aritmticas envolvendo nmeros
inteiros.
1 algoritmo "Calculo de expressoes aritmeticas"
2
3 inicio
4 escreval( "O resultado da expressao 5
*
3 % 2 e: ", 5
*
3 % 2 )
5
6 escreval( "O resultado da expressao -5
*
3 % 2 \ 8 e: ", -5
*
3 % 2 \ 8 )
7
8 escreval( "O resultado da expressao -5 - 3 - 6
*
3 e: ", -5 - 3 - 6
*
3 )
9
10 fimalgoritmo
Por exemplo, na expresso
(a b) (c %2) ,
a operao a b realizada primeiro. Em seguida, a operao c %2 realizada e, por ltimo,
a multiplicao dos resultados das duas operaes anteriores entre os parnteses realizada.
Mas, como sabemos disso? A idia imaginar as expresses entre parnteses como operandos
a seremdescobertos. Comisso emmente, a expresso acima pode ser imaginada como tendo
a forma
op
1
op
2
,
onde op
1
e op
2
so as expresses (a b) e (c %2). Ento, o que temos uma simples mul-
tiplicao de dois valores, op
1
e op
2
. No entanto, para que esta multiplicao seja realizada,
precisamos dos valores op
1
e op
2
. Para tal, assumimos que o valor, op
1
, esquerda do operador
de multiplicao, , ser obtido antes do valor, op
2
, direita dele. Para calcular op
1
, avaliamos
a expresso
a b ,
que se encontra dentro do parnteses. Neste momento, descobrimos que a subtrao a b
a primeira operao aritmtica realizada. Uma vez que o valor op
1
tenha sido descoberto,
avaliamos
c %2 ,
que a expresso correspondente ao valor op
2
. Neste momento, descobrimos que a operao
de resto de diviso, c %2, a segunda operao aritmtica realizada. Neste momento, dispomos
dos valores op
1
e op
2
e, portanto, podemos realizar a multiplicao op
1
op
2
, que passa a ser
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.3 ALTERAO DE PRIORIDADES 27
a terceira operao realizada. Logo, os operadores so aplicados na ordem, % e . Usamos a
notao
(a
1
b)
3
(c %
2
2)
para indicar este fato. Isto , os operadores possuem ndices que indicam a ordem em que so
aplicados.
Algoritmo 5.2: Algoritmo para calcular algumas expresses aritmticas com variveis inteiras.
1 algoritmo "Expressoes aritmeticas envolvendo variaveis e constantes"
2 var
3 a , b , c : inteiro
4 inicio
5 escreva( "Entre com o valor da variavel a: " )
6 leia( a )
7
8 escreva( "Entre com o valor da variavel b: " )
9 leia( b )
10
11 escreva( "Entre com o valor da variavel c: " )
12 leia( c )
13
14 escreval( "O resultado da expressao a
*
b % c e: ", a
*
b % c )
15
16 escreval( "O resultado da expressao -a
*
b % c
*
8 e: ", -a
*
b % c
*
8 )
17
18 escreval( "O resultado da expressao -a - b - c
*
3 e: ", -a - b - c
*
3 )
19
20 fimalgoritmo
A expresso
((2 + 3) (1 + 2)) 3 (3 + (3 2))
bem mais complexa do que a anterior, mas podemos determinar a ordem em que os oper-
adores so aplicados da mesma forma que antes. O primeiro passo substituir as expresses
dentro dos parnteses por operandos a serem descobertos. Isto feito para os parnteses mais
externos:
op
1
3 op
2
.
Agora, vemos que se os valores entre parnteses fossem conhecidos, haveria apenas duas op-
eraes a serem realizadas: uma multiplicao e uma adio. A multiplio possui prioridade
sobre a adio e ela precisa do valor op
1
para ser realizada. Ento, considere a expresso corre-
spondente a op
1
:
(2 + 3) (1 + 2) .
Esta expresso contm outras expresses dentro de parnteses e, assim como antes, ela pode
ser vista como
op
3
op
4
.
onde op
3
e op
4
correspondem s expresses 2 + 3 e 1 + 2, respectivamente. Para realizarmos
a operao de subtrao acima, precisamos dos valores op
3
e op
4
. Por estar esquerda do
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.4 A INSTRUO DE ATRIBUIO 28
operador, o valor op
3
descoberto primeiro. Isto implica que a primeira operao realizada a
adio
2 + 3
e a prxima a adio
1 + 2 .
Em seguida, temos a subtrao op
3
op
4
:
(2 + 3) (1 + 2) .
Depois que a subtrao acima for realizada, o valor op
1
se torna conhecido e, consequente-
mente, a multiplicao op
1
3 pode ser realizada, tornando-se a quarta operao realizada. O
resultado desta operao o primeiro operando disponvel da subtrao em op
1
3 op
2
.
Mas, esta subtrao no pode ser efetuada antes do valor op
2
ser conhecido, ou seja, antes da
expresso
3 + (3 2)
ser avaliada. Assim como zemos antes, podemos imaginar a expresso acima tendo a forma
3 + op
5
,
onde op
5
o valor da expresso, 3 2, entre parnteses. A adio na expresso acima precisa
do valor op
5
para ser realizada. Isto signica que a subtrao 3 2 a quinta operao real-
izada. Depois dela, a adio 3 + op
5
realizada, tornando-se a sexta operao realizada. Logo
em seguida, o valor op
2
se torna conhecido, o que possibilita a realizao da stima e ltima
operao, que a subtrao emop
1
3 op
2
. Usando a notao de subscrito, temos a seguinte
ordem:
((2 +
1
3)
3
(1 +
2
2))
4
3
7
(3 +
6
(3
5
2)) .
5.4 A instruo de atribuio
Quando utilizamos expresses aritmticas em nossos algoritmos, necessitaremos, muito
freqentemente, armazenar o valor da expresso em uma varivel. Como vimos na Aula 3, a
atribuio de um valor a uma varivel pode ser realizada atravs da instruo de leitura leia
ou do operador de atribuio <-. A instruo leia usada apenas quando o valor a ser atribudo
varivel fornecido como entrada para o algoritmo. Como o valor que queremos atribuir
varivel resultante da avaliao de uma expresso aritmtica, devemos usar o operador de
atribuio.
Por exemplo, suponha que o resultado da expresso
5 %2
deva ser atribudo a uma varivel inteira de nome resultado. Ento, a atribuio pode ser real-
izada da seguinte forma:
resultado<- 5 %2
Para um exemplo mais concreto do uso do operador de atribuio, considere o Algo-
ritmo 5.3, que l dois nmeros inteiros, calcula o quadrado da soma dos dois nmeros lidos,
atribui o resultado a uma varivel inteira, usando o operador <-, e escreve o valor da varivel.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.5 EXERCCIOS RESOLVIDOS 29
5.5 Exerccios resolvidos
1. Considere a expresso polinomial
5x
3
+ 7x
2
3x 1 ,
onde x uma varivel. Escreva a expresso acima usando a linguagem Portugol.
soluo:
5 x x x + 7 x x 3 x 1 .
2. Avalie a seguinte expresso aritmtica de acordo com as regras de precedncia da lin-
guagem Portugol:
2 3 5
soluo:
2 3 5 = 2 15 = 13 .
Algoritmo 5.3: Algoritmo para calcular o quadrado da soma de dois inteiros.
1 algoritmo "Quadrado da soma de 2 inteiros"
2 var
3 a , b , quadrado : inteiro
4 inicio
5 escreva( "Entre com o primeiro inteiro: " )
6 leia( a )
7
8 escreva( "Entre com o segundo inteiro: " )
9 leia( b )
10
11 quadrado <- ( a + b )
*
( a + b )
12
13 escreva ( "O quadrado da soma dos inteiros lidos e: " , quadrado )
14 fimalgoritmo
5.6 Exerccios propostos
1. Escreva a expresso abaixo usando a linguagem Portugol:
x
0
+v t
2. Avalie a seguinte expresso aritmtica de acordo com as regras de precedncia da lin-
guagem Portugol:
(2 3) 5
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.6 EXERCCIOS PROPOSTOS 30
3. Suponha que a linha 11 do Algoritmo 5.3 seja substituda por
quadrado<- a + b a + b
Voc acha que o algoritmo continuar correto? Justique sua resposta.
4. Suponha que a linha 11 do Algoritmo 5.3 seja substituda pelas duas seguintes linhas:
quadrado <- a + b
quadrado<- quadrado quadrado
Voc acha que o algoritmo continuar correto? Justique sua resposta.
5. Escreva um algoritmo, usando a linguagem Portugol, para ler dois nmeros inteiros, cal-
cular o cubo da soma desses dois nmeros e escrever o resultado calculado como sada.
6. Implemente o algoritmo anterior usando a ferramenta VISUALG.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 6
PROVA DE AVALIAO DE
CONHECIMENTO PRVIO
Essa aula ser dedicada aplicao de uma prova de conhecimento prvio. Aprova tempor
objetivo avaliar conhecimentos bsicos de matemtica e raciocnio lgico adquiridos no ensino
fundamental e mdio, A prova vale 1,0 ponto. este ponto ser somado nota da primeira prova,
que valer 10,0 pontos. Portanto, a nota desta prova pode apenas fazer com que a nota da
primeira unidade aumente e no prejudicar quem no a zer ou apresentar um desempenho
baixo.
31
AULA 7
EXPRESSES ARITMTICAS PARTE 2
7.1 Operadores aritmticos sobre os reais
Como vimos na aula anterior, os operadores aritmticos denem as operaes aritmticas
que podem ser realizadas sobre os nmeros inteiros e reais. J estudamos os operadores ar-
itmticos que atuam sobre os inteiros e, nesta aula, estudaremos aqueles que atuam sobre os
reais:
+ (adio).
(subtrao ou menos unrio).
(multiplicao).
/ (diviso).
Observe que os trs primeiros operadores so comuns aos reais e inteiros. Observe tambm
que o operador de diviso, /, est denido apenas para os reais. Por sua vez, o operador de
resto, %, est denido apenas para os inteiros. A Tabela 7.1 lista os operadores aritmticos
sobre os reais e suas respectivas prioridades. Ao escrevermos expresses aritmticas, podemos
alterar a prioridade desses operadores com o uso de parnteses da mesma forma que vimos
antes.
Operador Smbolo Prioridade
menos unrio mais alta
multiplicao e diviso , /
adio e subtrao +, mais baixa
Tabela 7.1: Operadores aritmticos sobre os reais e suas prioridades.
Por exemplo, considere a expresso
3a + 2b
c
a 1
1 +
a +b
2c
,
onde a, b e c so variveis. Na linguagem Portugol, a expresso acima pode ser escrita como
segue:
(3.0 a + 2.0 b) / (c (a 1.0) / (1.0 + (a +b) / (2.0 c))) .
32
7.2 REGRAS SEMNTICAS 33
importante notar que todos os parnteses so necessrios para que a expresso, na lin-
guagem Portugol, seja equivalente expresso aritmtica dada. Abaixo, indicamos, com
ndices nos operadores, a ordem em que as operaes da expresso so executadas quando
a expresso avaliada:
(3.0
1
a +
3
2.0
2
b) /
11
(x
10
(a
4
1.0) /
9
(1.0 +
8
(a +
5
b) /
7
(2.0
6
c))) .
O Algoritmo 7.1 calcula o valor da expresso acima para quaisquer valores de a, b e c
fornecidos como entrada. O valor da expresso atribudo a uma varivel antes de ser escrito
como sada.
Algoritmo 7.1: Algoritmo para calcular expresso aritmticas com variveis reais.
1 algoritmo "Expressoes aritmeticas com variaveis e constantes reais"
2 var
3 a , b , c , res : real
4 inicio
5 escreva( "Entre com o valor da variavel a: " )
6 leia( a )
7
8 escreva( "Entre com o valor da variavel b: " )
9 leia( b )
10
11 escreva( "Entre com o valor da variavel c: " )
12 leia( c )
13
14 res <- ( 3.0
*
a + 2.0
*
b ) /
15 ( c - ( a - 1.0 ) / ( 1.0 + ( a + b ) /
16 ( 2.0
*
c ) ) )
17
18 escreva ( "O resultado da expressao e: ", res )
19 fimalgoritmo
7.2 Regras semnticas
Na expresso
(3.0 a + 2.0 b) / (c (a 1.0) / (1.0 + (a +b) / (2.0 c))) ,
as constantes foram escritas com nmeros reais e as variveis so todas do tipo real. Logo,
cada operador aritmtico atuar sobre dois valores reais e produzir outro valor real. No en-
tanto, possvel, na linguagem Portugol, escrevermos expresses aritmticas que envolvam
constantes e variveis dos tipos inteiro e real. Para que tais expresses faam sentido, den-
imos a seguinte regra semntica: se os dois operandos de um operador binrio possuem tipos
distintos (um do tipo inteiro e o outro, do tipo real), o valor do tipo inteiro convertido para
o valor do tipo real equivalente. Logo, a operao executada sobre dois valores reais e o
resultado um valor do tipo real.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.3 UM ALGORITMO ENVOLVENDO CONSTANTES E VARIVEIS REAIS 34
Por exemplo, na expresso
(a b) (c / 2) ,
se as variveis a, b e c so do tipo real, o inteiro 2 convertido (automaticamente) para o real 2.0
imediatamente antes da operao de diviso ser executada. Em outras palavras, na linguagem
Portugol, a expresso acima equivalente expresso:
(a b) (c / 2.0) .
De maneira geral, o operador de diviso, /, pode ser utilizado para dividir valores inteiros.
Por exemplo,
5 / 2
igual ao valor real 2.5. Na expresso acima, no h nenhuma constante ou varivel do tipo
real. Mas, mesmo assim, os valores inteiros, que so operandos do operador /, so conver-
tidos para os valores reais equivalentes antes da operao de diviso ser efetuada. Logo, ns
podemos dividir dois inteiros usando /, mas o resultado da diviso um valor do tipo real
e no inteiro. Quando desejarmos realizar a diviso inteira dos dois inteiros, devemos usar o
operador .
Umoutro aspecto importante das expresses aritmticas envolvendo valores inteiros e reais
a precedncia de operadores. O que acontece se a expresso contiver os operadores / e %?
Como sabemos, o operador % s pode ser aplicado a inteiros. Mas, nada impede que ele ocorra
em uma expresso aritmtica que envolva inteiros e o operador /. Por exemplo, considere a
expresso
5 %2 / 2 .
Na linguagem Portugol, o operador % possui prioridade igual a do operador /. Logo, a oper-
ao 5 %2 realizada primeiro, produzindo o inteiro 1 como resultado. Emseguida, a operao
1 / 2 realizada. Isto signica que os valores inteiros sero convertidos (automaticamente) para
valores reais equivalentes e a diviso ser executada, gerando o valor 0.5. Bem, e se a expresso
fosse
5 / 2 %2 ?
Neste caso, a diviso 5 / 2 a primeira operao realizada, gerando o nmero real 2.5 como
resultado. Em seguida, a operao 2.5 %2 deve ser realizada. Mas, como o operador % no
pode atuar sobre nmeros reais, a operao 2.5 %2 no pode ser realizada. Voc poderia imag-
inar que o nmero 2.5 seria convertido em um nmero inteiro (por arredondamento ou trunca-
mento), de modo que a operao pudesse ser efetuada. Na linguagem Portugol, nenhum valor real
pode ser automaticamente convertido em um valor inteiro. Isto signica que a segunda expresso
aritmtica acima invlida na linguagemPortugol. A ferramenta VISUALG acusar um erro se
tentarmos utilizar esta expresso em um algoritmo (verique!). Em uma aula futura, veremos
uma funo da linguagem Portugol que nos permitir obter a parte inteira de um um valor real
qualquer.
7.3 Um algoritmo envolvendo constantes e variveis reais
Considere o problema de desenvolver um algoritmo para determinar o volume, V , de uma
esfera a partir do raio, r, da esfera. Como sabemos, a relao entre os valores V e r dada pela
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.4 EXERCCIOS RESOLVIDOS 35
frmula
V =
4
3
r
3
. (7.1)
O nosso algoritmo deve ler o valor do raio r da esfera, calcular o valor de V e escrever este
valor como sada. Para calcular o valor de V , nosso algoritmo pode se utilizar da frmula em
Eq. (7.1). Uma das particularidades da frmula que ela utiliza a constante . Para lidar com
situaes como essa, a linguagem Portugol possui uma palavra reservada, chamada pi, que
representa a constante . Logo, na linguagem Portugol, a frmula acima pode ser escrita como
segue:
(4 / 3) pi raio raio raio ,
onde assumimos que raio o nome da varivel que representa o raio r da esfera. Se a linguagem
Portugol no nos fornecesse a constante pi, poderamos escrever uma expresso para a frmula,
tal como
(4 / 3) 3.141596 raio raio raio ,
que se utiliza de um valor aproximado para o nmero . No entanto, o uso da palavra pi
mais recomendado, pois ela faz com que a sintaxe da expresso resultante seja mais legvel e
signicante.
Uma vez que saibamos como escrever, na linguagem Portugol, a expresso arimtica que
calcula o valor do volume V da esfera de raio r, podemos desenvolver o restante do algoritmo.
A entrada do algoritmo consiste apenas do valor do raio, r, da esfera. Ento, devemos declarar
uma varivel, digamos raio, para representar o valor de r. Aps calcularmos o valor do volume,
V , da esfera usando a frmula emEq. (7.1), atribuimos este valor a uma outra varivel, digamos
volume, que precisa ser declarada tambm. As duas variveis do algoritmo so do tipo real.
Finalmente, escreveremos o valor da varivel volume como sada. O algoritmo resultante o
Algoritmo 7.2.
Algoritmo 7.2: Algoritmo para calcular o volume da esfera.
1 algoritmo "Volume da esfera"
2 var
3 raio, volume : real
4 inicio
5 escreva( "Entre com o valor do raio da esfera: " )
6 leia( raio )
7
8 volume <- ( 4 / 3 )
*
pi
*
raio
*
raio
*
raio
9
10 escreva ( "O volume da esfera de raio " , raio , " e " , volume )
11 fimalgoritmo
7.4 Exerccios resolvidos
1. Escreva a seguinte expresso aritmtica usando a linguagem Portugol e indique a ordem
em que os operadores so aplicados na avaliao da expresso (use ndices ao lado dos
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.5 EXERCCIOS PROPOSTOS 36
operadores):
1
1 +
1
1 +a
.
Assuma que a uma varivel do tipo real.
soluo:
A expresso escrita em Portugol a seguinte:
1 / (1 + (1 / 1/(1 +a)))
Voc tambm poderia ter escrito
1.0 / (1.0 + (1.0 / 1.0/(1.0 +a)))
A ordem de avaliao dos operadores indicada abaixo por ndices:
1 /
5
(1 +
4
(1 /
3
1 /
2
(1 +
1
a))) .
2. Escreva um algoritmo que leia os valores correspondentes base e altura de um retn-
gulo, determine a rea do retngulo e escreva a rea como sada.
soluo:
Algoritmo 7.3: Algoritmo para calcular a rea de um retngulo.
1 algoritmo "Area de um retangulo"
2 var
3 base, altura, area : real
4 inicio
5 escreva( "Entre com o comprimento da base do retangulo: " )
6 leia( base )
7
8 escreva( "Entre com o valor da altura do retangulo: " )
9 leia( altura )
10
11 area <- base
*
altura
12
13 escreva ( "A area do retangulo e " , area )
14 fimalgoritmo
7.5 Exerccios propostos
1. Escreva a seguinte expresso aritmtica usando a linguagem Portugol e indique a ordem
em que os operadores so aplicados na avaliao da expresso (use ndices ao lado dos
operadores):
1
b
+
5
2 +
1
1 +a
.
Assuma que a e b so variveis do tipo real.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.5 EXERCCIOS PROPOSTOS 37
2. Escreva um algoritmo para calcular a rea de um crculo. A entrada do seu algoritmo o
valor do raio do crculo. A sada o valor da rea do crculo.
3. Implemente o algoritmo anterior usando a ferramenta VISUALG.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 8
EXPRESSES RELACIONAIS
8.1 Operadores relacionais
Uma expresso relacional, ou simplesmente relao, uma comparao entre dois valores
de um mesmo tipo. Esses valores so representados na relao atravs de constantes, variveis
ou expresses aritmticas. A operao de comparao realizada por um operador relacional.
Na linguagem Portugol da ferramenta VISUALG, temos os operadores relacionais mostrados
na Tabela 8.1.
Operador Descrio
= igual a
<> diferente de
> maior que
< menor que
>= maior ou igual a
<= menor ou igual a
Tabela 8.1: Operadores relacionais da linguagem Portugol.
Como exemplo, suponha que a, b e c sejam variveis do tipo inteiro. Ento, temos que
a = 2 , a > b e c <= b
so todos exemplos de expresses relacionais. Na expresso
a = 2 ,
estamos comparando o valor da varivel a com a constante 2. O resultado desta comparao
o valor lgico verdadeiro se o valor de a igual a 2; caso contrrio, o resultado o valor lgico
falso. Na expresso
a > b ,
estamos comparando os valores das variveis a e b. O resultado desta comparao o valor
lgico verdadeiro se o valor de a maior do que o de b. Caso contrrio, o resultado o valor
lgico falso. Na expresso
c <= b ,
estamos comparando os valores das variveis c e b. O resultado desta comparao o valor
lgico verdadeiro se o valor de c menor ou igual ao valor de b. Caso contrrio, o resultado
o valor lgico falso.
38
8.2 RELAES E EXPRESSES ARITMTICAS 39
8.2 Relaes e expresses aritmticas
As relaes podem envolver expresses aritmticas. Por exemplo,
a > (b +c) e c <= (5 a) ,
onde a, b e c so variveis do tipo inteiro, so relaes vlidas na linguagem Portugol. Na
primeira delas, estamos comparando o valor de a com o valor resultante da expresso arit-
mtica
b +c .
Na segunda delas, estamos comparando o valor de c com o valor resultante da expresso arit-
mtica
5 a .
Em particular, podemos escrever relaes da forma
(b +c) <= (c 10) .
Isto , podemos ter expresses aritmticas nos dois lados de um operador relacional. Neste
caso, estamos comparando o valor da expresso aritmtica do lado esquerdo do operador com
o valor da expresso aritmtica do lado direito do operador relacional. Alm disso, no pre-
cisamos sequer usar os parnteses que utilizamos nos exemplos acima. Isto , basta-nos escr-
ever
a > b +c , c <= 5 a e b +c <= c 10 ,
que so as mesmas expresses, em Portugol, que
a > (b +c) , c <= (5 a) e (b +c) <= (c 10) .
Isto porque qualquer operador arimtico possui prioridade maior do que qualquer operador
relacional. Logo, a operao de comparao em uma expresso relacional sempre realizada
por ltimo.
8.3 Relaes envolvendo tipos no inteiros
importante ressaltar que os operadores relacionais no se aplicam apenas a valores do
tipo inteiro. De fato, eles tambm podem ser usados com valores do tipo real e caractere. Em
particular, se a uma varivel do tipo real, ento
a <= 5.7
uma expresso que compara o valor de a como nmero 5.7, do tipo real. Na expresso acima,
se a fosse do tipo inteiro, seu valor seria primeiro convertido para o valor real equivalente e,
depois, comparado com 5.7. Analogamente, se considerarmos uma expresso relacional tal
como
b <> 5 ,
onde b uma varivel do tipo real, o valor 5, do tipo inteiro, primeiro convertido para o valor
do tipo real equivalente, isto , para 5.0, e, emseguida, comparado com o valor real da varivel
b.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
8.3 RELAES ENVOLVENDO TIPOS NO INTEIROS 40
Suponha, agora, que a e b so duas variveis do tipo caractere. Ento, as expresses rela-
cionais
a = b e a <> b
equivalem a perguntar se os caracteres representados por a e b so iguais ou distintos, respec-
tivamente. Tais expresses so facilmente avaliadas com base nos valores de a e b, claro.
No entanto, como avaliamos as expresses relacionais envolvendo os demais operadores, por
exemplo
a < b , a > b , a <= b e a >= b ?
Ou seja, o que signica dizer que uma palavra menor do que outra? Para responder esta per-
gunta, vamos primeiro considerar o caso em que os valores de a e b so um caractere cada. De-
pois, trataremos do caso em que esses valores so palavras com mais de um caractere. Quando
os valores de a e b so umcaractere cada, usamos o ndice do caractere no alfabeto da linguagem
Portugol da ferramenta VISUALG, denominado ASCII
1
, para decidir o resultado da compara-
o.
Cada caractere que pode ser usado na linguagem Portugol possui um nmero nico no al-
fabeto ASCII. Ento, dizemos que a menor do que b se, e somente se, o ndice do caractere
representado por a menor do que o ndice do caractere representado por b no alfabeto ASCII.
As demais expresses relacionais (denidas pelos operadores >, <= e >=) so avaliadas de
forma anloga. O alfabeto ASCII possui 256 smbolos e no cabe aqui descrever todos eles. No
entanto, bom saber que as letras maisculas de A a Z possuemos ndices 65 a 90, respec-
tivamente, as letras minsculas de a a z possuemos ndices 97 a 122, respectivamente, e os
dgitos 0 a 9 possuem os ndices 48 a 57, respectivamente. Logo, se o valor de a c e o
de b 4,
a < b , a > b , a <= b e a >= b
resultamnos valores lgicos falso, verdadeiro, falso e verdadeiro, respectivamente, quando so
avaliadas.
O que dizer se pelo menos um de a e b contm uma palavra com mais de um caractere?
Neste caso, usamos a ordem lexicogrca para determinar o resultado das comparaes.
Para tal, suponha que a palavra representada por a possua n caracteres, a
1
, a
2
, . . . , a
n
, nesta
ordem, e a palavra representada por b possua m caracteres, b
1
, b
2
, . . . , b
m
, nesta ordem, com
m, n Z e m, n 1. Seja k = minn, m. Ento, encontramos o menor valor de i em
1, 2, . . . , k tal que a
i
,= b
i
. Em seguida, ns determinamos se a
i
< b
i
, a
i
> b
i
, a
i
b
i
ou
a
i
b
i
.
Por exemplo, se a = abacate e b = abacaxi, ento i = 6, pois as palavras em a e b
coincidem nos cinco primeiros caracteres, isto , ambas comeam com o prexo abaca. O
prximo passo comparar a
6
com b
6
. Como podemos ver, a
6
igual a t e b
6
igual a x.
Ento, a
6
< b
6
e a
6
b
6
. Logo, sabemos que a menor do que b, ou seja, sabemos que as
expresses
a < b e a <= b
possuem valor lgico verdadeiro, enquanto as expresses
a > b e a >= b
possuem valor lgico falso.
1
A abreviao de American Standard Code for Information Interchange.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
8.4 EXERCCIOS RESOLVIDOS 41
possvel que a
i
= b
i
para todos os valores de i em 1, 2, . . . , k. Quando isto acontece,
temos que a palavra em a um prexo da palavra em b ou a palavra em b um prexo da
palavra em a. Por exemplo, se o valor de a bola e o de b bolada, ento a palavra em
a um prexo da palavra em b e, por isso, a
i
= b
i
, para todo i 1, 2, 3, 4. Quando isso
ocorre, a palavra de menor comprimento considerada a menor palavra. Isto quer dizer que
as expresses
a < b e a <= b
possuem valor lgico verdadeiro, enquanto as expresses
a > b e a >= b
possuem valor lgico falso.
Mas, e se as palavras em a e b possurem o mesmo comprimento? Se este o caso, ento
temos que m = n e a
i
= b
i
para todo i = 1, 2, . . . , k, onde k = minn, m. Mas, neste caso,
a e b so exatamente a mesma palavra! Por exemplo, se o valor de ambas as variveis, a e b,
bola, ento
a = b, a <= b e a >= b
possuem valor lgico verdadeiro, enquanto
a <> b, a > b e a < b
possuem valor lgico falso.
Para concluir, note que no faz sentido utilizar operadores relacionais com valores do tipo
lgico, exceto pelos operadores = e <>. Em outras palavras, no faz sentido dizer que o valor
verdadeiro menor, maior, menor ou igual ou maior ou igual ao valor falso. Como veremos
em uma outra aula, podemos construir expresses que relacionam valores lgicos usando op-
eradores lgicos.
8.4 Exerccios resolvidos
1. Avalie a relao abaixo:
10 %5 2 <> 5 2 + 1
soluo:
10 %5 2 <> 5 2 + 1 0 2 <> 5 2 + 1
0 <> 5 2 + 1
0 <> 10 + 1
0 <> 11
verdadeiro
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
8.5 EXERCCIOS PROPOSTOS 42
2. Suponha que x seja uma varivel do tipo inteiro e considere a relao
x%3 > 1
Ento, para quais valores de x a relao acima tem valor verdadeiro?
soluo:
O resultado de x%3 sempre 2, 1, 0, 1 ou 2. Em particular, na ferramenta VISUALG,
o resto no-negativo sempre que o dividendo for no-negativo. Isto no est de acordo
com a denio matemtica (e correta!) de resto. Como a relao ter valor verdadeiro
se, e somente se, x%3 for igual a 2, temos que o valor de x deve ser 2, 5, 8, . . ., ou seja, da
forma
2 + 3 k ,
para todo k Z

+
.
8.5 Exerccios propostos
1. Suponha que a, b, nome e prossao sejam variveis do tipo real, inteiro, caractere e
caractere, respectivamente. Ento, considere as trs expresses relacionais dadas a seguir:
a + 1 >= b b , nome <> ANA e prossao = medico
Qual o valor dessas expresses quando a, b, nome e prossao assumemos valores abaixo?
(a) 3.0, 2, MIRIAM e ADVOGADO
(b) 5.0, 2

2, PEDRO e MEDICO
(c) 2.5, 9, ANA e PROFESSOR
2. Suponha que x seja uma varivel do tipo real e considere a seguinte expresso relacional:
x
2
4 > 5 .
Ento, para quais valores de x a expresso relacional acima possui valor verdadeiro?
3. Suponha que x seja uma varivel do tipo inteiro. Ento, escreva uma expresso relacional
emPortugol que tenha valor verdadeiro se, e somente se, o valor de x umnmero mpar
no-negativo.
4. Sejam a e b duas variveis do tipo caractere. Ento, escreva uma expresso relacional
envolvendo a e b apenas que tenha resultado verdadeiro se, e somente se, a expresso
relacional,
a < b ,
tenha resultado falso.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 9
EXERCCIOS PARA A PRIMEIRA
AVALIAO
Esta aula ser dedicada ao desenvolvimento de algoritmos relacionados ao contedo da
primeira avaliao. importante que todos vocs tentemresolver os exerccios antes do dia da
aula. Para cada um dos problemas, tente primeiro descrever os dados de entrada e de sada.
Em seguida, crie variveis para os dados de entrada e pense em como obter os dados de sada
a partir deles. Use a ferramenta VISUALG para executar a sua soluo em algumas entradas de
sua escolha.
1. Dado um nmero inteiro qualquer, calcule e escreva o antecessor e o sucessor do nmero
dado.
2. Dados trs nmeros reais no-negativos, calcule e escreva a mdia aritmtica dos
nmeros dados.
3. Dado um nmero real qualquer, calcule e escreva a tera parte do nmero dado.
4. Dados o termo inicial e a razo de uma PA, bem como um nmero inteiro positivo n,
calcule e escreva a soma dos n primeiros termos desta PA.
5. Escreva um algoritmo para ler o valor de uma temperatura em graus centrgados e escr-
ever a mesma temperatura em graus Fahrenheit. Se c o valor da temperatura em graus
centrgados, ento a temperatura, f, em Fahrenheit dada pela frmula abaixo:
f =
9 c + 160
5
.
6. Chico Bento deseja calcular o saldo atual de uma de suas aplicaes nanceiras. Para
tal, ele conhece o saldo anterior ao reajuste e sabe que este saldo foi reajustado em 1%.
Escreva um algoritmo para calcular e escrever o saldo atual da aplicao de Chico Bento.
7. Chico Bento est preocupado com o consumo de energia de sua residncia e deseja escr-
ever umalgoritmo para ajud-lo a controlar suas despesas comenergia. Chico Bento sabe
que 100 quilowatts de energia equivalem a um stimo do salrio mnimo. Ento, dados o
valor do salrio mnimo e a quantidade de quilowatts gasta na residncia de Chico Bento,
calcule e escreva (a) o valor em reais de cada quilowatt, (b) o valor em reais a ser pago
e (c) o novo valor em reais a ser pago se Chico Bento ganhar um desconto de 10% por
pagar em dia.
43
44
8. Chico Bento possui umcarro que faz, emmdia, 12 kmcomumlitro de gasolina. Ele real-
izou uma viagemcomseu carro e est interessado emsaber quantos litros de combustvel
o carro consumiu. Para tal, ele dispe de duas informaes: o tempo gasto dirigindo e
a velocidade mdia do carro. Escreva um algoritmo para calcular quantos litros de com-
bustvel o carro de Chico Bento consumiu.
9. Escreva um algoritmo para ler um valor de hora, em termos de trs nmeros inteiros,
hora, minuto e segundos, e calcular e escrever o nmero de segundos que se passou desde
o comeo do dia at o valor da hora que foi fornecido como entrada para o algoritmo.
10. Dada uma centena, isto , um nmero inteiro positivo da forma xyz tal que x um dgito
de 1 a 9 e tanto y quanto z so dgitos de 0 a 9, calcule e escreva a unidade do nmero
dado.
Por exemplo, se o nmero dado igual a 147, a soluo do problema 7. Observe que
a entrada do problema consiste de um nico valor, que um nmero inteiro positivo
representando uma centena, e no os trs dgitos da centena.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 10
PRIMEIRA AVALIAO
Questo 1) [2 pontos]
Escreva as expresses abaixo usando a sintaxe da linguagem Portugol da ferramenta VI-
SUALG:
(a)
a
2
(b c)
2
+
b
2
(c a)
2
(b)
x y
2 x
+ 3
2

x
2
3
Assuma que as letras a, b, c, x e y so variveis que tomam valores no conjunto dos reais.
Soluo:
45
46
Questo 2) [2 pontos]
Resolva a expresso aritmtica abaixo de acordo com as regras de precedncia da lin-
guagem Portugol da ferramenta VISUALG e indique a ordem de ocorrncia da aplicao
de cada operador:
(2 %5 + 23) ((3 + 9 2) + 13 / (7 + 6) 3)
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
47
Questo 3) [1 ponto]
Classique cada um dos valores abaixo de acordo com o seu tipo (inteiro, real, lgico ou
caractere) na linguagem Portugol da ferramenta VISUALG; isto , indique um desses 4
tipos:
(a) "-3.5"
(b) "pi"
(c) "falso"
(d) 5.0
(e) 59
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
48
Questo 4) [1 ponto]
Para cada um dos nomes abaixo, determine se ele pode ou no ser usado como nome de
varivel na linguagem Portugol da ferramenta VISUALG e escreva o porqu de poder ou
no:
(a) _
(b) A&a
(c) "nome"
(d) a-b
(e) var
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
49
Questo 5) [2 pontos]
Chico Bento deseja construir uma escola onde estudaro 1000 crianas de uma cidade A
e 500 crianas de uma cidade B. H uma estrada em linha reta que liga a cidade A
cidade B. A escola ser construda na beira dessa estrada a
1
4
da distncia entre A e B no
sentido de A para B. Chico Bento gostaria de saber a soma total de quilmetros que todas
as crianas devem percorrer para ir de sua cidade escola. Ento, escreva um algoritmo
para ler o comprimento, l, em metros, da estrada que liga a cidade A cidade B e calcular
e escrever, como sada, a quantia, em quilmetros, que Chico Bento deseja determinar.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
50
Questo 6) [2 pontos]
Escreva um algoritmo para ler um nmero inteiro positivo, n, com exatamente quatro
algarismos e escrever como sada a soma dos algarismos da dezena e da centena. Por
exemplo, se n = 1234, ento o algoritmo deve escrever 5 como sada, que igual soma
do algarismo 3 (dezena) e do algarismo 2 (centena).
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 11
CORREO DA PRIMEIRA AVALIAO
Questo 1) [2 pontos]
Escreva as expresses abaixo usando a sintaxe da linguagem Portugol da ferramenta VI-
SUALG:
(a)
a
2
(b c)
2
+
b
2
(c a)
2
(b)
x y
2 x
+ 3
2

x
2
3
Assuma que as letras a, b, c, x e y so variveis que tomam valores no conjunto dos reais.
Soluo:
(a) A expresso em Portugol :
a
*
a / ( ( b - c )
*
( b - c ) ) + b
*
b / ( ( c - a )
*
( c - a ) )
(b) A expresso em Portugol :
x
*
y / ( 2
*
x ) + 3
*
3 - x
*
x / 3
51
52
Questo 2) [2 pontos]
Resolva a expresso aritmtica abaixo de acordo com as regras de precedncia da lin-
guagem Portugol da ferramenta VISUALG e indique a ordem de ocorrncia da aplicao
de cada operador:
(2 %5 + 23) ((3 + 9 2) + 13 / (7 + 6) 3)
Soluo:
(2 %5 + 23) ((3 + 9 2) + 13 / (7 + 6) 3) =
(2 + 23) ((3 + 9 2) + 13 / (7 + 6) 3) =
25 ((3 + 9 2) + 13 / (7 + 6) 3) =
25 ((3 + 9 2) + 13 / 13 3) =
25 ((3 + 9 2) + 1.0 3) =
25 ((3 + 9 2) + 3.0) =
25 ((3 + 4) + 3.0) =
25 (7 + 3.0) =
25 10.0 =
250.0
A ordem de aplicao dos operadores pode ser deduzida da avaliao acima, mas est
explicitamente indicada na expresso abaixo atravs de nmeros ao lado dos operadores
aritmticos:
(2 %
1
5 +
2
23)
9
((3 +
7
9
6
2) +
8
13 /
4
(7 +
3
6)
5
3)
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
53
Questo 3) [1 ponto]
Classique cada um dos valores abaixo de acordo com o seu tipo (inteiro, real, lgico ou
caractere) na linguagem Portugol da ferramenta VISUALG; isto , indique um desses 4
tipos:
(a) "-3.5"
(b) "pi"
(c) "falso"
(d) 5.0
(e) 59
Soluo:
(a) caractere
(b) caractere
(c) caractere
(d) real
(e) inteiro
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
54
Questo 4) [1 ponto]
Para cada um dos nomes abaixo, determine se ele pode ou no ser usado como nome de
varivel na linguagem Portugol da ferramenta VISUALG e escreva o porqu de poder ou
no:
(a) _
(b) A&a
(c) "nome"
(d) a-b
(e) var
Soluo:
(a) Sim, pois o nome composto por um nico caractere, o underscore, que permitido
como primeiro smbolo de um nome de varivel.
(b) No, pois o smbolo & no pode ser usado em nomes de variveis.
(c) No, pois nomes de variveis no possuem aspas duplas.
(d) No, pois o smbolo - no pode ser usado em nomes de variveis.
(e) No, pois nomes de variveis no podem ser palavras reservadas.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
55
Questo 5) [2 pontos]
Chico Bento deseja construir uma escola onde estudaro 1000 crianas de uma cidade A
e 500 crianas de uma cidade B. H uma estrada em linha reta que liga a cidade A
cidade B. A escola ser construda na beira dessa estrada a
1
4
da distncia entre A e B no
sentido de A para B. Chico Bento gostaria de saber a soma total de quilmetros que todas
as crianas devem percorrer para ir de sua cidade escola. Ento, escreva um algoritmo
para ler o comprimento, l, em metros, da estrada que liga a cidade A cidade B e calcular
e escrever, como sada, a quantia, em quilmetros, que Chico Bento deseja determinar.
Soluo:
Algoritmo 11.1: Soluo da questo 5.
1 algoritmo "questao 5"
2 var
3 l , distot : real
4 inicio
5 escreva( "Entre o comprimento, em metros, da estrada ligando A a B:" )
6 leia( l )
7 distot = 0.625
*
l ;
8 escreva( "A distancia total, em Km, e:" , distot )
9 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
56
Questo 6) [2 pontos]
Escreva um algoritmo para ler um nmero inteiro positivo, n, com exatamente quatro
algarismos e escrever como sada a soma dos algarismos da dezena e da centena. Por
exemplo, se n = 1234, ento o algoritmo deve escrever 5 como sada, que igual soma
do algarismo 3 (dezena) e do algarismo 2 (centena).
Soluo:
Algoritmo 11.2: Soluo da questo 6.
1 algoritmo "questao 6"
2 var
3 n , d, c, soma : inteiro
4 inicio
5 escreva( "Entre um numero inteiro de 1000 a 9999:" )
6 leia( n )
7 d <- n % 100 \ 10
8 c <- n % 1000 \100
9 soma <- d + c
10 escreva( "A soma dos algarismos de dezena e centena e:" , soma )
11 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 12
ESTRUTURAS CONDICIONAIS - PARTE 1
12.1 Motivao
At o presente momento, todos os algoritmos que vimos podem ser vistos como uma se-
qncia de comandos que so executados na ordem emque denida pela seqncia. Neste aula,
veremos um comando que nos permite bifurcar a seqncia de comandos de um algoritmo.
Com isso, poderemos criar trechos de algoritmos que so mutuamente exclusivos com respeito
execuo. Isto , um trecho executado se, e somente se, outro trecho no executado.
Antes de apresentarmos o comando condicional, apresentamos um problema que justica
a existncia de tal comando. Considere o problema de escrever um algoritmo para ler nome e
altura de duas pessoas e produzir como sada o nome da pessoa mais alta. Vamos assumir que
as pessoas possuam alturas distintas. Um algoritmo incompleto para o problema mostrado
em 12.1.
Algoritmo 12.1: Algoritmo para determinar a mais alta de duas pessoas.
1 algoritmo "Pessoa mais alta - incompleto"
2 var
3 nome1, nome2 : caractere
4 alt1 , alt2 : real
5 inicio
6 escreva( "Entre com o nome da primeira pessoa: " )
7 leia( nome1 )
8
9 escreva( "Entre com a altura da primeira pessoa: " )
10 leia( alt1 )
11
12 escreva( "Entre com o nome da segunda pessoa: " )
13 leia( nome2 )
14
15 escreva( "Entre com a altura da segunda pessoa: " )
16 leia( alt2 )
17
18 // Escreva o nome da pessoa de maior altura
19 fimalgoritmo
Tudo que precisamos fazer para concluir o Algoritmo 12.1 escrever sua sada. De fato,
57
12.2 COMANDO SE-ENTAO-SENAO-FIMSE 58
se a primeira pessoa for mais alta do que a segunda, ento podemos usar a seguinte linha de
cdigo:
escreva( nome1 , " e mais alta do que " , nome2 )
Caso contrrio, podemos usar a linha
escreva( nome2 , " e mais alta do que " , nome1 )
O problema que no sabemos qual das duas linhas acima deve ser inserida no algoritmo
antes de lermos e compararmos as duas alturas. Em outras palavras, o algoritmo deve deter-
minar qual das duas linhas acima deve ser escrita durante a sua execuo. Esta uma situao
de excluso mtua de dois comandos, pois somente um deles pode ser escrito. No entanto, at
agora, no aprendemos nenhumcomando que nos permita escrever um algoritmo que execute
umcomando emdetrimento da execuo de outro. Semtal comando, no temos como concluir
o algoritmo.
12.2 Comando se-entao-senao-mse
A linguagem Portugol possui o seguinte comando condicional:
se expresso lgica entao
comando
1
comando
2
.
.
.
comando
n
senao
comando
1
comando
2
.
.
.
comando
m
mse
O comando se-entao-senao-mse contm duas sees, cada uma das quais possui um ou
mais comandos. A primeira delas a que se situa entre o entao e o senao. A segunda a que
se situa entre o senao e o mse. As sees so mutuamente exclusivas, o que signica que uma
executada se, e somente se, a outra no executada. A seo a ser executada depende do
valor lgico da expresso lgica que se situa entre o se e o ento. Por enquanto, assuma que
uma expresso lgica uma expresso relacional (veja Aula 11). Na aula seguinte, veremos
expresses lgicas mais gerais. Se a expresso lgica resultar emo valor verdadeiro, a primeira
seo executada. Caso contrrio, isto , se ela avaliar para o valor falso, a segunda seo
executada.
importante ressaltar que independente da seo de cdigo que for executada, o uxo de
execuo do algoritmo segue para o primeiro comando aps o se-ento-seno-mse assim que
o ltimo comando da seo for executado. Isto , o comando condicional bifurca o uxo de
execuo, mas aps o comando condicional ser executado, o programa segue com seu uxo
seqencial nico que continua com o primeiro comando encontrado aps o comando condi-
cional.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.2 COMANDO SE-ENTAO-SENAO-FIMSE 59
O comando se-ento-seno-mse pode ser utilizado para completar o algoritmo que
comeamos a escrever na seo anterior. Em particular, o trecho que falta pode ser escrito
como segue
se alt1 > alt2 entao
escreva( nome1 , " e mais alta do que " , nome2 )
senao
escreva( nome2 , " e mais alta do que " , nome1 )
fimse
De fato, a expresso lgica,
alt1 > alt2,
avalia para o valor verdadeiro se, e somente se, a altura da primeira pessoa maior do que
a da segunda. Caso contrrio, sabemos que a altura da primeira pessoa no maior do que
a da segunda. Mas, como assumimos que as alturas so distintas, se a expresso relacional
resultar em falso, ento saberemos que a segunda pessoa mais alta do que a primeira. O
Algoritmo 12.2 o Algoritmo 12.1 acrescido do comando se-entao-senao-mse que gera a sada
esperada.
Algoritmo 12.2: Algoritmo para determinar a mais alta de duas pessoas.
1 algoritmo "Pessoa mais alta - primeira versao"
2 var
3 nome1, nome2 : caractere
4 alt1 , alt2 : real
5 inicio
6 escreva( "Entre com o nome da primeira pessoa: " )
7 leia( nome1 )
8
9 escreva( "Entre com a altura da primeira pessoa: " )
10 leia( alt1 )
11
12 escreva( "Entre com o nome da segunda pessoa: " )
13 leia( nome2 )
14
15 escreva( "Entre com a altura da segunda pessoa: " )
16 leia( alt2 )
17
18 se alt1 > alt2 entao
19 escreva( nome1 , " e mais alta do que " , nome2 )
20 senao
21 escreva( nome2 , " e mais alta do que " , nome1 )
22 fimse
23 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.3 ANINHAMENTO DE COMANDOS CONDICIONAIS 60
12.3 Aninhamento de comandos condicionais
Alguns problemas podem requerer o aninhamento de comandos condicionais, ou seja,
que um ou mais comandos condicionais ocorram dentro da seo de comandos de outro co-
mando condicional. Para exemplicar esta situao, vamos considerar o problema da seo
anterior e assumir que as alturas das duas pessoas no necessitem ser distintas. Ento, a sada
do problema envolve as seguintes trs (e no apenas duas) instrues escreva mutuamente
exclusivas:
escreva( nome1 , " e mais alta do que " , nome2 ) ,
escreva( nome2 , " e mais alta do que " , nome1 )
e
escreva( nome1 , " possui a mesma altura de " , nome2 )
Quando a expresso
alt1 > alt2,
resultar em verdadeiro, a primeira instruo acima deve ser executada. No entanto, quando a
expresso resultar em falso, ainda teremos que determinar qual das duas instrues restantes
deve ser executada. Isto pode ser feito com uma instruo se-entao-senao-mse dentro do
bloco senao que envolve a expresso relacional acima. Em outras palavras, podemos escrever
algo como:
se alt1 > alt2 entao
escreva( nome1 , " e mais alta do que " , nome2 )
senao
se alt1 < alt2 entao
escreva( nome2 , " e mais alta do que " , nome1 )
senao
escreva( nome1 , " possui a mesma altura de " , nome2 )
fimse
fimse
Note que se o uxo de execuo do algoritmo atinge o bloco senao do comando se-entao-
senao-mse mais externo, ento sabemos que a segunda pessoa no mais baixa do que a
primeira, mais ainda no sabemos se ela mais alta ou possui a mesma altura da primeira. O
comando se-entao-senao-mse mais externo determina qual desses dois casos verdadeiro e
escreve a sada esperada. O Algoritmo 12.3 contm o cdigo nal para determinar a pessoa
mais alta.
Um outro problema que requer aninhamento de comandos condicionais o seguinte: es-
creva um algoritmo que leia as notas (de 0 a 10) de trs provas de um aluno, calcule a mdia
aritmtica das trs notas do aluno e escreva o status dele como sada. O status do aluno
aprovado se a mdia das notas igual ou maior do que 7, exame se a mdia igual ou
maior do que 3, mas menor do que 7, e reprovado se a mdia menor do que 3. Note que os
status so mutuamente exclusivos, isto , para qualquer valor encontrado para a mdia, apenas
um status possvel.
Note que um nico comando se-entao-senao-mse no resolve o problema, pois tal co-
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.3 ANINHAMENTO DE COMANDOS CONDICIONAIS 61
mando s pode realizar uma classicao binria, ou seja, em um de dois grupos. Por exem-
plo, podemos usar o comando condicional para saber se a mdia maior ou igual a 7. Isto
suciente para sabermos se o aluno foi aprovado quando a mdia maior ou igual a 7. No
entanto, se a mdia for menor do que 7, no temos como saber se o aluno est em exame ou
foi reprovado.
Algoritmo 12.3: Algoritmo para determinar a mais alta de duas pessoas.
1 algoritmo "Pessoa mais alta - segunda versao"
2 var
3 nome1, nome2 : caractere
4 alt1 , alt2 : real
5 inicio
6 escreva( "Entre com o nome da primeira pessoa: " )
7 leia( nome1 )
8
9 escreva( "Entre com a altura da primeira pessoa: " )
10 leia( alt1 )
11
12 escreva( "Entre com o nome da segunda pessoa: " )
13 leia( nome2 )
14
15 escreva( "Entre com a altura da segunda pessoa: " )
16 leia( alt2 )
17
18 se alt1 > alt2 entao
19 escreva( nome1 , " e mais alta do que " , nome2 )
20 senao
21 se alt1 < alt2 entao
22 escreva( nome2 , " e mais alta do que " , nome1 )
23 senao
24 escreva( nome1 , " possui a mesma altura de " , nome2 )
25 fimse
26 fimse
27 fimalgoritmo
A observao crucial que se a mdia for menor do 7, podemos determinar o status do
aluno se usarmos mais um comando se-entao-senao-mse dentro da seo de senao do se-
ento-seno-mse que j temos. Isto , se o uxo de execuo desviar para a seo senao
porque a mdia menor do 7. Da, para determinarmos se o status exame ou reprovado,
basta compararmos o valor de media com 3. Se este valor for maior ou igual a 3, o status do
aluno exame. Caso contrrio, o status do aluno reprovado. O algoritmo completo pode
ser visto em 12.4.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.4 COMANDO SE-ENTAO-FIMSE 62
Algoritmo 12.4: Algoritmo para determinar situao escolar de aluno.
1 algoritmo "Situacao escolar de aluno"
2 var
3 n1, n2, n3, media : real
4 inicio
5 escreva( "Entre com a primeira nota: " )
6 leia( n1 )
7
8 escreva( "Entre com a segunda nota: " )
9 leia( n2 )
10
11 escreva( "Entre com a terceira nota: " )
12 leia( n3 )
13
14 media <- ( n1 + n2 + n3 ) / 3
15
16 se media >= 7 entao
17 escreva( "aprovado" )
18 senao
19 se media > 3 entao
20 escreva( "em exame" )
21 senao
22 escreva( "reprovado" )
23 fimse
24 fimse
25 fimalgoritmo
12.4 Comando se-entao-mse
O comando se-ento-seno-mse possui uma forma simplicada: o comando se-ento-
mse:
se expresso lgica ento
comando
1
comando
2
.
.
.
comando
n
mse
No comando acima, h apenas uma seo de comandos entre o se e o mse. Se a expresso
lgica avalia para o valor verdadeiro, ento a seo de comandos executada. Caso contrrio,
a seo de comandos no executada. Em qualquer um desses dois casos, o uxo de execuo
segue com o comando imediatamente aps a palavra mse. Em outras palavras, ao invs de
termos dos blocos de comandos mutuamente exclusivos, temos um bloco de comandos que
pode ou no ser executado. O que ocorrer depende unicamente do resultado da expresso
lgica.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.5 EXERCCIOS RESOLVIDOS 63
Por exemplo, considere o Algoritmo 12.5 que calcula o salrio lquido mensal de um fun-
cionrio. O algoritmo recebe como entrada o valor do salrio bruto mensal do funcionrio e o
nmero de lhos dele. O salrio lquido calculado como sendo 70% do salrio bruto. Mas, se
o funcionrio possuir mais de dois lhos, ele recebe um acrscimo de R$ 300,00 em seu salrio
lquido.
Algoritmo 12.5: Algoritmo para calcular salrio lquido mensal de um funcionrio.
1 algoritmo "Salario liquido mensal de funcionario"
2 var
3 salbruto, salario : real
4 filhos : inteiro
5 inicio
6 escreva( "Entre com o salario bruto mensal: ")
7 leia ( salbruto )
8
9 escreva( "Entre com o numero de filhos: " )
10 leia ( filhos )
11
12 salario <- 0.7
*
salbruto
13 se filhos > 2 entao
14 salario <- salario + 300
15 fimse
16
17 escreva ( "O salario liquido e: ", salario )
18 fimalgoritmo
12.5 Exerccios resolvidos
1. Escreva a sada do Algoritmo 12.7 quando ele for executado nas seguintes entradas:
(a) 2
(b) 21
Soluo:
(a) O algoritmo escreve como sada a sentena Passei pelo ponto 3 quando a entrada
for 2.
(b) O algoritmo escreve como sada a sentena Passei pelo ponto 1 quando a entrada
for 21.
2. Escreva um algoritmo que leia um nmero inteiro positivo com quatro dgitos e escreva
sim se a soma dos algarismos da centena e milhar do nmero par e no caso con-
trrio.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.5 EXERCCIOS RESOLVIDOS 64
Soluo:
Algoritmo 12.6: Soma dgitos de centena e milhar.
1 algoritmo "Soma de digitos de centena e milhar"
2 var
3 n, m, c : inteiro
4 inicio
5 escreva ( "Entre com um numero inteiro positivo:" )
6 leia ( n )
7 m <- n \ 1000
8 c <- n \ 100 % 10
9 se ( c + m ) % 2 = 0 entao
10 escreva ( "sim" )
11 senao
12 escreva ( "nao" )
13 fimse
14 fimalgoritmo
Algoritmo 12.7: Algoritmo Misterioso. Qual a sada dele?
1 algoritmo "Misterioso"
2 var
3 n : inteiro
4 inicio
5 escreva ( "Entre com um numero inteiro positivo:" )
6 leia ( n )
7 se ( n % 2 ) = 1 entao
8 se ( n % 7 ) = 0 entao
9 escreva ( "Passei pelo ponto 1" )
10 senao
11 escreva ( "Passei pelo ponto 4" )
12 fimse
13 senao
14 se ( n % 4 ) = 0 entao
15 escreva ( "Passei pelo ponto 2" )
16 senao
17 escreva ( "Passei pelo ponto 3" )
18 fimse
19 fimse
20 fimse
21 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
12.6 EXERCCIOS PROPOSTOS 65
12.6 Exerccios propostos
1. Escreva umalgoritmo que leia dois nmeros reais e escreva iguais se os nmeros forem
iguais e diferentes se os nmeros forem diferentes.
2. Escreva um algoritmo que leia um nmero real e escreva sim se o nmero est com-
preendido no intervalo [20, 90] e no caso contrrio.
3. Escreva umalgoritmo que leia dois nmeros reais e escreva o menor deles. Se os nmeros
forem iguais, qualquer um deles por ser escrito (pois so os mesmos).
4. Escreva um algoritmo que leia dois nmeros reais e escreva o maior deles. Se os nmeros
forem iguais, qualquer um deles por ser escrito (pois so os mesmos).
5. Escreva um algoritmo que leia um nmero inteiro e escreva como sada mltiplo de 3
se o nmero for mltiplo de 3 ou no mltiplo de 3 caso contrrio. Lembre-se de que
um nmero n mltiplo de 3 se ele divisvel por 3, ou seja, se o resto da diviso inteira
de n por 3 zero.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 13
EXPRESSES LGICAS
13.1 Lgica proposicional
Lgica o estudo do raciocnio
1
. Em particular, utilizamos lgica quando desejamos de-
terminar se um dado raciocnio est correto. Nesta disciplina, introduzimos algumas noes
bsicas de Lgica Proposicional para que sejamos capazes de entender alguns tipos de dados e
expresses utilizados nos algoritmos que desenvolveremos. No entanto, a relao entre lgica,
resoluo de problemas e programao de computadores muito mais ampla, rica e complexa
do que a discusso que apresentamos aqui.
A Lgica Proposicional consiste de uma linguagem e de umformalismo de clculo para falar
e deduzir fatos, respectivamente, sobre proposies. Uma proposio uma sentena declarativa
qual podemos atribuir um valor verdadeiro ou falso. H vrios tipos de sentenas:
Imperativas: Multiplique 2 por 3.
Exclamativas: Que cerveja gelada!
Interrogativas: Est chovendo l fora?
Declarativas: Todo aluno da UFRN maior de idade.
O que distingue as sentenas declarativas das demais o fato de que elas podemos atribuir
umvalor verdadeiro ou falso, embora nemsempre sejamos capazes de saber que valor atribuir.
Em lgica, assumimos que as proposies satisfazem dois princpios:
1. Terceiro Excludo: uma proposio ou verdadeira ou falsa, isto , no existe uma
terceira possibilidade.
2. No-Contradio: uma proposio no pode ser, ao mesmo tempo, verdadeira e falsa.
As sentenas: os nicos inteiros positivos que dividem 7 so 1 e o prprio 7 e para todo
inteiro positivo n, existe um primo maior do que n so exemplos de proposies.
Aqui, usamos letras minsculas, tais como p, q e r, para representar proposies e adotamos
a notao
p : 1 + 1 = 3
para denir p como sendo a proposio 1 + 1 = 3.
1
Conjunto de argumentos ou idias pensadas por algum.
66
13.2 PROPOSIES COMPOSTAS 67
13.2 Proposies compostas
A linguagem utilizada em lgica para representar proposies e realizar clculos sobre elas
foi cuidadosamente desenvolvida para evitar ambiguidades. Este no o caso da lngua por-
tuguesa, que nos permite facilmente construir sentenas ambguas:
Grandes carros e avies.
O que grande? S os carros ou carros e avies?
Jos est vendo o jogo em cima das dunas.
Quem est em cima das dunas? O jogo? Jos? Ambos?
A linguagemque usaremos para construir algoritmos e as linguagens de programao tambm
no so ambguas, mas no servem para descrever argumentos, conhecimento, verdades, etc.
por isso que estudaremos uma linguagem prpria para falar de proposies. Uma das carac-
tersticas desta linguagem o uso de conectivos lgicos para criar novas proposies, proposies
compostas, a partir de proposies existentes.
Sejam p e q duas proposies quaisquer. A conjuno de p e q, representada por p q, a
proposio
p e q.
A disjuno de p e q, representada por p q, a proposio
p ou q.
Por exemplo, se
p : 1 + 1 = 3
e
q : uma dcada equivale a 10 anos
ento a conjuno de p e q
p q : 1 + 1 = 3 e uma dcada equivale a 10 anos
e a disjuno de p e q
p q : 1 + 1 = 3 ou uma dcada equivale a 10 anos.
Os valores verdades das proposies, tais como conjunes e disjunes, podem ser de-
scritos atravs de tabelas verdades. A tabela verdade de uma proposio p denida a partir das
proposies p
1
, . . . , p
n
lista todas as possveis combinaes de valores lgicos de p
1
, . . . , p
n
, com
T denotando verdadeiro e F denotando falso, e para cada combinao desses valores lgicos,
a tabela verdade lista o valor lgico de p.
O valor lgico da proposio composta p q denido pela tabela verdade
Por exemplo, se
p : 1 + 1 = 3
e
q : uma dcada equivale a 10 anos
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.2 PROPOSIES COMPOSTAS 68
ento p falsa e q verdadeira, o que implica que a conjuno
p q : 1 + 1 = 3 e uma dcada equivale a 10 anos
falsa.
O valor lgico da proposio composta p q denido pela tabela verdade
Por exemplo, se
p : 1 + 1 = 3
e
q : uma dcada equivale a 10 anos
ento p falsa e q verdadeira, o que implica que a disjuno
p q : 1 + 1 = 3 ou uma dcada equivale a 10 anos
verdadeira.
Existe ainda uma outra proposio importante:
Seja p uma proposio qualquer. Ento, a negao de p, denotada por p, a proposio
no verdade que p.
O valor lgico da proposio p denido pela tabela verdade
Por exemplo, se
p : 1 + 1 = 3
e
q : uma dcada equivale a 10 anos
ento p falsa e q verdadeira, o que implica que
p : no verdade que 1 + 1 = 3
verdadeira e
q : no verdade que uma dcada equivale a 10 anos
falsa.
Ns podemos utilizar conjuno, disjuno e negao para construir uma nova proposio a
partir de duas proposies, onde cada uma delas pode ser uma proposio composta. Quando
isto acontece, usamos parnteses e regras de precedncia para determinar, de forma no-
ambgua, como avaliar o valor lgico da proposio resultante.
p q p q
V V V
V F F
F V F
F F F
Tabela 13.1: Tabela verdade da conjuno.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.2 PROPOSIES COMPOSTAS 69
Por exemplo, se p, q e r so proposies, ento
(p q) r
tambm uma proposio. Como podemos avaliar o valor lgico dessa proposio? Ns
supomos que o operador de negao possui precedncia sobre os conectivos de conjuno e
disjuno. Ento, a proposio
p q
signica a conjuno de p comq. Isto , o operador de negao atua sobe q antes que o conectivo
de conjuno atue sobre p e q.
Finalmente, quando temos mais duas proposies conectadas por ou , usamos parnte-
ses para determinar a ordem de composio das proposies. Por exemplo,
(p q) r
signica a disjuno da proposio pq com a proposio r. Isto , os parnteses servirampara
determinar que a conjuno de p com q ocorra antes da disjuno de p q com r.
Se os parnteses fossem removidos, isto , se tivssemos
p q r
no poderamos determinar se a sentena acima se trata da conjuno de p com q r ou da
disjuno de p q com r.
Agora, se supusermos que p V, q V e r F, o valor lgico de (p q) r
(p q) r = (V V) F
= (V F) F
= F F
= F.
Em alguns casos, no entanto, o uso de parnteses desnecessrio. Por exemplo,
(p q) (p q) (p q) (p q)
No caso acima, no importa a ordem em que agrupamos as proposies denidas dentro dos
parnteses, pois o valor lgico da proposio resultante ser sempre o mesmo. Isto porque o
conectivo fora que conecta as proposies parentizadas o mesmo: .
p q p q
V V V
V F V
F V V
F F F
Tabela 13.2: Tabela verdade da disjuno.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.3 OPERADORES LGICOS 70
13.3 Operadores lgicos
Como vimos na Aula 11, uma relao , na verdade, uma proposio, pois ela uma sen-
tena declarativa (em particular, uma comparao entre dois valores) cujo valor s pode ser
verdadeiro ou falso. Logo, bastante natural nos perguntarmos se podemos combinar relaes
usando algum operador, assim como zemos com as proposies que vimos na Seo 13.2 us-
ando conectivos lgicos, conjuno e disjuno. A resposta sim. Em particular, podemos
construir expresses lgicas, que so expresses cujo resultado um valor lgico. Toda re-
lao , portanto, uma expresso lgica. No entanto, uma expresso lgica pode consistir de
mais de uma relao, as quais so combinadas atravs dos operadores lgicos mostrados na
Tabela 13.4.
Suponha que a, b e c so variveis do tipo inteiro. Ento,
(a > b +c) e (c <= 5 a)
uma conjuno das relaes
a > b +c
e
c <= 5 a .
O resultado da avaliao da expresso lgica
(a > b +c) e (c <= 5 a)
(ou seja, da conjuno das duas relaes acima) ser o valor verdadeiro se, e somente se, o
resultado das duas relaes for o valor verdadeiro. Por outro lado, se a expresso lgica for
(a > b +c) ou (c <= 5 a)
ento o resultado da avaliao da expresso lgica (ou seja, da disjuno) ser o valor verdadeiro
se, e somente se, o resultado de uma ou de ambas as relaes for o valor verdadeiro. J
nao (a > b +c)
uma negao da relao
a > b +c .
O resultado da avaliao da expresso lgica (ou seja, da negao) ser o valor verdadeiro se, e
somente se, o resultado da avaliao da relao for o valor falso.
As expresses lgicas podem combinar mais de duas relaes. Por exemplo,
(a <> 4 +b) ou (2 5 % c = 1) e (a <= 5 c)
p p
V F
F V
Tabela 13.3: Tabela verdade da negao.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.3 OPERADORES LGICOS 71
e
nao (c 2 > 10) ou (c 3 <> 4) ou (b > c 4) .
Quando escrevemos expresses com mais de duas relaes, podemos necessitar de parnteses
para evitar ambigidade ou associar prioridades aos operadores lgicos, como zemos com as
expresses aritmticas. Como a utilizao demasiada de parnteses pode prejudicar a legibili-
dade da expresso, o uso de regras de precedncia de operadores sempre til. Na linguagem
Portugol da ferramenta VISUALG, o operador de conjuno (e) possui prioridade maior do que
a dos operadores de disjuno (ou) e negao (nao). Por sua vez, o operador de disjuno (ou)
possui prioridade maior do que a do operador de negao (nao). Ento, o valor da expresso
lgica
(2 > 3) e (3 < 2) ou (2 < 3)
verdadeiro, pois
(2 > 3) e (3 < 2) ou (2 < 3) (2 > 3) e (3 < 2) ou (2 < 3)
falso e (3 < 2) ou (2 < 3)
falso e falso ou (2 < 3)
falso e falso ou verdadeiro
falso ou verdadeiro
verdadeiro.
Por outro lado, se o operador ou tivesse maior prioridade do que o operador e, ento
(2 > 3) e (3 < 2) ou (2 < 3)
avaliaria para falso, pois
(2 > 3) e (3 < 2) ou (2 < 3) (2 > 3) e (3 < 2) ou (2 < 3)
falso e (3 < 2) ou (2 < 3)
falso e falso ou (2 < 3)
falso e falso ou verdadeiro
falso e verdadeiro
falso .
No exemplo acima, as relaes foram cercadas com parnteses. Esses parnteses so
absolutamente desnecessrios, pois qualquer operador relacional possui prioridade sobre todo oper-
ador lgico. No entanto, por alguma limitao, a ferramenta VISUALG exige que as relaes
que compem uma expresso lgica sejam cercadas por parnteses. Logo, usando a lin-
guagem Portugol desta ferramenta, as expresses lgicas acima no podemser reescritas como
mostrado a seguir:
2 > 3 ou 3 < 2 e 2 < 3 .
Operador Descrio
nao Negao
e Conjuno
ou Disjuno
Tabela 13.4: Operadores lgicos da linguagem Portugol.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.4 EXERCCIOS RESOLVIDOS 72
A Tabela 13.5 exibe a prioridade dos operadores lgicos da linguagem Portugol da ferra-
menta VISUALG.
Prioridade Operador
mais alta e
ou
mais baixa nao
Tabela 13.5: Prioridade de todos os operadores da linguagem Portugol vistos at o momento.
13.4 Exerccios resolvidos
1. Avalie as seguintes expresses lgicas:
(a) falso ou ( 10 % 5 2 <> 5 2 + 1 )
(b) nao falso e ( 3 3 3 < 15 5 % 7 )
soluo:
(a)
falso ou ( 10 % 5 2 <> 5 2 + 1 ) falso ou ( 0 2 <> 5 2 + 1 )
falso ou ( 0 <> 10 + 1 )
falso ou ( 0 <> 5 2 + 1 )
falso ou ( 0 <> 10 + 1 )
falso ou ( 0 <> 11 )
falso ou verdadeiro
verdadeiro .
(b)
nao falso e ( 3 3 3 < 15 5 % 7 ) nao falso e ( 9 3 < 15 5 % 7 )
nao falso e ( 3 < 15 5 % 7 )
nao falso e ( 3 < 15 5 )
nao falso e ( 3 < 10 )
nao falso e verdadeiro
nao falso
verdadeiro .
2. Suponha que x seja uma varivel do tipo inteiro e considere a seguinte expresso lgica:
(x % 3 = 0) e (x % 7 = 0)
Ento, para quais valores de x a expresso lgica acima avalia para o valor verdadeiro?
soluo:
Para todo valor inteiro que seja um mltiplo comum de 3 e de 7. Por exemplo, 21 e 21.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
13.5 EXERCCIOS PROPOSTOS 73
3. Suponha que x seja uma varivel do tipo inteiro. Ento, escreva uma expresso lgica
envolvendo x que avalie para o valor verdadeiro se, e somente se, o valor de x for par e
no for maior do que 11.
soluo:
(x % 2 = 0) e (x <= 11)
13.5 Exerccios propostos
1. Avalie as seguintes expresses lgicas:
(a) nao (7 <> 15 2) ou verdadeiro e (4 6 > 4 20)
(b) (2 5 > 3) ou (5 + 1 < 2) e (2 < 7 2)
2. Suponha que x seja uma varivel do tipo real e considere a seguinte expresso lgica:
x x 4 > 5
Ento, para quais valores de x a expresso lgica acima avalia para o valor falso?
3. Suponha que x seja uma varivel do tipo logico. Ento, escreva uma expresso lgica
envolvendo x que avalie para o valor falso se, e somente se, o valor de x for verdadeiro.
4. Suponha que x seja uma varivel do tipo logico. Ento, escreva uma expresso lgica
envolvendo x que avalie para o valor verdadeiro se, e somente se, o valor de x for falso.
5. Suponha que x seja uma varivel do tipo inteiro. Ento, escreva uma expresso lgica
envolvendo x que avalie para o valor verdadeiro se, e somente se, o valor de x for par ou
no for maior do que 11, mas no ambos.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 14
ESTRUTURAS CONDICIONAIS - PARTE 2
14.1 Usando proposies compostas
Considere o problema de se calcular a mdia harmnica ponderada de trs notas de prova.
As notas variam de 0 a 10 e os pesos so 1, 2 e 3 para a primeira, segunda e terceira notas,
respectivamente. Afrmula da mdia harmnica ponderada, digamos mh, para os pesos dados
acima
mh =
_

_
6
1
n
1
+
2
n
2
+
3
n
3
se n
1
, n
2
e n
3
so todas diferentes de 0
0 caso contrrio .
onde n
1
, n
2
e n
3
so os valores da primeira, segunda e terceira notas, respectivamente. Note
que a frmula para se calcular mh condicional. Em outras palavras, se todas as notas so
distintas de zero, ento o valor de mh, inversamente proporcional a uma soma de fraes.
Caso contrrio, isto , quando pelo menos uma das notas igual a zero, o valor de mh, igual
a zero.
Agora, vamos escrever um algoritmo para calcular mh. A entrada do algoritmo consiste
dos valores das trs notas, n
1
, n
2
e n
3
. A sada do algoritmo o valor de mh. Para obter este
valor, podemos utilizar a frmula acima. No entanto, como a frmula possui duas partes,
nosso algoritmo precisar de um comando condicional. Este comando deve testar se todas as
notas so diferentes de zero. Como este teste pode ser escrito? Pelo que vimos na aula anterior,
o teste desejado pode ser escrito como uma composio de trs relaes usando o conectivo de
conjuno:
(nota1 <> 0) e (nota2 <> 0) e (nota3 <> 0)
onde nota1, nota2 e nota3 so os nomes das variveis que armazenam os valores de n
1
, n
2
e n
3
,
respectivamente. Se a expresso lgica acima avaliar para verdadeiro, ento o valor de mh
calculado por:
mh =
6
1
n
1
+
2
n
2
+
3
n
3
.
Caso contrrio, o valor de mh deve ser igual zero. Um comando se-ento-seno-mse com a
expresso lgica acima tudo que precisamos para fazer o clculo de mh. Oalgoritmo completo
est em 14.1.
interessante notar que o comando se-ento-seno-mse poderia ser substitudo por um
comando se-ento-mse se removermos a seo senao e inicializarmos o valor da varivel media
74
14.2 TROCA DE CONTEDO ENTRE DUAS VARIVEIS 75
com 0 imediatamente acima do comando condicional, como mostrado no seguinte trecho de
cdigo:
media <- 0
se ( nota1 <> 0 ) e ( nota2 <> 0 ) e ( nota3 <> 0 ) entao
media <- 6 / ( 1 / nota1 + 2 / nota2 + 3 / nota3 )
mse
Algoritmo 14.1: Algoritmo para calcular a mdia harmnica ponderada de trs notas.
1 algoritmo "Media harmonica ponderada"
2 var
3 nota1, nota2, nota3, media : real
4 inicio
5 escreva( "Entre com a primeira nota: " )
6 leia( nota1 )
7 escreva( "Entre com a segunda nota: " )
8 leia( nota2 )
9 escreva( "Entre com a terceira nota: " )
10 leia( nota3 )
11 se ( nota1 <> 0 ) e ( nota2 <> 0 ) e ( nota3 <> 0 ) entao
12 media <- 6 / ( 1 / nota1 + 2 / nota2 + 3 / nota3 )
13 senao
14 media <- 0
15 fimse
16 escreva( "A media harmonica ponderada das tres notas e: " , media )
17 fimalgoritmo
14.2 Troca de contedo entre duas variveis
Quando escrevemos algoritmos mais complexos comum nos depararmos com a tarefa de
trocar os contedos de duas variveis. Isto , se x e y so duas variveis do mesmo tipo, trocar
os contedos de x e y signica atribuir o valor de x a y e atribuir o valor de y a x. Muitos
iniciantes no estudo de algoritmos podem pensar em cumprir esta tarefa escrevendo o trecho
de cdigo
y <- x
x <- y
ou
x <- y
y <- x
que no esto corretos. Para entender o porqu dos trechos acima no estarem corretos, vamos
supor que x e y sejamvariveis do tipo inteiro e que possuamos valores 4 e 7, respectivamente,
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
14.2 TROCA DE CONTEDO ENTRE DUAS VARIVEIS 76
antes de qualquer um dos trechos de cdigo ser executado. Como qualquer varivel s pode
armazenar um nico valor de seu tipo em um mesmo instante de tempo, a execuo do trecho
de cdigo
y <- x
x <- y
resulta em x e y com o valor 4. De fato, quando a instruo y <- x executada, o valor de x,
que 4 antes da atribuio, atribudo varivel y, que continha o valor 7 antes da atribuio.
Desta forma, o antigo valor de y substitudo por 4 e, aps a instruo, tanto x quanto y
possuem 4 como contedo. A prxima instruo, x <- y, simplesmente atribui o valor atual
de y, que agora 4, varivel x, que j possui o valor 4. Logo, ao nal das duas instrues, as
duas variveis possuem valor 4. O mesmo tipo de anlise mostra que outro trecho de cdigo,
x <- y
y <- x
deixa tanto x quanto y com valor 7. Como podemos realizar esta simples tarefa de forma
correta?
A forma correta de trocar o valor de duas variveis se utiliza de uma varivel extra, co-
mumente denominada de varivel temporria ou varivel auxiliar. Esta varivel serve para ar-
mazenar, temporariamente, o valor que ser sobrescrito por uma instruo de atribuio. Por
exemplo, se queremos executar a instruo y <- x, ento devemos guardar o valor de y,
que ser sobrescrito pela instruo, em algum local seguro de modo que ele possa ser us-
ado quando necessitarmos. Este local seguro a tal varivel temporria. De forma concreta,
suponha que z seja a varivel temporria. Ento, antes de executar a instruo y <- x, exe-
cutamos z <- y. Isto faz com que o valor de y seja guardado em z antes de y receber o valor
que est em x. Finalmente, atribumos o antigo valor de y, que agora est em z, a x atravs da
instruo x <- z.
O trecho de cdigo correto , portanto,
z <- y
y <- x
x <- z
Note que se x e y possuemos valores 4 e 7 antes do trecho acima ser executado, ento z <- y
faz com que z receba o valor 7, y <- x faz com que y receba o valor 4 e x <- z faz com que
x receba o valor 7. Logo, ao nal da execuo do cdigo acima, os valores em x e y so 7 e 4,
respectivamente.
Para ilustrar a ocorrncia de uma troca de valores de variveis em um algoritmo, va-
mos considerar um problema extremamente simples: escrever em ordem no-decrescente dois
nmeros fornecidos como entrada para o problema. Umalgoritmo para este problema deve ler
os dois nmeros, determinar qual deles o menor e qual deles o maior e escrever o menor
seguido pelo maior. Quando os nmeros forem iguais, a ordem de escrita dos nmeros in-
diferente.
Um algoritmo para o problema acima dado em 14.2. Note que a idia trocar os valores
das duas variveis que recebem os nmeros de entrada sempre que o primeiro nmero for
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
14.3 O COMANDO ESCOLHA 77
maior do que o segundo. Se este no for o caso, a troca no feita. Desta forma, podemos
escrever um comando de sada que sempre escreve o valor da primeira varivel seguido pelo
valor da segunda. Como o valor da primeira varivel sempre menor ou igual ao valor da
segunda varivel imediatamente antes da instruo de escrita ser executada, o algoritmo sem-
pre fornecer a resposta esperada. Um outro algoritmo, que no usa troca de variveis, dado
em 14.3.
Algoritmo 14.2: Algoritmo para escrever dois nmeros em ordem no-decrescente.
1 algoritmo "Numeros em ordem nao-decrescente - primeira versao"
2 var
3 num1, num2, num3 : real
4 inicio
5 escreva( "Entre com o primeiro numero: " )
6 leia( num1 )
7 escreva( "Entre com o segundo numero: " )
8 leia( num2 )
9 se num1 > num2 entao
10 num3 <- num1
11 num1 <- num2
12 num2 <- num3
13 fimse
14 escreva( "Os numeros em ordem nao-decrescente: " , num1 , " e " , num2 )
15 fimalgoritmo
14.3 O comando escolha
O uso do comando se-ento-seno-mse de forma aninhada e com vrios nveis de anin-
hamento pode dicultar a leitura do algoritmo. Emtais situaes, o melhor usar umoutro co-
mando de estrutura condicional fornecido pela linguagemPortugol da ferramenta VISUALG: o
comando escolha. Este comando permite que o resultado de uma nica expresso, denominada
expresso de seleo, seja comparado comos resultados de vrias expresses. Essas expresses se
encontram agrupadas e cada grupo est associado a uma seqncia de comandos. Se o valor
de qualquer uma das expresses de um grupo igual ao valor da expresso de seleo, todos
os comandos associados ao grupo so executados. A sintaxe do comando escolha mostrada
abaixo:
escolha expresso de seleo
caso expresso 1, expresso 2, . . ., expresso n
1
seqncia de comandos
caso expresso 1, expresso 2, . . ., expresso n
2
seqncia de comandos
.
.
.
outrocaso
seqncia de comandos
mescolha
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
14.3 O COMANDO ESCOLHA 78
Algoritmo 14.3: Outro lgoritmo para escrever dois nmeros em ordem no-decrescente.
1 algoritmo "Numeros em ordem nao-decrescente - segunda versao"
2 var
3 num1, num2 : real
4 inicio
5 escreva( "Entre com o primeiro numero: " )
6 leia( num1 )
7 escreva( "Entre com o segundo numero: " )
8 leia( num2 )
9 se num1 > num2 entao
10 escreva( "Os numeros em ordem nao-decrescente: " , num2 , " e " , num1 )
11 senao
12 escreva( "Os numeros em ordem nao-decrescente: " , num1 , " e " , num2 )
13 fimse
14 fimalgoritmo
Em geral, a expresso de seleo e as expresses de cada grupo so expresses aritmticas
ou simplesmente constantes, tais como nmeros, letras e frases. A palavra reservada caso
representa um grupo de expresses (as quais esto descritas direita da palavra caso) e um
grupo de comandos (que est logo abaixo da palavra caso). A palavra reservada outrocaso
representa o grupo de comandos executados quando o valor da expresso de seleo no
igual ao valor de nenhuma expresso dos grupos anteriores. possvel que grupos distintos
contenham expresses que avaliem para o mesmo valor. Se este mesmo valor igual ao valor
da expresso de seleo, apenas os comandos do grupo mais prximo da expresso de seleo
so executados.
Para ilustrar o comando escolha, considere o problema de classicar os atletas de um clube
de futebol por categorias que se distinguem pela idade do atleta: Infantil (de 5 a 10 anos),
Juvenil (de 11 a 15 anos), Junior ( de 16 a 20 anos) e Prossional ( de 21 a 25 anos). O nosso
objetivo construir um algoritmo que l o nome e a idade de um atleta e escreve como sada
o nome da categoria qual ele pertence (Infantil, Juvenil, Junior ou Prossional). Se
o atleta no pertence a nenhuma das categorias acima, o algoritmo deve escrever Nenhuma
categoria.
O problema pode ser resolvido naturalmente com o uso do comando escolha, pois cada
categoria est relacionada a um grupo de valores (as idades). Um algoritmo que utiliza o co-
mando escolha para resolver o problema dado em 14.4. Como exerccio, reeescreva o mesmo
algoritmo usando comandos se-ento-seno-mse aninhados e compare seu algoritmo com o
Algoritmo 14.4.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
14.4 EXERCCIOS PROPOSTOS 79
Algoritmo 14.4: Algoritmo para classicar atletas por categorias de idade.
1 algoritmo "Atletas por categorias de idade"
2 var
3 nome, categoria : caractere
4 idade : inteiro
5 inicio
6 escreva( "Entre com o nome do atleta: " )
7 leia( nome )
8 escreva( "Entre com a idade do atleta: " )
9 leia( idade )
10 escolha idade
11 caso 5, 6, 7, 8, 9, 10
12 categoria <- "Infantil"
13 caso 11, 12, 13, 14, 15
14 categoria <- "Juvenil"
15 caso 16, 17, 18, 19, 20
16 categoria <- "Junior"
17 caso 21, 22, 23, 24, 25
18 categoria <- "Profissional"
19 outrocaso
20 categoria <- "Nenhuma categoria"
21 fimescolha
22 escreva( "O atleta ", nome, " pertence a categoria ", categoria )
23 fimalgoritmo
14.4 Exerccios propostos
1. Escreva um algoritmo que leia um nmero inteiro e escreva como sada divisvel por 3
e 7 se o nmero for divisvel por 3 e por 7 ou no divisvel por 3 e 7 caso contrrio.
2. A Prefeitura de Natal abriu uma linha de crdito para os funcionrios estatutrios. O
valor mximo da prestao de umemprstimo no pode ultrapassar 30% do salrio bruto
do funcionrio. Escreva um algoritmo que leia o nome de um funcionrio, seu salrio
bruto e o valor da prestao do emprstimo que ele solicitou e, emseguida, escreva como
sada o nome do funcionrio seguido da mensagem teve o crdito concedido se o em-
prstimo solicitado puder ser concedido ou seguido da mensagemcrdito negado caso
contrrio.
3. Escreva um algoritmo que leia um nmero real, n, e escreva menor que 20, igual a 20
ou maior que 20 se n < 20, n = 20 ou n > 20, respectivamente.
4. Escreva um algoritmo que leia um nmero inteiro positivo com trs dgitos e escreva
como sada par se o dgito da centena par e mpar caso contrrio.
5. Escreva um algoritmo que leia um nmero inteiro positivo com quatro dgitos e escreva
como sada sim se a soma dos dgitos da unidade e da centena so mltiplos de 4 e
no caso contrrio.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
14.4 EXERCCIOS PROPOSTOS 80
6. Escreva um algoritmo que leia nome, sexo e idade de uma pessoa e escreva o nome e a
mensagem aceita se a pessoa for do sexo feminino e tiver mais de 25 anos ou for do
sexo masculino e tiver mais do que 30 anos. Caso contrrio, o algoritmo deve escrever o
nome e a mensagem no aceita. O dado sexo deve ser informado com a letra M ou a
letra F (maisculas).
7. Um comerciante compra um determinado produto para revender. O valor de revenda
calculado da seguinte forma: se o comerciante pagar menos de R$ 20,00 pelo produto, o
valor de revenda tal que o comerciante obtenha um lucro de 45%; se o valor de compra
maior ou igual a R$ 20,00, o valor de revenda tal que o comerciante obtm um lucro
de 30%. Ento, escreva um algoritmo que leia o valor de compra de um produto e calcule
e escreva o valor de revenda do produto.
8. Escreva umalgoritmo que leia dois nmeros reais e os escreva emordemno-decrescente.
9. Escreva um algoritmo que leia dois nmeros reais e os escreva em ordem no-crescente.
10. Escreva um algoritmo que leia trs nmeros reais distintos e os escreva em ordem no-
decrescente.
11. Escreva um algoritmo que leia cinco nmeros reais distintos e escreva o maior e o menor
deles.
12. Escreva um algoritmo que leia trs nmeros reais positivos e escreva sim se os trs
nmeros podem ser as medidas dos lados de um trngulo e no caso contrrio.
Lembre-se de que trs nmeros podem ser as medidas dos lados de um tringulo se,
e somente se, cada um deles menor do que a soma dos outros dois.
13. Escreva um algoritmo que leia trs nmeros reais e escreva equiltero se eles formam
os lados de um tringulo equiltero, issceles se eles formam os lados de um tringulo
issceles, escaleno se eles formam os lados de um tringulo escaleno e no formam os
lados de um tringulo se eles no formam os lados de um tringulo.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 15
ESTRUTURAS DE REPETIO - PARTE 1
15.1 O comando enquanto-faca-menquanto
Considere o problema de escrever um algoritmo para ler um nmero inteiro positivo, n, e
escrever todos os nmeros inteiros de 1 a n como sada. Por mais simples que este problema
possa parecer, no temos como resolv-lo com os comandos que aprendemos at aqui. A razo
que o valor de n no conhecido antes de escrevermos o algoritmo. Logo, no temos como
escrever um algoritmo com n comandos do tipo escreva(i), onde i um inteiro de 1 a n. No
entanto, se tivssemos uma forma de repetir a execuo do comando escreva um nmero
varivel de vezes, poderamos facilmente resolver nosso problema. De fato, o que gostaramos
de poder escrever algo como:
i <- 1
execute n vezes as duas linhas abaixo:
escreva(i)
i <- i + 1
A linguagem Portugol da ferramenta VISUALG contm um comando, o enquanto-faca-
menquanto, que faz exatamente o que queremos. Este comando possui a sintaxe descrita
abaixo:
enquanto expresso lgica faca
comando
1
comando
2
.
.
.
comando
n
menquanto
O comando enquanto-faca-menquanto, mais conhecido como lao enquanto, funciona
da seguinte forma: a expresso lgica, denominada condio do lao, primeiramente avali-
ada. Se o valor da expresso for verdadeiro, a seqncia de comandos do corpo do lao, isto
, a seo de comandos delimitada pelas palavras reservadas faca e menquanto, execu-
tada e a expresso novamente avaliada. Caso contrrio, o primeiro comando aps a palavra
menquanto executado. Note que se a expresso lgica que dene a condio do lao avaliar
para falso durante a primeira avaliao, a seqncia de comandos do corpo do lao no exe-
cutada nenhuma vez.
81
15.1 O COMANDO ENQUANTO-FACA-FIMENQUANTO 82
Usando o comando enquanto-faca-menquanto, podemos facilmente escrever o trecho de
cdigo que realiza a escrita dos nmero de 1 a n. Para tal, precisamos denir a condio do lao.
Como queremos executar o corpo do lao n vezes, uma escolha natural a condio que testa
se o valor de i menor ou igual ao valor de n, i <= n. Enquanto esta condio for verdadeira, o
comando de escrita executado e o valor de i incrementado em uma unidade. Em particular,
temos:
i < 1
enquanto i <= n faca
escreva(i)
i < i + 1
menquanto
A varivel i realiza dois papis importantes no trecho de cdigo acima. Ela serve para
enumerar os valores que sero escritos pelo algoritmo e para contar o nmero de vezes em que
o corpo do lao executado. Devido a este ltimo papel, a varivel recebe o nome de varivel
contadora. Para compreender como o trecho de algoritmo acima executado, vamos supor
que o valor de n seja 4. Se este for o caso, ento os seguintes passos so executados pelo trecho
acima:
1. atribui o valor 1 varivel i
2. compara o valor de i com 4
3. escreve o valor de i
4. incrementa o valor de i em uma unidade
5. compara o valor de i com 4
6. escreve o valor de i
7. incrementa o valor de i em uma unidade
8. compara o valor de i com 4
9. escreve o valor de i
10. incrementa o valor de i em uma unidade
11. compara o valor de i com 4
12. escreve o valor de i
13. incrementa o valor de i em uma unidade
14. compara o valor de i com 4
A Tabela 15.1 mostra o valor de i antes e depois de cada um dos passos acima. Note que o
corpo do lao executado exatamente 4 vezes (passos 3, 4, 6, 7, 9, 10, 12 e 13). Aps a execuo
do passo 13, o valor da varivel contadora, i, passa a ser 5, o que faz com que a expresso
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
15.2 EXEMPLOS 83
lgica que dene a condio do lao (avaliada nos passos 2, 5, 8, 11 e 14) avalie para falso pela
primeira vez.
O algoritmo completo para o problema de escrever os nmero de 1 a n mostra no Algo-
ritmo 15.1.
Passo Valor de i antes Valor de i depois
1 desconhecido 1
2 1 1
3 1 1
4 1 2
5 2 2
6 2 2
7 2 3
8 3 3
9 3 3
10 3 4
11 4 4
12 4 4
13 4 5
14 5 5
Tabela 15.1: O valor i antes e depois de cada comando do trecho de algoritmo que ilustra o lao
enquanto.
Algoritmo 15.1: Algoritmo para escrever os inteiros de 1 a n.
1 algoritmo "Inteiros de 1 a n"
2 var
3 num, i : inteiro
4 inicio
5 escreva( "Entre com um numero inteiro positivo: " )
6 leia( num )
7 i <- 1
8 enquanto ( i <= num ) faca
9 escreva( i , " " )
10 i <- i + 1
11 fimenquanto
12 fimalgoritmo
15.2 Exemplos
O lao enquanto nos permite resolver alguns problemas bem mais complexos do que o que
vimos na Seo 15.1. Como exemplo, considere o problema de escrever um algoritmo para ler
dois nmeros inteiros, a e b, com b > a, e calcular e escrever a soma de todos os nmeros entre
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
15.2 EXEMPLOS 84
a e b, incluindo os prprios extremos a e b na soma. O problema acima pode ser resolvido
sem o uso de um lao enquanto, mas a soluo requer o uso de uma frmula. Por outro lado,
podemos usar o lao enquanto para enumerar todos os nmeros inteiros de a a b e calcular a
soma desejada de forma incremental. Esta soluo consiste de duas etapas que so discutidas
a seguir.
A enumerao de todos os nmeros entre a e b, inclusive, pode ser feita como segue:
i < a
enquanto i <= b faa
i < i + 1
menquanto
Note que o corpo do lao acima executado b a +1 vezes e, em cada execuo, a varivel
i possui um valor distinto no intervalo [a, b] Z. O prximo passo acumular, de forma
incremental, o valor de i emuma varivel. Para tal, fazemos uso de uma varivel acumuladora
como segue:
soma < 0
i < a
enquanto i <= b faa
soma < soma + i
i < i + 1
menquanto
O nome varivel acumuladora vem do fato que, ao nal da j-sima execuo do corpo
do lao, para j 1, . . . , b a + 1, o valor de soma igual soma dos valores a, a + 1,
a + 2, . . . , a + j 1. Isto signica que a varivel acumula a soma dos valores que j foram
enumerados pelo lao. Ao nal da ltima iterao, ou seja, quando j assumir o valor b a + 1,
a varivel acumuladora ser igual soma dos nmeros a, a + 1, a + 2, . . . , b, que o valor
desejado.
O algoritmo completo mostrado no Algoritmo 15.2.
Variveis acumuladoras podem acumular valores de somas, subtraes, multiplicaes e
divises. Um algoritmo no qual usamos uma varivel acumuladora para acumular o valor de
multiplicaes o que calcula o fatorial de um nmero inteiro. Por denio, o fatorial, n!, de
n dado por
n! =
_
_
_
1 se n = 0 ou n = 1
n (n 1)! se n > 1
.
A denio acima recursiva, pois o fatorial de n denido em termos do fatorial de (n 1).
No entanto, ns aprendemos que a denio recursiva equivale denio no-recursiva dada
a seguir:
n! =
_
_
_
1 se n = 0
n (n 1) 2 1 se n > 0
.
Usando a denio no-recursiva e uma varivel acumuladora, temos o algoritmo dado
em 15.3. Note que a varivel acumuladora acumula uma multiplicao e no uma soma.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
15.3 EXERCCIOS PROPOSTOS 85
Logo, ela deve ser inicializada com 1 e no com zero, que foi o caso da varivel soma do Algo-
ritmo 15.2. Note tambm que a varivel contadora inicializada com o nmero de cujo fatorial
queremos calcular e que ela decrementada de uma unidade a cada execuo do corpo do lao.
Algoritmo 15.2: Algoritmo para somar os inteiros de um dado intervalo.
1 algoritmo "Soma de inteiros em um intervalo"
2 var
3 a, b, i, soma : inteiro
4 inicio
5 escreva( "Entre com o menor inteiro do intervalo: " )
6 leia( a )
7 escreva( "Entre com o maior inteiro do intervalo: " )
8 leia( b )
9 soma <- 0
10 i <- a
11 enquanto ( i <= b ) faca
12 soma <- soma + i
13 i <- i + 1
14 fimenquanto
15 escreva( "A soma dos numeros do intervalo e: ", soma )
16 fimalgoritmo
Algoritmo 15.3: Algoritmo para o fatorial de um inteiro no-negativo.
1 algoritmo "Fatorial de inteiro nao-negativo"
2 var
3 num, i , fat : inteiro
4 inicio
5 escreva( "Entre com um numero inteiro nao-negativo: " )
6 leia( num )
7 fat <- 1
8 i <- num
9 enquanto ( i > 1 ) faca
10 fat <- fat
*
i
11 i <- i - 1
12 fimenquanto
13 escreva( "O fatorial de ", num , " e: ", fat )
14 fimalgoritmo
15.3 Exerccios propostos
1. Escreva um algoritmo que leia um nmero inteiro positivo, n, e escreva os n primeiros
nmeros pares positivos. Por exemplo, dado n = 4, o algoritmo deveria escrever como
sada os nmeros 2, 4, 6 e 8.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
15.3 EXERCCIOS PROPOSTOS 86
2. Escreva um algoritmo que leia um nmero inteiro positivo, n, e escreva os n primeiros
inteiros positivos mpares. Por exemplo, dado n = 4, o algoritmo deveria escrever como
sada os nmeros 1, 3, 5 e 7.
3. Escreva um algoritmo que leia um nmero inteiro positivo, n, e escreva o quadrado dos
n primeiros inteiros positivos.
4. Escreva um algoritmo que leia dois nmeros inteiros positivos, a e b, com a < b, e calcule
e escreva o quadrado de todos os nmeros mpares no intervalo [a, b].
5. Escreva um algoritmo que leia dois nmeros inteiros positivos, a e b, com a < b, e calcule
e escreva a mdia aritmtica de todos os nmeros pares compreendidos no intervalo [a, b].
6. Dizemos que um nmero inteiro positivo, n, perfeito se n for igual soma de seus divi-
sores positivos diferentes de n. Por exemplo, n = 28 perfeito, pois 1+2+4+7+14 = 28.
Escreva um algoritmo que leia um nmero inteiro positivo, n, verique se n perfeito e
escreva perfeito em caso armativo e no perfeito caso contrrio.
7. Qualquer nmero inteiro positivo de quatro algarismos pode ser dividido em duas
dezenas formadas pelos seus dois primeiros e dois ltimos dgitos. Por exemplo,
1297 : 12 e 97.
5314 : 53 e 14.
Escreva um algoritmo que imprima todos os nmeros de quatro algarismos cuja raiz
quadrada seja a soma das dezenas formadas pela diviso acima. Por exemplo,

9801 = 99 = 98 + 01 .
Portanto, 9801 um dos nmeros a serem escritos pelo algoritmo. Note que este algo-
ritmo no possui nenhum dado de entrada!
8. Dado um inteiro positivo, n, o nmero harmnico, H
n
, denido pela soma
H
n
=
n

k=1
1
k
.
Escreva um algoritmo que leia n e escreva como sada o valor de H
n
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 16
ESTRUTURAS DE REPETIO - PARTE 2
16.1 A seqncia de Fibonacci
Um problema parecido, mas ligeiramente mais complicado do que o do clculo do fatorial
(veja as notas da Aula 15), o do clculo do n-simo termo da seqncia de Fibonacci, (f
n
)

n=1
,
onde
f
n
=
_
_
_
1 se n = 1 ou n = 2
f
n1
+f
n2
se n > 2
.
Em outras palavras, os dois primeiros termos da seqncia, f
1
e f
2
, so iguais a 1. A partir
do terceiro termo, o valor de qualquer termo, f
i
, com i 3, igual a soma dos dois termos
anteriores:
f
i
= f
i1
+f
i2
.
Vamos escrever um algoritmo que leia um inteiro positivo, n, e calcule e escreva o n-simo
termo, f
n
, da seqncia. A idia por trs deste algoritmo calcular f
n
de forma incremental,
isto , o algoritmo comea com a inicializao de duas variveis, a e b, com os valores f
1
= 1 e
f
2
= 1. Emseguida, ele calcula o valor de f
3
como sendo a+b. Ovalor resultante armazenado
em uma varivel, f. Antes de calcular f
4
, o algoritmo copia o valor de b para a e o valor de f
para b. Desta forma, temos que a = f
2
(o antigo valor de b) e b = f
3
(o atual valor de f). Em
seguida, o valor de f
4
calculado como a + b novamente, pois f
4
= f
3
+ f
2
. Se obsevarmos
bem, a soma a + b foi repetida no clculo de f
3
e f
4
. O que acabamos de descrever pode ser
expresso como
i < 3
a < 1
f < 1
enquanto i <= n faca
b < f
f < f +a
a < b
i < i + 1
menquanto
Se supusermos que n = 5, o lao acima calcula o valor de f
n
= f
5
da seguinte forma:
1. i recebe o valor 3.
87
16.2 INVERSO DA ORDEM DOS DGITOS DE UM NMERO 88
2. a recebe o valor 1.
3. f recebe o valor 1.
4. O valor de i comparado com o valor n = 5. Como i = 3 5 = n, o corpo do lao
executado.
5. b recebe o valor de f: 1.
6. f recebe o valor f +a = 1 + 1 = 2.
7. a recebe o valor de b: 1.
8. O valor de i incrementado e se torna 4.
9. O valor de i comparado com o valor n = 5. Como i = 4 5 = n, o corpo do lao
executado.
10. b recebe o valor de f: 2.
11. f recebe o valor f +a = 2 + 1 = 3.
12. a recebe o valor de b: 2.
13. O valor de i incrementado e se torna 5.
14. O valor de i comparado com o valor n = 5. Como i = 5 5 = n, o corpo do lao
executado.
15. b recebe o valor de f: 3.
16. f recebe o valor f +a = 3 + 2 = 5.
17. a recebe o valor de b: 3.
18. O valor de i incrementado e se torna 6.
19. O valor de i comparado com o valor n = 5. Como i = 6 > 5 = n, o corpo do lao no
mais executado.
Um algoritmo para calcular o n-simo termo da seqncia de Fibonacci dado em 16.1.
Note que o algoritmo tambm fornece a resposta correta quando n = 1 ou n = 2. De fato, como
o valor da varivel i 3 na primeira vez em que a condio do lao avaliada, o corpo do lao
jamais executado. Logo, o valor de f escrito pelo algoritmo igual ao valor que f recebeu
antes do lao, ou seja, 1, que o valor de sada correto tanto para a entrada n = 1 quanto para
n = 2.
16.2 Inverso da ordem dos dgitos de um nmero
Suponha que desejemos desenvolver um algoritmo para ler um nmero inteiro no-
negativo, n, e escrever como sada o nmero inteiro correspondente a n, quando n lido da
direita para a esquerda. Isto , queremos calcular um nmero que correspondente ao nmero
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.2 INVERSO DA ORDEM DOS DGITOS DE UM NMERO 89
obtido quando invertemos a ordem dos dgitos de n. Por exemplo, se n = 43, ento o algo-
ritmo deveria escrever o nmero 34; se n = 120, ento o algoritmo deveria escrever o nmero
21; se n = 1304, ento o algoritmo deveria escrever o nmero 4031; e, se n = 5, ento o algo-
ritmo deveria escrever o nmero 5. Qual estratgia devemos usar para construir o algoritmo
desejado?
Algoritmo 16.1: Algoritmo para calcular n-simo termo da seqncia de Fibinacci.
1 algoritmo "N-esimo termo da sequencia de Fibonacci"
2 var
3 i, a, b, f : inteiro
4 inicio
5 escreva( "Entre com um inteiro nao-negativo: " )
6 leia( n )
7 i <- 3
8 a <- 1
9 f <- 1
10 enquanto i <= n faca
11 b <- f
12 f <- f + a
13 a <- b
14 i <- i + 1
15 fimenquanto
16 escreva( "O ", n , "-esimo termo da sequencia de Fibinacci e: ", f )
17 fimalgoritmo
Uma possvel estratgia a seguinte: se os algarismos de n so d
1
, d
2
, . . . , d
k
, com k 1
quando enumerados da direita para a esquerda, ento o nmero que queremos calcular igual
a
d
1
10
(k1)
+d
2
10
(k2)
+ +d
k
10
0)
= d
1
10
(k1)
+d
2
10
(k2)
+ +d
k
.
Por exemplo, se n = 43 ento o nmero a ser escrito igual a
3 10
1
+ 4 10
0
= 30 + 4 = 34 ;
se n = 120 ento o nmero a ser escrito igual a
0 10
2
+ 2 10
1
+ 1 10
0
= 0 + 20 + 1 = 21 ;
se n = 1304 ento o nmero a ser escrito igual a
4 10
3
+ 0 10
2
+ 3 10
1
+ 1 10
0
= 4000 + 0 + 30 + 1 = 4031 ;
e se n = 5 ento o nmero a ser escrito igual a
5 10
0
= 5 1 = 5 .
O problema com a estratgia acima que ns no temos os algarismos individuais, d
1
,
d
2
, . . . , d
k
, de n. Mas, com o que aprendemos at o presente momento, somos capazes de
calcul-los.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.2 INVERSO DA ORDEM DOS DGITOS DE UM NMERO 90
O algarismo da unidade pode ser obtido com a operao resto, n % 10, da diviso de n
por 10. Os demais algarismos podem ser obtidos por uma seqncia de operaes de diviso
por 10 seguida por uma operao resto de diviso por 10. Por exemplo, se n = 43 ento o
algarismo da unidade igual a n % 10 = 43 % 10 = 3 e o algarismo da dezena igual a
(n 10) % 10 = (43 10) % 10 = 4 % 10 = 4. Por sua vez, se n = 120 ento o algarismo da
unidade igual a n % 10 = 120 % 10 = 0 e os algarismos da dezena e centena so obtidos como
segue:
(n 10) % 10 = (120 10) % 10 = 12 % 10 = 2
e
((n 10) 10) % 10 = ((120 10) 10) % 10 = (12 10) % 10 = 1 % 10 = 1 .
Em geral, para k > 1, o k-simo algarismo da direita para a esquerda, pode ser obtido por
uma seqncia de (k 1) operaes de diviso (inteira) por 10 seguida por uma operao de
resto de diviso por 10. Isto implica tambm que se o nmero n possui exatamente j dgitos,
uma seqncia de j divises inteiras por 10 resultar no valor zero. Por exemplo, se n = 5
ento
n 10 = 5 10 = 0 ;
se n = 43 ento
(n 10) 10 = (43 10) 10 = 4 10 = 0 ;
e se n = 120 ento
((n 10) 10) 10 = ((120 10) 10) 10 = (12 10) 10 = 1 10 = 0 .
Uma vez que saibamos como calcular cada algarismo do nmero n, como podemos calcular
o nmero que desejamos? Uma outra observao nos levar a uma soluo bastante elegante.
Sejamd
1
e d
2
dois dgitos quaisquer. Se quisermos obter o nmero d
1
d
2
a partir de d
1
e d
2
, basta
multiplicarmos d
1
por 10 e somar o resultado a d
2
: d
1
10+d
2
. Por exemplo, se d
1
= 4 e d
2
= 3,
o nmero d
1
d
2
= 43 igual a d
1
10 +d
2
= 4 10 +3. De forma anloga, se quisermos obter o
nmero d
1
d
2
d
3
a partir de d
1
d
2
e d
3
, onde d
3
outro dgito qualquer, basta multiplicarmos d
1
d
2
por 10 e somar o resultado a d
3
: d
1
d
2
10 +d
3
. Por exemplo, se d
1
d
2
= 43 e d
3
= 7, o nmero
d
1
d
2
d
3
= 437 igual a d
1
d
2
10 + d
3
= 43 10 + 7 = 437. Agora, considere o seguinte lao
enquanto:
m < n % 10
enquanto (n / 10) <> 0 faca
n < n / 10
m < m 10 + (n % 10)
menquanto
Note que as duas linhas repetidas sero executadas j 1, onde j o nmero de algarismos
de n. Em cada execuo, o atual valor de m multiplicado por 10 e somado com o prximo
dgito de n. O algarismo d
1
calculado antes do lao ser executado; isto , a varivel m recebe
o valor n % 10, que igual a d
1
. Na primeira execuo do corpo do lao, o valor de m se torna
(d
1
10) +d
2
.
Na prxima execuo do corpo do lao, o valor de m se torna
((d
1
10) +d
2
) 10) +d
3
,
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.3 TESTE DE PRIMALIDADE 91
e assim por diante at que, na ltima execuo do lao, o valor de m se torna
d
1
10
(j1)
+d
2
10
(j2)
+ +d
j
,
que o nmero desejado. O Algoritmo 16.2 ilustra a soluvo completa para o problema que
estudamos. Note que o algoritmo utiliza uma varivel chamada q ao invs de n no clculo de
m. Isto uma boa prtica, que evita mudana de valor e dois usos distintos da varivel de
entrada.
Algoritmo 16.2: Algoritmo para inverter a ordem dos dgitos de um nmero.
1 algoritmo "Numero da direita para a esquerda"
2 var
3 n, m, q : inteiro
4 inicio
5 escreva( "Entre com um inteiro nao-negativo: " )
6 leia( n )
7 m <- n % 10
8 q <- n \ 10
9 enquanto q <> 0 faca
10 r <- q % 10
11 m <- m
*
10 + r
12 q <- q \ 10
13 fimenquanto
14 escreva( "O numero ", n , " da direita para a esquerda e: ", m )
15 fimalgoritmo
16.3 Teste de primalidade
Um nmero primo, n, um nmero inteiro maior do que 1 que s divisvel por 1 e por ele
prprio. Um nmero inteiro maior do que 1 que no primo dito composto. Suponha que
desejemos escrever um algoritmo para determinar se um dado nmero inteiro, n, com n 2,
primo ou composto. A entrada do algoritmo o nmero n e a saida a sentena primo se
n primo e composto caso contrrio.
A estratgia de soluo que utilizaremos consiste em tentar dividir n por 2, 3, . . . , n 1.
Se sucedermos ento o nmero n no primo. Caso contrrio, ele . As divises podem ser
realizadas em um lao, pois elas consistem da mesma operao. No entanto, como nem sem-
pre realizaremos todas as divises, no temos como saber quantas divises sero executadas.
Esta ltima observao um forte indcio de que precisamos de um lao enquanto. Mais es-
pecicamente, testaremos se n divisvel por i, para i = 2, 3, . . . , n 1. No entanto, assim
que determinarmos que n divisvel por i, no precisaremos continuar com os testes, pois j
saberemos que n composto.
Em outras palavras, podemos construir um lao tal como
i < 2
enquanto (n % i) <> 0 faca
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.3 TESTE DE PRIMALIDADE 92
i < i + 1
menquanto
O lao acima terminar se o valor de i atingir n ou se n for divisvel por i, para algum valor
de i no intervalo [2, n1] Z. Mas, como saberemos se o nmero primo ou composto depois
que o lao for encerrado? A resposta simples: basta notar que se i atingir o valor de n, ento
i foi incrementada de 2 at n, o que s possvel se o corpo do lao tiver sido repetido para os
valores de i iguais a 2, 3, . . . , n 1. Mas, por sua vez, todas essas repeties s podem ocorrer
se o teste (n % i) ,= 0 resultar em verdadeiro para todos esses valores de i. Bom, mas quando
isto ocorre, sabemos que n primo. Por outro lado, se o valor de i no atingir n, ento o teste
(n % i) ,= 0 resultou em falso para algum valor de i no intervalo [2, n 1]. Caso contrrio, o
lao s se encerraria quando i atingisse o valor n. Ento, podemos concluir que se i < n depois
do lao, o nmero n composto, pois n divisvel por i e pelo quociente, q, da diviso inteira
de n por i. Como i > 1, o valor de q tambm maior do que 1. Logo, n possui dois divisores
maiores do que 1 (i e q), o que implica que n deve ser um nmero composto. Ento, o comando
condicional
se i < n entao
escreva( "e composto )
senao
escreva( "e primo )
mse
pode ser escrito aps o lao enquanto para determinar se n primo ou composto com base no
valor da varivel i quando o lao encerrar. A soluo do teste de primalidade mostrada no
Algoritmo 16.3.
Algoritmo 16.3: Algoritmo para determinar se um nmero primo ou composto.
1 algoritmo "Primo ou composto"
2 var
3 n, i: inteiro
4 inicio
5 escreva( "Entre com um numero inteiro maior que 1: " )
6 leia( n )
7 i <- 2
8 enquanto ( n % i ) <> 0 faca
9 i <- i + 1
10 fimenquanto
11 se i < n entao
12 escreva( "O numero ", n , " e composto")
13 senao
14 escreva( "O numero ", n , " e primo")
15 fimse
16 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.4 EXERCCIOS PROPOSTOS 93
16.4 Exerccios propostos
1. Escreva um algoritmo que leia trs nmeros inteiros, a, b e n, com n > 0, e escreva como
sada o n-simo termo, f
n
, da seqencia, (f
i
)

i=1
, tal que
f
i
=
_
_
_
a se i = 1
b se i = 2
f
i1
+f
i2
se i > 2
.
2. Escreva um algoritmo que leia trs nmeros inteiros, a, b e n, com n > 0, e escreva como
sada o n-simo termo, f
n
, da seqencia, (f
i
)

i=1
, tal que
f
i
=
_

_
a se i = 1
b se i = 2
f
i1
+f
i2
se i > 2 e i mpar
f
i1
f
i2
se i > 2 e i par
.
3. Dizemos que um nmero inteiro positivo, n, tal que n possui pelo menos 2 dgitos e
n no possui nenhum dgito 0, palndrome se, e somente se, o primeiro dgito de n
igual ao seu ltimo dgito, o segundo dgito de n igual ao seu penltimo dgito e assim
sucessivamente. Por exemplo, 567765 palndrome, 32423 palndrome, mas 567675 no
palndrome. Escreva um algoritmo que leia um nmero inteiro positivo, n, verique se
n palndrome e escreva palndrome em caso armativo e no palndrome caso
contrrio.
4. Uma maneira de calcular o valor do nmero utilizar a seguinte srie
= 4
4
3
+
4
5

4
7
+
4
9

4
11
+. . . .
Escreva um algoritmo que leia um nmero inteiro positivo, n, e calcule e escreva o valor
de atravs da srie acima, levando em conta apenas os nmeros com preciso de pelo
menos n casas decimais. Isto , adicione apenas os termos cujo valor absoluto seja maior
ou igual a 10
n
.
5. Escreva um algoritmo que leia um nmero real x e um nmero inteiro positivo, n, e
calcule e escreva uma aproximao para cos x usando os n primeiros termos da seguinte
srie
cos x = 1
x
2
2!
+
x
4
4!

x
6
6!
+. . . + (1)
k
x
2k
(2k)!
+. . . .
6. Escreva um algoritmo que leia dois nmeros inteiros positivos e escreva como sada o
Mnimo Mltiplo Comum (MMC) desses dois nmeros. Lembre-se de que o MMC de
dois nmeros, digamos a e b, o menor nmero inteiro positivo que um mltiplo tanto
de a quanto de b.
7. Escreva um algoritmo que leia dois nmeros inteiros positivos e escreva como sada o
Mximo Divisor Comum (MDC) desses dois nmeros. Lembre-se de que o MDC de dois
nmeros, digamos a e b, o maior nmero inteiro positivo que um divisor tanto de a
quanto de b.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
16.4 EXERCCIOS PROPOSTOS 94
8. Dizemos que um nmero inteiro positivo, n, triangular se ele o produto de trs
nmeros naturais consecutivos. Por exemplo, 120 triangular, pois 4 5 6 = 120.
Escreva um algoritmo que leia um nmero inteiro positivo, n, verique se ele triangu-
lar e escreva triangular em caso armativo e no triangular caso contrrio.
9. Escreva um algoritmo que leia trs nmeros inteiros positivos, n, a e b, e escreva, em
ordem crescente, os n primeiros inteiros positivos que so mltiplos de a ou b ou ambos.
Por exemplo, se n = 6, a = 2 e b = 3, o algoritmo deve escrever como sada os nmeros
2, 3, 4, 6, 8 e 9.
10. Uma pessoa aplicou seu capital, C, a juros e deseja saber, trimestralmente, a posio
de seu investimento inicial. Chamando i a taxa de juros do trimestre e n o nmero
de trimestres do investimento, sabe-se que o valor atual, M
n
, do investimento aps n
trimestres dado pela frmula
M
n
= C (1 +i)
n
.
Escreva um algoritmo que receba como entrada o capital inicial, C, a taxa de juros, i, e
o nmero, X, de anos completos em que o capital foi investido, e produza como sada o
valor M
n
, onde n o nmero de trimestres dos X anos. No utilize o operador de potenciao.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 17
ESTRUTURAS DE REPETIO - PARTE 3
17.1 O clculo da mdia aritmtica
Considere o seguinte problema: dados um nmero inteiro positivo, n, e uma seqncia,
x
1
, x
2
, . . . , x
n
, com n nmeros reais, calcule e escreva a mdia aritmtica dos n nmeros da
seqncia. Como sabemos, a mdia aritmtica desses n nmeros pode ser obtida atravs da
frmula
1
n

n

i=1
x
i
.
No entanto, o que torna o problema acima um pouco complicado o fato de no sabermos o
valor de n antes de escrevermos o algoritmo. Conseqentemente, no temos como saber quantas
variveis deveremos declarar no algoritmo para armazenar os valores da seqncia,
_
x
i
_
n
i=1
,
de entrada. Mas, note que precisamos dos valores da seqncia apenas para calcular a soma
da frmula:
n

i=1
x
i
.
Como a soma acima pode ser calculada de forma iterativa atravs de um lao, de uma varivel
acumuladora e medida que os valores da seqncia forem lidos, no precisamos denir uma
varivel para amazenar cada valor. De fato, o seguinte trecho de algoritmo ilustra o clculo da
soma:
soma < 0
i < 1
enquanto i <= n faca
leia( x )
soma < soma + x
i < i + 1
menquanto
No trecho acima, o corpo do lao executado n vezes e, para cada execuo, um valor da
entrada lido e armazenado na varivel x. Obviamente, quando um valor lido da entrada e
armazenado em x, o valor que estava em x perdido, pois x s pode armazenar um valor
por vez. Mas, isso pouco importa, pois queremos apenas calcular a soma dos n nmeros da
seqncia.
O algoritmo completo dado em 17.1.
95
17.2 O MAIOR ELEMENTO DE UMA SEQNCIA 96
17.2 O maior elemento de uma seqncia
Suponha que desejemos escrever um algoritmo para ler um nmero inteiro positivo, n,
seguido por uma seqncia de n nmeros reais, e escrever o maior de todos os nmeros da se-
qncia. Mais uma vez, temos uma situao emque a entrada do problema possui umtamanho
varivel, pois no sabemos quantos nmeros podemfazer parte dela antes de escrever o algoritmo.
Algoritmo 17.1: Algoritmo para calcular aritmtica a mdia de n nmeros reais.
1 algoritmo "Media aritmetica de n numeros reais"
2 var
3 i, n : inteiro
4 soma, x, media : real
5 inicio
6 escreva( "Entre com a quantidade de numeros: " )
7 leia( n )
8 soma <- 0
9 i <- 1
10 enquanto i <= n faca
11 escreva( "Entre com o ", i , "-esimo numero: " )
12 leia (x)
13 soma <- soma + x
14 i <- i + 1
15 fimenquanto
16 media <- soma / n
17 escreva( "A media aritmetica dos ", n , " numeros e ", media )
18 fimalgoritmo
Em princpio, podemos fazer a leitura da entrada da mesma forma que zemos para o
problema da Seo 17.1. Mas, e quanto estratgia de soluo do problema? A soluo do
problema tambmpode ser encontra medida que a entrada est sendo lida. De fato, podemos
denir uma varivel, digamos maior, para guardar o maior valor de todos os nmeros lidos da
entrada. Inicialmente, esta varivel recebe o valor do primeiro nmero lido. Em seguida, para
cada nmero, x, lido, comparamos o valor de x com o valor de maior. Se aquele for maior do
que este, atribuimos o valor de x a maior. Caso contrrio, o valor de maior permanece o mesmo.
Isto ,
leia(maior)
i < 2
enquanto i <= n faca
leia(x)
se x > maior entao
maior < x
mse
i < i + 1
menquanto
Note que o primeiro nmero lido antes do lao ser encontrado. Como o valor de n
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
17.3 OS MLTIPLOS DE POSIO NA SEQNCIA 97
supostamente positivo, podemos assumir que h pelo menos um valor a ser lido. Este valor
lido antes do lao ser encontrado para que a varivel maior seja inicializada com o primeiro
valor lido. Emseguida, no corpo do lao, os demais valores so lidos. O corpo do lao se repete
n 1 vezes, que exatamente o nmero de valores restantes a serem lidos. Cada valor lido no
corpo do lao comparado com o maior valor lido antes dele, que est armazenado na varivel
maior. Se o valor em maior for menor do que o valor lido, maior recebe o valor lido. Logo, aps
a execuo do lao, maior conter o maior valor lido e tudo que precisamos fazer escrever este
valor.
O algoritmo completo dado em 17.2.
Algoritmo 17.2: Algoritmo para calcular o maior de uma seqncia de n nmeros reais.
1 algoritmo "Maior numero de uma sequencia"
2 var
3 i, n : inteiro
4 maior, x : real
5 inicio
6 escreva( "Entre com a quantidade de numeros da sequencia: " )
7 leia( n )
8 escreva( "Entre com o primeiro numero da sequencia: " )
9 leia( maior )
10 i <- 2
11 enquanto i <= n faca
12 escreva( "Entre com o proximo numero da sequencia: " )
13 leia (x)
14 se x > maior entao
15 maior <- x
16 fimse
17 i <- i + 1
18 fimenquanto
19 escreva( "O maior numero da sequencia e: ", maior )
20 fimalgoritmo
17.3 Os mltiplos de posio na seqncia
Suponha que desejemos escrever umalgoritmo para ler uma seqncia de nmeros inteiros
seguida pelo nmero zero e escrever os nmeros da seqncia que forem mltiplos de suas
respectivas posies, exceto o zero. Por exemplo, se a seqncia for 3, 7, 8, 16 e 0, a sada deve
ser 3 e 16, pois 3 mltiplo de 1 (a posio do 3 na seqncia), 7 no mltiplo de 2 (a posio
do 7 na seqncia), 8 no mltiplo de 3 (a posio do 8 na seqncia) e 16 mltiplo de 4 (a
posio do 16 na seqncia). Novamente, temos uma situao em que o tamanho da entrada
(a quantidade de nmeros da seqncia) no conhecido no momento em que escrevemos o
algoritmo. Ento, no podemos declarar uma varivel para cada elemento da seqncia. Alm
disso, o tamanho da entrada tambm no informado na prpria entrada, como nos exemplos
anteriores.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
17.4 EXERCCIOS PROPOSTOS 98
A prpria entrada possui uma propriedade que nos permite saber qual o ltimo nmero
da seqncia: o nmero que o sucede igual a zero. Logo, a entrada pode ser lida com o
seguinte lao:
leia (x)
enquanto x <> 0 faca
leia (x)
menquanto
O trecho algortmico acima ler nmeros at que um zero seja lido. Agora, note que o
problema nos pede para escrever os nmeros da entrada que so mltiplos de suas respectivas
posies. Esta operao de escrita pode ser feita medida que os nmeros sejam lidos, como
segue:
leia (x)
enquanto x <> 0 faca
se x mltiplo de sua posio na seqncia entao
escreva (x)
mse
leia (x)
menquanto
Mas, como podemos determinar se x mltiplo de sua posio na seqncia se no temos
essas posies? Mais uma vez, uma observao mais cuidadosa da entrada nos conduz
soluo: os nmeros so lidos na ordem em que eles ocorrem na seqncia. Esta observao
nos diz que podemos denir uma varivel para contar quantos nmeros foram lidos at o mo-
mento. Com essa varivel, podemos vericar se x mltiplo de sua posio comparando o
resto da diviso de x pelo valor da varivel com zero. O trecho de algoritmo a seguir utiliza
essa estratgia:
leia (x)
i <- 1
enquanto x <> 0 faca
se (x % i) = 0 entao
escreva (x)
mse
leia (x)
i <- i + 1
menquanto
O algoritmo completo mostrado em 17.3.
17.4 Exerccios Propostos
1. Escreva um algoritmo que leia um nmero inteiro positivo, n, e uma seqncia,
x
1
, . . . , x
n
, de n nmeros inteiros, calcule e escreva o triplo, 3 x
1
, . . . , 3 x
n
, de cada
um dos n nmeros da seqncia.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
17.4 EXERCCIOS PROPOSTOS 99
2. Escreva um algoritmo que leia um nmero inteiro positivo, n, e uma seqncia,
x
1
, . . . , x
n
, de n nmeros inteiros, calcule e escreva o menor dentre todos os n nmeros,
x
1
, . . . , x
n
, da seqncia.
3. Escreva um algoritmo que leia cem nmeros inteiros e escreva a quantidade de nmeros
de entrada que so maiores do que 30 e menores do que 50.
Algoritmo 17.3: Algoritmo para escrever os nmeros mltiplos de uma seqncia de inteiros.
1 algoritmo "Multiplos de posicao de uma sequencia"
2 var
3 i, x : inteiro
4 inicio
5 escreva( "Entre com o primeiro numero da sequencia ou zero: " )
6 leia( x )
7 i <- 1
8 enquanto x <> 0 faca
9 se ( x % i ) = 0 entao
10 escreva( x , " ")
11 fimse
12 escreva( "Entre com o proximo numero da sequencia ou zero: " )
13 leia (x)
14 i <- i + 1
15 fimenquanto
16 fimalgoritmo
4. Escreva um algoritmo que leia vinte nmeros inteiros, calcule e escreva a soma dos
quadrados menores ou iguais a 225 dos vinte nmeros dados como entrada.
5. Escreva um algoritmo que leia duzentos nmeros inteiros e escreva a quantidade de
nmeros de entrada que so pares e a quantidade de nmeros de entrada que so m-
pares.
6. Escreva um algoritmo que leia a idade e o peso de 20 pessoas, calcule e escreva a mdia
dos pesos das pessoas da mesma faixa etria. Os dados de entrada esto dispostos na
forma idade
1
, peso
1
, idade
2
, peso
2
, . . . , idade
20
, peso
20
, onde idade
i
e peso
i
so a idade e o peso
da i-sima pessoa, para i = 1, . . . , 20. A idade um nmero inteiro positivo e o peso
um nmero real. As faixas etrias so de 1 a 10 anos, 11 a 20 anos, 21 a 30 anos e maiores
de 30 anos.
7. No dia da estria do lme Senhor dos Anis, uma grande emissora de TV realizou
uma pesquisa logo aps o encerramento do lme. Cada espectador respondeu a um
questionrio no qual constava sua idade e a sua opinio emrelao ao lme: excelente 3,
bom 2, regular 1. Escreva umalgoritmo que leia a idade e a opinio de 20 espectadores,
calcule e escreva
a mdia das idades das pessoas que responderam excelente;
a quantidade de pessoas que responderam regular;
a percentagem de pessoas que responderam bom entre todos os espectadores entre-
vistados.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
17.4 EXERCCIOS PROPOSTOS 100
Os dados de entrada esto dispostos na forma
idade
1
, opinio
1
, . . . , idade
20
, opinio
20
,
onde idade
i
e opinio
i
so a idade e a opinio da i-sima pessoa, para i = 1, . . . , 20. A
idade um nmero inteiro positivo, enquanto a opinio um dos nmeros inteiros: 1, 2
e 3.
8. Escreva um algoritmo que leia uma seqncia de nmeros reais terminada pelo nmero
zero e calcule e escreva a quantidade de nmeros lidos que esto no intervalo [100, 200].
9. Escreva um algoritmo que leia o sexo de uma certa quantidade de pessoas e escreva a
quantidade de pessoas que so do sexo masculino e a quantidade de pessoas que so
do sexo feminino. A entrada dada como uma seqncia de caracteres formada apenas
pelas letras F, M, f ou m e seguida da letra X. As letras F e f representam
pessoas do sexo feminino, enquanto as letras M e m representam pessoas do sexo
masculino.
10. Uma empresa de fornecimento de energia eltrica faz a leitura mensal dos medidores de
consumo. Para cada consumidor so fornecidos os seguintes dados:
nmero do consumidor;
quantidade de KWh (quilowatts por hora) consumida durante o ms;
tipo do consumidor.
O nmero do consumidor um nmero inteiro positivo que identica unicamente o
consumidor. A quantidade de KWh consumida durante o ms um nmero real no-
negativo e o tipo do consumidor um dos nmeros 1, 2 e 3, onde 1 signica consumidor
residencial, 2 signica consumidor comercial e 3 signica consumidor industrial. Os val-
ores em R$ pagos por 1 KWh so R$ 0,30, R$ 0,50 e R$ 0,70 para os consumidores dos
tipos 1, 2 e 3, respectivamente. Escreva um algoritmo que leia os dados da leitura mensal
dos medidores de consumo, calcule e escreva
o custo total do consumo de cada consumidor;
o total de consumo de energia de cada tipo de consumidor;
a mdia de consumo dos consumidores dos tipos 1 e 2.
Os dados devemser lidos como uma seqncia de triplas da forma nmero do consumidor,
quantidade de KWh consumida e tipo do consumidor. A seqncia de entrada deve terminar
com um nmero zero.
11. Uma empresa realizou uma pesquisa com 1000 habitantes de uma regio para coletar
sexo, idade e altura deles. A empresa deseja calcular as seguintes informaes:
a mdia de idade dos habitantes da regio;
a mdia de altura das mulheres da regio com mais de 21 anos;
a maior altura entre os homens e
o percentual de habitantes com idade entre 18 e 30 anos.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
17.4 EXERCCIOS PROPOSTOS 101
Ento, escreva um algoritmo para ler os dados de entrada da pesquisa e calcular e es-
crever as informaes que a empresa deseja encontrar. A entrada se dar como uma
seqncia de triplas, sexo, idade e altura, onde sexo um dos carecteres F, f, M e m,
idade um inteiro positivo e altura um nmero real positivo.
12. A Prefeitura de Natal fez uma pesquisa entre os habitantes assalariados de Natal para
coletar dados sobre o salrio e nmero de lhos deles. A Prefeitura deseja saber a mdia
salarial dos assalariados, o nmero mdio de lhos, o maior salrio e o percentual de
assalariados com salrio at R$ 800,00. Escreva um algoritmo para resolver o problema
da Prefeitura. O algoritmo deve ler uma seqncia de pares, salrio e nmero de lhos,
onde salrio um real positivo e nmero de lhos um inteiro positivo. Esta seqncia
seguida pelo nmero zero para indicar o seu trmino. A sada do algoritmo consiste da
mdia salarial dos assalariados, nmero mdio de lhos, maior salrio e percentual de
assalariados com salrio at R$ 800,00.
13. Uma das maneiras de se conseguir calcular a raiz quadrada de um nmero inteiro pos-
itivo atravs da subtrao, do nmero, de mpares consecutivos a partir de 1 at se
atingir o nmero zero. O nmero de subtraes realizadas igual a raiz do nmero. Por
exemplo, se nmero for 16, ento temos
16 1 = 15
15 3 = 12
12 5 = 7
7 7 = 0
Logo, realizamos 4 subtraes, o que est de acordo com a raiz de 16. Se, por acaso, o
resultado de uma subtrao for negativo, o nmero no possui raiz quadrada exata e o
processo de clculo deve ser abortado. Por exemplo, se o nmero for 14, ento temos
14 1 = 13
13 3 = 10
10 5 = 5
5 7 = 2
Escreva um algoritmo que leia um nmero inteiro positivo, n, e aplique o processo acima
para determinar se a raiz do nmero. Se o nmero admitir uma raiz inteira, o algo-
ritmo deve escrever esta raiz. Caso contrrio, o algoritmo deve escrever a mensagem O
nmero no possui raiz inteira.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 18
ESTRUTURAS DE REPETIO - PARTE 4
18.1 O lao repita
A linguagem Portugol da ferramenta VISUALG dispe de outro comando de repetio que
executa uma seqncia de comandos repetidamente at que uma dada condio se torne ver-
dadeira:
repita
comando
1
comando
2
.
.
.
comando
n
ate expresso lgica
O comando repita-ate semelhante ao comando enquanto-faca-menquanto, pois ele tambm
repete uma seqncia de comandos combase no valor de uma expresso lgica. No entanto, h
uma diferena sutil entre eles: o comando repita-ate executa a seqncia de comandos pelo menos
uma vez e, s depois da primeira execuo, que a expresso lgica avaliada. Se ela avaliar
para falso, a seqncia de comandos no corpo do lao repetida. Caso contrrio, o lao
nalizado.
O uso mais corriqueiro do comando repita-ate na consistncia da leitura de um valor de
entrada. O que queremos dizer com isso? Vimos vrios exemplos de algoritmos em que a en-
trada restrita a um subconjunto dos valores possveis de serem assumidos por uma varivel.
Por exemplo, algoritmos em que a entrada deve ser um nmero inteiro positivo e que usamos
uma varivel inteira para armazenar o valor lido. Tal varivel pode armazenar valores no-
positivos, tais como 0 e 13. Para esses algoritmos, assumimos que o usurio iria sempre
entrar um valor que respeitasse a restrio, mas o fato que no podemos garantir que isso v
acontecer.
O Algoritmo 15.1 que vimos na Aula 15 para escrever os n primeiros nmeros inteiros
positivos um bom exemplo da situao que acabamos de discutir no pargrafo acima. Se
envolvermos o comando de leitura de n por um comando repita-ate, garantiremos que o
restante do algoritmo s ser executado quando um valor positivo for atribudo a n (veja o
Algoritmo 18.1).
102
18.2 EXEMPLO 103
18.2 Exemplo
H outras situaes em que o comando repita-ate mais naturalmente utilizado do que o
comando enquanto-faca. Como exemplo, considere o problema de escrever um algoritmo para
ler um nmero inteiro positivo, n, e um nmero real, x, e calcular e escrever o resultado da
srie
x +
x
2
2
+
x
3
3
+ +
x
n
n
.
Algoritmo 18.1: Algoritmo para escrever os inteiros de 1 a n.
1 algoritmo "Inteiros de 1 a n"
2 var
3 num, i : inteiro
4 inicio
5 repita
6 escreva( "Entre com um numero inteiro positivo: " )
7 leia( num )
8 ate num > 0
9 i <- 1
10 enquanto ( i <= num ) faca
11 escreva( i , " " )
12 i <- i + 1
13 fimenquanto
14 fimalgoritmo
A srie possui n termos. Note que, para todo i = 1, . . . , n, o i-simo termo da srie da
forma
x
i
i
.
Logo, podemos escrever um algoritmo para calcular a srie com base na mesma estratgia
usada para soma os n primeiros nmeros inteiros (veja o Algoritmo 15.1). A nica diferena
que acumularemos os termos da srie ao invs dos ndices deles. Isto , podemos utilizar um
lao como
soma <- 0
i <- 1
enquanto i <= n faca
soma <- soma + i-simo termo
i <- i + 1
menquanto
O problema do lao acima o clculo do i-simo termo. Embora saibamos qual o termo,
ele possui uma potncia e esta operao deve ser implementada com o uso de outro lao (j
que no estudamos o operador de potenciao ainda). No entanto, uma observao cuidadosa
dos termos da srie nos leva a uma soluo mais simples. Em particular, note que, para todo
i = 1, . . . , n 1, o (i + 1)-simo termo da srie, x
(i+1)
/(i + 1), pode ser obtido a partir do i-
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
18.3 LAO REPITA VERSUS LAO ENQUANTO 104
simo termo, x
i
/i, multiplicando o numerador por x e incrementando o denominador em uma
unidade.
A observao sugere que a soma pode ser realizada atravs do seguinte lao:
soma <- 0
i <- 1
num <- x
den <- 1
enquanto i <= n faca
soma <- soma + num / den
num <- num x
den <- den + 1
i <- i + 1
menquanto
H duas outras observaes importantes sobre o lao acima. A primeira delas diz respeito re-
dundncia da varivel den; isto , esta varivel possui o mesmo valor que i quando realizamos
a acumulao dos termos da soma. Logo, podemos substituir a linha soma <- soma + num/ den
pela linha soma <- soma + num / i e remover a varivel den e as demais linhas que envolvem
esta varivel. A segunda observao importante que o corpo do lao enquanto ser executado
pelo menos uma vez, pois n 1 por hiptese. Isto sugere a utlizao do lao repita, como
abaixo:
soma <- 0
i <- 1
num <- x
repita
soma <- soma + num / i
num <- num x
i <- i + 1
ate i > n
Embora ambos os laos possam ser utilizados no trecho de algoritmo acima, note que a
utilizao do lao repita bem mais natural, pois o corpo do lao executado pelo menos
uma vez sem a necessidade de realizar um teste que sempre resultar no valor verdadeiro.
Uma soluo completa para o problema que acabamos de discutir acima est ilustrado em
Algoritmo 18.2.
18.3 Lao repita versus lao enquanto
Os comandos repita-ate e enquanto-faca-menquanto so, de fato, equivalentes, pois tudo
o que um deles faz, o outro tambm pode fazer. Mais especicamente, o lao repita com a
forma
repita
comando
1
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
18.3 LAO REPITA VERSUS LAO ENQUANTO 105
comando
2
.
.
.
comando
n
ate expresso lgica
pode ser transformado no lao enquanto
comando
1
comando
2
.
.
.
comando
n
enquanto nao expresso lgica faa
comando
1
comando
2
.
.
.
comando
n
menquanto
Algoritmo 18.2: Algoritmo para calcular e escrever o resultado da srie nita

n
i=1
x
i
/i.
1 algoritmo "Soma de termos de serie finita"
2 var
3 n, i : inteiro
4 soma, num : real
5 inicio
6 repita
7 escreva( "Entre com um numero inteiro positivo: " )
8 leia( n )
9 ate n > 0
10 escreva( "Entre com o primeiro termo da serie: " )
11 leia( x )
12 soma <- 0
13 i <- 1
14 num <- x
15 repita
16 soma <- soma + num / i
17 num <- num
*
x
18 i <- i + 1
19 fimenquanto
20 escreva( "A soma de x^i / i para i de 1 a ", n , " e igual a " , soma )
21 fimalgoritmo
Em outras palavras, escrevemos os comandos no corpo do lao repita antes do lao
enquanto para garantir que eles sejam executados pelo menos uma vez. Tambm negamos a
expresso lgica, pois os comandos devem ser repetidos enquanto a expresso original avaliar
para falso.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
18.4 EXERCCIOS PROPOSTOS 106
Por outro lado, um lao enquanto da forma
enquanto expresso lgica faca
comando
1
comando
2
.
.
.
comando
n
menquanto
pode ser transformado em um lao repita da forma
se expresso lgica entao
repita
comando
1
comando
2
.
.
.
comando
n
ate nao expresso lgica
mse
Em outras palavras, escrevemos o lao repita dentro de uma estrutura condicional para garan-
tir que o corpo do lao seja executado uma vez apenas se a expresso lgica for verdadeira.
Tambm negamos a expresso lgica para garantir que o corpo do lao enquanto seja repetido
sempre que a expresso avaliar para o valor verdadeiro, que exatamente o que ocorre com o
lao enquanto.
Por exemplo, na Aula 15, usamos o lao enquanto emumalgoritmo para calcular a soma de
todos os nmeros de um intervalo fechado, [a, b], onde a e b so nmeros inteiros, com a < b,
dados como entrada para o algoritmo (veja Algoritmo 15.2). Um algoritmo equivalente escrito
com o lao repita dado em 18.3. Note que simplesmente aplicamos a transformao discutida
acima.
18.4 Exerccios propostos
1. Resolva todos os exerccios da Aula 17 usando o lao repita. Tente desenvolver os algo-
ritmos sem se preocupar em usar a transformao vista nesta aula; isto , utilize o lao
repita mais naturalmente.
2. Numa fbrica trabalham homens e mulheres divididos em trs classes:
A Os que fazem at 30 peas por ms;
B Os que fazem de 31 a 35 peas por ms;
C Os que fazem maisd e 35 peas por ms.
Os trabalhadores da classe A recebem salrio mnimo. Os trabalhadores da classe B re-
cebem salrio mnimo e mais 3% do salrio mnimo por pea, acima das 30 iniciais. Os
trabalhadores da classe C recebemsalrio mnimo e mais 5% do salrio mnimo por pea,
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
18.4 EXERCCIOS PROPOSTOS 107
acima das 30 iniciais. Escreva umalgoritmo que leia uma seqncia como seguinte trio
de dados: o nmero do operrio (um inteiro positivo e nico para cada operrio), o
nmero de peas fabricadas por ms (um inteiro no-negativo) e o sexo do operrio (a
letra "F"ou "M"). A seqncia de entrada seguida pelo nmero 0. Em seguida, o algo-
ritmo deve calcular e escrever o salrio total de cada operrio, o total da folha mensal de
pagamento da fbrica, o nmero total de peas fabricadas por ms, a mdia de peas fab-
ricadas pelos homens de cada classe, a mdia de peas fabricadas pelas mulheres de cada
classe e o nmero do operrio (ou operria) de maior salrio (se houver empate, deve ser
escrito o menor nmero).
Algoritmo 18.3: Algoritmo para somar os inteiros de um dado intervalo.
1 algoritmo "Somar inteiros de um intervalo"
2 var
3 a, b, i, soma : inteiro
4 inicio
5 escreva( "Entre com o menor inteiro do intervalo: " )
6 leia( a )
7 escreva( "Entre com o maior inteiro do intervalo: " )
8 leia( b )
9 soma <- 0
10 i <- a
11 se i <= b entao
12 repita
13 soma <- soma + i
14 i <- i + 1
15 ate i > b
16 fimse
17 escreva( "A soma dos numeros do intervalo e: ", soma )
18 fimalgoritmo
3. Escreva umalgoritmo que leia uminteiro positivo, n, e umvalor real, x, e calcule e escreva
o somatrio
x
n

x
2
n 1
+
x
3
n 2
+ (1)
n+1

x
n
1
.
4. Escreva um algoritmo que calcule e escreva a soma dos 50 primeiros termos da srie
1!
1

2!
3
+
3!
7

4!
15
+
5!
31
.
5. Considere a equao
x
3
3x
2
+ 1 = 0 .
Qualquer raiz real da equao acima pode ser encontrada atravs de aproximaes su-
cessivas obtidas com a utilizao da frmula
x
n+1
= x
n

x
3
n
3x
2
n
+ 1
2x
2
n
6x
n
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
18.4 EXERCCIOS PROPOSTOS 108
Escreva um algoritmo que receba como entrada uma estimativa inicial, x
1
, para uma raiz
e calcule e escreva a trigsima aproximao. Usando a ferramenta VISUALG, execute o
seu algoritmo usando como entrada x
1
= 1.5.
6. O nmero 3025 goza da seguinte propriedade
_
30 + 25 = 55
55
2
= 3025
Escreva um algoritmo determine e escreva todos os nmeros de quatro dgitos que pos-
suema propriedade acima. Note que este algoritmo no possui nenhumdado de entrada.
7. Numa universidade, cada aluno possui os seguintes dados:
Renda pessoal
Renda familiar
Total gasto com alimentao
Total gasto com outras despesas
Escreva umalgoritmo que calcule e escreva a porcentagemdos alunos que gasta acima de
R$ 200,00 com outras despesas, o nmero de alunos com renda pessoal maior que renda
familiar e a porcentagem gasta com alimentao e outras despesas em relao s rendas
pessoal e familiar.
A entrada do algoritmo uma seqncia com quatro nmeros reais positivos (renda pes-
soal, renda familiar, total gasto com alimentao e total gasto com outras despesas) para
cada aluno, seguida pelo nmero zero.
8. Um nmero inteiro positivo, n, dito triangular se, e somente se, ele o resultado do
produto de trs nmeros inteiros positivos e consecutivos. Por exemplo, 24 triangular,
pois 24 = 234. Agora, escreva umalgoritmo que leia umnmero inteiro positivo, n, e
escreva como sada triangular se n for triangular e no triangular caso contrrio.
9. Escreva um algoritmo para ler um nmero inteiro positivo, n, e escrever os dgitos de n,
da esquerda para a direita, separados por um espao. Por exemplo, se n = 2439, ento a
sada do algoritmo deveria ser 2 4 3 9.
10. Escreva um algoritmo que imprima a tabela de equivalncia de graus Fahrenheit para
Celsius (centgrados). Os limites so de 50 a 70 graus Fahrenheit com intervalo de 1 grau.
A frmula para converso de Fahrenheit (F) para Celsius (C)
C =
F 32
1,8
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 19
VETORES
19.1 Motivao
Considere o problema de calcular a mdia aritmtica das notas de 5 alunos de uma disci-
plina e determinar e escrever o nmero de alunos que obtiveram nota superior mdia calcu-
lada. Como sabemos, o clculo da mdia aritmtica das notas de 5 alunos de uma disciplina
pode ser feito com o uso de um lao enquanto como o que mostramos no trecho de cdigo
abaixo:
soma < 0
i < 1
enquanto i <= 5 faca
leia( nota )
soma < soma + nota
i < i + 1
menquanto
media < soma / 5
Mas, se seguirmos comeste trecho de algoritmo, como determinaremos o nmero de alunos
com nota superior mdia calculada? Isto porque no guardamos as notas de cada um dos 5
alunos em variveis, o que nos impede de comparar o valor da mdia com o das notas lidas
depois que o trecho acima for executado. Logo, devemos optar por outro caminho. Um desses
caminhos est ilustrado no Algoritmo 19.1, que utiliza cinco variveis para guardar as notas
lidas da entrada.
O Algoritmo 19.1 no utiliza uma estrutura de repetio para ler as notas. Ao invs disso,
ele utiliza cinco instrues de leitura. Para determinar quantas notas so superiores mdia,
o algoritmo compara cada nota lida com a mdia. Se a nota superior mdia, o algoritmo
incrementa um contador, que inicializado com o valor zero. Note que o trecho do algoritmo
que compara e, se necessrio, incrementa o contador o mesmo para cada uma das notas
(o que muda o nome da varivel comparada e incrementada) e consiste de uma estrutura
condicional.
Se o cdigo o mesmo, por que no podemos utilizar uma estrutura de repetio? O
problema aqui que no temos como trocar o nome de uma varivel a cada iterao de um
lao. No problema que temos em mos, h apenas 5 variveis e a redundncia que temos no
chega a ser um fardo. No entanto, se tivssemos 100, 1000, ou mesmo 1000000 de notas,
esta soluo seria invivel, uma vez que teramos de escrever, respectivamente, 100, 1000 ou
1000000 estruturas condicionais semelhantes, uma para cada nota. Felizmente, a linguagem
109
19.2 DEFINIO E MANIPULAO DE VARIVEIS 110
Portugol possui uma forma ecaz de soluo que utiliza uma estrutura de dados denominada
vetor.
Algoritmo 19.1: Algoritmo para calcular a mdia aritmtica de cinco notas.
1 algoritmo "Calcula media de notas e numero de notas superiores a media"
2 var
3 n1, n2, n3, n4, n5, media : real
4 maiores : inteiro
5 inicio
6 escreva( "Entre com a primeira nota: " )
7 leia( n1 )
8 escreva( "Entre com a segunda nota: " )
9 leia( n2 )
10 escreva( "Entre com a terceira nota: " )
11 leia( n3 )
12 escreva( "Entre com a quarta nota: " )
13 leia( n4 )
14 escreva( "Entre com a quinta nota: " )
15 leia( n5 )
16 media <- ( n1 + n2 + n3 + n4 + n5 ) / 5
17 maiores <- 0
18 se n1 > media entao
19 maiores <- maiores + 1
20 fimse
21 se n2 > media entao
22 maiores <- maiores + 1
23 fimse
24 se n3 > media entao
25 maiores <- maiores + 1
26 fimse
27 se n4 > media entao
28 maiores <- maiores + 1
29 fimse
30 se n5 > media entao
31 maiores <- maiores + 1
32 fimse
33 escreva( "A media das notas e: " , media )
34 escreva( "O numero de notas maiores do que a media e: " , maiores )
35 fimalgoritmo
19.2 Denio e manipulao de variveis
A estrutura de dados vetor uma estrutura de dados linear utilizada para armazenar uma
seqncia de valores do mesmo tipo. Um dado vetor denido como tendo algum nmero xo
de clulas idnticas. Cada clula armazena um, e somente um, dos valores de dados do vetor.
Cada uma das clulas de um vetor possui um ndice, atravs do qual podemos referenci-la de
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.2 DEFINIO E MANIPULAO DE VARIVEIS 111
forma nica.
Ao denirmos uma varivel do tipo vetor, estamos, na verdade, especicando uma varivel
e um novo tipo de dados, que o tipo vetor da varivel. Isto porque o tipo da varivel no
est pronto para uso, como o caso dos tipos inteiro, real, caractere e logico. Para sermos
mais especcos, vamos supor que queremos denir uma varivel, denominada notas, como
um vetor de 5 clulas do tipo inteiro. Na linguagem Portugol, esta denio segue a seguinte
sintaxe:
nome : vetor [ tamanho ] de tipo
onde nome o nome da varivel do tipo vetor, tamanho uma faixa de valores, que consiste do
primeiro e do ltimo ndice, e tipo o tipo dos valores das clulas do vetor. Ento, denimos
notas como
notas : vetor [ 1..5 ] de real
A declarao acima corresponde declarao de cinco variveis do tipo real. Essas cinco
variveis so as cinco clulas do vetor. Ns podemos manipular cada uma das clulas indi-
vidualmente, usando o nome da varivel e o ndice da clula. Mais especicamente, temos as
clulas
notas[1], notas[2], notas[3], notas[4], notas[5] ,
que correspondem, respectivamente, a primeira, segunda, terceira, quarta e quinta clulas do
vetor notas. Cada uma das clulas acima corresponde a uma varivel do tipo real. Tudo que
fazemos com uma varivel do tipo real pode ser feito com as clulas de notas. Por exemplo, o
comando
leia(notas[1])
realiza a leitura de um valor do tipo real e faz com que este valor seja o contedo da clula
notas[1]. J
escreva(notas[1])
escreve o contedo da clula notas[1]. De forma geral, podemos usar notas[1] em qualquer
instruo que manipule um valor real. O seguinte trecho de algoritmo ilustra diversas manip-
ulaes:
leia(notas[1])
i < 3
leia(notas[i])
notas[i 1] < ( notas[1] + notas[i] ) / 2
Note que, ao escrevermos notas[i], estamos nos referindo clula de ndice i do vetor notas,
ou seja, o contedo de i nos d o ndice da clula. justamente esta exibilidade que nos
permite manipular vetores de forma bastante compacta. Para voc ter uma idia clara do que
estamos falando, considere o trecho de algoritmo a seguir que faz a leitura de valores para as
clulas de notas:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.2 DEFINIO E MANIPULAO DE VARIVEIS 112
i < 1
enquanto i <= 5 faca
escreva( Entre com a nota , i , : )
leia( notas[i] )
i < i + 1
menquanto
Podemos, facilmente, modicar o trecho acima para que ele calcule a mdia das notas tam-
bm:
i < 1
soma < 0
enquanto i <= 5 faca
escreva( Entre com a nota , i , : )
leia( notas[i] )
soma < soma + notas[i]
i < i + 1
menquanto
media < soma / 5
Finalmente, podemos escrever um trecho de algoritmo bastante compacto para contar
quantas das notas lidas so maiores do que a mdia da notas. Este trecho de algoritmo
mostrado a seguir:
i < 1
maiores < 0
enquanto i <= 5 faca
se notas[i] > media entao
maiores < maiores + 1
mse
i < i + 1
menquanto
Note que, ao combinarmos os dois trechos acima, temos um algoritmo muito mais com-
pacto do que o Algoritmo 19.1 para calcular a mdia aritmtica de cinco notas e o nmero de
notas acima da mdia. Mas, muito mais importante do que isso que o mesmo algoritmo pode
ser modicado, muito facilmente, para lidar com 100, 1000 e 1000000 de notas. De fato, con-
sidere o Algoritmo 19.2. S precisamos trocar o nmero 5 por 100, 1000 ou 1000000 nas linhas
3, 9, 15 e 18 do algoritmo para obter um novo algoritmo que lida com 100, 1000 ou 1000000
notas, respectivamente.
Variveis do tipo vetor so comumente chamadas variveis compostas homogneas. O termo
composta se deve ao fato da varivel ser formada por uma coleo de clulas. O termo
homognea se deve ao fato de todas as clulas da varivel vetor serem de um mesmo tipo
de dados. Um outro termo bastante comum, em Computao, para designar vetor arranjo
unidimensional.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.3 O CLCULO DO DESVIO PADRO 113
19.3 O clculo do desvio padro
O desvio padro uma medida de resumo que nos d uma idia de quo disperso esto os
valores de um conjunto em relao ao valor esperado dos valores. Se os valores so represen-
tados por
v
1
, . . . , v
n
,
ento o desvio padro desses valores comrelao mdia aritmtica deles dado pela frmula

_
1
n 1

n

i=1
(v
i
v)
2
,
onde v a mdia aritmtica.
Algoritmo 19.2: Algoritmo para calcular a mdia aritmtica de cinco notas usando vetor.
1 algoritmo "Calcula media de notas e numero de notas superiores a media"
2 var
3 notas : vetor [ 1..5 ] de real
4 soma, media : real
5 i, maiores : inteiro
6 inicio
7 i <- 1
8 soma <- 0
9 enquanto i <= 5 faca
10 escreva( "Entre com a nota ", i , ": " )
11 leia( notas[ i ] )
12 soma <- soma + notas[ i ]
13 i <- i + 1
14 fimenquanto
15 media <- soma / 5
16 i <- 1
17 maiores <- 0
18 enquanto i <= 5 faca
19 se notas[ i ] > media entao
20 maiores <- maiores + 1
21 fimse
22 i <- i + 1
23 fimenquanto
24 escreva( "A media das notas e: " , media )
25 escreva( "O numero de notas maiores do que a media e: " , maiores )
26 fimalgoritmo
Vamos escrever umalgoritmo para calcular o desvio padro de 10 notas de prova emrelao
mdia aritmticas dessas notas. Cada nota um nmero real de 0 a 10. O algoritmo deve ler
as dez notas, calcular a mdia e o desvio padro e produzir, como sada, o valor da mdia e o
desvio padro.
Usaremos a frmula que vimos anteriormente para clculo do desvio padro. Esta frmula
depende do clculo da raiz quadrada de um nmero real. Para realizar este clculo, faremos
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.4 O COMANDO PARA-FACA-FIMPARA 114
uso do operador de potenciao, ^. Este operador calcula o valor de expresses do tipo
x
y
onde x e y so nmeros reais. Para calcular a raiz quadrada de x usando o operador ^, escreve-
mos
x^0.5
Assim como zemos antes, deniremos um vetor chamado notas para armazenar as 10 no-
tas que sero lidas da entrada. A leitura e clculo da mdia das 10 notas podemser feitos como
segue:
i < 1
soma < 0
enquanto i <= 10 faca
escreva( Entre com a nota , i, : )
leia( notas[i] )
soma < soma + notas[i]
i < i + 1
menquanto
media < soma / 10
Para calcular o desvio padro, usamos o seguinte lao:
i < 1
desvio < 0
enquanto i <= 10 faca
desvio < desvio + ( notas[i] media ) ( notas[i] media )
i < i + 1
menquanto
desvio < ( desvio / 9 )^0.5
O algoritmo completo mostrado em 19.3.
19.4 O comando para-faca-mpara
Como voc j deve ter notado, a manipulao de variveis do tipo vetor sempre realizada
de forma indexada e atravs de laos. Usamos laos para ler, escrever e fazer clculos com
as variveis do tipo vetor. Nos exemplos que vimos antes, usamos laos enquanto. De forma
geral, o nmero de iteraes do lao controlado por uma varivel que tambm serve para
indexar o vetor. Esta varivel sempre incrementada em uma unidade e comparada com o
tamanho do vetor ao nal de cada iterao. Como este tipo de lao to freqente quando
usamos variveis do tipo vetor, um lao mais apropriado para o uso com vetores, o lao para,
foi denido.
O lao para implementado pelo comando para-faca-mpara, que tem a sintaxe dada a
seguir:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.4 O COMANDO PARA-FACA-FIMPARA 115
para varivel de controle de valor inicial ate valor nal faca
comando
1
comando
2
.
.
.
comando
n
mpara
Algoritmo 19.3: Algoritmo para calcular desvio padro.
1 algoritmo "Calcula desvio padrao"
2 var
3 notas : vetor [ 1..10 ] de real
4 soma, media, desvio : real
5 i : inteiro
6 inicio
7 i <- 1
8 soma <- 0
9 enquanto i <= 10 faca
10 escreva( "Entre com a nota ", i , ": " )
11 leia( notas[ i ] )
12 soma <- soma + notas[ i ]
13 i <- i + 1
14 fimenquanto
15 media <- soma / 10
16 i <- 1
17 desvio <- 0
18 enquanto i <= 10 faca
19 desvio <- desvio + ( notas[ i ] - media )
*
( notas[ i ] - media )
20 i <- i + 1
21 fimenquanto
22 desvio <- ( desvio / 9 )^0.5
23 escreva( "A media das notas e: " , media )
24 escreva( "O desvio padrao e: " , desvio )
25 fimalgoritmo
A varivel de controle assume o valor inicial, que passa a ser seu valor atual. Em seguida, o
valor atual da varivel de controle comparado com o valor nal. Se o valor atual for menor ou
igual ao valor nal, o corpo do lao executado. Caso contrrio, o lao termina. Se o corpo do
lao executado, ento o valor atual da varivel de controle incrementado em uma unidade
depois da execuo do ltimo comando do corpo do lao (semque tenhamos de escrever cdigo
para isso) e comparado novamente com o valor nal. Se o valor atual for menor ou igual ao
valor nal, o corpo do lao executado novamente e assim por diante. Por exemplo, o lao
para,
para i de 1 ate 10 faca
escreva( i , )
mpara
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.5 EXERCCIOS PROPOSTOS 116
faz com que os nmeros 1, 2, . . . , 10 sejam escritos. Note que a varivel de controle, i, no
incrementada de forma explcita por nenhum comando de atribuio e soma. O incremento da
varivel parte do comando do lao. O Algoritmo 19.4 o Algoritmo 19.3 com o uso do lao
para.
Algoritmo 19.4: Algoritmo para calcular desvio padro com lao para.
1 algoritmo "Calcula desvio padrao com laco para"
2 var
3 notas : vetor [ 1..10 ] de real
4 soma, media, desvio : real
5 i : inteiro
6 inicio
7 soma <- 0
8 para i de 1 ate 10 faca
9 escreva( "Entre com a nota ", i , ": " )
10 leia( notas[ i ] )
11 soma <- soma + notas[ i ]
12 fimpara
13 media <- soma / 10
14 desvio <- 0
15 para i de 1 ate 10 faca
16 desvio <- desvio + ( notas[ i ] - media )
*
( notas[ i ] - media )
17 fimpara
18 desvio <- ( desvio / 9 )^0.5
19 escreva( "A media das notas e: " , media )
20 escreva( "O desvio padrao e: " , desvio )
21 fimalgoritmo
19.5 Exerccios propostos
1. Escreva umalgoritmo que dena umvetor de elementos inteiros de tamanho 100, leia val-
ores de entrada para este vetor e escreva a soma dos elementos que ocupam as posies
pares do vetor seguida pelo valor da soma dos elementos que ocupam as suas posies
mpares.
2. Escreva um algoritmo que dena um vetor v de elementos inteiros de tamanho 100, leia
valores de entrada para este vetor e escreva a soma, v
i
+v
101i
, de cada par de elementos,
v
i
e v
101i
, que ocupamas posies i e 101i do vetor, para todo i Z variando de 1 a 50.
Isto , a sada do algoritmo consiste dos valores das somas v
1
+v
100
, v
2
+v
99
, . . . , v
50
+v
51
.
3. Escreva um algoritmo que dena um vetor de elementos inteiros de tamanho 100, leia
valores de entrada para este vetor, troque os valores dos elementos v
i
e v
101i
, para todo
i Z variando de 1 a 50, e escreva os elementos do vetor resultante em ordem crescente
de posio (isto , v
1
, v
2
, . . . , v
100
).
4. Escreva umalgoritmo que dena umvetor de elementos inteiros de tamanho 100, leia um
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
19.5 EXERCCIOS PROPOSTOS 117
nmero inteiro, n, com n > 0 e n 10, e 100 valores de entrada para o vetor, troque os
valores dos elementos v
i
e v
j
, para todo i Z variando de 1 a 100 e j = ((i +n) % 100)+1,
e escreva os elementos do vetor resultante em ordem crescente de posio (isto , v
1
,
v
2
, . . . , v
100
).
5. Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e uma se-
qncia de n nmeros reais e escreva a seqncia de n nmeros em ordem inversa de
leitura.
6. Escreva um algoritmo que leia o preo de compra e o preo e venda de 100 mercadorias
e calcule e escreva a quantidade de mercadorias proporcionam (1) um lucro menor que
10%, (2) um lucro maior ou igual a 10% e menor ou igual a 20% e (3) um lucro maior do
que 20%.
7. Escreva um algoritmo para calcular o produto escalar de dois vetores. A entrada do
algoritmo consiste de umnmero n, comn 100, e de 2 n nmeros reais, x
1
, x
2
, . . . , x
n
e
y
1
, y
2
, . . . , y
n
. A sada do algoritmo o produto escalar, x, y, dos vetores x e y denidos
como
x = (x
1
, x
2
, . . . , x
n
) e y = (y
1
, y
2
, . . . , y
n
) ,
isto ,
x, y =
n

i=1
x
i
y
i
.
8. Escreva um algoritmo que leia valores para um vetor de 100 inteiros e calcule e escreva
o maior e o menor elemento lido, o percentual de nmeros pares, a mdia dos elementos
do vetor e o nmero de elementos do vetor que so menores do que a mdia.
9. Tentando descobrir se um dado de seis faces era viciado, um dono de cassino o lanou
n vezes, onde n 100. Escreva um algoritmo que leia os n resultados dos lanamentos
(cada resultado um nmero inteiro de 1 a 6), determine e escreva o nmero de ocorrn-
cias de cada face.
10. Umjogador viciado emjogos de cassino deseja fazer umlevantamento estatstico simples
sobre uma roleta. Para isso, ele fez n, com n 100, lanamentos nesta roleta. Sabendo
que uma roleta contm 37 nmeros (de 0 a 36), escreva um algoritmo que leia o resultado
dos n lanamentos e calcule e escreva a freqncia de cada um dos 37 nmeros da roleta.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 20
SEGUNDA AVALIAO
Questo 1) [2 pontos]
A mdia anual (MA) da UFRN uma mdia ponderada de trs notas, N
1
, N
2
e N
3
, dada
por
MA =
4 N
1
+ 5 N
2
+ 6 N
3
15
,
onde N
1
, N
2
e N
3
so valores reais de 0 a 10. Um aluno que obtm MA menor do que 3,0
considerado reprovado. Um aluno que obtm MA maior ou igual a 3,0 e menor do que
7,0 far um exame nal. Um aluno que obtm MA maior ou igual a 7,0 aprovado por
mdia. Escreva um algoritmo que leia as notas N
1
e N
2
que um aluno obteve em uma
disciplina e determine a menor nota, N
3
, que o aluno precisa obter para ser aprovado por
mdia na disciplina. Se esta nota for maior do que 10, o algoritmo deve escrever a men-
sagem O aluno nao pode mais ser aprovado por media; caso contrrio, ele
deve escrever N
3
.
Soluo:
118
119
Questo 2) [2 pontos]
Escreva a sada do algoritmo dado abaixo quando ele for executado na entrada 10:
algoritmo Misterioso
var
n, i, x : inteiro
inicio
escreva(Entre com um numero inteiro positivo: )
leia( n )
x < 0
i < 1
repita
x < x +i
se (x % 5) = 0 entao
escreva( x, )
mse
i < i + 1
ate i > n
malgoritmo
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
120
Questo 3) [3 pontos]
Escreva um algoritmo cuja entrada formada por um inteiro positivo, n, seguido de uma
seqncia, c
1
, c
2
, . . . , c
n
, de n letras, e a sada outra seqncia, d
1
, d
2
, . . . , d
n
, de n letras.
Para todo i = 1, . . . , n, cada letra, c
i
, da seqncia de entrada s pode ser uma de trs
letras: a, b ou c. Por sua vez, cada letra, d
i
, da seqncia de sada s pode ser uma
de trs letras: x, y ou z. Mais especicamente, d
i
deve ser igual a x se c
i
igual a
a, igual a y se c
i
igual a b e igual a z se c
i
igual a c. Por exemplo, se a entrada
for
5 a a b c b
ento, a seqncia de sada do algoritmo deve ser
x x y z y
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
121
Questo 4) [3 pontos]
O valor do nmero irracional,

2
, pode ser aproximado pelo seguinte produtrio:

2
=
n

k=1
4k
2
4k
2
1
=
n

k=1
_
2k
2k 1

2k
2k + 1
_
,
onde n um nmero inteiro positivo. Por exemplo, se tomarmos n = 6, temos que

2

_
2
1

2
3
_

_
4
3

4
5
_

_
6
5

6
7
_

_
8
7

8
9
_

_
10
9

10
11
_

_
12
11

12
13
_
.
Escreva um algoritmo que leia um inteiro positivo, n, e calcule e escreva o valor da con-
stante usando o produtrio acima para calcular o valor de

2
com exatamente n termos.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 21
CORREO DA SEGUNDA AVALIAO
Questo 1) [2 pontos]
A mdia anual (MA) da UFRN uma mdia ponderada de trs notas, N
1
, N
2
e N
3
, dada
por
MA =
4 N
1
+ 5 N
2
+ 6 N
3
15
,
onde N
1
, N
2
e N
3
so valores reais de 0 a 10. Um aluno que obtm MA menor do que 3,0
considerado reprovado. Um aluno que obtm MA maior ou igual a 3,0 e menor do que
7,0 far um exame nal. Um aluno que obtm MA maior ou igual a 7,0 aprovado por
mdia. Escreva um algoritmo que leia as notas N
1
e N
2
que um aluno obteve em uma
disciplina e determine a menor nota, N
3
, que o aluno precisa obter para ser aprovado por
mdia na disciplina. Se esta nota for maior do que 10, o algoritmo deve escrever a men-
sagem O aluno nao pode mais ser aprovado por media; caso contrrio, ele
deve escrever N
3
.
Soluo:
Algoritmo 21.1: Soluo da questo 1.
1 algoritmo "Questao 1"
2 var
3 n1, n2, n3 : real
4 inicio
5 escreva( "Entre com a primeira nota: ")
6 leia( n1 )
7 escreva( "Entre com a segunda nota: ")
8 leia( n2 )
9 n3 <- ( 15
*
7 - 4
*
n1 - 5
*
n2 ) / 6
10 se n3 > 10 entao
11 escreva( "O aluno nao pode mais ser aprovado por media" )
12 senao
13 escreva( "A menor nota para atingir a media e: " , n3 )
14 fimse
15 fimalgoritmo
122
123
Questo 2) [2 pontos]
Escreva a sada do algoritmo dado abaixo quando ele for executado na entrada 10:
algoritmo Misterioso
var
n, i, x : inteiro
inicio
escreva(Entre com um numero inteiro positivo: )
leia( n )
x < 0
i < 1
repita
x < x +i
se (x % 5) = 0 entao
escreva( x, )
mse
i < i + 1
ate i > n
malgoritmo
Soluo:
10 15 45 55
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
124
Questo 3) [3 pontos]
Escreva um algoritmo cuja entrada formada por um inteiro positivo, n, seguido de uma
seqncia, c
1
, c
2
, . . . , c
n
, de n letras, e a sada outra seqncia, d
1
, d
2
, . . . , d
n
, de n letras.
Para todo i = 1, . . . , n, cada letra, c
i
, da seqncia de entrada s pode ser uma de trs
letras: a, b ou c. Por sua vez, cada letra, d
i
, da seqncia de sada s pode ser uma
de trs letras: x, y ou z. Mais especicamente, d
i
deve ser igual a x se c
i
igual a
a, igual a y se c
i
igual a b e igual a z se c
i
igual a c. Por exemplo, se a entrada
for
5 a a b c b
ento, a seqncia de sada do algoritmo deve ser
x x y z y
Soluo:
Algoritmo 21.2: Soluo da questo 3.
1 algoritmo "Questao 3"
2 var
3 i , n : inteiro
4 c : caractere
5 inicio
6 escreva( "Entre com um numero inteiro positivo: ")
7 leia( n )
8 i <- 1
9 enquanto i <= n faca
10 escreva( "Entre com o caractere ", i , ": " )
11 leia( c )
12 se c = "a" entao
13 escreval( "x" )
14 senao
15 se c = "b" entao
16 escreval( "y" )
17 senao
18 escreval( "z" )
19 fimse
20 fimse
21 i <- i + 1
22 fimenquanto
23 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
125
Questo 4) [3 pontos]
O valor do nmero irracional,

2
, pode ser aproximado pelo seguinte produtrio:

2
=
n

k=1
4k
2
4k
2
1
=
n

k=1
_
2k
2k 1

2k
2k + 1
_
,
onde n um nmero inteiro positivo. Por exemplo, se tomarmos n = 6, temos que

2

_
2
1

2
3
_

_
4
3

4
5
_

_
6
5

6
7
_

_
8
7

8
9
_

_
10
9

10
11
_

_
12
11

12
13
_
.
Escreva um algoritmo que leia um inteiro positivo, n, e calcule e escreva o valor da con-
stante usando o produtrio acima para calcular o valor de

2
com exatamente n termos.
Soluo:
Algoritmo 21.3: Soluo da questo 4.
1 algoritmo "Questao 4"
2 var
3 k , n : inteiro
4 p , x , y : real
5 inicio
6 escreva( "Entre com um numero inteiro positivo: " )
7 leia( n )
8 k <- 1
9 p <- 1
10 x <- 2
11 y <- 1
12 repita
13 p <- p
*
( x / y )
14 se x > y entao
15 y <- y + 2
16 senao
17 x <- x + 2
18 fimse
19 k <- k + 1
20 ate k > 2
*
n
21 p <- p
*
2
22 escreva( "O valor de pi e: ", p )
23 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 22
ANINHAMENTO DE LAOS
22.1 Laos aninhados
Em princpio, qualquer comando pode fazer parte do corpo de um lao, inclusive um outro
lao. Quando isto acontece, dizemos que os laos esto aninhados. Por exemplo, o trecho de
algoritmo a seguir escreve os pares ordenados na forma (i, j), onde i [1, 4] N e j [5, 9]
N:
para i de 1 ate 4 faca
para j de 5 ate 9 faca
escreva( ( , i , , , j , ) )
mpara
mpara
Para cada iterao do corpo do lao mais externo,
para i de 1 ate 4 faca
.
.
.
mpara
o lao mais interno executado por completo. Com isso, a sada do trecho algortmico acima
( 1 , 5 )
( 1 , 6 )
( 1 , 7 )
( 1 , 8 )
( 1 , 9 )
( 2 , 5 )
( 2 , 6 )
( 2 , 7 )
( 2 , 8 )
( 2 , 9 )
( 3 , 5 )
( 3 , 6 )
( 3 , 7 )
( 3 , 8 )
( 3 , 9 )
126
22.1 LAOS ANINHADOS 127
( 4 , 5 )
( 4 , 6 )
( 4 , 7 )
( 4 , 8 )
( 4 , 9 )
Alguns problemas requerem o aninhamento de dois ou mais laos. Quando estudarmos
matrizes, teremos oportunidade de resolver problemas com o aninhamento de trs ou mais
laos. Por enquanto, vamos discutir a soluo de umproblema que pode ser facilmente descrita
com o aninhamento de dois laos. O problema consiste em contar o nmero de elementos
comuns a dois subconjuntos, Ae B, de nmeros inteiros. Osubconjunto Apossui 10 elementos,
enquanto o subconjunto B possui 5 elementos. Suponha que A e B no possuam elementos
repetidos.
Para solucionar o problema acima, usaremos dois vetores, a e b, para representar os conjun-
tos A e B, respectivamente. Para contar quantos elementos so comuns a a e b, basta utilizar
um contador e procurar cada elemento do vetor a no vetor b. Toda vez que um elemento do
vetor a estiver no vetor b, incrementamos o contador de elementos. Mas, como procuramos
um elemento no vetor b? A idia comparar o elemento procurado, digamos a[i], com os ele-
mentos do vetor b at que uma igualdade seja vericada ou todos os elementos do vetor b tenham sido
comparados. Esta operao de busca pode ser efetuada, de forma natural, com o seguinte lao
enquanto:
achou < falso
j < 1
enquanto ( nao achou ) e ( j <= 5 ) faca
se a[i] = b[j] entao
achou < verdadeiro
senao
j < j + 1
mse
menquanto
Note que o lao enquanto acima termina por causa de uma de duas condies mutuamente
exclusivas: (1) a varivel achou recebeu o valor verdadeiro ou (2) o valor do contador j maior
do que 5. Quando o lao termina porque a condio (2) verdadeira, o valor da varivel achou
falso. Logo, para saber se encontramos o elemento do vetor a que procuramos no vetor b,
basta vericarmos o valor que a varivel achou possui aps o trmino do lao. Se o valor for da
varivel for verdadeiro, ento devemos incrementar o contador de achados para contabilizar o
fato do elemento a[i] fazer parte do vetor b. Por exemplo, se comuns a varivel contadora, o
cdigo
se achou entao
comuns < comuns + 1
mse
pode ser escrito logo aps o lao, incrementando a varivel comuns se o valor de achou for
verdadeiro.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 128
O lao enquanto e a estrutura condicional acima nos permitem procurar um elemento do
vetor a no vetor b. Mas, como fazemos para procurar todos os elementos do vetor a da mesma
forma que zemos para apenas um deles? Ora, basta notar que o cdigo acima no depende
do elemento do vetor a a ser procurado. Ocdigo, na verdade, considera o elemento a[i], mas o
ndice i desconhecido do cdigo. Este ndice pode assumir qualquer valor de 1 a 10. Logo,
podemos criar um novo lao que tem como corpo o cdigo acima. Tudo que o novo lao far
variar o ndice i de a[i] de forma que todos os elementos do vetor a sejam procurados no vetor
b:
comuns < 0
para i de 1 ate 10 faca
achou < falso
j < 1
enquanto ( no achou ) e ( j <= 5 ) faa
se a[i] = b[j] entao
achou < verdadeiro
seno
j < j + 1
mse
menquanto
se achou entao
comuns < comuns + 1
mse
mpara
Note que temos um lao enquanto dentro de um lao para. O papel do lao para escol-
her um elemento do vetor a por vez para ser procurado no vetor b. O papel do lao enquanto
procurar o elemento escolhido pelo lao para. Se o elemento escolhido for encontrado, ento
o contador comuns incrementado. Assim, quado o lao para terminar de executar, o valor do
contador comuns ser igual ao nmero de elementos do vetor a que tambm so elementos do
vetor b.
22.2 Ordenao
Em Computao, o termo ordenao se refere tarefa de rearranjar uma seqncia de val-
ores para torn-la uma seqncia crescente, decrescente, no-crescente ou no-decrescente. Por
exemplo,
5 1 10 100 0
uma seqncia com5 nmeros inteiros. Esta seqncia no est ordenada, pois ela nem cres-
cente, decrescente, no-crescente ou no-decrescente. Entretanto, se permutarmos a posio de
alguns elementos, ento podemos obter uma seqncia crescente com os mesmos 5 inteiros:
0 1 5 10 100
De forma anloga,
100 10 5 1 0
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 129
uma seqncia decrescente obtida com outra permutao da posio dos elementos da se-
qncia original. O problema da ordenao consiste em encontrar uma permutao da posio
dos elementos da seqncia original que gere uma seqncia crescente, decrescente, no-
crescente ou no-decrescente. Obviamente, para falarmos de seqncias crescentes, decres-
centes, no-crescentes ou no-decrescentes, assumimos que qualquer valor da seqncia orig-
inal deve ser comparvel com todos os demais para se determinar se um maior, menor ou
igual ao outro.
Algoritmo 22.1: Algoritmo para contar nmero de elementos comuns.
1 algoritmo "Numero de elementos comuns em dois vetores"
2 var
3 a : vetor[ 1..10 ] de inteiro
4 b : vetor[ 1..5 ] de inteiro
5 i , j , comuns : inteiro
6 achou : logico
7 inicio
8 para i de 1 ate 10 faca
9 escreva( "Entre com o elemento ", i , " do vetor a: " )
10 leia( a[ i ] )
11 fimpara
12 para i de 1 ate 5 faca
13 escreva( "Entre com o elemento ", i , " do vetor b: " )
14 leia( b[ i ] )
15 fimpara
16 comuns <- 0
17 para i de 1 ate 10 faca
18 achou <- falso
19 j <- 1
20 enquanto ( nao achou ) e ( j <= 5 ) faca
21 se a[ i ] = b[ j ] entao
22 achou <- verdadeiro
23 senao
24 j <- j + 1
25 fimse
26 fimenquanto
27 se achou entao
28 comuns <- comuns + 1
29 fimse
30 fimpara
31 escreva( "O numero de elementos comuns e: ", comuns )
32 fimalgoritmo
O problema da ordenao extremamente importante, pois muito comum precisarmos
ordenar um conjunto grande de dados antes de manipul-lo. Um exemplo disso um catlogo
telefnico. Quando procuramos o telefone de algum usando um catlogo telefnico, usamos
o sobrenome e o nome desse algum, pois sabemos que os nmeros de telefone esto listados
no catlogo em ordem lexicogrca crescente de sobrenome e nome dos assinantes. O fato
dos sobrenomes e nomes aparecerem dessa forma faz com que a busca pelo nmero de um
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 130
assinante seja feita de forma rpida. Voc j imaginou uma busca sem que os sobrenomes e
nomes estejam dispostos em ordem lexicogrca crescente? por isso que algum realizou
a tarefa de ordenar os nmeros dos assinantes da forma como conhecemos em um catlogo
telefnico.
Veremos, agora, um algoritmo capaz de ordenar um conjunto de valores quaisquer (mas,
comparveis uns comos outros, claro). Este algoritmo assume que o conjunto de valores a ser
ordenado est armazenado em um vetor. O algoritmo pode ordenar os valores em ordem no-
decrescente ou no-crescente. Para simplicar nossa exposio, vamos assumir que os valores
sejam nmeros inteiros distintos e que devam ser ordenados em ordem crescente. O algoritmo
utiliza um mtodo de ordenao bastante conhecido em Computao e denominado ordenao
por seleo.
Para ilustrar o mtodo de ordenao por seleo, vamos supor que o conjunto de valores a
ser ordenado esteja armazenado no vetor a e que consista de: 23, 9, 12, 25, 7, 0, 1, 2, 35 e 4,
nesta ordem:
1 2 3 4 5 6 7 8 9 10
23 9 12 25 7 0 1 2 35 4
Se o vetor possui n elementos, o mtodo realiza a ordenao em n 1 passos. No primeiro
passo, o menor valor do vetor encontrado e colocado em sua primeira posio. No segundo
passo, o segundo menor valor do vetor encontrado e colocado em sua segunda posio. De
forma geral, no i-simo passo, para 1 i n 1, o i-simo menor elemento do vetor
encontrado e colocado na i-sima posio do vetor. Aps esses n 1 passos, o vetor estar
ordenado!
De fato, considere o vetor a, que possui n = 10 elementos. No passo i = 1 do mtodo de
ordenao por seleo, encontramos o menor elemento de a e o colocamos na posio 1 de a.
O menor elemento de a 9, que est na posio 2; isto , a[2] = 9. Queremos coloc-lo na
posio 1. Para tal, trocamos os elementos a[1] = 23 e a[2] = 9 de posio, obtendo o seguinte
vetor a:
1 2 3 4 5 6 7 8 9 10
9 23 12 25 7 0 1 2 35 4
No passo i = 2, encontramos o segundo menor elemento de a, que o elemento a[10] = 4,
e o colocamos na posio 2. Para tal, trocamos os elementos a[2] = 23 e a[10] = 4 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 12 25 7 0 1 2 35 23
No passo i = 3, encontramos o terceiro menor elemento de a, que o elemento a[7] = 1,
e o colocamos na posio 3. Para tal, trocamos os elementos a[3] = 12 e a[7] = 1 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 25 7 0 12 2 35 23
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 131
No passo i = 4, encontramos o quarto menor elemento de a, que o elemento a[6] = 0,
e o colocamos na posio 4. Para tal, trocamos os elementos a[4] = 25 e a[6] = 0 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 7 25 12 2 35 23
No passo i = 5, encontramos o quinto menor elemento de a, que o elemento a[8] = 2, e o
colocamos na posio 5. Para tal, trocamos os elementos a[5] = 7 e a[8] = 2 de posio, obtendo
o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 2 25 12 7 35 23
No passo i = 6, encontramos o sexto menor elemento de a, que o elemento a[8] = 7, e
o colocamos na posio 6. Para tal, trocamos os elementos a[6] = 25 e a[8] = 7 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 2 7 12 25 35 23
No passo i = 7, encontramos o stimo menor elemento de a, que o elemento a[7] = 12,
e o colocamos na posio 7. Mas, este elemento j est na stima posio de a. Ento, o vetor
permanece inalterado neste passo:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 2 7 12 25 35 23
No passo i = 8, encontramos o oitavo menor elemento de a, que o elemento a[10] = 23,
e o colocamos na posio 8. Para tal, trocamos os elementos a[8] = 25 e a[10] = 23 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 2 7 12 23 35 25
No passo i = 9, encontramos o nono menor elemento de a, que o elemento a[10] = 25, e
o colocamos na posio 9. Para tal, trocamos os elementos a[9] = 35 e a[10] = 25 de posio,
obtendo o vetor:
1 2 3 4 5 6 7 8 9 10
9 4 1 0 2 7 12 23 25 35
Como podemos vericar, o vetor a est ordenado em ordem no-decrescente aps os 9
passos que executamos do mtodo de ordenao por seleo. Este mtodo sempre funciona?
Por qu? O mtodo de ordenao por seleo coloca o i-simo menor elemento da seqncia
de entrada na i-sima posio do vetor, para todo i variando de 1 a n1. Mas, isto implica que,
ao nal de n 1 passos, o maior elemento do vetor estar na posio n, pois os n 1 menores
do que ele esto nas posies 1, . . . , n 1. Logo, o vetor a estar ordenado aps os n1 passos
do mtodo.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 132
Vejamos, agora, o algoritmo que implementa o mtodo de ordenao por seleo acima.
Uma operao chave deste algoritmo aquela que encontra o i-simo menor elemento da se-
qncia original de entrada. Para entender esta operao preciso notar que, ao iniciarmos a
busca pelo i-simo menor elemento da seqncia, o vetor a est parcialmente ordenado, pois
a[1], a[2], . . . , a[i 1]
j armazenam os i1 menores elementos do vetor. Isto signica que o i-simo menor est entre
os elementos
a[i], a[i + 1], . . . , a[n] .
Logo, a busca pelo i-simo menor elemento deve se restringir aos elementos acima. Esta busca
pode ser feita por um lao do tipo para como mostrado pelo trecho de algoritmo escrito logo
abaixo:
menor < i
para j de i + 1 ate n faca
se a[j] < a[menor] entao
menor < j
mse
mpara
se i <> menor entao
temp < a[menor]
a[menor] < a[j]
a[j] < temp
mse
No trecho de algoritmo acima, a varivel menor tem como nalidade guardar o ndice do
menor elemento visto at ento entre os elementos a[i], a[i + 1], . . . , a[n]. Inicialmente, menor
recebe o valor de i, que a posio onde queremos colocar o i-simo menor elemento da se-
qncia de entrada. Emseguida, o lao compara o elemento da posio menor comos elementos
a[i + 1], . . . , a[n]. Toda vez que um elemento menor do que a[menor] encontrado, o valor de
menor passa a ser a posio deste elemento. Quando o lao termina, menor contm a posio do
menor elemento entre os elementos a[i], a[i + 1], . . . , a[n]. Se esta posio no i, trocamos os
elementos a[i] e a[menor] de posio. Desta forma, o i-simo menor elemento sempre acabar
na posio i.
O trecho algortmico que vimos acima encontra o i-simo menor elemento da seqncia de
entrada e o coloca na posio i do vetor a. Para utilizar este trecho de algoritmo para colocar
todos os elementos da seqncia em suas devidas posies, basta executar o trecho para todos
os valores de i variando de 1 a n 1. Mas, isto pode ser feito atravs do uso de um outro
lao para, que ter como corpo o trecho de algoritmo acima. Mais especicamente, temos o
seguinte:
para i de 1 ate n 1 faca
menor < i
para j de i + 1 ate n faca
se a[j] < a[menor] entao
menor < j
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.2 ORDENAO 133
mse
mpara
se i <> menor entao
temp < a[menor]
a[menor] < a[i]
a[i] < temp
mse
mpara
O algoritmo completo mostrado em Algoritmo 22.2.
Algoritmo 22.2: Ordenao de uma seqncia de inteiros usando o mtodo de seleo.
1 algoritmo "Ordenacao de inteiros usando o metodo de selecao"
2 var
3 a : vetor[ 1..100 ] de inteiro
4 i , j , n , temp : inteiro
5 inicio
6 escreva( "Entre com o numero de elementos do vetor (<= 100): " )
7 repita
8 leia( n )
9 ate n <= 100
10 para i de 1 ate n faca
11 escreva( "Entre com o elemento ", i , " do vetor a: " )
12 leia( a[ i ] )
13 fimpara
14 para i de 1 ate n - 1 faca
15 menor <- i
16 para j de i + 1 ate n faca
17 se a[ j ] < a[ menor ] entao
18 menor <- j
19 fimse
20 fimpara
21 se i <> menor entao
22 temp <- a[ menor ]
23 a[ menor ] <- a[ i ]
24 a[ i ] <- temp
25 fimse
26 fimpara
27 escreva( "A sequencia ordenada e: " )
28 para i de 1 ate n faca
29 escreva( a[ i ] , " " )
30 fimpara
31 fimalgoritmo
H um detalhe importante no Algoritmo 22.2. O vetor a denido como um vetor com 100
elementos, mas o algoritmo solicita como entrada o nmero de elementos a seremarmazenados
no vetor, que deve ser um nmero menor ou igual a 100. Logo, embora o vetor tenha tamanho
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.3 EXERCCIOS PROPOSTOS 134
100, pode ser que um nmero bem menor de clulas seja efetivamente utilizado durante uma
execuo do algoritmo. Este artifcio bastante comum na prtica, pois, emgeral, no sabemos
a priori quantos elementos receberemos como entrada. Ento, utilizamos um vetor de tamanho
grande o suciente para armazenar qualquer entrada que achamos ser possvel de ser dada
ao algoritmo.
Na descrio do mtodo de ordenao por seleo, assumimos que os nmeros dados como
entrada so distintos. O que acontece se houver nmeros repetidos? O algoritmo ainda fun-
ciona corretamente? Execute o algoritmo em uma entrada de tamanho pequeno com alguns
elementos repetidos e verique que ele produz a sada correta. Em seguida, analise o algo-
ritmo e descreva o porqu do algoritmo estar correto para entradas com nmeros repetidos
tambm.
22.3 Exerccios propostos
1. Esreva um algoritmo que leia um nmero inteiro positivo, n, e escreva a tabuada at 10
dos inteiros de 1 a n.
2. Escreva um algoritmo que leia um nmero inteiro positivo, n, e uma seqncia de n
nmeros inteiros, determine e escreva a quantidade de segmentos de nmeros iguais
consecutivos que compem essa seqncia. Por exemplo, se a entrada for 9, 5, 2, 2, 4, 4,
4, 4, 1, 1, ento a sada deve ser o nmero 4, pois
5, 2, 2, 4, 4, 4, 4, 1, 1
possui quatro segmentos de nmeros iguais consecutivos:
5
..
, 2, 2
..
, 4, 4, 4, 4
. .
, 1, 1
..
.
Observe que h segmentos com um nico elemento, tal como 5
..
no exemplo acima.
3. Escreva um algoritmo que leia um inteiro positivo, n, e uma seqncia com n nmeros
inteiros e calcule e escreva o comprimento de ummaior segmento crescente da seqncia.
Por exemplo, se a entrada for
9, 5, 10, 3, 2, 4, 7, 9, 8, 5
ento a sada 4, pois
2, 4, 7, 9
um segmento crescente com comprimento mximo e igual a 4 da seqncia
5, 10, 3, 2, 4, 7, 9
. .
, 8, 5
Se a entrada for
5, 10, 8, 7, 5, 2
ento a sada 1, pois todos os segmentos crescentes de tamanho mximo da seqncia
10, 8, 7, 5, 2
possuem tamanho 1 e h exatamente cinco segmentos crescentes de tamanho mximo:
10
..
, 8
..
, 7
..
, 5
..
, 2
..
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.3 EXERCCIOS PROPOSTOS 135
4. Escreva umalgoritmo que leia umnmero inteiro positivo, n, e determine e escreva todos
os inteiros entre 1 e n que so comprimento de hipotenusa de umtringulo retngulo com
catetos inteiros.
5. Sabe-se que umnmero inteiro positivo da forma n
3
igual soma de n nmeros mpares
consecutivos; isto ,
1
3
= 1
2
3
= 3 + 5
3
3
= 7 + 9 + 11
4
3
= 13 + 15 + 17 + 19
.
.
.
Ento, escreva um algoritmo que leia um nmero inteiro positivo, m, e, em seguida,
calcule e escreva todos os mpares consecutivos cuja soma igual a n
3
para n variando
de 1 a m.
6. Escreva umalgoritmo que leia um nmero inteiro positivo, n, e determine e escreva a sua
decomposio em fatores primos, exibindo a multiplicidade de cada fator. Por exemplo,
se a entrada for n = 18, ento a sada deve ser da forma
2 com multiplicidade 1
3 com multiplicidade 2
pois 2 3 3 = 18 e 2 e 3 so nmeros primos.
7. Escreva um algoritmo que leia dois nmeros inteiros positivos, n e m, e duas seqncias
ordenadas, em ordem no-decrescente, com n e m nmeros inteiros, respectivamente.
Em seguida, o algoritmo deve criar e escrever como sada uma nica seqncia ordenada
em ordem no-decrescente com todos os m+n nmeros das duas seqncias de entrada.
Assuma que n, m 100.
8. Dadas duas seqncias com n nmeros inteiros entre 0 e 9, podemos interpret-las como
dois nmeros inteiros de n algarismos para, emseguida, calcular a seqncia de nmeros
que representa a soma dos dois inteiros. Por exemplo, se n = 8 e 8, 2, 4, 3, 4, 2, 5, 1 e
3, 3, 7, 5, 2, 3, 3, 7 forem as duas seqncias, ento a soma dos dois nmeros dados
igual a
1
a
seqncia 8 2 4 3 4 2 5 1
2
a
seqncia + 3 3 7 5 2 3 3 7
1 1 6 1 8 6 5 8 8
Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e duas se-
qncias com n nmeros inteiros entre 0 e 9 e calcule e escreva a seqncia que repre-
senta o nmero resultante da soma dos dois nmeros dados pelas duas seqncias de
entrada (como acima).
9. Chama-se seqncia de Farey relativa a n a seqncia de fraes racionais irredutveis, dis-
postas em ordem crescente, com denominadores positivos e no maiores que n. Por ex-
emplo, se n = 5, os termos da seqncia de Farey, tais que 0 1, so os seguintes:
0
1
,
1
5
,
1
4
,
1
3
,
2
5
,
1
2
,
3
5
,
2
3
,
3
4
,
4
5
,
1
1
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.3 EXERCCIOS PROPOSTOS 136
Para gerarmos os termos de uma seqncia de Farey, com 0 1, podemos utilizar
o seguinte processo: comeamos com as fraes
0
1
e
1
1
, e entre cada duas fraes consec-
utivas
i
j
e
k
m
, introduzimos a frao
i+k
j+m
e assim sucessivamente enquanto j + m n.
Quando no for mais possvel introduzir novas fraes, teremos gerados todos os termos
da seqncia de Farey relativa a n, com 0 1. Utilizando o mtodo descrito,
escreva um algoritmo que leia um inteiro positivo n, e escreva todos os termos , com
0 1, da seqncia de Farey relativa a n. Dica: gere os numeradores e os denomi-
nadores em dois vetores.
10. Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e uma se-
qncia,
x
1
, x
2
, . . . , x
n
,
com n nmeros inteiros, e que verica se existem dois segmentos consecutivos iguais
nesta seqncia, isto , o algoritmo deve vericar se existem inteiros i e m tais que os
segmentos consecutivos,
x
i
, x
i+1
, . . . , x
i+m1
e x
i+m
, x
i+m+1
, . . . , x
i+2m1
,
sejam iguais. Se existirem, o algoritmo deve escrever os valores de i e m. Caso contrrio,
o algoritmo deve escrever a mensagem no h dois segmentos consecutivos iguais na
seqncia dada.
Por exemplo, na seqncia
7, 9, 5, 4, 5, 4, 8, 6 ,
h (os segmentos consecutivos 5, 4 e 5, 4) e o algoritmo deve escrever i = 3 e m = 2 como
sada.
11. Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e uma se-
qncia,
x
1
, x
2
, . . . , x
n
,
com n nmeros inteiros, determine um segmento de soma mxima e escreva a soma dos
elementos deste segmento. Por exemplo, se n for igual a 12 e a seqncia dada como
entrada for
5, 2, 2, 7, 3, 14, 10, 3, 9, 6, 4, 1
o segmento de soma mxima 3, 14, 10, 3, 9 e a soma dos inteiros deste segmento
igual a 33. Observe que um segmento um subseqncia de elementos consecutivos da
seqncia.
12. Escreva um algoritmo que leia o nome dos alunos de uma turma de tamanho indenido
(mas no superior a 60) e sua nota em uma prova (0 a 10: o algoritmo deve vericar se
a nota fornecida vlida. O algoritmo para de ler a entrada quando o nome do aluno
fornecido for vazio (). Para cada aluno, o algoritmo deve escrever seu nome e sua nota
normalizada, dada pela frmula
n
i
n
max
,
onde n
i
a nota que o aluno tirou na prova e n
max
a maior nota obtida dentre todos os
alunos da turma.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
22.3 EXERCCIOS PROPOSTOS 137
13. Deseja-se escrever um algoritmo para fazer a emisso da folha de pagamento de uma
empresa. Para cada um dos n funcionrios, as seguintes informaes so fornecidas, por
funcionrio, em seqncia:
Cdigo Descrio
NOME Nome do funcionrio
SAL Salrio do funcionrio
HED Horas extras diurnas
HEN Horas extras noturnas
ND Nmero de dependentes
FAL Faltas em horas
DE Descontos eventuais
REF Gastos com refeies feitas na empresa
VAL Vales retirados durante o ms
Para cada funcionrio, o algortimo deve escrever as seguintes informaes:
Nome,
Salrio,
Horas Extras = HED SAL/160 + HEN 1,2 SAL/160,
Salrio Famlia = ND 0,05 Salrio Mnimo vigente,
Salrio Bruto = Salrio + Horas Extras + Salrio Famlia.
e os descontos efetuados:
INSS = 0,08 SAL,
Faltas = FAL SAL/160,
Refeies,
Vales,
Descontos Eventuais,
Imposto de Renda = 0,08 Salrio Bruto.
e nalmente o seu Salrio Lquido:
Salrio Lquido = Salrio Bruto - Descontos.
14. Reescreva o Algoritmo 22.2 para que ele ordene nmeros reais.
15. Reescreva o Algoritmo 22.2 para que ele ordene palavras.
16. Use a ferramenta VISUALG para testar os algoritmos que voc escreveu para os proble-
mas 13 e 14.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 23
MATRIZES - PARTE 1
23.1 Denio e Manipulao de Matrizes
Na Aula 21, aprendemos como denir variveis de um novo tipo de dados, denominado
vetor, que representamseqncias de valores de ummesmo tipo. Por possuremuma estrutura
seqencial, vetores so denominados arranjos unidimensionais. Nesta aula, generalizaremos
a noo de arranjo para duas dimenses. Mais especicamente, deniremos variveis de um
novo tipo de dados, conhecido como matriz, que representa tabelas, com m linhas e n colunas,
de valores de um mesmo tipo. Cada uma das m linhas de uma matriz pode ser vista como um
vetor de tamanho n. por isso que matrizes so tambm denominadas de arranjos bidimension-
ais.
Uma matriz uma coleo de valores de um mesmo tipo de dados dispostos na forma
de uma tabela com m linhas e n colunas, onde m e n so constantes inteiras positivas. Cada
elemento ou clula de uma matriz armazena um nico valor e todos os valores de uma matriz
so de um mesmo tipo. Cada clula de uma matriz pode ser identicada de forma nica por
dois ndices, digamos i e j, com i, j Z, tais que 1 i m e 1 j n. O ndice i identica
a linha da tabela em que o elemento se encontra, enquanto o ndice j identica a coluna (veja
Figura 23.1).
elemento (4,3)
1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8

Figura 23.1: Uma matriz com 8 linhas e 8 colunas.


Cada linha de uma matriz com m linhas e n colunas, ou simplesmente uma matriz m por
n, pode ser considerada como sendo um vetor contendo n elementos. Na linguagem Portugol
da ferramenta VISUALG, uma varivel do tipo matriz m por n declarada atravs da seguinte
sintaxe:
138
23.1 DEFINIO E MANIPULAO DE MATRIZES 139
nome : vetor [ tamanho1 , tamanho2 ] de tipo
onde nome o nome da varivel do tipo matriz, tamanho1 e tamanho2 so faixas de valores
consistindo do primeiro e ltimo ndices das linhas e colunas da matriz, respectivamente, e tipo
o tipo dos valores das clulas do vetor. Se a matriz possui mlinhas e n colunas, ento tamanho1
e tamanho2 devem ser escritos como m
1
..m
2
e n
1
..n
2
, respectivamente, onde m
2
m
1
= m1 e
n
2
n
1
= n 1. Comumente, temos m
1
= n
1
= 1, m
2
= m e n
2
= n. No entanto, nada impede
que usemos outros valores para m
1
, m
2
, n
1
e n
2
. Por exemplo, m
1
= 1, m
2
= m 2, n
1
= 0 e
n
2
= n 1.
Por exemplo, o comando abaixo declara uma varivel matriz 5 por 3 de valores inteiros:
tabela : vetor [ 1..5 , 1..3 ] de inteiro
A declarao acima corresponde declarao de 15 = 5 3 variveis do tipo inteiro. Essas
quinze variveis so as quinze clulas da matriz. Ns podemos manipular cada uma das clu-
las individualmente, usando o nome da varivel e os ndices da clula. As clulas da matriz
tabela so:
tabela[1, 1] tabela[1, 2] tabela[1, 3]
tabela[2, 1] tabela[2, 2] tabela[2, 3]
tabela[3, 1] tabela[3, 2] tabela[3, 3]
tabela[4, 1] tabela[4, 2] tabela[4, 3]
tabela[5, 1] tabela[5, 2] tabela[5, 3]
Cada uma das clulas acima corresponde a uma varivel do tipo inteiro. Tudo que fazemos com
uma varivel do tipo inteiro pode ser feito com as clulas de tabela. Por exemplo, o comando
leia(tabela[1, 2])
realiza a leitura de um valor do tipo inteiro e faz com que este valor seja o contedo da clula
tabela[1, 2]. J
escreva(tabela[1, 2])
escreve o contedo da clula tabela[1, 2]. De forma geral, podemos usar tabela[1, 2] em qual-
quer instruo que manipule um valor inteiro. O seguinte trecho de algoritmo ilustra diversas
manipulaes:
i < 2
j < 3
leia(tabela[i, j])
tabela[i, j] < tabela[i, j 1] + tabela[i 1, j]
Note que, ao escrevermos tabela[i, j], estamos nos referindo clula da linha i e coluna j
da matriz tabela, ou seja, o contedo de i nos d a linha e o contedo de j nos d a coluna
da clula. Esta exibilidade nos permitiu escrever algoritmos envolvendo vetores de forma
bastante compacta. A mesma exibilidade se estende para matrizes. Por exemplo, o trecho de
algoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.2 EXEMPLOS 140
para i de 1 ate 5 faca
para j de 1 ate 3 faca
tabela[i, j] < i + j
mpara
mpara
atribui o valor i +j para o elemento da i-sima linha e j-sima coluna de tabela. J o trecho de
algoritmo
para i de 1 ate 5 faca
para j de 1 ate 3 faca
escreva( Entre com o elemento [, i , ,, j , ]: )
leia( tabela[i, j] )
mpara
mpara
s difere do anterior pelo corpo do lao mais interno, que faz a leitura de cada elemento da
matriz tabela ao invs de uma atribuio de valor. De forma geral, a manipulao de todos
os elementos de uma matriz, um de cada vez, feita com dois laos aninhados, como nos
exemplos acima. De fato, podemos facilmente modicar qualquer um dos dois trechos de
algoritmo acima para escrever, ao invs de ler, o contedo de todos os elementos da matriz
tabela:
para i de 1 ate 5 faca
para j de 1 ate 3 faca
escreva( tabela [, i , ,, j , ] = , tabela[i, j] )
mpara
mpara
23.2 Exemplos
Em geral, o uso de matrizes mais freqente na resoluo de problemas computacionais
de Engenharia, os quais envolvem lgebra linear numrica. Neste contexto, variveis do tipo
matriz possuemuma relao direta com a noo de matriz em Matemtica. No entanto, vrios
programas de computador utilizam matrizes para outras nalidades, que variam desde a rep-
resentao de uma simples planilha a grades de interfaces grcas. Os exemplos que veremos
a seguir tm por nalidade familiarizar o leitor com a manipulao de matrizes. Por isso,
eles so aplicaes demasiadamente simples e que esto relacionadas noo de matriz em
Matemtica.
23.2.1 Soma de duas matrizes
Aprendemos no Ensino Mdio que se A e B forem matrizes de dimenso m n, ento
C = A + B tambm ser m n e tal que c
ij
= a
ij
+ b
ij
, para todo i 1, . . . , m e todo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.2 EXEMPLOS 141
j 1, . . . , n. Por exemplo, se
A =
_
_
8 6
1 4
5 7
_
_
e B =
_
_
1 2
0 3
2 1
_
_
,
ento
C = A +B =
_
_
9 8
1 7
7 8
_
_
.
Com a denio acima em mente, podemos construir um algoritmo para ler duas matrizes,
A e B, de mesma dimenso, calcular a matriz soma, C, e escrever seus elementos. Vamos
representar as matrizes A, B e C por variveis a, b e c do tipo matriz de elementos do tipo real.
Assimcomo zemos comvetores, vamos declarar a, b e c como tendo muitas linhas e colunas.
Em seguida, solicitamos ao usurio que nos fornea o nmero, m, de linhas e o nmero, n, de
colunas das matrizes. Aprxima etapa a leitura dos mn elementos das matrizes Ae B (veja
Algoritmo 23.1).
Algoritmo 23.1: Primeira parte do algoritmo para somar duas matrizes.
1 algoritmo "Soma de duas matrizes"
2 var
3 a, b, c : vetor [ 1..100 , 1..100 ] de real
4 i, j, m, n : inteiro
5 inicio
6 escreva( "Entre com o numero de linhas das matrizes (<= 100): ")
7 repita
8 leia( m )
9 ate m <= 100
10 escreva( "Entre com o numero de colunas das matrizes (<= 100): ")
11 repita
12 leia( n )
13 ate n <= 100
14 para i de 1 ate m faca
15 para j de 1 ate n faca
16 escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
17 leia( a[ i , j ] )
18 escreva( "Entre com o elemento b[ ", i , "," , j , "]: " )
19 leia( b[ i , j ] )
20 fimpara
21 fimpara
Uma vez que tenhamos os elementos de A e B, precisamos calcular a matriz soma C =
A+B. Por denio, sabemos que c
ij
= a
ij
+b
ij
, para todo i 1, . . . , m e todo j 1, . . . , n.
Isto ,
c[ i , j ] <- a[ i , j ] + b[ i , j ]
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.2 EXEMPLOS 142
para todos os valores que as variveis i e j assumem nos intervalos de 1 a m e 1 a n, re-
spectivamente. A soma e atribuio acima podem ser feitas com dois laos aninhados (veja
Algoritmo 23.2).
Algoritmo 23.2: Segunda parte do algoritmo para somar duas matrizes.
22 para i de 1 ate m faca
23 para j de 1 ate n faca
24 c[ i , j ] <- a[ i , j ] + b[ i , j ]
25 fimpara
26 fimpara
Finalmente, os elementos da matriz C so escritos como mostrado em Algoritmo 23.3.
Algoritmo 23.3: Terceira parte do algoritmo para somar duas matrizes.
27 para i de 1 ate m faca
28 para j de 1 ate n faca
29 escreva( "c[ ", i , "," , j , "] = " , c[ i , j ] , " " )
30 fimpara
31 escreval( "" )
32 fimpara
33 fimalgoritmo
23.2.2 Clculo de norma matricial
Em lgebra Linear, aprendemos que o modo usual de expressarmos a magnitude de
um vetor ou matriz atravs de um escalar denominado norma. Uma norma matricial uma
funo, | | : R
mn
R, que associa um nmero real a cada matriz e que satisfaz s seguintes
condies:
|A| 0 e |A| = 0 se, e somente se, todo elemento de A igual a zero,
|A +B| |A| +|B| e
|k A| = [k[ |A|,
onde A, B R
mn
so matrizes de mesma dimenso e k R um escalar. Uma norma
matricial bastante conhecida e utilizada em clculos numricos a norma de soma mxima de
linha:
|A|

= max
1in
n

j=1
[a
ij
[ .
Basicamente, a norma soma mxima de linha igual a maior soma que obtemos quando so-
mamos o valor absoluto dos elementos de uma linha da matriz. Por exemplo, se a matriz A
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.2 EXEMPLOS 143
igual a
_
2 1
3 5
_
,
ento
|A|

= max[2[ +[ 1[, [3[ +[5[ = max3, 8 = 8 .


O Algoritmo 23.4 l uma matriz e calcula e escreve a norma de soma mxima de linha da
matriz.
Algoritmo 23.4: Clculo da norma da soma mxima de linha.
1 algoritmo "Norma da soma maxima de linha"
2 var
3 a : vetor [ 1..100 , 1..100 ] de real
4 soma, norma : real
5 i, j, m, n : inteiro
6 inicio
7 escreva( "Entre com o numero de linhas da matriz (<= 100): ")
8 repita
9 leia( m )
10 ate m <= 100
11 escreva( "Entre com o numero de colunas da matriz (<= 100): ")
12 repita
13 leia( n )
14 ate n <= 100
15 para i de 1 ate m faca
16 para j de 1 ate n faca
17 escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
18 leia( a[ i , j ] )
19 fimpara
20 fimpara
21 norma <- 0
22 para i de 1 ate m faca
23 soma <- 0
24 para j de 1 ate n faca
25 se a[ i , j ] < 0 entao
26 soma <- soma - a[ i , j ]
27 senao
28 soma <- soma + a[ i , j ]
29 fimse
30 fimpara
31 se soma > norma entao
32 norma <- soma
33 fimse
34 fimpara
35 escreva( "A norma da soma maxima de linha da matriz e: ", norma )
36 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.3 EXERCCIOS PROPOSTOS 144
23.2.3 Clculo da matriz transposta
A transposta de uma matriz A, denotada por A
T
, uma matriz obtida trocando-se as linhas
de A pelas colunas, de modo que a linha i se torne a coluna i e a coluna j se torne a linha j. Por
exemplo, se
A =
_

_
5 2 0
6 9 1
3 4 2
7 0 8
1 5 6
_

_
,
ento
A
T
=
_
_
5 6 3 7 1
2 9 4 0 5
0 1 2 8 6
_
_
.
Em geral, temos que se A uma matriz m por n, ento A
T
uma matriz n por m tal que a
T
ij
=
a
ji
, para todo i 1, . . . , n e todo j 1, . . . , m. Usando esta denio, o Algoritmo 23.5
calcula e escreve os elementos da transposta de uma matriz de reais dada como entrada do
algoritmo. Preste bastante ateno no uso correto dos ndices nos laos aninhados do algoritmo.
23.3 Exerccios propostos
1. Escreva, usando a linguagemPortugol da ferramenta VISUALG, trs declaraes distintas
de uma mesma varivel do tipo matriz com 10 por 20 elementos do tipo caractere. A
diferena entre as declaraes deve se d, apenas, nas faixas de valores que denem a
dimenso da matriz.
2. Escreva umalgoritmo que leia valores para cada elemento de uma matriz B de 100 linhas
e 200 colunas de nmeros reais, calcule a soma dos elementos da linha de ndice 40 e da
coluna de ndice 30 e escreva o resultado dessas duas somas.
3. Escreva um algoritmo para calcular a matriz resultante da multiplicao de um escalar
por uma dada matriz. A entrada do algoritmo composta por dois inteiros, m e n, um
nmero real, , e pelos elementos de uma matriz, A, m por n de reais. Assuma que
m 100 e n 50. A sada do algoritmo composta pelos elementos da matriz A.
4. Escreva um algoritmo para calcular o vetor resultante da multiplicao de uma dada
matriz por um dado vetor. A entrada do algoritmo composta por dois inteiros, m e n,
pelos elementos de uma matriz, A, m por n de reais e pelos elementos de um vetor, V ,
de tamanho n de nmeros reais. Assuma que m 100 e n 50. A sada do algoritmo
composta pelos elementos do vetor A V de tamanho m de nmeros reais.
5. Escreva umalgoritmo para vericar se existemelementos repetidos emuma dada matriz.
A entrada do algoritmo composta por dois inteiros, m e n, e pelos elementos de uma
matriz, A, m por n de inteiros. Assuma que m 100 e n 50. A sada do algoritmo a
mensagem sim se A contiver pelo menos um elemento repetido e no caso contrrio.
6. Deseja-se escrever um algoritmo para atualizar as contas correntes dos clientes de uma
agncia bancria. dado o cadastro de n clientes contendo, para cada cliente, o nmero
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.3 EXERCCIOS PROPOSTOS 145
de sua conta e o seu saldo; o cadastro est ordenado pelo nmero da conta. Em seguida,
dado o nmero m de operaes efetuadas no dia e, para cada operao, o nmero da
conta, uma letra C ou D indicando se a operao de crdito ou dbito e o valor da
operao.
A entrada do algoritmo um inteiro positivo, n, uma seqncia com n pares, (nmero
da conta, saldo), de cada um dos n clientes, um nmero inteiro no-negativo m e uma
seqencia de m pares, (nmero da conta, letra C ou D), com m transaes bancrias. A
sada do algoritmo uma seqncia de n pares, (nmero da conta, saldo), onde o saldo
da conta o saldo aps as m transaes terem sido efetuadas. Assuma que n 40 e
m 1000.
Algoritmo 23.5: Clculo da matriz transposta.
1 algoritmo "Transposta de uma matriz"
2 var
3 a, b : vetor [ 1..100 , 1..100 ] de real
4 i, j, m, n : inteiro
5 inicio
6 escreva( "Entre com o numero de linhas da matriz (<= 100): ")
7 repita
8 leia( m )
9 ate m <= 100
10 escreva( "Entre com o numero de colunas da matriz (<= 100): ")
11 repita
12 leia( n )
13 ate n <= 100
14 para i de 1 ate m faca
15 para j de 1 ate n faca
16 escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
17 leia( a[ i , j ] )
18 b[ j , i ] = a[ i , j ]
19 fimpara
20 fimpara
21 para i de 1 ate n faca
22 para j de 1 ate m faca
23 escreva( "b[ ", i , "," , j , "] = " , b[ i , j ] , " " )
24 fimpara
25 escreval( "" )
26 fimpara
27 fimalgoritmo
7. Escreva um algoritmo para ler um nmero inteiro positivo, n, e escrever as n primeiras
linhas do tringulo de Pascal
1
.
1
Descoberto em 1654 pelo matemtico francs Blaise Pascal.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
23.3 EXERCCIOS PROPOSTOS 146
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 4 10 10 5 1
.
.
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 24
MATRIZES - PARTE 2
24.1 Mais exemplos
Nesta aula, veremos mais dois algoritmos envolvendo matrizes. O primeiro deles calcula a
matriz resultante da multiplicao de duas matrizes e utiliza trs laos do tipo para aninhados.
O segundo verica se uma dada matriz ou no um quadrado mgico e utiliza uma combi-
nao de laos do tipo para e enquanto. Os dois algoritmos so mais elaborados do que os que
vimos antes.
24.1.1 Multiplicao de duas matrizes
Sejam A e B duas matrizes com dimenses mp e p n, respectivamente. Ento, a multi-
plicao
A B
da matrix A pela matriz B resulta em uma matriz, C, de dimenso mn tal que o elemento c
ij
igual a
p

k=1
a
ik
b
kj
,
para i 1, . . . , m e j 1, . . . , n. Em outras palavras, cada elemento c
ij
igual ao produto
_
a
i1
a
i2
a
ip

_
b
1j
b
2j
.
.
.
b
pj
_

_
da i-sima linha de A pela j-sima coluna de B. Por exemplo, se
A =
_
_
8 6
1 4
5 7
_
_
e B =
_
1 2 0
3 2 1
_
,
ento
C = AB = A =
_
_
8 6
1 4
5 7
_
_

_
1 2 0
3 2 1
_
=
_
_
26 28 6
13 10 4
26 24 7
_
_
,
147
24.1 MAIS EXEMPLOS 148
pois
c
11
=
_
8 6


_
1
3
_
= 8 1 + 6 3 = 8 + 18 = 26 ,
c
12
=
_
8 6


_
2
2
_
= 8 2 + 6 2 = 16 + 12 = 28 ,
c
13
=
_
8 6


_
0
1
_
= 8 0 + 6 1 = 0 + 6 = 6 ,
c
21
=
_
1 4


_
1
3
_
= 1 1 + 4 3 = 1 + 12 = 13 ,
c
22
=
_
1 4


_
2
2
_
= 1 2 + 4 2 = 2 + 8 = 10 ,
c
23
=
_
1 4


_
0
1
_
= 1 0 + 4 1 = 0 + 4 = 4 ,
c
31
=
_
5 7


_
1
3
_
= 5 1 + 7 3 = 5 + 21 = 26 ,
c
32
=
_
5 7


_
2
2
_
= 5 2 + 7 2 = 10 + 14 = 24 ,
c
33
=
_
5 7


_
0
1
_
= 5 0 + 7 1 = 0 + 7 = 7 .
O que queremos, agora, desenvolver um algoritmo para ler duas matrizes, A e B, com
dimenses mp e pn, respectivamente, e calcular e escrever a matriz C = AB de dimenso
mn. A entrada deste algoritmo composta das dimenses m, n e p e dos elementos de Ae B.
A sada composta pelos elementos da matriz C. importante notar que o nmero de colunas
de Ae o nmero de colunas de B devemser iguais. Como esses nmeros so representados por
p, no precisamos de quatro valores de entrada (mas sim trs) para representar as dimenses
de A e B.
O passo crucial do algoritmo que queremos construir o que calcula os elementos de C,
pois os demais passos se referem entrada e sada de dados, que so realizadas da mesma
forma que vimos em outros exemplos. Os elementos c
ij
podem ser calculados com o seguinte
cdigo:
para i de 1 ate m faca
para j de 1 ate n faca
// calcule o elemento c
ij
da matriz C = AB
mpara
mpara
Como sabemos,
c
ij
=
p

k=1
a
ik
b
kj
.
A soma acima pode ser feita com outro lao do tipo para e uma varivel acumuladora, que
pode ser a prpria clula da varivel matriz que representa C. De fato, se as matrizes A, B e C
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.1 MAIS EXEMPLOS 149
so representadas pelas variveis a, b e c, respectivamente, ento cada c
ij
pode ser obtido com
o cdigo
c[i, j] < 0
para k de 1 ate p faca
c[i, j] < c[i, j] + a[i, k] b[k, j]
mpara
Note que os valores de i e j so xos no lao acima. Apenas o valor da varivel contadora k
varia.
Substituindo o cdigo acima para calcular um nico c
ij
na linha de comentrio dos laos
aninhados que vimos antes, obtemos um trecho de cdigo que calcula todos os elementos c
ij
da
matriz C:
para i de 1 ate m faca
para j de 1 ate n faca
c[i, j] < 0
para k de 1 ate p faca
c[i, j] < c[i, j] + a[i, k] b[k, j]
mpara
mpara
mpara
O algoritmo completo para a multiplicao de duas matrizes est em Algoritmo 24.1.
24.1.2 Quadrado mgico
A matriz
_
_
8 0 7
4 5 6
3 10 2
_
_
possui a seguinte propriedade: a soma dos elementos de qualquer uma de suas linhas, colunas,
diagonal principal ou diagonal secundria igual a 15. Quando isto acontece, dizemos que a
matriz um quadrado mgico. Um problema computacional interessante o de vericar se
uma dada matriz quadrada ou no um quadrado mgico. A entrada deste problema um
inteiro n, comn 2, e uma matriz quadrada, digamos A, de ordemn. A sada do problema a
mensagem A matriz no um quadrado mgico ou a mensagem A matriz um quadrado
mgico.
O que queremos aqui construir um algoritmo para resolver o problema acima. Basica-
mente, o algoritmo que queremos um vericador de uma propriedade. Ele deve decidir se a
entrada satisfaz uma dada propriedade. A sada do algoritmo deve indicar se a propriedade
ou no satisfeita pela entrada. Algoritmos desta natureza so conhecidos como algoritmos de
deciso.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.1 MAIS EXEMPLOS 150
Algoritmo 24.1: Clculo da multiplicao de duas matrizes.
1 algoritmo "Multiplicacao de duas matrizes"
2 var
3 a, b, c : vetor [ 1..100 , 1..100 ] de real
4 i, j, m, p, n : inteiro
5 inicio
6 escreva( "Entre com o numero de linhas da primeira matriz (<= 100): ")
7 repita
8 leia( m )
9 ate m <= 100
10 escreva( "Entre com o numero de colunas da primeira matriz (<= 100): ")
11 repita
12 leia( p )
13 ate p <= 100
14 escreva( "Entre com o numero de colunas da segunda matriz (<= 100): ")
15 repita
16 leia( n )
17 ate n <= 100
18 para i de 1 ate m faca
19 para j de 1 ate p faca
20 escreva( "Entre com o elemento [ ", i , "," , j , "] da matriz A: " )
21 leia( a[ i , j ] )
22 fimpara
23 fimpara
24 para i de 1 ate p faca
25 para j de 1 ate n faca
26 escreva( "Entre com o elemento [ ", i , "," , j , "] da matriz B: " )
27 leia( b[ i , j ] )
28 fimpara
29 fimpara
30 para i de 1 ate m faca
31 para j de 1 ate n faca
32 c[ i , j ] <- 0
33 para k de 1 ate p faca
34 c[ i , j ] <- c[ i , j ] + a[ i , k ]
*
b[ k , j ]
35 fimpara
36 fimpara
37 fimpara
38 para i de 1 ate m faca
39 para j de 1 ate n faca
40 escreva( "O elemento c[ ", i , "," , j , "] e: " , c[ i , j ] )
41 fimpara
42 fimpara
43 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.1 MAIS EXEMPLOS 151
Para construir nosso algoritmo, valeremo-nos de uma idia simples. Suponha que recebe-
mos m nmeros reais, x
1
, x
2
, . . . , x
m
, e queremos decidir se esses nmeros so todos iguais.
Para fazer isso de forma eciente, consideramos a seguinte propriedade: se a, b e c so trs
nmeros tais que a = b e b = c, ento a = c. Usando esta propriedade, escolhemos qualquer um
dos nmeros que recebemos, digamos x
i
, e comparamos este nmero com todos os nmeros
x
j
, tais que i ,= j e j 1, . . . , m. O que podemos dizer se todas as comparaes resultam em
igualdade? A propriedade acima nos garante que todos os nmeros so iguais. Por outro lado,
se alguma comparao resultar em desigualdade, sabemos que x
1
, x
2
, . . . , x
m
no so todos
iguais. Mais ainda, quando x
1
, x
2
, . . . , x
m
no forem todos iguais, alguma comparao de x
i
com outro nmero resultar em desigualdade. Caso contrrio, todos os x
1
, x
2
, . . . , x
m
seriam
iguais
1
.
Mas, o que a idia acima tema ver com o nosso problema? Bem, se considerarmos que cada
x
i
a soma dos elementos de uma linha, coluna, diagonal principal ou diagonal secundria da
matriz, o problema que queremos resolver idntico ao problema que acabamos de discutir.
Isto sugere que devemos calcular a soma dos elementos de cada linha, coluna, diagonal prin-
cipal e diagonal secundria da matriz, separadamente, e comparar os valores obtidos com a
estratgia acima. Esta a estratgia de soluo que utilizaremos, mas para fazer esta estratgia
funcionar de forma eciente, faremos as comparaes, uma de cada vez, e enquanto obtiver-
mos igualdade. Assim que uma desigualdade for descoberta, no precisamos mais continuar
comparando, pois j sabemos que todos os valores no so iguais. O primeiro passo da nossa
estratgia o clculo da soma dos elementos da primeira linha da matriz. Isto equivale a es-
colher o elemento x
i
, que pode ser a soma dos elementos de qualquer linha, coluna, diagonal
principal ou diagonal secundria da matriz. Arbitrariamente, escolhemos a primeira linha da
matriz. O trecho de cdigo dado a seguir calcula a soma dos elementos da primeira linha da
matriz:
s1 < 0
para j de 1 ate n faca
s1 < s1 + a[1, j]
mpara
Assumimos que a matriz est representada pela varivel a e acumula a soma na varivel s1.
Uma vez que saibamos o valor da soma dos elementos de uma linha, devemos comparar
este valor com o valor da soma dos elementos das demais linhas, colunas, diagonal principal e
diagonal secundria da matriz. Mas, no precisamos realizar todas as comparaes se isto no
for necessrio. Faremos uma comparao por vez. Enquanto as comparaes resultarem em
igualdade, continuamos comparando. Mas, se uma desigualdade ocorrer, paramos de com-
parar.
O trecho de cdigo dado a seguir calcula a soma dos elementos de uma linha da matriz
que no seja a primeira. Em seguida, compara o valor desta soma com s1. Se a comparao
resultar em igualdade, outra linha da matriz considerada para clculo da soma de seus ele-
mentos e comparao com s1. Se a comparao resultar em desigualdade, o clculo da soma
abortado. Para que isto seja possvel, usamos uma varivel lgica de nome igual e um lao do
tipo enquanto:
igual < verdadeiro
1
Conclumos isso por um argumento baseado em contradio!
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.1 MAIS EXEMPLOS 152
i < 2
enquanto igual e (i <= n) faca
s2 < 0
para j de 1 ate n faca
s2 < s2 + a[i, j]
mpara
se s1 = s2 entao
i < i + 1
senao
igual < falso
mse
menquanto
O lao que acabamos de ver implementa o teste das linhas. Se a varivel igual possuir o valor
verdadeiro aps o trmino deste lao, sabemos que a soma dos elementos de qualquer uma das
linhas da matriz igual soma dos elementos de qualquer outra linha da matriz. Mas, ainda
no podemos armar que a matriz a umquadrado mgico. Para isso, devemos realizar o teste
das colunas e o teste das diagonais. Por outro lado, se a varivel igual possuir o valor falso aps
o trmino do teste das linhas, j podemos armar que a matriz a no um quadrado mgico
e no precisamos realizar mais nenhum teste. O trecho de algoritmo a seguir mostra como
realizar o teste das colunas se, e somente se, a varivel igual possuir o valor verdadeiro aps
o trmino do teste das linhas. Este trecho muito parecido com o que implementa o teste das
linhas:
j < 1
enquanto igual e (j <= n) faca
s2 < 0
para i de 1 ate n faca
s2 < s2 + a[i, j]
mpara
se s1 = s2 entao
j < j + 1
senao
igual < falso
mse
menquanto
importante observar que tanto o teste das linhas quanto o teste das colunas ser abortado
assim que uma desigualdade for encontrada, pois isto faz com que a varivel igual receba o
valor falso na estrutura condicional que verica se s1 e s2 possuem o mesmo valor. Aps o
teste das colunas, realizamos o teste da diagonal principal, que mostrado no seguinte trecho
de algoritmo:
se igual entao
s2 < 0
para i de 1 ate n faca
s2 < s2 + a[i, i]
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.2 EXERCCIOS PROPOSTOS 153
mpara
igual < (s1 = s2)
mse
O teste da diagonal secundria quase idntico e realizado logo a seguir:
se igual entao
s2 < 0
para i de 1 ate n faca
s2 < s2 + a[i, n i 1]
mpara
igual < (s1 = s2)
mse
importante observar tambm que um teste, seja ele de coluna ou diagonal, s ser exe-
cutado se a matriz passar no teste anterior. Finalmente, aps todos os testes acima, devemos
vericar o valor de igual para saber se a matriz passou ou no por todos os testes. Note que a
matriz passa por todos os testes se, e somente se, o valor da varivel igual verdadeiro. Ento,
o ltimo trecho do algoritmo que verica se a matriz ou no um quadrado mgico como
segue:
se igual entao
escreva( A matriz e um quadrado magico )
senao
escreva( A matriz nao e um quadrado magico )
mse
O algoritmo completo deixado como exerccio para o aluno. Note apenas que deixamos
de mostrar, apenas, a seo de declarao de variveis e o trecho que realiza a leitura da entrada
de dados, que consiste da ordem n da matriz e dos elementos da matriz. Esta tarefa deve ser
trivial
2
.
24.2 Exerccios propostos
1. Dizemos que uma matriz de inteiros, A, n por n, uma matriz de permutao se em cada
linha e emcada coluna houver n1 elementos nulos e umnico elemento 1. Por exemplo,
_

_
0 1 0 0
0 0 1 0
1 0 0 0
0 0 0 1
_

_
uma matriz de permutao, mas
2
Pelo menos para aqueles que zeram os exerccios da aula anterior.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.2 EXERCCIOS PROPOSTOS 154
_
_
2 1 0
1 2 0
0 0 1
_
_
no de permutao. Escreva umalgitmo para determinar se uma dada matriz quadrada
de inteiros de permutao. A entrada do algoritmo consiste de um inteiro positivo, n,
e dos nmeros inteiros que compem a matriz. A sada do algoritmo a mensagem
de permutao se a matriz de permutao e a mensagem no de permutao caso
contrrio. Assuma que n 1000.
2. Escreva um algoritmo para ler um nmero inteiro positivo, n, e escrever as n primeiras
linhas do tringulo de Pascal
3
.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 4 10 10 5 1
.
.
.
3. Um jogo de palavras cruzadas pode ser representado por uma matriz A
mn
, onde cada
posio da matriz corresponde a um quadrado do jogo, sendo que 0 indica um quadrado
branco e 1 indica um quadrado preto. Escreva um algoritmo para indicar na matriz as
posies que so incio de palavras horizontais e/ou verticais nos quadrados correspon-
dentes (substituindo os zeros), considerando que uma palavra deve ter pelo menos duas
letras. Para isso, numere consecutivamente tais posies. Por 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
_

_
o algoritmo deve exibir como sada os elementos da matriz
_

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

_
.
4. Uma matriz D
88
pode representar a posio atual de um jogo de damas, sendo que
0 indica uma casa vazia, 1 indica uma casa ocupada por uma pea branca e 1 indica
uma casa ocupada por uma pea preta. Supondo que as peas pretas esto se movendo
no sentido crescente das linhas da matriz D, escreva um algoritmo para determinar as
posies das peas pretas que:
3
Descoberto em 1654 pelo matemtico francs Blaise Pascal.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
24.2 EXERCCIOS PROPOSTOS 155
(a) podem tomar peas brancas;
(b) podem mover-se sem tomar peas;
(c) no podem se mover.
A entrada do algoritmo consiste dos elementos da matriz D
88
e a sada consiste dos
ndices das posies que satisfazem (a), seguidos pelos ndices das posies que satis-
fazem (b), seguidos pelos ndices das posies que satisfazem (c).
5. Suponha que os elementos a
ij
de uma matriz inteira A
nn
representemos custos de trans-
porte da cidade i para a cidade j. Ento, dado um itinerrio com k cidades, podemos
calcular o custo total de cada itinerrio. Por exemplo, se
A =
_

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

_
,
ento o custo do itinerrio 1 4 2 4 4 3 2 1 comk = 8 cidades (no necessariamente distintas)
igual a
a
14
+a
42
+a
24
+a
44
+a
43
+a
32
+a
21
= 3 + 1 + 400 + 5 + 2 + 1 + 5 = 417 .
Escreva um algoritmo que leia um inteiro positivo, n, os elementos de uma matriz, A,
de n por n inteiros, um inteiro positivo m, um inteiro positivo k e uma seqncia de
m itinerrios, cada qual com k cidades, e que calcule e escreva o custo total de cada
itinerrio.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 25
MODULARIZAO - PARTE 1
25.1 Exerccios propostos
156
AULA 26
MODULARIZAO - PARTE 2
26.1 Exerccios propostos
157
AULA 27
RECURSIVIDADE
27.1 Exerccios propostos
158
AULA 28
FLUXOGRAMAS
28.1 Exerccios propostos
159
AULA 29
TERCEIRA AVALIAO
Questo 1) [2 pontos]
(a) Declare uma varivel de nome tabver do tipo matriz de lgicos com 5 linhas e 5
colunas.
(b) Escreva um trecho de algoritmo para inicializar a matriz tabver do item (a) tal que a
clula [i, j] da matriz receba o valor verdadeiro se i + j for mltiplo de 3 e o valor
falso caso contrrio.
Em (a), a faixa de valores que dene os ndices das clulas da matriz deve ser escolhida
por voc (isto , voc pode usar qualquer faixa de valores desde que o tamanho da matriz
seja aquele solicitado no enunciado). A resposta para cada item no um algoritmo, mas
sim o trecho de algoritmo que realiza o que o enunciado pede. Ento, faa apenas o que
se pede.
Soluo:
160
161
Questo 2) [2 pontos] Considere a seguinte funo recursiva: Ento, responda:
Algoritmo 29.1: Funo do enunciado da questo 2.
1 funcao misterio( a , n : inteiro ) : inteiro
2 var
3 p , m : inteiro
4 inicio
5 se n = 0 entao
6 p <- 1
7 senao
8 m <- n \ 2
9 p <- misterio( a , m )
10 se ( n % 2 ) = 0 entao
11 p <- p
*
p
12 senao
13 p <- p
*
p
*
a
14 fimse
15 fimse
16 retorne p
17 fimfuncao
(a) Qual o valor retornado pela funo se ela for chamada com a = 2 e n = 5?
(b) De forma geral, o que esta funo calcula? D sua resposta em termos de a e n.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
162
Questo 3) [2 pontos]
Uma matriz A
nn
estritamente diagonalmente dominante se, e somente se,
n

j=1,j=i
[a
ij
[ < [a
ii
[ ,
para todo i = 1, 2, . . . , n. Em outras palavras, uma matriz quadrada estritamente di-
agonalmente dominante se, e somente se, o valor absoluto do elemento da diagonal
maior do que a soma dos valores absolutos dos elementos da mesma linha. Por exemplo,
a matriz
A =
_
_
3 1 1
1 5 2
4 1 7
_
_
estritamente diagonalmente dominante, pois
[a
11
[ = 3 > 2 = 1 + 1 = [a
12
[ + [a
13
[
[a
22
[ = 5 > 3 = 1 + 2 = [a
21
[ + [a
23
[
[a
33
[ = 7 > 5 = 4 + 1 = [a
31
[ + [a
32
[ .
Escreva um algoritmo que leia uma matriz quadrada, A, de ordem n e verique se esta
matriz ou no estritamente diagonalmente dominante. A entrada do algoritmo con-
siste do inteiro positivo n e dos elementos da matriz A, que so nmeros reais. A sada
do algoritmo deve ser a frase estritamente diagonalmente dominante caso A seja es-
tritamente diagonalmente dominante e a frase no estritamente diagonalmente domi-
nante caso contrrio. Voc pode assumir que a matriz A tem, no mximo, 10 linhas e 10
colunas.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
163
Questo 4) [2 pontos]
Escreva uma funo, chamada contadigito, que recebe dois inteiros, n e d, como parmet-
ros de entrada, com 0 < d 9, e retorna o nmero de vezes em que o dgito d ocorre no
nmero n.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
164
Questo 5) [2 pontos]
Um nmero a dito ser permutao de um nmero b se os dgitos de a formam uma
permutao dos dgitos de b. Por exemplo, se a = 5412434 e b = 4321445, ento a
uma permutao de b. Por outro lado, se a = 5412434 e b = 4312455, ento a no uma
permutao de b. Escreva um algoritmo que recebe como entrada dois nmeros inteiros
positivos, a e b, tais que nenhum dos dois possui um dgito igual a zero, e determina se
a uma permutao de b. O seu algoritmo deve escrever, como sada, a palavra sim se
a uma permutao e, a palavra nao, caso contrrio. O seu algoritmo deve, tambm,
utilizar-se da funo que voc desenvolveu para a questo anterior (no escreva o cdigo
da funo novamente).
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 30
CORREO DA TERCEIRA AVALIAO
Questo 1) [2 pontos]
(a) Declare uma varivel de nome letras do tipo vetor de caracteres com 10 elementos.
(b) Declare uma varivel de nome tabver do tipo matriz de lgicos com 5 linhas e 5
colunas.
Tanto em(a) quanto em(b), a faixa de valores que denemos ndices das clulas do vetor
(resp. matriz) devem ser escolhidos por voc (isto , voc pode usar qualquer faixa de
valores desde que o tamanho do vetor e o tamanho da matriz sejam aqueles solicitados
no enunciado).
A resposta para cada item a sentena que declara a varivel solicitada e no um algo-
ritmo.
Soluo:
Algoritmo 30.1: Soluo da questo 1(a).
(a)1 tabver : vetor[ 1..5 , 1..5 ] de logico
Algoritmo 30.2: Soluo da questo 1(b).
(b)1 para i de 1 ate 5 faca
2 para j de 1 ate 5 faca
3 se ( i + j ) % 3 = 0 entao
4 tabver[ i , j ] <- verdadeiro
5 senao
6 tabver[ i , j ] <- falso
7 fimse
8 fimpara
9 fimpara
165
166
Questo 2) [2 pontos] Considere a seguinte funo recursiva: Ento, responda:
Algoritmo 30.3: Funo do enunciado da questo 2.
1 funcao misterio( a , n : inteiro ) : inteiro
2 var
3 p , m : inteiro
4 inicio
5 se n = 0 entao
6 p <- 1
7 senao
8 m <- n \ 2
9 p <- misterio( a , m )
10 se ( n % 2 ) = 0 entao
11 p <- p
*
p
12 senao
13 p <- p
*
p
*
a
14 fimse
15 fimse
16 retorne p
17 fimfuncao
(a) Qual o valor retornado pela funo se ela for chamada com a = 2 e n = 5?
(b) De forma geral, o que esta funo calcula? D sua resposta em termos de a e n.
Soluo:
(a) O valor retornado 32.
(b) A funo calcula a
n
.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
167
Questo 3) [2 pontos]
Uma matriz A
nn
estritamente diagonalmente dominante se, e somente se,
n

j=1,j=i
[a
ij
[ < [a
ii
[ ,
para todo i = 1, 2, . . . , n. Em outras palavras, uma matriz quadrada estritamente di-
agonalmente dominante se, e somente se, o valor absoluto do elemento da diagonal
maior do que a soma dos valores absolutos dos elementos da mesma linha. Por exemplo,
a matriz
A =
_
_
3 1 1
1 5 2
4 1 7
_
_
estritamente diagonalmente dominante, pois
[a
11
[ = 3 > 2 = 1 + 1 = [a
12
[ + [a
13
[
[a
22
[ = 5 > 3 = 1 + 2 = [a
21
[ + [a
23
[
[a
33
[ = 7 > 5 = 4 + 1 = [a
31
[ + [a
32
[ .
Escreva um algoritmo que leia uma matriz quadrada, A, de ordem n e verique se esta
matriz ou no estritamente diagonalmente dominante. A entrada do algoritmo con-
siste do inteiro positivo n e dos elementos da matriz A, que so nmeros reais. A sada
do algoritmo deve ser a frase estritamente diagonalmente dominante caso A seja es-
tritamente diagonalmente dominante e a frase no estritamente diagonalmente domi-
nante caso contrrio. Voc pode assumir que a matriz A tem, no mximo, 10 linhas e 10
colunas.
Soluo:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
168
Algoritmo 30.4: Soluo da questo 3.
1 algoritmo "Questao 3"
2 var
3 i , j , n : inteiro
4 maior : logico
5 s : real
6 a : vetor[ 1..10 , 1..10 ] de inteiro
7 inicio
8 escreva( "Entre com o numero de linhas e colunas da matriz (<= 10): " )
9 repita
10 leia( n )
11 ate ( n > 0 ) e ( n <= 10 )
12 para i de 1 ate n faca
13 para j de 1 ate n faca
14 escreva( "Entre com o elemento [ ", i , "," , j , "]: ")
15 leia( a[ i , j ] )
16 fimpara
17 fimpara
18 i <- 1
19 repita
20 s <- 0
21 para j de 1 ate n faca
22 se j <> i entao
23 s <- s + abs( a[ i , j ] )
24 fimse
25 fimpara
26 se abs( a[ i , i ] ) > s entao
27 maior <- falso
28 senao
29 i <- i + 1
30 fimse
31 ate ( nao maior ) ou ( i > n )
32 se maior entao
33 escreva( "e estritamente diagonalmente dominante" )
34 senao
35 escreva( "nao e estritamente diagonalmente dominante" )
36 fimse
37 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
169
Questo 4) [2 pontos]
Escreva uma funo, chamada contadigito, que recebe dois inteiros, n e d, como parmet-
ros de entrada, com 0 < d 9, e retorna o nmero de vezes em que o dgito d ocorre no
nmero n.
Soluo:
Algoritmo 30.5: Soluo da questo 4.
1 funcao contadigito( n , d : inteiro ) : inteiro
2 var
3 tot : inteiro
4 inicio
5 tot <- 0
6 repita
7 se ( n % 10 ) = d entao
8 tot <- tot + 1
9 fimse
10 n <- n \ 10
11 ate n = 0
12 retorne tot
13 fimfuncao
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
170
Questo 5) [2 pontos]
Um nmero a dito ser permutao de um nmero b se os dgitos de a formam uma
permutao dos dgitos de b. Por exemplo, se a = 5412434 e b = 4321445, ento a
uma permutao de b. Por outro lado, se a = 5412434 e b = 4312455, ento a no uma
permutao de b. Escreva um algoritmo que recebe como entrada dois nmeros inteiros
positivos, a e b, tais que nenhum dos dois possui um dgito igual a zero, e determina se
a uma permutao de b. O seu algoritmo deve escrever, como sada, a palavra sim se
a uma permutao e, a palavra nao, caso contrrio. O seu algoritmo deve, tambm,
utilizar-se da funo que voc desenvolveu para a questo anterior (no escreva o cdigo
da funo novamente).
Soluo:
Algoritmo 30.6: Soluo da questo 5.
1 algoritmo "Questao 5"
2 var
3 i , j , n : inteiro
4 maior : logico
5 s : real
6 a : vetor[ 1..10 , 1..10 ] de inteiro
7 //
8 // O codigo da funcao contadigito deveria vir aqui
9 //
10 inicio
11 escreva( "Entre com o primeiro numero inteiro: " )
12 leia( a )
13 escreva( "Entre com o segundo numero inteiro: " )
14 leia( b )
15 perm <- verdadeiro
16 i <- 1
17 enquanto perm e ( i <= 9 ) faca
18 se contadigito( a , i ) <> contadigito( b , i ) entao
19 perm <- falso
20 senao
21 i <- i + 1
22 fimse
23 fimenquanto
24 se perm entao
25 escreva( "sim" )
26 senao
27 escreva( "nao" )
28 fimse
29 fimalgoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
REFERNCIAS BIBLIOGRFICAS
[1] S. Gandz. The origin of the term "algebra". The American Mathematical Monthly, 33(9):437
440, 1926. 2.1
[2] D. jan Struik. A Concise History of Mathematics. Dover Publications, Inc., fourth edition,
1987. 2.1
[3] C. Koliver, R. V. Dorneles, A. G. Adami, A. L. Martinotto, V. Gava, and L. A. Cassol. Intro-
duo Construo de Algoritmos: Notas de Aula. EDUCS, 2009. 1.2
171