Sei sulla pagina 1di 178

DIM0320 - Algoritmos e Programao de Computadores

(Notas de Aula)

Prof. Marcelo Ferreira Siqueira


mfsiqueira@dimap.ufrn.br
DIMAp - CCET - UFRN

Maro 2011

c 2011 Marcelo Ferreira Siqueira


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

S UMRIO

Informaes Gerais

1.1

Professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduo

2.1

Algoritmos e problemas computacionais . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Representao de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Resoluo de Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4

Computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.5

Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

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

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

Expresses Aritmticas Parte 1

24

5.1

Operadores aritmticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

5.2

Precedncia de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

5.3

Alterao de prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

5.4

A instruo de atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

5.5

Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

5.6

Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

Prova de Avaliao de Conhecimento Prvio

31

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

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

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

58

12.3 Aninhamento de comandos condicionais . . . . . . . . . . . . . . . . . . . . . . .

60

12.4 Comando se-entao-fimse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

12.5 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63

12.6 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

13 Expresses Lgicas

66

13.1 Lgica proposicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ii

66

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

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 Definio e manipulao de variveis . . . . . . . . . . . . . . . . . . . . . . . . . 110


19.3 O clculo do desvio padro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
19.4 O comando para-faca-fimpara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Definio 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

A ULA 1

I NFORMAES G ERAIS

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 P ROFESSOR

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 P 1, P 2 e P 3. As notas das
unidades I, II e III sero as notas obtidas nas provas P 1, P 2 e P 3, respectivamente. As datas
das provas P 1, P 2 e P 3, assim como a data do exame final, 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 final: 5 de julho de 2011.
Todas as provas, inclusive o exame final, 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 Bibliografia
Nesta disciplina, no adotaremos nenhum livro-texto em particular, pois nenhum deles
suficientemente 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

1.2 B IBLIOGRAFIA

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 2

I NTRODUO

2.1 Algoritmos e problemas computacionais


A palavra algoritmo tem origem no sobrenome do matemtico, astrnomo, gelogo, gegrafo 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 notao posicional decimal para o Mundo Ocidental. Ele tambm apresentou a primeira soluo
sistemtica das equaes lineares e quadrticas e considerado um dos fundadores da lgebra [1]. O radical de algarismo e algoritmo vem de Algoritmi, a forma latina do sobrenome
al-Khwarizmi.
H tantas definies diferentes para o termo algoritmo quanto autores escrevendo sobre
elas. No entanto, todas essas definies concordam que um algoritmo uma seqncia finita
de instrues, bem definidas e no-ambguas, para resolver um dado problema. Cada instruo
de um algoritmo deve ser executada por um perodo de tempo finito. Em geral, a definio 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 computador.
Para exemplificar 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 = l2 .
(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 A obtido 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.

2.1 A LGORITMOS E PROBLEMAS COMPUTACIONAIS

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
definio de algoritmo. A seqncia finita (h apenas trs instrues). Cada uma delas est
bem definida, no deixa nenhuma dvida sobre o que deve ser feito e pode ser realizada em
um perodo finito de tempo. H ainda, no nosso exemplo, dois componentes fundamentais dos
algoritmos computacionais: entrada e sada. A entrada 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 computacionais: 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.

PSfrag replacements
Algoritmo
Entrada
Sada

Entrada

Algoritmo

Saida

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 comprimento 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, fielmente, as instrues que lhe
damos.
Quando comeamos a construir algoritmos, umas das habilidades mais importantes
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.2 R EPRESENTAO DE ALGORITMOS

aquela de identificar 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 preocupar 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 algoritmos extremamente pequeno quando comparado ao das linguagens coloquiais, mas rico
o suficiente para resolvermos uma gama enorme de problemas computacionais. Aqui, descreveremos algoritmos com uma linguagem conhecida como Portugol, que utilizada pela
ferramenta V ISU A LG , que ser utilizada na disciplina como forma de apoio ao aprendizado
de algoritmos.
Por exemplo, usando a linguagem Portugol da V ISU A LG, 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
2
3
4
5
6
7
8

algoritmo "Area do quadrado


var lado, area : real
inicio
escreva ( "Entre com o comprimento dos lados do quadrado: " )
leia ( lado )
area <- lado * lado
escreva ( "A area do quadrado e: " , area )
fimalgoritmo

H uma srie de detalhes sintticos da linguagem Portugol da ferramenta V ISU A LG que


devem ser dominados para que voc possa escrever seus algoritmos usando esta linguagem.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.3 R ESOLUO DE P ROBLEMAS

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 fluxogramas, que so diagramas com figuras que identificam as vrias instrues do algoritmo. Nesta disciplina, tambm utilizaremos fluxogramas, embora a principal forma de descrio seja mesmo a linguagem
Portugol.

inicio

lado

area < lado * lado

area

fim
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 computacional. Portanto, construir um algoritmo para um dado problema significa, antes de mais nada,
determinar uma forma para solucionar um problema e descrev-la como uma seqncia finita
de instrues em alguma linguagem. A tarefa de encontrar a soluo de um problema qualquer , muitas vezes, realizada de forma emprica e um tanto quanto desorganizada; ocorrem
vrios procedimentos mentais, dos quais raramente tomamos conhecimento. A organizao do
processo de resoluo de problemas extremamente desejvel, pois somente assim podemos
verificar onde o processo no eficiente. Identificadas as deficincias deste processo, procuramos 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.4 C OMPUTADORES

conhecimento e
destreza.
Conhecimento adquirido pelo estudo. Em termos de resoluo de problemas, est relacionado 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 problemas.

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 instrues 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. A informao
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 resultado 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 conhecido 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,
produzem a soluo do problema. Entretanto, antes de inserir as aes e os dados no computador, devemos reescrev-las em uma linguagem apropriada para descrever algoritmos computacionais, 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 programa1 . O Algoritmo 2.1 escrito em linguagem C
mostrado no Programa 2.1. Compare os dois!
Cada modelo de computador possui uma linguagem de 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 entende. 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 programao independentes de mquina foram criadas. Se voc aprende uma linguagem independente 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.4 C OMPUTADORES

compilador deve estar presente no computador. Um compilador para uma determinada linguagem 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 precisamos 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 compilador especfico 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
2
3
4
5
6
7
8
9
10

#include <stdio.h>
void main()
{
double lado, area ;
printf( "Entre com o comprimento dos lados do quadrado:"
scanf( "%f\n" , &lado ) ;
area = lado * lado ;
printf( "A area do quadrado e: %f\n" , area ) ;
return ;
}

) ;

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 computador 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 eletrnicos 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 denominado 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, decodificar 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 pacotes 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.5 E XERCCIOS PROPOSTOS

10

2.5 Exerccios propostos


1. O primeiro passo no desenvolvimento de um algoritmo para um dado problema computacional 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 um dos 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 financeiras. 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 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.
(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 em saber 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 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.
(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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

2.5 E XERCCIOS PROPOSTOS

11

2. Se voc puder, escreva um algoritmo (ou seja, uma seqncia de instrues) para resolver
cada um dos problemas acima. Voc no precisa escrever as instrues na linguagem
do V ISU A LG, mas sim de forma livre, como na primeira seqncia de instrues que foi
dada para o problema da rea do quadrado.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 3

T IPOS DE D ADOS 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 define o conjunto de valores ao qual o dado pertence, bem como o conjunto de todas as operaes que podem atuar sobre qualquer valor daquele conjunto de valores.
Por exemplo, como veremos mais adiante, a linguagem que utilizaremos para descrever nossos 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 V ISU A LG.
Na nossa descrio, o nome de um tipo escrito no formato tipo, assim como as demais palavras
reservadas da linguagem Portugol. Alm disso, ao definirmos 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, multiplicao, 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 linguagem Portugol, os nmeros reais so caracterizados por possurem uma
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 escritos, 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 variveis so representados por variveis, enquanto dados constantes so representados por constantes1 .
Uma varivel pode ser imaginada como um caixa 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 computacional de verdade, a caixa correspondente a uma varivel uma posio da memria do computador.
Uma varivel possui nome, tipo e contedo. O nome de uma varivel deve ser nico,
isto , identificar, de forma nica, a varivel no algoritmo. O tipo de uma varivel define 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 em uma mesma linha. Por exemplo,
var lado, area : real
1

No discutiremos constantes neste momento.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

3.2 VARIVEIS

14

Note que nenhum contedo (isto , valor) foi associado varivel durante a sua declarao.
Esta associao denominada definio 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 instruo 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 execuo da instruo de leitura do comprimento dos lados de um quadrado 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.
O que vemos no lado direito do operador de atribuio, lado * lado, um exemplo 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 um algoritmo, o valor armazenado em uma 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

3.3 E XEMPLOS

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 variveis:
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

3.4 N OMES 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 significado especial para a
linguagem Portugol. Em geral, uma palavra reservada identifica uma instruo. Neste texto,
tais palavras aparecem sublinhas. O conjunto de palavras reservadas do Portugol mostrado
na Tabela 3.1.
aleatorio
abs
algoritmo
arcos
arcsen
arctan
arquivo
asc
ate
caractere
caso
compr
copia
cos
cotan
cronometro
debug
declare

e
eco
enquanto
entao
escolha
escreva
exp
faca
falso
fimalgoritmo
fimenquanto
fimescolha
fimfuncao
fimpara
fimprocedimento
fimrepita
fimse
funcao

grauprad
inicio
int
interrompa
leia
literal
log
logico
logn
maiusc
mensagem
minusc
nao
numerico
numpcarac
ou
outrocaso
para

passo
pausa
pi
pos
procedimento
quad
radpgrau
raizq
rand
randi
repita
se
sen
senao
timer
tan
var
verdadeiro
xou

Tabela 3.1: Palavras reservadas da linguagem Portugol.


Por exemplo,
_12234,

fruta

x123

fru?ta

so nomes vlidos para variveis, mas


maria bonita,

pi,

1xed

no so. O nome maria bonita contm um espao em branco. O nome pi uma palavra reservada. 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

3.5 E XERCCIOS R ESOLVIDOS

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

3.6 E XERCCIOS 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. Identifique o tipo de dados dos seguintes valores:
(a) "9 de agosto de 1968"
(b) 1.3
(c) falso
(d) 31
(e) "?"

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 4

E NTRADA E S ADA

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 tambm 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 comprimento dos lados de um quadrado. A mensagem Entre com o comprimento dos lados do
19

4.2 A

20

ESTRUTURA DE UM ALGORITMO

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 especificamente, 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 identifica 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 contm as instrues que, de fato, fazem o trabalho descrito
pelo algoritmo.
O corpo do algoritmo se inicia com a palavra
inicio
A linha final, que obrigatoriamente a ltima linha do algoritmo, contm a palavra
fimalgoritmo
que especifica 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 caractersticas 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 com relao
linha de cabealho e a linha final. 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

4.2 A

21

ESTRUTURA DE UM ALGORITMO

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 comentrio 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
3
4
5
6
7
8
9
10
11
12

//
// Este algoritmo exemplifica as instrucoes de entrada e saida
//
algoritmo "Leitura e escrita"
var
//
// Secao de declaracao de variaveis
//
num : inteiro
inicio
// Escreve uma mensagem para indicar o que deve ser lido pelo algoritmo
escreva ( "Entre com um numero inteiro: " )

13
14
15

// Realiza a leitura de um numero inteiro e o associa a uma variavel


leia ( num )

16
17
18
19

// Escreve o valor do numero lido


escreva ( "O numero que voce forneceu foi: " ,
fimalgoritmo

num )

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 mensagem 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

4.3 E XERCCIOS 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
3
4
5
6
7
8
9
10
11
12
13

//
// Este algoritmo le e escreve um numero e uma palavra
//
algoritmo "Leitura e escrita de numero e palavra"
var
//
// Secao de declaracao de variaveis
//
num : inteiro
pal : caractere
inicio
// Escreve uma mensagem para solicitar um numero
escreva ( "Entre com um numero inteiro: " )

14

// Realiza a leitura de um numero inteiro e o atribui a uma variavel


leia ( num )

15
16
17

// Escreve uma mensagem para solicitar uma palavra


escreva ( "Entre com uma palavra: " )

18
19
20

// Realiza a leitura de uma palavra e a atribui a uma variavel


leia ( pal )

21
22
23
24
25
26

// Escreve numero e palavra lidos


escreva ( "O numero e a palavra fornecidos foram: " ,
fimalgoritmo

num ,

" e ",

pal )

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

4.4 E XERCCIOS 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 V ISU A LG para executar o algoritmo que voc escreveu para o problema
anterior.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 5

E XPRESSES A RITMTICAS PARTE 1

5.1 Operadores aritmticos


Os operadores aritmticos definem as operaes aritmticas que podem ser 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 definidas sobre os inteiros so
+ (adio)
(subtrao ou menos unrio)
(multiplicao)
\ (diviso inteira)
% (resto aplicado apenas aos valores inteiros).
Com os operadores acima, podemos escrever expresses aritmticas que envolvem constantes
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 definio, 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 definir 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 P RECEDNCIA 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 definir regras de precedncia de operadores, que so regras para definir a
ordem em que os operadores aritmticos que vimos so aplicados em uma expresso aritmtica
qualquer.
Na linguagem Portugol, os operadores possuem prioridades associadas com eles. A operao associada a um operador com prioridade p sempre executada antes da operao associada a um operador com prioridade q sempre que p > q. Quando p = q, a operao correspondente 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
menos unrio
multiplicao, diviso inteira e resto
adio e subtrao

Smbolo

, \ e %
+,

Prioridade
mais alta

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 envolvendo os inteiros lidos.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

5.3 A LTERAO 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 sejam 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
4

inicio
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 )

escreval( "O resultado da expressao -5 - 3 - 6 * 3 e: ",

-5 - 3 - 6 * 3 )

7
8
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 serem descobertos. Com isso em mente, a expresso acima pode ser imaginada como tendo
a forma
op1 op2 ,
onde op1 e op2 so as expresses (a b) e (c % 2). Ento, o que temos uma simples multiplicao de dois valores, op1 e op2 . No entanto, para que esta multiplicao seja realizada,
precisamos dos valores op1 e op2 . Para tal, assumimos que o valor, op1 , esquerda do operador
de multiplicao, , ser obtido antes do valor, op2 , direita dele. Para calcular op1 , 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 op1 tenha sido descoberto,
avaliamos
c%2,
que a expresso correspondente ao valor op2 . Neste momento, descobrimos que a operao
de resto de diviso, c % 2, a segunda operao aritmtica realizada. Neste momento, dispomos
dos valores op1 e op2 e, portanto, podemos realizar a multiplicao op1 op2 , que passa a ser
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

5.3 A LTERAO 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
2
3
4
5
6

algoritmo "Expressoes aritmeticas envolvendo variaveis e constantes"


var
a , b , c : inteiro
inicio
escreva( "Entre com o valor da variavel a: " )
leia( a )

7
8
9

escreva( "Entre com o valor da variavel b: " )


leia( b )

10
11
12

escreva( "Entre com o valor da variavel c: " )


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 )

escreval( "O resultado da expressao -a - b - c * 3 e: ",

-a - b - c * 3 )

17
18
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 operadores 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:
op1 3 op2 .
Agora, vemos que se os valores entre parnteses fossem conhecidos, haveria apenas duas operaes a serem realizadas: uma multiplicao e uma adio. A multiplio possui prioridade
sobre a adio e ela precisa do valor op1 para ser realizada. Ento, considere a expresso correspondente a op1 :
(2 + 3) (1 + 2) .
Esta expresso contm outras expresses dentro de parnteses e, assim como antes, ela pode
ser vista como
op3 op4 .
onde op3 e op4 correspondem s expresses 2 + 3 e 1 + 2, respectivamente. Para realizarmos
a operao de subtrao acima, precisamos dos valores op3 e op4 . Por estar esquerda do
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

5.4 A

28

INSTRUO DE ATRIBUIO

operador, o valor op3 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 op3 op4 :
(2 + 3) (1 + 2) .
Depois que a subtrao acima for realizada, o valor op1 se torna conhecido e, consequentemente, a multiplicao op1 3 pode ser realizada, tornando-se a quarta operao realizada. O
resultado desta operao o primeiro operando disponvel da subtrao em op1 3 op2 .
Mas, esta subtrao no pode ser efetuada antes do valor op2 ser conhecido, ou seja, antes da
expresso
3 + (3 2)
ser avaliada. Assim como fizemos antes, podemos imaginar a expresso acima tendo a forma
3 + op5 ,
onde op5 o valor da expresso, 3 2, entre parnteses. A adio na expresso acima precisa
do valor op5 para ser realizada. Isto significa que a subtrao 3 2 a quinta operao realizada. Depois dela, a adio 3 + op5 realizada, tornando-se a sexta operao realizada. Logo
em seguida, o valor op2 se torna conhecido, o que possibilita a realizao da stima e ltima
operao, que a subtrao em op1 3 op2 . 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 realizada da seguinte forma:
resultado <- 5 % 2
Para um exemplo mais concreto do uso do operador de atribuio, considere o Algoritmo 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

5.5 E XERCCIOS RESOLVIDOS

29

5.5 Exerccios resolvidos


1. Considere a expresso polinomial
5x3 + 7x2 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 linguagem Portugol:
235
soluo:
2 3 5 = 2 15 = 13 .
Algoritmo 5.3: Algoritmo para calcular o quadrado da soma de dois inteiros.
1
2
3
4
5
6

algoritmo "Quadrado da soma de 2 inteiros"


var
a , b , quadrado : inteiro
inicio
escreva( "Entre com o primeiro inteiro: " )
leia( a )

7
8
9

escreva( "Entre com o segundo inteiro: " )


leia( b )

10
11

quadrado <- ( a + b ) * ( a + b )

12
13
14

escreva ( "O quadrado da soma dos inteiros lidos e: " , quadrado


fimalgoritmo

5.6 Exerccios propostos


1. Escreva a expresso abaixo usando a linguagem Portugol:
x0 + v t
2. Avalie a seguinte expresso aritmtica de acordo com as regras de precedncia da linguagem Portugol:
(2 3) 5

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

5.6 E XERCCIOS 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? Justifique 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? Justifique sua resposta.
5. Escreva um algoritmo, usando a linguagem Portugol, para ler dois nmeros inteiros, calcular o cubo da soma desses dois nmeros e escrever o resultado calculado como sada.
6. Implemente o algoritmo anterior usando a ferramenta V ISU A LG.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 6

P ROVA DE AVALIAO DE
C ONHECIMENTO P RVIO

Essa aula ser dedicada aplicao de uma prova de conhecimento prvio. A prova tem por
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 fizer ou apresentar um desempenho
baixo.

31

A ULA 7

E XPRESSES A RITMTICAS PARTE 2

7.1 Operadores aritmticos sobre os reais


Como vimos na aula anterior, os operadores aritmticos definem as operaes aritmticas
que podem ser realizadas sobre os nmeros inteiros e reais. J estudamos os operadores aritmticos 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 definido apenas para os reais. Por sua vez, o operador de
resto, %, est definido 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
menos unrio
multiplicao e diviso
adio e subtrao

Smbolo

, /
+,

Prioridade
mais alta

mais baixa

Tabela 7.1: Operadores aritmticos sobre os reais e suas prioridades.


Por exemplo, considere a expresso
3a + 2b
,
a1
c
a+b
1+
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 R EGRAS SEMNTICAS

33

importante notar que todos os parnteses so necessrios para que a expresso, na linguagem 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
2
3
4
5
6

algoritmo "Expressoes aritmeticas com variaveis e constantes reais"


var
a , b , c , res : real
inicio
escreva( "Entre com o valor da variavel a: " )
leia( a )

7
8
9

escreva( "Entre com o valor da variavel b: " )


leia( b )

10
11
12

escreva( "Entre com o valor da variavel c: " )


leia( c )

13
14
15
16

res <- ( 3.0 * a + 2.0 * b ) /


( c - ( a - 1.0 ) / ( 1.0 + ( a + b )
( 2.0 * c ) ) )

17
18
19

escreva ( "O resultado da expressao e: ", res )


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 entanto, possvel, na linguagem Portugol, escrevermos expresses aritmticas que envolvam
constantes e variveis dos tipos inteiro e real. Para que tais expresses faam sentido, definimos 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

7.3 U M 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 convertidos 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 \.
Um outro 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 operao 5 % 2 realizada primeiro, produzindo o inteiro 1 como resultado. Em seguida, a operao
1 / 2 realizada. Isto significa 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 imaginar que o nmero 2.5 seria convertido em um nmero inteiro (por arredondamento ou truncamento), de modo que a operao pudesse ser efetuada. Na linguagem Portugol, nenhum valor real
pode ser automaticamente convertido em um valor inteiro. Isto significa que a segunda expresso
aritmtica acima invlida na linguagem Portugol. A ferramenta V ISU A LG acusar um erro se
tentarmos utilizar esta expresso em um algoritmo (verifique!). 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

7.4 E XERCCIOS RESOLVIDOS

35

frmula

4
r3 .
(7.1)
3
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 ,
V =

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
significante.
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 em Eq. (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
2
3
4
5
6

algoritmo "Volume da esfera"


var
raio, volume : real
inicio
escreva( "Entre com o valor do raio da esfera: " )
leia( raio )

7
8

volume <- ( 4 / 3 ) * pi * raio * raio * raio

9
10
11

escreva ( "O volume da esfera de raio " , raio , " e " , volume )
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

7.5 E XERCCIOS 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 retngulo, determine a rea do retngulo e escreva a rea como sada.
soluo:
Algoritmo 7.3: Algoritmo para calcular a rea de um retngulo.
1
2
3
4
5
6

algoritmo "Area de um retangulo"


var
base, altura, area : real
inicio
escreva( "Entre com o comprimento da base do retangulo: " )
leia( base )

7
8
9

escreva( "Entre com o valor da altura do retangulo: " )


leia( altura )

10
11

area <- base * altura

12
13
14

escreva ( "A area do retangulo e " , area )


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
5
.
+
1
b
2+
1+a
Assuma que a e b so variveis do tipo real.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

7.5 E XERCCIOS 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 V ISU A LG.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 8

E XPRESSES R ELACIONAIS

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 V ISU A LG, 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 R ELAES E EXPRESSES ARITMTICAS

39

8.2 Relaes e expresses aritmticas


As relaes podem envolver expresses aritmticas. Por exemplo,
a > (b + c)

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 aritmtica
b + c.
Na segunda delas, estamos comparando o valor de c com o valor resultante da expresso aritmtica
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 precisamos sequer usar os parnteses que utilizamos nos exemplos acima. Isto , basta-nos escrever
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)

(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 com o 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, em seguida, comparado com o valor real da varivel
b.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

8.3 R ELAES ENVOLVENDO TIPOS NO INTEIROS

40

Suponha, agora, que a e b so duas variveis do tipo caractere. Ento, as expresses relacionais
a=b
e
a <> b
equivalem a perguntar se os caracteres representados por a e b so iguais ou distintos, respectivamente. 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 significa dizer que uma palavra menor do que outra? Para responder esta pergunta, vamos primeiro considerar o caso em que os valores de a e b so um caractere cada. Depois, trataremos do caso em que esses valores so palavras com mais de um caractere. Quando
os valores de a e b so um caractere cada, usamos o ndice do caractere no alfabeto da linguagem
Portugol da ferramenta V ISU A LG, denominado ASCII1 , para decidir o resultado da comparao.
Cada caractere que pode ser usado na linguagem Portugol possui um nmero nico no alfabeto 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 (definidas 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 possuem os ndices 65 a 90, respectivamente, as letras minsculas de a a z possuem os 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
resultam nos 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 lexicogrfica para determinar o resultado das comparaes.
Para tal, suponha que a palavra representada por a possua n caracteres, a1 , a2 , . . . , an , nesta
ordem, e a palavra representada por b possua m caracteres, b1 , b2 , . . . , bm , nesta ordem, com
m, n Z e m, n 1. Seja k = min{n, m}. Ento, encontramos o menor valor de i em
{1, 2, . . . , k} tal que ai 6= bi . Em seguida, ns determinamos se ai < bi , ai > bi , ai bi ou
ai bi .
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 prefixo abaca. O
prximo passo comparar a6 com b6 . Como podemos ver, a6 igual a t e b6 igual a x.
Ento, a6 < b6 e a6 b6 . 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

a >= b

possuem valor lgico falso.


1

A abreviao de American Standard Code for Information Interchange.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

8.4 E XERCCIOS RESOLVIDOS

41

possvel que ai = bi para todos os valores de i em {1, 2, . . . , k}. Quando isto acontece,
temos que a palavra em a um prefixo da palavra em b ou a palavra em b um prefixo da
palavra em a. Por exemplo, se o valor de a bola e o de b bolada, ento a palavra em
a um prefixo da palavra em b e, por isso, ai = bi , 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
e

a>b

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 ai = bi para todo i = {1, 2, . . . , k}, onde k = min{n, 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

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 operadores 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

8.5 E XERCCIOS 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 V ISU A LG,
o resto no-negativo sempre que o dividendo for no-negativo. Isto no est de acordo
com a definio 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+3k,
para todo k Z+ .

8.5 Exerccios propostos


1. Suponha que a, b, nome e profissao 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

profissao = medico

Qual o valor dessas expresses quando a, b, nome e profissao assumem os 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:
x2 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
em Portugol que tenha valor verdadeiro se, e somente se, o valor de x um nmero 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 9

E XERCCIOS PARA A P RIMEIRA


AVALIAO

Esta aula ser dedicada ao desenvolvimento de algoritmos relacionados ao contedo da


primeira avaliao. importante que todos vocs tentem resolver 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 V ISU A LG 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 escrever 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 financeiras. 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 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 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 um carro que faz, em mdia, 12 km com um litro de gasolina. Ele realizou uma viagem com seu carro e est interessado em saber 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.
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 10

P RIMEIRA AVALIAO

Questo 1) [2 pontos]
Escreva as expresses abaixo usando a sintaxe da linguagem Portugol da ferramenta V I SU ALG:
(a)

(b)

a2
b2
+
(b c)2 (c a)2
x2
xy
+ 32
2x
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 linguagem Portugol da ferramenta V ISU ALG 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

47

Questo 3) [1 ponto]
Classifique cada um dos valores abaixo de acordo com o seu tipo (inteiro, real, lgico ou
caractere) na linguagem Portugol da ferramenta V ISU ALG; isto , indique um desses 4
tipos:
(a) "-3.5"
(b) "pi"
(c) "falso"
(d) 5.0
(e) 59
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 V ISU ALG e escreva o porqu de poder ou
no:
(a) _
(b) A&a
(c) "nome"
(d) a-b
(e) var
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 41 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 11

C ORREO DA P RIMEIRA AVALIAO

Questo 1) [2 pontos]
Escreva as expresses abaixo usando a sintaxe da linguagem Portugol da ferramenta V I SU ALG:
(a)

a2
b2
+
(b c)2 (c a)2

(b)

x2
xy
+ 32
2x
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 linguagem Portugol da ferramenta V ISU ALG 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

53

Questo 3) [1 ponto]
Classifique cada um dos valores abaixo de acordo com o seu tipo (inteiro, real, lgico ou
caractere) na linguagem Portugol da ferramenta V ISU ALG; 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 V ISU ALG 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 41 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
2
3
4
5
6
7
8
9

algoritmo "questao 5"


var
l , distot : real
inicio
escreva( "Entre o comprimento, em metros, da estrada ligando A a B:" )
leia( l )
distot = 0.625 * l ;
escreva( "A distancia total, em Km, e:" , distot )
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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
2
3
4
5
6
7
8
9
10
11

algoritmo "questao 6"


var
n , d, c, soma : inteiro
inicio
escreva( "Entre um numero inteiro de 1000 a 9999:" )
leia( n )
d <- n % 100 \ 10
c <- n % 1000 \100
soma <- d + c
escreva( "A soma dos algarismos de dezena e centena e:" , soma )
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 12

E STRUTURAS C ONDICIONAIS - PARTE 1

12.1

Motivao

At o presente momento, todos os algoritmos que vimos podem ser vistos como uma seqncia de comandos que so executados na ordem em que definida 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 justifica
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
2
3
4
5
6
7

algoritmo "Pessoa mais alta - incompleto"


var
nome1, nome2 : caractere
alt1 , alt2 : real
inicio
escreva( "Entre com o nome da primeira pessoa: " )
leia( nome1 )

8
9
10

escreva( "Entre com a altura da primeira pessoa: " )


leia( alt1 )

11
12
13

escreva( "Entre com o nome da segunda pessoa: " )


leia( nome2 )

14
15
16

escreva( "Entre com a altura da segunda pessoa: " )


leia( alt2 )

17
18
19

// Escreva o nome da pessoa de maior altura


fimalgoritmo

Tudo que precisamos fazer para concluir o Algoritmo 12.1 escrever sua sada. De fato,
57

12.2 C OMANDO 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 determinar 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 nenhum comando que nos permita escrever um algoritmo que execute
um comando em detrimento da execuo de outro. Sem tal comando, no temos como concluir
o algoritmo.

12.2

Comando se-entao-senao-fimse

A linguagem Portugol possui o seguinte comando condicional:


se expresso lgica entao
comando1
comando2
..
.
comandon
senao
comando1
comando2
..
.
comandom
fimse
O comando se-entao-senao-fimse 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 fimse. As sees so mutuamente exclusivas, o que significa 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 em o 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 fluxo de
execuo do algoritmo segue para o primeiro comando aps o se-ento-seno-fimse assim que
o ltimo comando da seo for executado. Isto , o comando condicional bifurca o fluxo de
execuo, mas aps o comando condicional ser executado, o programa segue com seu fluxo
seqencial nico que continua com o primeiro comando encontrado aps o comando condicional.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.2 C OMANDO SE - ENTAO - SENAO - FIMSE

59

O comando se-ento-seno-fimse 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-fimse que gera a sada
esperada.
Algoritmo 12.2: Algoritmo para determinar a mais alta de duas pessoas.
1
2
3
4
5
6
7

algoritmo "Pessoa mais alta - primeira versao"


var
nome1, nome2 : caractere
alt1 , alt2 : real
inicio
escreva( "Entre com o nome da primeira pessoa: " )
leia( nome1 )

8
9
10

escreva( "Entre com a altura da primeira pessoa: " )


leia( alt1 )

11
12
13

escreva( "Entre com o nome da segunda pessoa: " )


leia( nome2 )

14
15
16

escreva( "Entre com a altura da segunda pessoa: " )


leia( alt2 )

17
18
19
20
21
22
23

se alt1 > alt2 entao


escreva( nome1 , " e mais alta do que " , nome2 )
senao
escreva( nome2 , " e mais alta do que " , nome1 )
fimse
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.3 A NINHAMENTO DE COMANDOS CONDICIONAIS

12.3

60

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 comando condicional. Para exemplificar 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-fimse 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 fluxo de execuo do algoritmo atinge o bloco senao do comando se-entaosenao-fimse 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-fimse mais externo determina qual desses dois casos verdadeiro e
escreve a sada esperada. O Algoritmo 12.3 contm o cdigo final para determinar a pessoa
mais alta.
Um outro problema que requer aninhamento de comandos condicionais o seguinte: escreva 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-fimse no resolve o problema, pois tal coDIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.3 A NINHAMENTO DE COMANDOS CONDICIONAIS

61

mando s pode realizar uma classificao binria, ou seja, em um de dois grupos. Por exemplo, podemos usar o comando condicional para saber se a mdia maior ou igual a 7. Isto
suficiente 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
2
3
4
5
6
7

algoritmo "Pessoa mais alta - segunda versao"


var
nome1, nome2 : caractere
alt1 , alt2 : real
inicio
escreva( "Entre com o nome da primeira pessoa: " )
leia( nome1 )

8
9
10

escreva( "Entre com a altura da primeira pessoa: " )


leia( alt1 )

11
12
13

escreva( "Entre com o nome da segunda pessoa: " )


leia( nome2 )

14
15
16

escreva( "Entre com a altura da segunda pessoa: " )


leia( alt2 )

17
18
19
20
21
22
23
24
25
26
27

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
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-fimse dentro da seo de senao do seento-seno-fimse que j temos. Isto , se o fluxo 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.4 C OMANDO SE - ENTAO - FIMSE

62

Algoritmo 12.4: Algoritmo para determinar situao escolar de aluno.


1
2
3
4
5
6

algoritmo "Situacao escolar de aluno"


var
n1, n2, n3, media : real
inicio
escreva( "Entre com a primeira nota: " )
leia( n1 )

escreva( "Entre com a segunda nota: " )


leia( n2 )

8
9
10

escreva( "Entre com a terceira nota: " )


leia( n3 )

11
12
13

media <- ( n1 + n2 + n3 ) / 3

14
15
16
17
18
19
20
21
22
23
24
25

se media >= 7 entao


escreva( "aprovado" )
senao
se media > 3 entao
escreva( "em exame" )
senao
escreva( "reprovado" )
fimse
fimse
fimalgoritmo

12.4

Comando se-entao-fimse

O comando se-ento-seno-fimse possui uma forma simplificada: o comando se-entofimse:


se expresso lgica ento
comando1
comando2
..
.
comandon
fimse
No comando acima, h apenas uma seo de comandos entre o se e o fimse. 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 fluxo de execuo
segue com o comando imediatamente aps a palavra fimse. Em outras palavras, ao invs de
termos dos blocos de comandos mutuamente exclusivos, temos um bloco de comandos que

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.5 E XERCCIOS RESOLVIDOS

63

pode ou no ser executado. O que ocorrer depende unicamente do resultado da expresso


lgica.
Por exemplo, considere o Algoritmo 12.5 que calcula o salrio lquido mensal de um funcionrio. O algoritmo recebe como entrada o valor do salrio bruto mensal do funcionrio e o
nmero de filhos dele. O salrio lquido calculado como sendo 70% do salrio bruto. Mas, se
o funcionrio possuir mais de dois filhos, 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
2
3
4
5
6
7

algoritmo "Salario liquido mensal de funcionario"


var
salbruto, salario : real
filhos : inteiro
inicio
escreva( "Entre com o salario bruto mensal: ")
leia ( salbruto )

escreva( "Entre com o numero de filhos: " )


leia ( filhos )

9
10
11

salario <- 0.7 * salbruto


se filhos > 2 entao
salario <- salario + 300
fimse

12
13
14
15
16
17
18

escreva ( "O salario liquido e: ", salario )


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 contrrio.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.5 E XERCCIOS RESOLVIDOS

64

Soluo:
Algoritmo 12.6: Soma dgitos de centena e milhar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

algoritmo "Soma de digitos de centena e milhar"


var
n, m, c : inteiro
inicio
escreva ( "Entre com um numero inteiro positivo:" )
leia ( n )
m <- n \ 1000
c <- n \ 100 % 10
se ( c + m ) % 2 = 0 entao
escreva ( "sim" )
senao
escreva ( "nao" )
fimse
fimalgoritmo

Algoritmo 12.7: Algoritmo Misterioso. Qual a sada dele?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

algoritmo "Misterioso"
var
n : inteiro
inicio
escreva ( "Entre com um numero inteiro positivo:" )
leia ( n )
se ( n % 2 ) = 1 entao
se ( n % 7 ) = 0 entao
escreva ( "Passei pelo ponto 1" )
senao
escreva ( "Passei pelo ponto 4" )
fimse
senao
se ( n % 4 ) = 0 entao
escreva ( "Passei pelo ponto 2" )
senao
escreva ( "Passei pelo ponto 3" )
fimse
fimse
fimse
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

12.6 E XERCCIOS PROPOSTOS

12.6

65

Exerccios propostos

1. Escreva um algoritmo 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 compreendido no intervalo [20, 90] e no caso contrrio.
3. Escreva um algoritmo 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 13

E XPRESSES L GICAS

13.1

Lgica proposicional

Lgica o estudo do raciocnio1 . Em particular, utilizamos lgica quando desejamos determinar 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 um formalismo 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
um valor verdadeiro ou falso, embora nem sempre 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 definir p como sendo a proposio 1 + 1 = 3.
1

Conjunto de argumentos ou idias pensadas por algum.

66

13.2 P ROPOSIES COMPOSTAS

13.2

67

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 portuguesa, 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 linguagem que 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 caractersticas 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
pq :

1+1=3

e uma dcada equivale a 10 anos

e a disjuno de p e q
pq :

1+1=3

ou uma dcada equivale a 10 anos.

Os valores verdades das proposies, tais como conjunes e disjunes, podem ser descritos atravs de tabelas verdades. A tabela verdade de uma proposio p definida a partir das
proposies p1 , . . . , pn lista todas as possveis combinaes de valores lgicos de p1 , . . . , pn , 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 definido pela tabela verdade
Por exemplo, se
p:

1+1=3

e
q:

uma dcada equivale a 10 anos

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.2 P ROPOSIES COMPOSTAS

68

ento p falsa e q verdadeira, o que implica que a conjuno


pq :

1+1=3

e uma dcada equivale a 10 anos

falsa.
O valor lgico da proposio composta p q definido 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


pq :

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 definido 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 noambgua, como avaliar o valor lgico da proposio resultante.
p
V
V
F
F

q
V
F
V
F

pq
V
F
F
F

Tabela 13.1: Tabela verdade da conjuno.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.2 P ROPOSIES 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
pq
significa a conjuno de p com q. 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 parnteses para determinar a ordem de composio das proposies. Por exemplo,
(p q) r
significa a disjuno da proposio p q com a proposio r. Isto , os parnteses serviram para
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
pqr
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
=FF
= 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 definidas 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
V
V
F
F

q
V
F
V
F

pq
V
V
V
F

Tabela 13.2: Tabela verdade da disjuno.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.3 O PERADORES LGICOS

13.3

70

Operadores lgicos

Como vimos na Aula 11, uma relao , na verdade, uma proposio, pois ela uma sentena 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 fizemos com as proposies que vimos na Seo 13.2 usando conectivos lgicos, conjuno e disjuno. A resposta sim. Em particular, podemos
construir expresses lgicas, que so expresses cujo resultado um valor lgico. Toda relao , 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
V
F

p
F
V

Tabela 13.3: Tabela verdade da negao.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.3 O PERADORES 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 fizemos com as
expresses aritmticas. Como a utilizao demasiada de parnteses pode prejudicar a legibilidade da expresso, o uso de regras de precedncia de operadores sempre til. Na linguagem
Portugol da ferramenta V ISU A LG, 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 operador lgico. No entanto, por alguma limitao, a ferramenta V ISU A LG exige que as relaes
que compem uma expresso lgica sejam cercadas por parnteses. Logo, usando a linguagem Portugol desta ferramenta, as expresses lgicas acima no podem ser reescritas como
mostrado a seguir:
2 > 3 ou 3 < 2 e 2 < 3 .
Operador
nao
e
ou

Descrio
Negao
Conjuno
Disjuno

Tabela 13.4: Operadores lgicos da linguagem Portugol.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.4 E XERCCIOS RESOLVIDOS

72

A Tabela 13.5 exibe a prioridade dos operadores lgicos da linguagem Portugol da ferramenta V ISU A LG.
Prioridade
mais alta

mais baixa

Operador
e
ou
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

13.5 E XERCCIOS 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:
xx4>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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 14

E STRUTURAS C ONDICIONAIS - 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. A frmula da mdia harmnica ponderada, digamos mh, para os pesos dados
acima

se n1 , n2 e n3 so todas diferentes de 0

2
3
1
+
+
mh =
n1 n2 n3

0
caso contrrio .
onde n1 , n2 e n3 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, n1 , n2 e n3 . 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 n1 , n2 e n3 ,
respectivamente. Se a expresso lgica acima avaliar para verdadeiro, ento o valor de mh
calculado por:
6
.
mh =
1
2
3
+
+
n1 n2 n3
Caso contrrio, o valor de mh deve ser igual zero. Um comando se-ento-seno-fimse com a
expresso lgica acima tudo que precisamos para fazer o clculo de mh. O algoritmo completo
est em 14.1.
interessante notar que o comando se-ento-seno-fimse poderia ser substitudo por um
comando se-ento-fimse se removermos a seo senao e inicializarmos o valor da varivel media
74

14.2 T ROCA 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 )
fimse
Algoritmo 14.1: Algoritmo para calcular a mdia harmnica ponderada de trs notas.
algoritmo "Media harmonica ponderada"
var
nota1, nota2, nota3, media : real
inicio
escreva( "Entre com a primeira nota: " )
leia( nota1 )
escreva( "Entre com a segunda nota: " )
leia( nota2 )
escreva( "Entre com a terceira nota: " )
leia( nota3 )
se ( nota1 <> 0 ) e ( nota2 <> 0 ) e ( nota3 <> 0 ) entao
media <- 6 / ( 1 / nota1 + 2 / nota2 + 3 / nota3 )
senao
media <- 0
fimse
escreva( "A media harmonica ponderada das tres notas e: " , media )
fimalgoritmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

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

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

14.2 T ROCA DE CONTEDO ENTRE DUAS VARIVEIS

76

que no esto corretos. Para entender o porqu dos trechos acima no estarem corretos, vamos
supor que x e y sejam variveis do tipo inteiro e que possuam os valores 4 e 7, respectivamente,
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 final 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, comumente denominada de varivel temporria ou varivel auxiliar. Esta varivel serve para armazenar, 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 usado 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, executamos 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 possuem os 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 final 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, vamos considerar um problema extremamente simples: escrever em ordem no-decrescente dois
nmeros fornecidos como entrada para o problema. Um algoritmo 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 indiferente.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

14.3 O

77

COMANDO ESCOLHA

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
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 sempre 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

algoritmo "Numeros em ordem nao-decrescente - primeira versao"


var
num1, num2, num3 : real
inicio
escreva( "Entre com o primeiro numero: " )
leia( num1 )
escreva( "Entre com o segundo numero: " )
leia( num2 )
se num1 > num2 entao
num3 <- num1
num1 <- num2
num2 <- num3
fimse
escreva( "Os numeros em ordem nao-decrescente: " , num1 , " e " , num2 )
fimalgoritmo

14.3

O comando escolha

O uso do comando se-ento-seno-fimse de forma aninhada e com vrios nveis de aninhamento pode dificultar a leitura do algoritmo. Em tais situaes, o melhor usar um outro comando de estrutura condicional fornecido pela linguagem Portugol da ferramenta V ISU A LG: o
comando escolha. Este comando permite que o resultado de uma nica expresso, denominada
expresso de seleo, seja comparado com os 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 n1
seqncia de comandos
caso expresso 1, expresso 2, . . ., expresso n2
seqncia de comandos
..
.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

14.3 O

78

COMANDO ESCOLHA

outrocaso
seqncia de comandos
fimescolha
Algoritmo 14.3: Outro lgoritmo para escrever dois nmeros em ordem no-decrescente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

algoritmo "Numeros em ordem nao-decrescente - segunda versao"


var
num1, num2 : real
inicio
escreva( "Entre com o primeiro numero: " )
leia( num1 )
escreva( "Entre com o segundo numero: " )
leia( num2 )
se num1 > num2 entao
escreva( "Os numeros em ordem nao-decrescente: " , num2 , " e " , num1 )
senao
escreva( "Os numeros em ordem nao-decrescente: " , num1 , " e " , num2 )
fimse
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 classificar 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 Profissional ( 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 Profissional). 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 comando escolha para resolver o problema dado em 14.4. Como exerccio, reeescreva o mesmo
algoritmo usando comandos se-ento-seno-fimse aninhados e compare seu algoritmo com o
Algoritmo 14.4.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

14.4 E XERCCIOS PROPOSTOS

79

Algoritmo 14.4: Algoritmo para classificar atletas por categorias de idade.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

algoritmo "Atletas por categorias de idade"


var
nome, categoria : caractere
idade : inteiro
inicio
escreva( "Entre com o nome do atleta: " )
leia( nome )
escreva( "Entre com a idade do atleta: " )
leia( idade )
escolha idade
caso 5, 6, 7, 8, 9, 10
categoria <- "Infantil"
caso 11, 12, 13, 14, 15
categoria <- "Juvenil"
caso 16, 17, 18, 19, 20
categoria <- "Junior"
caso 21, 22, 23, 24, 25
categoria <- "Profissional"
outrocaso
categoria <- "Nenhuma categoria"
fimescolha
escreva( "O atleta ", nome, " pertence a categoria ", categoria )
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 um emprstimo 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, em seguida, escreva como
sada o nome do funcionrio seguido da mensagem teve o crdito concedido se o emprstimo solicitado puder ser concedido ou seguido da mensagem crdito 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
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

14.4 E XERCCIOS PROPOSTOS

80

no caso contrrio.
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 um algoritmo que leia dois nmeros reais e os escreva em ordem no-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 nodecrescente.
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 15

E STRUTURAS DE R EPETIO - PARTE 1

15.1

O comando enquanto-faca-fimenquanto

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 V ISU A LG contm um comando, o enquanto-facafimenquanto, que faz exatamente o que queremos. Este comando possui a sintaxe descrita
abaixo:
enquanto expresso lgica faca
comando1
comando2
..
.
comandon
fimenquanto
O comando enquanto-faca-fimenquanto, mais conhecido como lao enquanto, funciona
da seguinte forma: a expresso lgica, denominada condio do lao, primeiramente avaliada. 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 fimenquanto, executada e a expresso novamente avaliada. Caso contrrio, o primeiro comando aps a palavra
fimenquanto executado. Note que se a expresso lgica que define a condio do lao avaliar
para falso durante a primeira avaliao, a seqncia de comandos do corpo do lao no executada nenhuma vez.
81

15.1 O

COMANDO ENQUANTO - FACA - FIMENQUANTO

82

Usando o comando enquanto-faca-fimenquanto, podemos facilmente escrever o trecho de


cdigo que realiza a escrita dos nmero de 1 a n. Para tal, precisamos definir 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
fimenquanto
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

15.2 E XEMPLOS

83

lgica que define 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 Algoritmo 15.1.
Passo
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Valor de i antes
desconhecido
1
1
1
2
2
2
3
3
3
4
4
4
5

Valor de i depois
1
1
1
2
2
2
3
3
3
4
4
4
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
2
3
4
5
6
7
8
9
10
11
12

algoritmo "Inteiros de 1 a n"


var
num, i : inteiro
inicio
escreva( "Entre com um numero inteiro positivo: " )
leia( num )
i <- 1
enquanto ( i <= num ) faca
escreva( i , " " )
i <- i + 1
fimenquanto
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

15.2 E XEMPLOS

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
fimenquanto
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 em uma 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
fimenquanto
O nome varivel acumuladora vem do fato que, ao final 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 significa que a varivel acumula a soma dos valores que j foram
enumerados pelo lao. Ao final 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 definio, o fatorial, n!, de
n dado por

1
se n = 0 ou n = 1
n! =
.
n (n 1)! se n > 1
A definio acima recursiva, pois o fatorial de n definido em termos do fatorial de (n 1).
No entanto, ns aprendemos que a definio recursiva equivale definio no-recursiva dada
a seguir:

1
se n = 0
n! =
.
n (n 1) 2 1 se n > 0
Usando a definio 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

15.3 E XERCCIOS PROPOSTOS

85

Logo, ela deve ser inicializada com 1 e no com zero, que foi o caso da varivel soma do Algoritmo 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

algoritmo "Soma de inteiros em um intervalo"


var
a, b, i, soma : inteiro
inicio
escreva( "Entre com o menor inteiro do intervalo: " )
leia( a )
escreva( "Entre com o maior inteiro do intervalo: " )
leia( b )
soma <- 0
i <- a
enquanto ( i <= b ) faca
soma <- soma + i
i <- i + 1
fimenquanto
escreva( "A soma dos numeros do intervalo e: ", soma )
fimalgoritmo

Algoritmo 15.3: Algoritmo para o fatorial de um inteiro no-negativo.


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

algoritmo "Fatorial de inteiro nao-negativo"


var
num, i , fat : inteiro
inicio
escreva( "Entre com um numero inteiro nao-negativo: " )
leia( num )
fat <- 1
i <- num
enquanto ( i > 1 ) faca
fat <- fat * i
i <- i - 1
fimenquanto
escreva( "O fatorial de ", num , " e: ", fat )
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
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

15.3 E XERCCIOS PROPOSTOS

86

sada os nmeros 2, 4, 6 e 8.
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 divisores 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, verifique se n perfeito e
escreva perfeito em caso afirmativo 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 algoritmo no possui nenhum dado de entrada!
8. Dado um inteiro positivo, n, o nmero harmnico, Hn , definido pela soma
n
X
1
.
Hn =
k
k=1

Escreva um algoritmo que leia n e escreva como sada o valor de Hn .

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 16

E STRUTURAS DE R EPETIO - 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, (fn )
n=1 ,
onde

1
se n = 1 ou n = 2
.
fn =
f
n1 + fn2 se n > 2
Em outras palavras, os dois primeiros termos da seqncia, f1 e f2 , so iguais a 1. A partir
do terceiro termo, o valor de qualquer termo, fi , com i 3, igual a soma dos dois termos
anteriores:
fi = fi1 + fi2 .
Vamos escrever um algoritmo que leia um inteiro positivo, n, e calcule e escreva o n-simo
termo, fn , da seqncia. A idia por trs deste algoritmo calcular fn de forma incremental,
isto , o algoritmo comea com a inicializao de duas variveis, a e b, com os valores f1 = 1 e
f2 = 1. Em seguida, ele calcula o valor de f3 como sendo a+b. O valor resultante armazenado
em uma varivel, f . Antes de calcular f4 , o algoritmo copia o valor de b para a e o valor de f
para b. Desta forma, temos que a = f2 (o antigo valor de b) e b = f3 (o atual valor de f ). Em
seguida, o valor de f4 calculado como a + b novamente, pois f4 = f3 + f2 . Se obsevarmos
bem, a soma a + b foi repetida no clculo de f3 e f4 . 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
fimenquanto
Se supusermos que n = 5, o lao acima calcula o valor de fn = f5 da seguinte forma:
1. i recebe o valor 3.
87

16.2 I NVERSO 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 nonegativo, 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.2 I NVERSO DA ORDEM DOS DGITOS DE UM NMERO

89

obtido quando invertemos a ordem dos dgitos de n. Por exemplo, se n = 43, ento o algoritmo 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 algoritmo 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

algoritmo "N-esimo termo da sequencia de Fibonacci"


var
i, a, b, f : inteiro
inicio
escreva( "Entre com um inteiro nao-negativo: " )
leia( n )
i <- 3
a <- 1
f <- 1
enquanto i <= n faca
b <- f
f <- f + a
a <- b
i <- i + 1
fimenquanto
escreva( "O ", n , "-esimo termo da sequencia de Fibinacci e: ", f )
fimalgoritmo

Uma possvel estratgia a seguinte: se os algarismos de n so d1 , d2 , . . . , dk , com k 1


quando enumerados da direita para a esquerda, ento o nmero que queremos calcular igual
a
d1 10(k1) + d2 10(k2) + + dk 100) = d1 10(k1) + d2 10(k2) + + dk .
Por exemplo, se n = 43 ento o nmero a ser escrito igual a
3 101 + 4 100 = 30 + 4 = 34 ;
se n = 120 ento o nmero a ser escrito igual a
0 102 + 2 101 + 1 100 = 0 + 20 + 1 = 21 ;
se n = 1304 ento o nmero a ser escrito igual a
4 103 + 0 102 + 3 101 + 1 100 = 4000 + 0 + 30 + 1 = 4031 ;
e se n = 5 ento o nmero a ser escrito igual a
5 100 = 5 1 = 5 .
O problema com a estratgia acima que ns no temos os algarismos individuais, d1 ,
d2 , . . . , dk , de n. Mas, com o que aprendemos at o presente momento, somos capazes de
calcul-los.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.2 I NVERSO 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.
Sejam d1 e d2 dois dgitos quaisquer. Se quisermos obter o nmero d1 d2 a partir de d1 e d2 , basta
multiplicarmos d1 por 10 e somar o resultado a d2 : d1 10 + d2 . Por exemplo, se d1 = 4 e d2 = 3,
o nmero d1 d2 = 43 igual a d1 10 + d2 = 4 10 + 3. De forma anloga, se quisermos obter o
nmero d1 d2 d3 a partir de d1 d2 e d3 , onde d3 outro dgito qualquer, basta multiplicarmos d1 d2
por 10 e somar o resultado a d3 : d1 d2 10 + d3 . Por exemplo, se d1 d2 = 43 e d3 = 7, o nmero
d1 d2 d3 = 437 igual a d1 d2 10 + d3 = 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)
fimenquanto
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 d1 calculado antes do lao ser executado; isto , a varivel m recebe
o valor n % 10, que igual a d1 . Na primeira execuo do corpo do lao, o valor de m se torna
(d1 10) + d2 .
Na prxima execuo do corpo do lao, o valor de m se torna
((d1 10) + d2 ) 10) + d3 ,
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.3 T ESTE DE PRIMALIDADE

91

e assim por diante at que, na ltima execuo do lao, o valor de m se torna


d1 10(j1) + d2 10(j2) + + dj ,
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

algoritmo "Numero da direita para a esquerda"


var
n, m, q : inteiro
inicio
escreva( "Entre com um inteiro nao-negativo: " )
leia( n )
m <- n % 10
q <- n \ 10
enquanto q <> 0 faca
r <- q % 10
m <- m * 10 + r
q <- q \ 10
fimenquanto
escreva( "O numero ", n , " da direita para a esquerda e: ", m )
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 sempre 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 especificamente, 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
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.3 T ESTE DE PRIMALIDADE

92

enquanto (n % i) <> 0 faca


i < i + 1
fimenquanto
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, n 1] 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) 6= 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) 6= 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 )
fimse
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

algoritmo "Primo ou composto"


var
n, i: inteiro
inicio
escreva( "Entre com um numero inteiro maior que 1: " )
leia( n )
i <- 2
enquanto ( n % i ) <> 0 faca
i <- i + 1
fimenquanto
se i < n entao
escreva( "O numero ", n , " e composto")
senao
escreva( "O numero ", n , " e primo")
fimse
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.4 E XERCCIOS PROPOSTOS

16.4

93

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, fn , da seqencia, (fi )
i=1 , tal que

se i = 1
a
b
se i = 2 .
fi =

fi1 + fi2 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, fn , da seqencia, (fi )
i=1 , tal que

a
se i = 1

b
se i = 2
fi =
.
f
+
f

i2 se i > 2 e i mpar

i1
fi1 fi2 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, verifique se
n palndrome e escreva palndrome em caso afirmativo e no palndrome caso
contrrio.
4. Uma maneira de calcular o valor do nmero utilizar a seguinte srie
=4

4 4 4 4
4
+ +
+ ... .
3 5 7 9 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 10n .
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
x2 x4 x6
x2k
cos x = 1
+

+ . . . + (1)k
+ ... .
2!
4!
6!
(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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

16.4 E XERCCIOS 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, verifique se ele triangular e escreva triangular em caso afirmativo 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, Mn , do investimento aps n
trimestres dado pela frmula
Mn = 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 Mn , onde n o nmero de trimestres dos X anos. No utilize o operador de potenciao.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 17

E STRUTURAS DE R EPETIO - PARTE 3

17.1

O clculo da mdia aritmtica

Considere o seguinte problema: dados um nmero inteiro positivo, n, e uma seqncia,


x1 , x2 , . . . , xn , 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
n
1 X

xi .
n
i=1

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
n
variveis deveremos declarar no algoritmo para armazenar os valores da seqncia, xi i=1 ,
de entrada. Mas, note que precisamos dos valores da seqncia apenas para calcular a soma
da frmula:
n
X
xi .
i=1

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 definir 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
fimenquanto
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

17.2

96

MAIOR ELEMENTO DE UMA SEQNCIA

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 seqncia. Mais uma vez, temos uma situao em que a entrada do problema possui um tamanho
varivel, pois no sabemos quantos nmeros podem fazer parte dela antes de escrever o algoritmo.
Algoritmo 17.1: Algoritmo para calcular aritmtica a mdia de n nmeros reais.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

algoritmo "Media aritmetica de n numeros reais"


var
i, n : inteiro
soma, x, media : real
inicio
escreva( "Entre com a quantidade de numeros: " )
leia( n )
soma <- 0
i <- 1
enquanto i <= n faca
escreva( "Entre com o ", i , "-esimo numero: " )
leia (x)
soma <- soma + x
i <- i + 1
fimenquanto
media <- soma / n
escreva( "A media aritmetica dos ", n , " numeros e ", media )
fimalgoritmo

Em princpio, podemos fazer a leitura da entrada da mesma forma que fizemos para o
problema da Seo 17.1. Mas, e quanto estratgia de soluo do problema? A soluo do
problema tambm pode ser encontra medida que a entrada est sendo lida. De fato, podemos
definir 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
fimse
i < i + 1
fimenquanto
Note que o primeiro nmero lido antes do lao ser encontrado. Como o valor de n
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

17.3 O S 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. Em seguida, 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

algoritmo "Maior numero de uma sequencia"


var
i, n : inteiro
maior, x : real
inicio
escreva( "Entre com a quantidade de numeros da sequencia: " )
leia( n )
escreva( "Entre com o primeiro numero da sequencia: " )
leia( maior )
i <- 2
enquanto i <= n faca
escreva( "Entre com o proximo numero da sequencia: " )
leia (x)
se x > maior entao
maior <- x
fimse
i <- i + 1
fimenquanto
escreva( "O maior numero da sequencia e: ", maior )
fimalgoritmo

17.3

Os mltiplos de posio na seqncia

Suponha que desejemos escrever um algoritmo 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

17.4 E XERCCIOS P ROPOSTOS

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)
fimenquanto
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)
fimse
leia (x)
fimenquanto
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 definir uma varivel para contar quantos nmeros foram lidos at o momento. Com essa varivel, podemos verificar 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)
fimse
leia (x)
i <- i + 1
fimenquanto
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,


x1 , . . . , xn , de n nmeros inteiros, calcule e escreva o triplo, 3 x1 , . . . , 3 xn , de cada
um dos n nmeros da seqncia.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

17.4 E XERCCIOS P ROPOSTOS

99

2. Escreva um algoritmo que leia um nmero inteiro positivo, n, e uma seqncia,


x1 , . . . , xn , de n nmeros inteiros, calcule e escreva o menor dentre todos os n nmeros,
x1 , . . . , xn , 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

algoritmo "Multiplos de posicao de uma sequencia"


var
i, x : inteiro
inicio
escreva( "Entre com o primeiro numero da sequencia ou zero: " )
leia( x )
i <- 1
enquanto x <> 0 faca
se ( x % i ) = 0 entao
escreva( x , " ")
fimse
escreva( "Entre com o proximo numero da sequencia ou zero: " )
leia (x)
i <- i + 1
fimenquanto
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 mpares.
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 idade1 , peso1 , idade2 , peso2 , . . . , idade20 , peso20 , onde idadei e pesoi 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 filme Senhor dos Anis, uma grande emissora de TV realizou
uma pesquisa logo aps o encerramento do filme. Cada espectador respondeu a um
questionrio no qual constava sua idade e a sua opinio em relao ao filme: excelente 3,
bom 2, regular 1. Escreva um algoritmo 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;

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

17.4 E XERCCIOS P ROPOSTOS

100

a percentagem de pessoas que responderam bom entre todos os espectadores entrevistados.


Os dados de entrada esto dispostos na forma
idade1 ,

opinio1 ,

...,

idade20 ,

opinio20 ,

onde idadei e opinioi 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 identifica unicamente o
consumidor. A quantidade de KWh consumida durante o ms um nmero real nonegativo e o tipo do consumidor um dos nmeros 1, 2 e 3, onde 1 significa consumidor
residencial, 2 significa consumidor comercial e 3 significa consumidor industrial. Os valores 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 devem ser 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
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

17.4 E XERCCIOS P ROPOSTOS

101

o percentual de habitantes com idade entre 18 e 30 anos.


Ento, escreva um algoritmo para ler os dados de entrada da pesquisa e calcular e escrever 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 filhos deles. A Prefeitura deseja saber a mdia
salarial dos assalariados, o nmero mdio de filhos, 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 filhos,
onde salrio um real positivo e nmero de filhos 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 filhos, 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 positivo 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
77=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 algoritmo deve escrever esta raiz. Caso contrrio, o algoritmo deve escrever a mensagem O
nmero no possui raiz inteira.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 18

E STRUTURAS DE R EPETIO - PARTE 4

18.1

O lao repita

A linguagem Portugol da ferramenta V ISU A LG dispe de outro comando de repetio que


executa uma seqncia de comandos repetidamente at que uma dada condio se torne verdadeira:
repita
comando1
comando2
..
.
comandon
ate expresso lgica
O comando repita-ate semelhante ao comando enquanto-faca-fimenquanto, pois ele tambm
repete uma seqncia de comandos com base 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
finalizado.
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 entrada 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 nopositivos, 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 E XEMPLO

18.2

103

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
xn
x2 x3
+
+ +
.
x+
2
3
n
Algoritmo 18.1: Algoritmo para escrever os inteiros de 1 a n.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

algoritmo "Inteiros de 1 a n"


var
num, i : inteiro
inicio
repita
escreva( "Entre com um numero inteiro positivo: " )
leia( num )
ate num > 0
i <- 1
enquanto ( i <= num ) faca
escreva( i , " " )
i <- i + 1
fimenquanto
fimalgoritmo

A srie possui n termos. Note que, para todo i = 1, . . . , n, o i-simo termo da srie da
forma
xi
.
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
fimenquanto
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

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

18.3 L AO REPITA

104

VERSUS LAO ENQUANTO

i = 1, . . . , n 1, o (i + 1)-simo termo da srie, x(i+1) /(i + 1), pode ser obtido a partir do isimo termo, xi /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
fimenquanto
H duas outras observaes importantes sobre o lao acima. A primeira delas diz respeito redundncia 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-fimenquanto so, de fato, equivalentes, pois tudo


o que um deles faz, o outro tambm pode fazer. Mais especificamente, o lao repita com a
forma
repita
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

18.3 L AO REPITA

105

VERSUS LAO ENQUANTO

comando1
comando2
..
.
comandon
ate expresso lgica
pode ser transformado no lao enquanto
comando1
comando2
..
.
comandon
enquanto nao expresso lgica faa
comando1
comando2
..
.
comandon
fimenquanto
Algoritmo 18.2: Algoritmo para calcular e escrever o resultado da srie finita
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Pn

i
i=1 x /i.

algoritmo "Soma de termos de serie finita"


var
n, i : inteiro
soma, num : real
inicio
repita
escreva( "Entre com um numero inteiro positivo: " )
leia( n )
ate n > 0
escreva( "Entre com o primeiro termo da serie: " )
leia( x )
soma <- 0
i <- 1
num <- x
repita
soma <- soma + num / i
num <- num * x
i <- i + 1
fimenquanto
escreva( "A soma de x^i / i para i de 1 a ", n , " e igual a " , soma )
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

18.4 E XERCCIOS PROPOSTOS

106

Por outro lado, um lao enquanto da forma


enquanto expresso lgica faca
comando1
comando2
..
.
comandon
fimenquanto
pode ser transformado em um lao repita da forma
se expresso lgica entao
repita
comando1
comando2
..
.
comandon
ate nao expresso lgica
fimse
Em outras palavras, escrevemos o lao repita dentro de uma estrutura condicional para garantir 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 em um algoritmo 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 algoritmos 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 recebem salrio mnimo e mais 3% do salrio mnimo por pea, acima das 30 iniciais. Os
trabalhadores da classe C recebem salrio mnimo e mais 5% do salrio mnimo por pea,
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

18.4 E XERCCIOS PROPOSTOS

107

acima das 30 iniciais. Escreva um algoritmo que leia uma seqncia com o 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 algoritmo 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 fabricadas 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

algoritmo "Somar inteiros de um intervalo"


var
a, b, i, soma : inteiro
inicio
escreva( "Entre com o menor inteiro do intervalo: " )
leia( a )
escreva( "Entre com o maior inteiro do intervalo: " )
leia( b )
soma <- 0
i <- a
se i <= b entao
repita
soma <- soma + i
i <- i + 1
ate i > b
fimse
escreva( "A soma dos numeros do intervalo e: ", soma )
fimalgoritmo

3. Escreva um algoritmo que leia um inteiro positivo, n, e um valor real, x, e calcule e escreva
o somatrio
x
x2
x3
xn

+
+ (1)n+1
.
n n1 n2
1
4. Escreva um algoritmo que calcule e escreva a soma dos 50 primeiros termos da srie
4!
5!
1! 2! 3!
+
+
.
1
3
7
15 31
5. Considere a equao
x3 3x2 + 1 = 0 .
Qualquer raiz real da equao acima pode ser encontrada atravs de aproximaes sucessivas obtidas com a utilizao da frmula
xn+1 = xn

DIM0320 - 2011.1 - DIMA P /UFRN

x3n 3x2n + 1
.
2x2n 6xn

P ROF. M ARCELO F ERREIRA S IQUEIRA

18.4 E XERCCIOS PROPOSTOS

108

Escreva um algoritmo que receba como entrada uma estimativa inicial, x1 , para uma raiz
e calcule e escreva a trigsima aproximao. Usando a ferramenta V ISU A LG, execute o
seu algoritmo usando como entrada x1 = 1.5.
6. O nmero 3025 goza da seguinte propriedade

30 + 25 = 55
552
= 3025
Escreva um algoritmo determine e escreva todos os nmeros de quatro dgitos que possuem a propriedade acima. Note que este algoritmo no possui nenhum dado 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 um algoritmo que calcule e escreva a porcentagem dos 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 pessoal, 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 um algoritmo que leia um nmero 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=

DIM0320 - 2011.1 - DIMA P /UFRN

F 32
.
1,8

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 19

V ETORES

19.1

Motivao

Considere o problema de calcular a mdia aritmtica das notas de 5 alunos de uma disciplina e determinar e escrever o nmero de alunos que obtiveram nota superior mdia calculada. 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
fimenquanto
media < soma / 5
Mas, se seguirmos com este 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 D EFINIO E MANIPULAO DE VARIVEIS

110

Portugol possui uma forma eficaz de soluo que utiliza uma estrutura de dados denominada
vetor.
Algoritmo 19.1: Algoritmo para calcular a mdia aritmtica de cinco notas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

algoritmo "Calcula media de notas e numero de notas superiores a media"


var
n1, n2, n3, n4, n5, media : real
maiores : inteiro
inicio
escreva( "Entre com a primeira nota: " )
leia( n1 )
escreva( "Entre com a segunda nota: " )
leia( n2 )
escreva( "Entre com a terceira nota: " )
leia( n3 )
escreva( "Entre com a quarta nota: " )
leia( n4 )
escreva( "Entre com a quinta nota: " )
leia( n5 )
media <- ( n1 + n2 + n3 + n4 + n5 ) / 5
maiores <- 0
se n1 > media entao
maiores <- maiores + 1
fimse
se n2 > media entao
maiores <- maiores + 1
fimse
se n3 > media entao
maiores <- maiores + 1
fimse
se n4 > media entao
maiores <- maiores + 1
fimse
se n5 > media entao
maiores <- maiores + 1
fimse
escreva( "A media das notas e: " , media )
escreva( "O numero de notas maiores do que a media e: " , maiores )
fimalgoritmo

19.2

Definio 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 definido como tendo algum nmero fixo
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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.2 D EFINIO E MANIPULAO DE VARIVEIS

111

forma nica.
Ao definirmos uma varivel do tipo vetor, estamos, na verdade, especificando 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 especficos, vamos supor que queremos definir uma varivel, denominada notas, como
um vetor de 5 clulas do tipo inteiro. Na linguagem Portugol, esta definio 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, definimos
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 individualmente, usando o nome da varivel e o ndice da clula. Mais especificamente, 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 manipulaes:
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 flexibilidade 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.2 D EFINIO E MANIPULAO DE VARIVEIS

112

i < 1
enquanto i <= 5 faca
escreva( Entre com a nota , i , : )
leia( notas[i] )
i < i + 1
fimenquanto
Podemos, facilmente, modificar o trecho acima para que ele calcule a mdia das notas tambm:
i < 1
soma < 0
enquanto i <= 5 faca
escreva( Entre com a nota , i , : )
leia( notas[i] )
soma < soma + notas[i]
i < i + 1
fimenquanto
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
fimse
i < i + 1
fimenquanto
Note que, ao combinarmos os dois trechos acima, temos um algoritmo muito mais compacto 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 modificado, muito facilmente, para lidar com 100, 1000 e 1000000 de notas. De fato, considere 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.3 O

19.3

113

CLCULO DO DESVIO PADRO

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 representados por
v1 , . . . , vn ,
ento o desvio padro desses valores com relao mdia aritmtica deles dado pela frmula
v
u
n
X
u 1
t

(vi v)2 ,
n1
i=1

onde v a mdia aritmtica.


Algoritmo 19.2: Algoritmo para calcular a mdia aritmtica de cinco notas usando vetor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

algoritmo "Calcula media de notas e numero de notas superiores a media"


var
notas : vetor [ 1..5 ] de real
soma, media : real
i, maiores : inteiro
inicio
i <- 1
soma <- 0
enquanto i <= 5 faca
escreva( "Entre com a nota ", i , ": " )
leia( notas[ i ] )
soma <- soma + notas[ i ]
i <- i + 1
fimenquanto
media <- soma / 5
i <- 1
maiores <- 0
enquanto i <= 5 faca
se notas[ i ] > media entao
maiores <- maiores + 1
fimse
i <- i + 1
fimenquanto
escreva( "A media das notas e: " , media )
escreva( "O numero de notas maiores do que a media e: " , maiores )
fimalgoritmo

Vamos escrever um algoritmo para calcular o desvio padro de 10 notas de prova em relao
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.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.4 O

COMANDO PARA - FACA - FIMPARA

114

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
uso do operador de potenciao, ^. Este operador calcula o valor de expresses do tipo
xy
onde x e y so nmeros reais. Para calcular a raiz quadrada de x usando o operador ^, escrevemos
x^0.5
Assim como fizemos antes, definiremos um vetor chamado notas para armazenar as 10 notas que sero lidas da entrada. A leitura e clculo da mdia das 10 notas podem ser 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
fimenquanto
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
fimenquanto
desvio < ( desvio / 9 )^0.5
O algoritmo completo mostrado em 19.3.

19.4

O comando para-faca-fimpara

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 final 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 definido.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.4 O

COMANDO PARA - FACA - FIMPARA

115

O lao para implementado pelo comando para-faca-fimpara, que tem a sintaxe dada a
seguir:
para varivel de controle de valor inicial ate valor final faca
comando1
comando2
..
.
comandon
fimpara
Algoritmo 19.3: Algoritmo para calcular desvio padro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

algoritmo "Calcula desvio padrao"


var
notas : vetor [ 1..10 ] de real
soma, media, desvio : real
i : inteiro
inicio
i <- 1
soma <- 0
enquanto i <= 10 faca
escreva( "Entre com a nota ",
leia( notas[ i ] )
soma <- soma + notas[ i ]
i <- i + 1
fimenquanto
media <- soma / 10
i <- 1
desvio <- 0
enquanto i <= 10 faca
desvio <- desvio + ( notas[ i
i <- i + 1
fimenquanto
desvio <- ( desvio / 9 )^0.5
escreva( "A media das notas e: "
escreva( "O desvio padrao e: " ,
fimalgoritmo

i , ": "

] - media ) * ( notas[ i ] - media )

, media )
desvio )

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 final. Se o valor atual for menor ou
igual ao valor final, 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 (sem que tenhamos de escrever cdigo
para isso) e comparado novamente com o valor final. Se o valor atual for menor ou igual ao
valor final, o corpo do lao executado novamente e assim por diante. Por exemplo, o lao
para,
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.5 E XERCCIOS PROPOSTOS

116

para i de 1 ate 10 faca


escreva( i , )
fimpara
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

algoritmo "Calcula desvio padrao com laco para"


var
notas : vetor [ 1..10 ] de real
soma, media, desvio : real
i : inteiro
inicio
soma <- 0
para i de 1 ate 10 faca
escreva( "Entre com a nota ", i , ": " )
leia( notas[ i ] )
soma <- soma + notas[ i ]
fimpara
media <- soma / 10
desvio <- 0
para i de 1 ate 10 faca
desvio <- desvio + ( notas[ i ] - media ) * ( notas[ i ] - media )
fimpara
desvio <- ( desvio / 9 )^0.5
escreva( "A media das notas e: " , media )
escreva( "O desvio padrao e: " , desvio )
fimalgoritmo

19.5

Exerccios propostos

1. Escreva um algoritmo que defina um vetor de elementos inteiros de tamanho 100, leia valores 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 defina um vetor v de elementos inteiros de tamanho 100, leia
valores de entrada para este vetor e escreva a soma, vi + v101i , de cada par de elementos,
vi e v101i , que ocupam as posies i e 101 i do vetor, para todo i Z variando de 1 a 50.
Isto , a sada do algoritmo consiste dos valores das somas v1 + v100 , v2 + v99 , . . . , v50 + v51 .
3. Escreva um algoritmo que defina um vetor de elementos inteiros de tamanho 100, leia
valores de entrada para este vetor, troque os valores dos elementos vi e v101i , para todo
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

19.5 E XERCCIOS PROPOSTOS

117

i Z variando de 1 a 50, e escreva os elementos do vetor resultante em ordem crescente


de posio (isto , v1 , v2 , . . . , v100 ).
4. Escreva um algoritmo que defina um vetor de elementos inteiros de tamanho 100, leia um
nmero inteiro, n, com n > 0 e n 10, e 100 valores de entrada para o vetor, troque os
valores dos elementos vi e vj , 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 , v1 ,
v2 , . . . , v100 ).
5. Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e uma seqncia 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 um nmero n, com n 100, e de 2 n nmeros reais, x1 , x2 , . . . , xn e
y1 , y2 , . . . , yn . A sada do algoritmo o produto escalar, hx, yi, dos vetores x e y definidos
como
x = (x1 , x2 , . . . , xn ) e y = (y1 , y2 , . . . , yn ) ,
isto ,
hx, yi =

n
X

xi yi .

i=1

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 ocorrncias de cada face.
10. Um jogador viciado em jogos de cassino deseja fazer um levantamento 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 20

S EGUNDA AVALIAO

Questo 1) [2 pontos]
A mdia anual (MA) da UFRN uma mdia ponderada de trs notas, N1 , N2 e N3 , dada
por
4 N1 + 5 N 2 + 6 N3
,
MA =
15
onde N1 , N2 e N3 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 final. Um aluno que obtm MA maior ou igual a 7,0 aprovado por
mdia. Escreva um algoritmo que leia as notas N1 e N2 que um aluno obteve em uma
disciplina e determine a menor nota, N3 , 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 mensagem O aluno nao pode mais ser aprovado por media; caso contrrio, ele
deve escrever N3 .
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, )
fimse
i < i + 1
ate i > n
fimalgoritmo
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

120

Questo 3) [3 pontos]
Escreva um algoritmo cuja entrada formada por um inteiro positivo, n, seguido de uma
seqncia, c1 , c2 , . . . , cn , de n letras, e a sada outra seqncia, d1 , d2 , . . . , dn , de n letras.
Para todo i = 1, . . . , n, cada letra, ci , da seqncia de entrada s pode ser uma de trs
letras: a, b ou c. Por sua vez, cada letra, di , da seqncia de sada s pode ser uma
de trs letras: x, y ou z. Mais especificamente, di deve ser igual a x se ci igual a
a, igual a y se ci igual a b e igual a z se ci 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

121

Questo 4) [3 pontos]

, pode ser aproximado pelo seguinte produtrio:


2

n
n 
Y
Y

4k 2
2k
2k
=
=

,
2
4k 2 1
2k 1 2k + 1

O valor do nmero irracional,

k=1

k=1

onde n um nmero inteiro positivo. Por exemplo, se tomarmos n = 6, temos que



 
 
 
 
 

2 2
4 4
6 6
8 8
10 10
12 12

.
2
1 3
3 5
5 7
7 9
9 11
11 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 com exatamente n termos.
2
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 21

C ORREO DA S EGUNDA AVALIAO

Questo 1) [2 pontos]
A mdia anual (MA) da UFRN uma mdia ponderada de trs notas, N1 , N2 e N3 , dada
por
4 N1 + 5 N 2 + 6 N3
,
MA =
15
onde N1 , N2 e N3 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 final. Um aluno que obtm MA maior ou igual a 7,0 aprovado por
mdia. Escreva um algoritmo que leia as notas N1 e N2 que um aluno obteve em uma
disciplina e determine a menor nota, N3 , 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 mensagem O aluno nao pode mais ser aprovado por media; caso contrrio, ele
deve escrever N3 .
Soluo:
Algoritmo 21.1: Soluo da questo 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

algoritmo "Questao 1"


var
n1, n2, n3 : real
inicio
escreva( "Entre com a primeira nota: ")
leia( n1 )
escreva( "Entre com a segunda nota: ")
leia( n2 )
n3 <- ( 15 * 7 - 4 * n1 - 5 * n2 ) / 6
se n3 > 10 entao
escreva( "O aluno nao pode mais ser aprovado por media" )
senao
escreva( "A menor nota para atingir a media e: " , n3 )
fimse
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, )
fimse
i < i + 1
ate i > n
fimalgoritmo
Soluo:
10 15

DIM0320 - 2011.1 - DIMA P /UFRN

45

55

P ROF. M ARCELO F ERREIRA S IQUEIRA

124

Questo 3) [3 pontos]
Escreva um algoritmo cuja entrada formada por um inteiro positivo, n, seguido de uma
seqncia, c1 , c2 , . . . , cn , de n letras, e a sada outra seqncia, d1 , d2 , . . . , dn , de n letras.
Para todo i = 1, . . . , n, cada letra, ci , da seqncia de entrada s pode ser uma de trs
letras: a, b ou c. Por sua vez, cada letra, di , da seqncia de sada s pode ser uma
de trs letras: x, y ou z. Mais especificamente, di deve ser igual a x se ci igual a
a, igual a y se ci igual a b e igual a z se ci 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

algoritmo "Questao 3"


var
i , n : inteiro
c : caractere
inicio
escreva( "Entre com um numero inteiro positivo: ")
leia( n )
i <- 1
enquanto i <= n faca
escreva( "Entre com o caractere ", i , ": " )
leia( c )
se c = "a" entao
escreval( "x" )
senao
se c = "b" entao
escreval( "y" )
senao
escreval( "z" )
fimse
fimse
i <- i + 1
fimenquanto
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

125

Questo 4) [3 pontos]

, pode ser aproximado pelo seguinte produtrio:


2

n
n 
Y
Y

4k 2
2k
2k
=
=

,
2
4k 2 1
2k 1 2k + 1

O valor do nmero irracional,

k=1

k=1

onde n um nmero inteiro positivo. Por exemplo, se tomarmos n = 6, temos que



 
 
 
 
 

2 2
4 4
6 6
8 8
10 10
12 12

.
2
1 3
3 5
5 7
7 9
9 11
11 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 com exatamente n termos.
2
Soluo:
Algoritmo 21.3: Soluo da questo 4.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

algoritmo "Questao 4"


var
k , n : inteiro
p , x , y : real
inicio
escreva( "Entre com um numero inteiro positivo: " )
leia( n )
k <- 1
p <- 1
x <- 2
y <- 1
repita
p <- p * ( x / y )
se x > y entao
y <- y + 2
senao
x <- x + 2
fimse
k <- k + 1
ate k > 2 * n
p <- p * 2
escreva( "O valor de pi e: ", p )
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 22

A NINHAMENTO DE L AOS

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 , ) )
fimpara
fimpara
Para cada iterao do corpo do lao mais externo,
para i de 1 ate 4 faca
..
.
fimpara
o lao mais interno executado por completo. Com isso, a sada do trecho algortmico acima
(
(
(
(
(

1
1
1
1
1

,
,
,
,
,

5
6
7
8
9

)
)
)
)
)

(
(
(
(
(

2
2
2
2
2

,
,
,
,
,

5
6
7
8
9

)
)
)
)
)

(
(
(
(
(

3
3
3
3
3

,
,
,
,
,

5
6
7
8
9

)
)
)
)
)

126

22.1 L AOS ANINHADOS

127

(
(
(
(
(

4
4
4
4
4

,
,
,
,
,

5
6
7
8
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 um problema que pode ser facilmente descrita
com o aninhamento de dois laos. O problema consiste em contar o nmero de elementos
comuns a dois subconjuntos, A e B, de nmeros inteiros. O subconjunto A possui 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 conjuntos 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 elementos do vetor b at que uma igualdade seja verificada 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
fimse
fimenquanto
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 verificarmos 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
fimse
pode ser escrito logo aps o lao, incrementando a varivel comuns se o valor de achou for
verdadeiro.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

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 fizemos para apenas um deles? Ora, basta notar que o cdigo acima no depende
do elemento do vetor a a ser procurado. O cdigo, 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
fimse
fimenquanto
se achou entao
comuns < comuns + 1
fimse
fimpara
Note que temos um lao enquanto dentro de um lao para. O papel do lao para escolher 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 valores para torn-la uma seqncia crescente, decrescente, no-crescente ou no-decrescente. Por
exemplo,
5 1 10 100 0
uma seqncia com 5 nmeros inteiros. Esta seqncia no est ordenada, pois ela nem crescente, 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

10

100

De forma anloga,
100 10
DIM0320 - 2011.1 - DIMA P /UFRN

0
P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

129

uma seqncia decrescente obtida com outra permutao da posio dos elementos da seqncia original. O problema da ordenao consiste em encontrar uma permutao da posio
dos elementos da seqncia original que gere uma seqncia crescente, decrescente, nocrescente ou no-decrescente. Obviamente, para falarmos de seqncias crescentes, decrescentes, no-crescentes ou no-decrescentes, assumimos que qualquer valor da seqncia original 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

algoritmo "Numero de elementos comuns em


var
a : vetor[ 1..10 ] de inteiro
b : vetor[ 1..5 ] de inteiro
i , j , comuns : inteiro
achou : logico
inicio
para i de 1 ate 10 faca
escreva( "Entre com o elemento ", i
leia( a[ i ] )
fimpara
para i de 1 ate 5 faca
escreva( "Entre com o elemento ", i
leia( b[ i ] )
fimpara
comuns <- 0
para i de 1 ate 10 faca
achou <- falso
j <- 1
enquanto ( nao achou ) e ( j <= 5 )
se a[ i ] = b[ j ] entao
achou <- verdadeiro
senao
j <- j + 1
fimse
fimenquanto
se achou entao
comuns <- comuns + 1
fimse
fimpara
escreva( "O numero de elementos comuns
fimalgoritmo

dois vetores"

, " do vetor a: " )

, " do vetor b: " )

faca

e: ", comuns )

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 lexicogrfica crescente de sobrenome e nome dos assinantes. O fato

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

130

dos sobrenomes e nomes aparecerem dessa forma faz com que a busca pelo nmero de um
assinante seja feita de forma rpida. Voc j imaginou uma busca sem que os sobrenomes e
nomes estejam dispostos em ordem lexicogrfica 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 com os 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 nodecrescente ou no-crescente. Para simplificar 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
23

2
9

3
12

4
25

5
7

6
0

7
1

8
2

9
35

10
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
9

2
23

3
12

4
25

5
7

6
0

7
1

8
2

9
35

10
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
9

2
4

3
12

4
25

5
7

6
0

7
1

8
2

9
35

10
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
9

2
4

3
1

DIM0320 - 2011.1 - DIMA P /UFRN

4
25

5
7

6
0

7
12

8
2

9
35

10
23

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

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
9

2
4

3
1

4
0

5
7

6
25

7
12

8
2

9
35

10
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
9

2
4

3
1

4
0

5
2

6
25

7
12

8
7

9
35

10
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
9

2
4

3
1

4
0

5
2

6
7

7
12

8
25

9
35

10
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
9

2
4

3
1

4
0

5
2

6
7

7
12

8
25

9
35

10
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
9

2
4

3
1

4
0

5
2

6
7

7
12

8
23

9
35

10
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
9

2
4

3
1

4
0

5
2

6
7

7
12

8
23

9
25

10
35

Como podemos verificar, 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 n 1. Mas, isto implica que,
ao final 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 n 1 passos
do mtodo.
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

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 seqncia 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 significa 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
fimse
fimpara
se i <> menor entao
temp < a[menor]
a[menor] < a[j]
a[j] < temp
fimse
No trecho de algoritmo acima, a varivel menor tem como finalidade 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 seqncia de entrada. Em seguida, o lao compara o elemento da posio menor com os 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 especificamente, 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.2 O RDENAO

133

fimse
fimpara
se i <> menor entao
temp < a[menor]
a[menor] < a[i]
a[i] < temp
fimse
fimpara
O algoritmo completo mostrado em Algoritmo 22.2.
Algoritmo 22.2: Ordenao de uma seqncia de inteiros usando o mtodo de seleo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

algoritmo "Ordenacao de inteiros usando o metodo de selecao"


var
a : vetor[ 1..100 ] de inteiro
i , j , n , temp : inteiro
inicio
escreva( "Entre com o numero de elementos do vetor (<= 100): " )
repita
leia( n )
ate n <= 100
para i de 1 ate n faca
escreva( "Entre com o elemento ", i , " do vetor a: " )
leia( a[ i ] )
fimpara
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
fimse
fimpara
se i <> menor entao
temp <- a[ menor ]
a[ menor ] <- a[ i ]
a[ i ] <- temp
fimse
fimpara
escreva( "A sequencia ordenada e: " )
para i de 1 ate n faca
escreva( a[ i ] , " " )
fimpara
fimalgoritmo

H um detalhe importante no Algoritmo 22.2. O vetor a definido como um vetor com 100
elementos, mas o algoritmo solicita como entrada o nmero de elementos a serem armazenados
no vetor, que deve ser um nmero menor ou igual a 100. Logo, embora o vetor tenha tamanho
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.3 E XERCCIOS 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, em geral, no sabemos
a priori quantos elementos receberemos como entrada. Ento, utilizamos um vetor de tamanho
grande o suficiente 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 funciona corretamente? Execute o algoritmo em uma entrada de tamanho pequeno com alguns
elementos repetidos e verifique que ele produz a sada correta. Em seguida, analise o algoritmo 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 .
|{z}
|{z} | {z } |{z}
Observe que h segmentos com um nico elemento, tal como |{z}
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 um maior 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
| {z }
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 , |{z}
8 , |{z}
7 , |{z}
5 , |{z}
2 .
|{z}
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.3 E XERCCIOS PROPOSTOS

135

4. Escreva um algoritmo que leia um nmero inteiro positivo, n, e determine e escreva todos
os inteiros entre 1 e n que so comprimento de hipotenusa de um tringulo retngulo com
catetos inteiros.
5. Sabe-se que um nmero inteiro positivo da forma n3 igual soma de n nmeros mpares
consecutivos; isto ,
13 = 1
23 = 3 + 5
33 = 7 + 9 + 11
43 = 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 n3 para n variando
de 1 a m.
6. Escreva um algoritmo 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, em seguida, 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
1a seqncia
2a seqncia

+
1

8
3
1

2
3
6

4
7
1

3
5
8

4
2
6

2
3
5

5
3
8

1
7
8

Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e duas seqncias com n nmeros inteiros entre 0 e 9 e calcule e escreva a seqncia que representa 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, dispostas em ordem crescente, com denominadores positivos e no maiores que n. Por exemplo, se n = 5, os termos da seqncia de Farey, tais que 0 6 6 1, so os seguintes:
0 1 1 1 2 1 3 2 3 4 1
, , , , , , , , , , .
1 5 4 3 5 2 5 3 4 5 1
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.3 E XERCCIOS PROPOSTOS

136

Para gerarmos os termos de uma seqncia de Farey, com 0 6 6 1, podemos utilizar


o seguinte processo: comeamos com as fraes 01 e 11 , e entre cada duas fraes conseck
i+k
utivas ji e m
, introduzimos a frao j+m
e assim sucessivamente enquanto j + m 6 n.
Quando no for mais possvel introduzir novas fraes, teremos gerados todos os termos
da seqncia de Farey relativa a n, com 0 6 6 1. Utilizando o mtodo descrito,
escreva um algoritmo que leia um inteiro positivo n, e escreva todos os termos , com
0 6 6 1, da seqncia de Farey relativa a n. Dica: gere os numeradores e os denominadores em dois vetores.
10. Escreva um algoritmo que leia um nmero inteiro positivo, n, com n 100, e uma seqncia,
x1 , x2 , . . . , xn ,
com n nmeros inteiros, e que verifica se existem dois segmentos consecutivos iguais
nesta seqncia, isto , o algoritmo deve verificar se existem inteiros i e m tais que os
segmentos consecutivos,
xi , xi+1 , . . . , xi+m1

e xi+m , xi+m+1 , . . . , xi+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 seqncia,
x1 , x2 , . . . , xn ,
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 indefinido
(mas no superior a 60) e sua nota em uma prova (0 a 10: o algoritmo deve verificar 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
ni
,
nmax
onde ni a nota que o aluno tirou na prova e nmax a maior nota obtida dentre todos os
alunos da turma.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

22.3 E XERCCIOS 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
NOME
SAL
HED
HEN
ND
FAL
DE
REF
VAL

Descrio
Nome do funcionrio
Salrio do funcionrio
Horas extras diurnas
Horas extras noturnas
Nmero de dependentes
Faltas em horas
Descontos eventuais
Gastos com refeies feitas na empresa
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 finalmente 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 V ISU A LG para testar os algoritmos que voc escreveu para os problemas 13 e 14.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 23

M ATRIZES - PARTE 1

23.1

Definio e Manipulao de Matrizes

Na Aula 21, aprendemos como definir variveis de um novo tipo de dados, denominado
vetor, que representam seqncias de valores de um mesmo tipo. Por possurem uma estrutura
seqencial, vetores so denominados arranjos unidimensionais. Nesta aula, generalizaremos
a noo de arranjo para duas dimenses. Mais especificamente, definiremos 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 bidimensionais.
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 identificada 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 identifica
a linha da tabela em que o elemento se encontra, enquanto o ndice j identifica a coluna (veja
Figura 23.1).
1

1
2
3
4

5
6
7

PSfrag replacements 8

elemento (4,3)

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 V ISU A LG, uma varivel do tipo matriz m por n declarada atravs da seguinte
sintaxe:

138

23.1 D EFINIO E M ANIPULAO DE M ATRIZES

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 m linhas e n colunas, ento tamanho1
e tamanho2 devem ser escritos como m1 ..m2 e n1 ..n2 , respectivamente, onde m2 m1 = m 1 e
n2 n1 = n 1. Comumente, temos m1 = n1 = 1, m2 = m e n2 = n. No entanto, nada impede
que usemos outros valores para m1 , m2 , n1 e n2 . Por exemplo, m1 = 1, m2 = m 2, n1 = 0 e
n2 = 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 clulas 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 qualquer 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 flexibilidade nos permitiu escrever algoritmos envolvendo vetores de forma
bastante compacta. A mesma flexibilidade se estende para matrizes. Por exemplo, o trecho de
algoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.2 E XEMPLOS

140

para i de 1 ate 5 faca


para j de 1 ate 3 faca
tabela[i, j] < i + j
fimpara
fimpara
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] )
fimpara
fimpara
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 modificar 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] )
fimpara
fimpara

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 possuem uma relao direta com a noo de matriz em Matemtica. No entanto, vrios
programas de computador utilizam matrizes para outras finalidades, que variam desde a representao de uma simples planilha a grades de interfaces grficas. Os exemplos que veremos
a seguir tm por finalidade 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 cij = aij + bij , para todo i {1, . . . , m} e todo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.2 E XEMPLOS

141

j {1, . . . , n}. Por exemplo, se

8 6
A= 1 4
5 7
ento

1 2
e B= 0 3 ,
2 1

9 8
C =A+B = 1 7 .
7 8

Com a definio 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.
Assim como fizemos com vetores, 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. A prxima etapa a leitura dos m n elementos das matrizes A e B (veja
Algoritmo 23.1).
Algoritmo 23.1: Primeira parte do algoritmo para somar duas matrizes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

algoritmo "Soma de duas matrizes"


var
a, b, c : vetor [ 1..100 , 1..100 ] de real
i, j, m, n : inteiro
inicio
escreva( "Entre com o numero de linhas das matrizes (<= 100): ")
repita
leia( m )
ate m <= 100
escreva( "Entre com o numero de colunas das matrizes (<= 100): ")
repita
leia( n )
ate n <= 100
para i de 1 ate m faca
para j de 1 ate n faca
escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
leia( a[ i , j ] )
escreva( "Entre com o elemento b[ ", i , "," , j , "]: " )
leia( b[ i , j ] )
fimpara
fimpara

Uma vez que tenhamos os elementos de A e B, precisamos calcular a matriz soma C =


A + B. Por definio, sabemos que cij = aij + bij , para todo i {1, . . . , m} e todo j {1, . . . , n}.
Isto ,
c[ i , j ] <- a[ i , j ] + b[ i , j ]
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.2 E XEMPLOS

142

para todos os valores que as variveis i e j assumem nos intervalos de 1 a m e 1 a n, respectivamente. 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
23
24
25
26

para i de 1 ate m faca


para j de 1 ate n faca
c[ i , j ] <- a[ i , j ] + b[ i , j ]
fimpara
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
28
29
30
31
32
33

para i de 1 ate m faca


para j de 1 ate n faca
escreva( "c[ ", i , "," , j , "] = " ,
fimpara
escreval( "" )
fimpara
fimalgoritmo

c[ i , j ] , "

" )

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, k k : Rmn R, que associa um nmero real a cada matriz e que satisfaz s seguintes
condies:
kAk 0 e kAk = 0 se, e somente se, todo elemento de A igual a zero,
kA + Bk kAk + kBk e
kk Ak = |k| kAk,
onde A, B Rmn 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:
n
X
kAk = max
|aij | .
1in

j=1

Basicamente, a norma soma mxima de linha igual a maior soma que obtemos quando somamos o valor absoluto dos elementos de uma linha da matriz. Por exemplo, se a matriz A
DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.2 E XEMPLOS

143

igual a

2 1
3
5


,

ento
kAk = max{|2| + | 1|, |3| + |5|} = max{3, 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

algoritmo "Norma da soma maxima de linha"


var
a : vetor [ 1..100 , 1..100 ] de real
soma, norma : real
i, j, m, n : inteiro
inicio
escreva( "Entre com o numero de linhas da matriz (<= 100): ")
repita
leia( m )
ate m <= 100
escreva( "Entre com o numero de colunas da matriz (<= 100): ")
repita
leia( n )
ate n <= 100
para i de 1 ate m faca
para j de 1 ate n faca
escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
leia( a[ i , j ] )
fimpara
fimpara
norma <- 0
para i de 1 ate m faca
soma <- 0
para j de 1 ate n faca
se a[ i , j ] < 0 entao
soma <- soma - a[ i , j ]
senao
soma <- soma + a[ i , j ]
fimse
fimpara
se soma > norma entao
norma <- soma
fimse
fimpara
escreva( "A norma da soma maxima de linha da matriz e: ", norma )
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.3 E XERCCIOS PROPOSTOS

144

23.2.3 Clculo da matriz transposta


A transposta de uma matriz A, denotada por AT , 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

5 2 0
6 9 1

A=
3 4 2 ,
7 0 8
1 5 6
ento

5 6 3 7 1
AT = 2 9 4 0 5 .
0 1 2 8 6

Em geral, temos que se A uma matriz m por n, ento AT uma matriz n por m tal que aTij =
aji , para todo i {1, . . . , n} e todo j {1, . . . , m}. Usando esta definio, 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 linguagem Portugol da ferramenta V ISU A LG, 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 definem a
dimenso da matriz.
2. Escreva um algoritmo 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 um algoritmo para verificar se existem elementos repetidos em uma 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.3 E XERCCIOS 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.
algoritmo "Transposta de uma matriz"
var
a, b : vetor [ 1..100 , 1..100 ] de real
i, j, m, n : inteiro
inicio
escreva( "Entre com o numero de linhas da matriz (<= 100): ")
repita
leia( m )
ate m <= 100
escreva( "Entre com o numero de colunas da matriz (<= 100): ")
repita
leia( n )
ate n <= 100
para i de 1 ate m faca
para j de 1 ate n faca
escreva( "Entre com o elemento a[ ", i , "," , j , "]: " )
leia( a[ i , j ] )
b[ j , i ] = a[ i , j ]
fimpara
fimpara
para i de 1 ate n faca
para j de 1 ate m faca
escreva( "b[ ", i , "," , j , "] = " ,
b[ i , j ] , "
" )
fimpara
escreval( "" )
fimpara
fimalgoritmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

7. Escreva um algoritmo para ler um nmero inteiro positivo, n, e escrever as n primeiras


linhas do tringulo de Pascal1 .
1

Descoberto em 1654 pelo matemtico francs Blaise Pascal.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

23.3 E XERCCIOS PROPOSTOS

146

1
1
1
1
1
1
..
.

DIM0320 - 2011.1 - DIMA P /UFRN

1
2
3
4
4

1
3
6
10

1
4
10

1
5

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 24

M ATRIZES - 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 verifica se uma dada matriz ou no um quadrado mgico e utiliza uma combinao 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 m p e p n, respectivamente. Ento, a multiplicao
AB
da matrix A pela matriz B resulta em uma matriz, C, de dimenso m n tal que o elemento cij
igual a
p
X
aik bkj ,
k=1

para i {1, . . . , m} e j {1, . . . , n}. Em outras palavras, cada elemento cij igual ao produto

b1j



b2j
ai1 ai2 aip .
..
bpj
da i-sima linha de A pela j-sima coluna de B. Por exemplo, se



8 6
1 2 0

e B=
,
A= 1 4
3 2 1
5 7
ento



26 28 6
8 6
1 2 0
= 13 10 4 ,
C =AB =A= 1 4
3 2 1
26 24 7
5 7

147

24.1 M AIS EXEMPLOS

pois
c11 =
c12 =
c13 =
c21 =
c22 =
c23 =
c31 =
c32 =
c33 =











8 6
8 6
8 6
1 4
1 4
1 4
5 7
5 7
5 7

148











1
3
2
2
0
1
1
3
2
2
0
1
1
3
2
2
0
1


= 81 + 63 =

8 + 18 = 26 ,


= 8 2 + 6 2 = 16 + 12 = 28 ,

= 80 + 61 =

0 +

= 11 + 43 =

1 + 12 = 13 ,

= 12 + 42 =

2 +

8 = 10 ,

= 10 + 41 =

0 +

4 =

= 51 + 73 =

5 + 21 = 26 ,

6 =

6,




4,



= 5 2 + 7 2 = 10 + 14 = 24 ,

= 50 + 71 =

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
m n. A entrada deste algoritmo composta das dimenses m, n e p e dos elementos de A e B.
A sada composta pelos elementos da matriz C. importante notar que o nmero de colunas
de A e o nmero de colunas de B devem ser 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 cij podem ser calculados com o seguinte
cdigo:
para i de 1 ate m faca
para j de 1 ate n faca
// calcule o elemento cij da matriz C = A B
fimpara
fimpara
Como sabemos,
cij =

p
X

aik bkj .

k=1

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.1 M AIS EXEMPLOS

149

so representadas pelas variveis a, b e c, respectivamente, ento cada cij 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]
fimpara
Note que os valores de i e j so fixos no lao acima. Apenas o valor da varivel contadora k
varia.
Substituindo o cdigo acima para calcular um nico cij na linha de comentrio dos laos
aninhados que vimos antes, obtemos um trecho de cdigo que calcula todos os elementos cij 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]
fimpara
fimpara
fimpara
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 verificar se
uma dada matriz quadrada ou no um quadrado mgico. A entrada deste problema um
inteiro n, com n 2, e uma matriz quadrada, digamos A, de ordem n. 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. Basicamente, o algoritmo que queremos um verificador 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.1 M AIS EXEMPLOS

150

Algoritmo 24.1: Clculo da multiplicao de duas matrizes.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

algoritmo "Multiplicacao de duas matrizes"


var
a, b, c : vetor [ 1..100 , 1..100 ] de real
i, j, m, p, n : inteiro
inicio
escreva( "Entre com o numero de linhas da primeira matriz (<= 100): ")
repita
leia( m )
ate m <= 100
escreva( "Entre com o numero de colunas da primeira matriz (<= 100): ")
repita
leia( p )
ate p <= 100
escreva( "Entre com o numero de colunas da segunda matriz (<= 100): ")
repita
leia( n )
ate n <= 100
para i de 1 ate m faca
para j de 1 ate p faca
escreva( "Entre com o elemento [ ", i , "," , j , "] da matriz A: " )
leia( a[ i , j ] )
fimpara
fimpara
para i de 1 ate p faca
para j de 1 ate n faca
escreva( "Entre com o elemento [ ", i , "," , j , "] da matriz B: " )
leia( b[ i , j ] )
fimpara
fimpara
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 ]
fimpara
fimpara
fimpara
para i de 1 ate m faca
para j de 1 ate n faca
escreva( "O elemento c[ ", i , "," , j , "] e: " , c[ i , j ] )
fimpara
fimpara
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.1 M AIS EXEMPLOS

151

Para construir nosso algoritmo, valeremo-nos de uma idia simples. Suponha que recebemos m nmeros reais, x1 , x2 , . . . , xm , e queremos decidir se esses nmeros so todos iguais.
Para fazer isso de forma eficiente, 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 xi , e comparamos este nmero com todos os nmeros
xj , tais que i 6= 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 x1 , x2 , . . . , xm no so todos
iguais. Mais ainda, quando x1 , x2 , . . . , xm no forem todos iguais, alguma comparao de xi
com outro nmero resultar em desigualdade. Caso contrrio, todos os x1 , x2 , . . . , xm seriam
iguais1 .
Mas, o que a idia acima tem a ver com o nosso problema? Bem, se considerarmos que cada
xi 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 principal 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 eficiente, faremos as comparaes, uma de cada vez, e enquanto obtivermos 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 escolher o elemento xi , 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]
fimpara
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 comparar.
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 elementos 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.1 M AIS EXEMPLOS

152

i < 2
enquanto igual e (i <= n) faca
s2 < 0
para j de 1 ate n faca
s2 < s2 + a[i, j]
fimpara
se s1 = s2 entao
i < i + 1
senao
igual < falso
fimse
fimenquanto
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 afirmar que a matriz a um quadrado 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 afirmar 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]
fimpara
se s1 = s2 entao
j < j + 1
senao
igual < falso
fimse
fimenquanto
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 verifica 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.2 E XERCCIOS PROPOSTOS

153

fimpara
igual < (s1 = s2)
fimse
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]
fimpara
igual < (s1 = s2)
fimse
importante observar tambm que um teste, seja ele de coluna ou diagonal, s ser executado se a matriz passar no teste anterior. Finalmente, aps todos os testes acima, devemos
verificar 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 verifica 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 )
fimse
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
trivial2 .

24.2

Exerccios propostos

1. Dizemos que uma matriz de inteiros, A, n por n, uma matriz de permutao se em cada
linha e em cada coluna houver n1 elementos nulos e um nico elemento 1. Por exemplo,

0
0

1
0

1
0
0
0

0
1
0
0

0
0

0
1

uma matriz de permutao, mas


2

Pelo menos para aqueles que fizeram os exerccios da aula anterior.

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.2 E XERCCIOS PROPOSTOS

154

2 1 0
1
2 0
0
0 1
no de permutao. Escreva um algitmo 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 Pascal3 .
1
1
1
1
1
1
..
.

1
2
3
4
4

1
3
6
10

1
4
10

1
5

3. Um jogo de palavras cruzadas pode ser representado por uma matriz Amn , 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 correspondentes (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 D88 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

24.2 E XERCCIOS 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 D88 e a sada consiste dos
ndices das posies que satisfazem (a), seguidos pelos ndices das posies que satisfazem (b), seguidos pelos ndices das posies que satisfazem (c).
5. Suponha que os elementos aij de uma matriz inteira Ann representem os custos de transporte 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

4
5
A=
2
7

1
2
1
1

2
3
1 400
,
3
8
2
5

ento o custo do itinerrio 1 4 2 4 4 3 2 1 com k = 8 cidades (no necessariamente distintas)


igual a
a14 + a42 + a24 + a44 + a43 + a32 + a21 = 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 25

M ODULARIZAO - PARTE 1

25.1

Exerccios propostos

156

A ULA 26

M ODULARIZAO - PARTE 2

26.1

Exerccios propostos

157

A ULA 27

R ECURSIVIDADE

27.1

Exerccios propostos

158

A ULA 28

F LUXOGRAMAS

28.1

Exerccios propostos

159

A ULA 29

T ERCEIRA 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 define 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

funcao misterio( a
var
p , m : inteiro
inicio
se n = 0 entao
p <- 1
senao
m <- n \ 2
p <- misterio(
se ( n % 2 ) =
p <- p * p
senao
p <- p * p *
fimse
fimse
retorne p
fimfuncao

, n : inteiro ) : inteiro

a , m )
0 entao

(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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

162

Questo 3) [2 pontos]
Uma matriz Ann estritamente diagonalmente dominante se, e somente se,
n
X

|aij | < |aii | ,

j=1,j6=i

para todo i = 1, 2, . . . , n. Em outras palavras, uma matriz quadrada estritamente diagonalmente 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

3 1 1
A= 1 5 2
4 1 7
estritamente diagonalmente dominante, pois
|a11 | = 3 > 2 = 1 + 1 = |a12 | + |a13 |
|a22 | = 5 > 3 = 1 + 2 = |a21 | + |a23 |
|a33 | = 7 > 5 = 4 + 1 = |a31 | + |a32 | .
Escreva um algoritmo que leia uma matriz quadrada, A, de ordem n e verifique se esta
matriz ou no estritamente diagonalmente dominante. A entrada do algoritmo consiste 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 estritamente diagonalmente dominante e a frase no estritamente diagonalmente dominante caso contrrio. Voc pode assumir que a matriz A tem, no mximo, 10 linhas e 10
colunas.
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

163

Questo 4) [2 pontos]
Escreva uma funo, chamada contadigito, que recebe dois inteiros, n e d, como parmetros 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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

A ULA 30

C ORREO DA T ERCEIRA 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 definem os 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 algoritmo.
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
2
3
4
5
6
7
8
9

para i de 1 ate 5 faca


para j de 1 ate 5 faca
se ( i + j ) % 3 = 0 entao
tabver[ i , j ] <- verdadeiro
senao
tabver[ i , j ] <- falso
fimse
fimpara
fimpara

165

166

Questo 2) [2 pontos] Considere a seguinte funo recursiva: Ento, responda:


Algoritmo 30.3: Funo do enunciado da questo 2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

funcao misterio( a
var
p , m : inteiro
inicio
se n = 0 entao
p <- 1
senao
m <- n \ 2
p <- misterio(
se ( n % 2 ) =
p <- p * p
senao
p <- p * p *
fimse
fimse
retorne p
fimfuncao

, n : inteiro ) : inteiro

a , m )
0 entao

(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 an .

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

167

Questo 3) [2 pontos]
Uma matriz Ann estritamente diagonalmente dominante se, e somente se,
n
X

|aij | < |aii | ,

j=1,j6=i

para todo i = 1, 2, . . . , n. Em outras palavras, uma matriz quadrada estritamente diagonalmente 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

3 1 1
A= 1 5 2
4 1 7
estritamente diagonalmente dominante, pois
|a11 | = 3 > 2 = 1 + 1 = |a12 | + |a13 |
|a22 | = 5 > 3 = 1 + 2 = |a21 | + |a23 |
|a33 | = 7 > 5 = 4 + 1 = |a31 | + |a32 | .
Escreva um algoritmo que leia uma matriz quadrada, A, de ordem n e verifique se esta
matriz ou no estritamente diagonalmente dominante. A entrada do algoritmo consiste 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 estritamente diagonalmente dominante e a frase no estritamente diagonalmente dominante caso contrrio. Voc pode assumir que a matriz A tem, no mximo, 10 linhas e 10
colunas.
Soluo:

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

168

Algoritmo 30.4: Soluo da questo 3.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

algoritmo "Questao 3"


var
i , j , n : inteiro
maior : logico
s : real
a : vetor[ 1..10 , 1..10 ] de inteiro
inicio
escreva( "Entre com o numero de linhas e colunas da matriz (<= 10): " )
repita
leia( n )
ate ( n > 0 ) e ( n <= 10 )
para i de 1 ate n faca
para j de 1 ate n faca
escreva( "Entre com o elemento [ ", i , "," , j , "]: ")
leia( a[ i , j ] )
fimpara
fimpara
i <- 1
repita
s <- 0
para j de 1 ate n faca
se j <> i entao
s <- s + abs( a[ i , j ] )
fimse
fimpara
se abs( a[ i , i ] ) > s entao
maior <- falso
senao
i <- i + 1
fimse
ate ( nao maior ) ou ( i > n )
se maior entao
escreva( "e estritamente diagonalmente dominante" )
senao
escreva( "nao e estritamente diagonalmente dominante" )
fimse
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

169

Questo 4) [2 pontos]
Escreva uma funo, chamada contadigito, que recebe dois inteiros, n e d, como parmetros 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
2
3
4
5
6
7
8
9
10
11
12
13

funcao contadigito( n , d : inteiro ) : inteiro


var
tot : inteiro
inicio
tot <- 0
repita
se ( n % 10 ) = d entao
tot <- tot + 1
fimse
n <- n \ 10
ate n = 0
retorne tot
fimfuncao

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

algoritmo "Questao 5"


var
i , j , n : inteiro
maior : logico
s : real
a : vetor[ 1..10 , 1..10 ] de inteiro
//
// O codigo da funcao contadigito deveria vir aqui
//
inicio
escreva( "Entre com o primeiro numero inteiro: " )
leia( a )
escreva( "Entre com o segundo numero inteiro: " )
leia( b )
perm <- verdadeiro
i <- 1
enquanto perm e ( i <= 9 ) faca
se contadigito( a , i ) <> contadigito( b , i ) entao
perm <- falso
senao
i <- i + 1
fimse
fimenquanto
se perm entao
escreva( "sim" )
senao
escreva( "nao" )
fimse
fimalgoritmo

DIM0320 - 2011.1 - DIMA P /UFRN

P ROF. M ARCELO F ERREIRA S IQUEIRA

R EFERNCIAS B IBLIOGRFICAS

[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. Introduo Construo de Algoritmos: Notas de Aula. EDUCS, 2009. 1.2

171

Potrebbero piacerti anche