Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
(Notas de Aula)
Maro 2011
S UMRIO
Informaes Gerais
1.1
Professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduo
2.1
2.2
Representao de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3
Resoluo de Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4
Computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5
Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
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
19
4.2
A estrutura de um algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
4.3
Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
4.4
Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
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
31
32
7.1
32
7.2
Regras semnticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
7.3
34
7.4
Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
7.5
Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Expresses Relacionais
38
8.1
Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
8.2
39
8.3
39
8.4
Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
8.5
Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
43
10 Primeira Avaliao
45
51
57
12.1 Motivao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
58
60
62
63
65
13 Expresses Lgicas
66
ii
66
67
70
72
73
74
74
75
77
79
81
81
15.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
85
87
87
88
91
93
95
95
96
97
98
102
109
iii
118
122
22 Aninhamento de Laos
126
138
147
156
157
158
159
iv
160
165
A ULA 1
I NFORMAES G ERAIS
Professor
Nome
mfsiqueira@dimap.ufrn.br
Sala
Telefone
Horrio de atendimento
Setor 3, sala G3
Horrio
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
mfsiqueira@dimap.ufrn.br
Sala
Telefone
Horrio de atendimento
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
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.
A ULA 2
I NTRODUO
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
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.
inicio
lado
area
fim
Figura 2.2: Fluxograma do algoritmo de clculo da rea do quadrado.
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.
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).
10
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
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.
A ULA 3
3.2 VARIVEIS
13
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
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
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.
16
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
fruta
x123
fru?ta
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.
17
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) "?"
A ULA 4
E NTRADA E S ADA
4.2 A
20
ESTRUTURA DE UM ALGORITMO
4.2 A
21
ESTRUTURA DE UM ALGORITMO
//
// 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
16
17
18
19
num )
22
//
// 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
15
16
17
18
19
20
21
22
23
24
25
26
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.
23
A ULA 5
24
25
Smbolo
, \ e %
+,
Prioridade
mais alta
mais baixa
26
2
3
4
inicio
escreval( "O resultado da expressao 5 * 3 % 2 e: ", 5 * 3 % 2
5
6
-5 * 3 % 2 \ 8 )
-5 - 3 - 6 * 3 )
7
8
9
10
fimalgoritmo
27
7
8
9
10
11
12
13
14
15
16
-a * b % c * 8 )
-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
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)) .
29
7
8
9
10
11
quadrado <- ( a + b ) * ( a + b )
12
13
14
30
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
Smbolo
, /
+,
Prioridade
mais alta
mais baixa
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
7
8
9
10
11
12
13
14
15
16
17
18
19
34
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
7
8
9
10
11
escreva ( "O volume da esfera de raio " , raio , " e " , volume )
fimalgoritmo
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
7
8
9
10
11
12
13
14
37
A ULA 8
E XPRESSES R ELACIONAIS
Descrio
igual a
diferente de
maior que
menor que
maior ou igual a
menor ou igual a
a>b e
c <= b
39
c <= (5 a) ,
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.
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
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
a>b
a<b
10 % 5 2 <> 5 2 + 1 0 2 <> 5 2 + 1
0 <> 5 2 + 1
0 <> 10 + 1
0 <> 11
verdadeiro
42
profissao = medico
Qual o valor dessas expresses quando a, b, nome e profissao assumem os valores abaixo?
(a) 3.0, 2, MIRIAM e ADVOGADO
A ULA 9
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.
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:
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:
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:
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:
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:
A ULA 11
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 ) )
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)
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
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.
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
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
A ULA 12
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
8
9
10
11
12
13
14
15
16
17
18
19
Tudo que precisamos fazer para concluir o Algoritmo 12.1 escrever sua sada. De fato,
57
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
59
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
12.3
60
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
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
62
8
9
10
11
12
13
media <- ( n1 + n2 + n3 ) / 3
14
15
16
17
18
19
20
21
22
23
24
25
12.4
Comando se-entao-fimse
63
9
10
11
12
13
14
15
16
17
18
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
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 "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
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.
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
66
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:
ento a conjuno de p e q
pq :
1+1=3
e a disjuno de p e q
pq :
1+1=3
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:
68
1+1=3
falsa.
O valor lgico da proposio composta p q definido pela tabela verdade
Por exemplo, se
p:
1+1=3
e
q:
1+1=3
ou
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:
no verdade que 1 + 1 = 3
verdadeira e
q:
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
69
q
V
F
V
F
pq
V
V
V
F
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
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
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
13.4
Exerccios resolvidos
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
A ULA 14
14.1
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
75
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
14.2
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
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
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
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
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
79
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
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.
A ULA 15
15.1
O comando enquanto-faca-fimenquanto
15.1 O
82
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
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
15.2 E XEMPLOS
84
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
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
15.3
Exerccios 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
A ULA 16
16.1
A seqncia de Fibonacci
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
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
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
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
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
91
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
92
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 =
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
94
A ULA 17
17.1
xi .
n
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
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
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
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
17.3
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
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
99
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;
100
opinio1 ,
...,
idade20 ,
opinio20 ,
101
A ULA 18
18.1
O lao repita
102
18.2 E XEMPLO
18.2
103
Exemplo
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
18.3 L AO REPITA
104
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
18.3 L AO REPITA
105
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.
106
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
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
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
x3n 3x2n + 1
.
2x2n 6xn
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=
F 32
.
1,8
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
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
19.2
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
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
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.
19.3 O
19.3
113
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
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.
19.4 O
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
19.4 O
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
i , ": "
, 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
116
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
117
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.
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:
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:
121
Questo 4) [3 pontos]
4k 2
2k
2k
=
=
,
2
4k 2 1
2k 1 2k + 1
k=1
k=1
.
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:
A ULA 21
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
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
45
55
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
125
Questo 4) [3 pontos]
4k 2
2k
2k
=
=
,
2
4k 2 1
2k 1 2k + 1
k=1
k=1
.
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
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
127
(
(
(
(
(
4
4
4
4
4
,
,
,
,
,
5
6
7
8
9
)
)
)
)
)
22.2 O RDENAO
128
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
dois vetores"
faca
e: ", comuns )
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
2
23
3
12
4
25
5
7
6
0
7
1
8
2
9
35
10
4
2
4
3
12
4
25
5
7
6
0
7
1
8
2
9
35
10
23
2
4
3
1
4
25
5
7
6
0
7
12
8
2
9
35
10
23
22.2 O RDENAO
131
2
4
3
1
4
0
5
7
6
25
7
12
8
2
9
35
10
23
2
4
3
1
4
0
5
2
6
25
7
12
8
7
9
35
10
23
2
4
3
1
4
0
5
2
6
7
7
12
8
25
9
35
10
23
2
4
3
1
4
0
5
2
6
7
7
12
8
25
9
35
10
23
2
4
3
1
4
0
5
2
6
7
7
12
8
23
9
35
10
25
2
4
3
1
4
0
5
2
6
7
7
12
8
23
9
25
10
35
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
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
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
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
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
136
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
A ULA 23
M ATRIZES - PARTE 1
23.1
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)
138
139
23.2 E XEMPLOS
140
23.2
Exemplos
23.2 E XEMPLOS
141
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
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
c[ i , j ] , "
" )
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
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
144
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
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
146
1
1
1
1
1
1
..
.
1
2
3
4
4
1
3
6
10
1
4
10
1
5
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.
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
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
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.
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.
150
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
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
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
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
155
4
5
A=
2
7
1
2
1
1
2
3
1 400
,
3
8
2
5
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
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:
162
Questo 3) [2 pontos]
Uma matriz Ann estritamente diagonalmente dominante se, e somente se,
n
X
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:
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:
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:
A ULA 30
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
165
166
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 .
167
Questo 3) [2 pontos]
Uma matriz Ann estritamente diagonalmente dominante se, e somente se,
n
X
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:
168
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
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
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