Buscar

Algoritmos e Programação de Computadores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 178 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 178 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 178 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

DIM0320 - Algoritmos e Programação de Computadores
(Notas de Aula)
Prof. Marcelo Ferreira Siqueira
mfsiqueira@dimap.ufrn.br
DIMAp - CCET - UFRN
Março 2011
Copyright c© 2011 Marcelo Ferreira Siqueira
Permission is granted to copy, distribute and/or modify this document under the terms of
the GNU Free Documentation License, Version 1.2 or any later version published by the Free
Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled “GNU Free Documentation
License”.
SUMÁRIO
1 Informações Gerais 1
1.1 Professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Introdução 4
2.1 Algoritmos e problemas computacionais . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Representação de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Resolução de Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Computadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Tipos de Dados e Variáveis 12
3.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4 Nomes de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 Exercícios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.6 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 Entrada e Saída 19
4.1 Instruções de entrada e saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2 A estrutura de um algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.3 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.4 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5 Expressões Aritméticas – Parte 1 24
5.1 Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.2 Precedência de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
i
5.3 Alteração de prioridades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.4 A instrução de atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.5 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.6 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6 Prova de Avaliação de Conhecimento Prévio 31
7 Expressões Aritméticas – Parte 2 32
7.1 Operadores aritméticos sobre os reais . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.2 Regras semânticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3 Um algoritmo envolvendo constantes e variáveis reais . . . . . . . . . . . . . . . . 34
7.4 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.5 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
8 Expressões Relacionais 38
8.1 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
8.2 Relações e expressões aritméticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
8.3 Relações envolvendo tipos não inteiros . . . . . . . . . . . . . . . . . . . . . . . . 39
8.4 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.5 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
9 Exercícios para a Primeira Avaliação 43
10 Primeira Avaliação 45
11 Correção da Primeira Avaliação 51
12 Estruturas Condicionais - Parte 1 57
12.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
12.2 Comando se-entao-senao-fimse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
12.3 Aninhamento de comandos condicionais . . . . . . . . . . . . . . . . . . . . . . . 60
12.4 Comando se-entao-fimse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
12.5 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
12.6 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
13 Expressões Lógicas 66
13.1 Lógica proposicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
ii
13.2 Proposições compostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
13.3 Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
13.4 Exercícios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
13.5 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
14 Estruturas Condicionais - Parte 2 74
14.1 Usando proposições compostas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
14.2 Troca de conteúdo entre duas variáveis . . . . . . . . . . . . . . . . . . . . . . . . 75
14.3 O comando escolha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
14.4 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
15 Estruturas de Repetição - Parte 1 81
15.1 O comando enquanto-faca-fimenquanto . . . . . . . . . . . . . . . . . . . . . . . . 81
15.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
15.3 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
16 Estruturas de Repetição - Parte 2 87
16.1 A seqüência de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
16.2 Inversão da ordem dos dígitos de um número . . . . . . . . . . . . . . . . . . . . 88
16.3 Teste de primalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
16.4 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
17 Estruturas de Repetição - Parte 3 95
17.1 O cálculo da média aritmética . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
17.2 O maior elemento de uma seqüência . . . . . . . . . . . . . . . . . . . . . . . . . . 96
17.3 Os múltiplos de posição na seqüência . . . . . . . . . . . . . . . . . . . . . . . . . 97
17.4 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
18 Estruturas de Repetição - Parte 4 102
18.1 O laço repita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
18.2 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
18.3 Laço repita versus laço enquanto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
18.4 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
19 Vetores 109
19.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
iii
19.2 Definição e manipulação de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . 110
19.3 O cálculo do desvio padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
19.4 O comando para-faca-fimpara . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . 114
19.5 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
20 Segunda Avaliação 118
21 Correção da Segunda Avaliação 122
22 Aninhamento de Laços 126
22.1 Laços aninhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
22.2 Ordenação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
22.3 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
23 Matrizes - Parte 1 138
23.1 Definição e Manipulação de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 138
23.2 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
23.2.1 Soma de duas matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
23.2.2 Cálculo de norma matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
23.2.3 Cálculo da matriz transposta . . . . . . . . . . . . . . . . . . . . . . . . . . 144
23.3 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
24 Matrizes - Parte 2 147
24.1 Mais exemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
24.1.1 Multiplicação de duas matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 147
24.1.2 Quadrado mágico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
24.2 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
25 Modularização - Parte 1 156
25.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
26 Modularização - Parte 2 157
26.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
27 Recursividade 158
27.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
28 Fluxogramas 159
iv
28.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
29 Terceira Avaliação 160
30 Correção da Terceira Avaliação 165
v
AULA 1
INFORMAÇÕES GERAIS
Professor
Nome Marcelo Ferreira Siqueira
Email mfsiqueira@dimap.ufrn.br
Sala DIMAp 16 (primeiro andar)
Telefone 3215 3814/3816 Ramal 228
Horário de atendimento por demanda e marcado com antecipação
Local e Horário de Aulas
Local Setor 3, sala G3
Horário Terças e quintas das 10h50min às 12h30min (35M56)
Conteúdo Programático
1. Problemas computacionais, algoritmos e computadores
2. Tipos de dados, variáveis
3. Expressões aritméticas
4. Entrada e saída
5. Expressões relacionais
6. Expressões lógicas
7. Estrutura condicional
8. Estruturas de repetição
9. Vetores
10. Matrizes
1
1.1 PROFESSOR 2
11. Modularização
12. Recursividade
13. Fluxogramas
Os tópicos 1, 2, 3, 4, 5 e a primeira parte de 7 serão cobertos na Unidade I da disciplina. Os
tópicos 6, a segunda parte de 7, 8 e 9 serão vistos na Unidade II. Os tópicos 10, 11, 12 e 13 serão
estudados na Unidade III.
Sistema de Avaliação
A disciplina contará com três provas escritas, denotadas por P1, P2 e P3. As notas das
unidades I, II e III serão as notas obtidas nas provas P1, P2 e P3, respectivamente. As datas
das provas P1, P2 e P3, assim como a data do exame final, já foram informadas no SIGAA e
são 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, serão realizadas na sala de aula da disciplina e
durante o horário de aula (das 10h50min às 12h30min). Por favor, atente-se ao horário das
aulas e provas, pois nenhum aluno terá permissão para entrar em sala depois que a prova já
tiver sido iniciada.
1.1 Professor
Nome Marcelo Ferreira Siqueira
Email mfsiqueira@dimap.ufrn.br
Sala DIMAp 16 (primeiro andar)
Telefone 3215 3814/3816 Ramal 228
Horário de atendimento por demanda e marcado com antecipação
1.2 Bibliografia
Nesta disciplina, não adotaremos nenhum livro-texto em particular, pois nenhum deles é
suficientemente adequado para as necessidades da disciplina. No entanto, notas de aula serão
disponibilizadas para os alunos à medida que os tópicos da disciplina forem cobertos. Os
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
1.2 BIBLIOGRAFIA 3
alunos também terão acesso aos eventuais slides utilizados pelo professor durantes as. Tanto
as notas de aula quanto os slides serão disponibilizados, na forma de arquivos em formato
PDF, para download no SIGAA. Apesar de não adotarmos nenhum livro-texto em particular,
recomendamos o uso do livro em [3] para complementar as notas de aula e como fonte de
exercícios.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 2
INTRODUÇÃO
2.1 Algoritmos e problemas computacionais
A palavra algoritmo tem origem no sobrenome do matemático, astrônomo, geólogo, geó-
grafo e autor persa Mohammed ibn-Musa al-Khwarizmi, que viveu entre 780 e 850 d.C [2].
No século XII, sua obra sobre numerais indianos foi traduzida para o latim e apresentou a no-
tação posicional decimal para o Mundo Ocidental. Ele também apresentou a primeira solução
sistemática das equações lineares e quadráticas e é considerado um dos fundadores da Álge-
bra [1]. O radical de algarismo e algoritmo vem de Algoritmi, a forma latina do sobrenome
al-Khwarizmi.
Há tantas definições diferentes para o termo algoritmo quanto autores escrevendo sobre
elas. No entanto, todas essas definições concordam que um algoritmo é uma seqüência finita
de instruções, bem definidas e não-ambíguas, para resolver um dado problema. Cada instrução
de um algoritmo deve ser executada por um período de tempo finito. Em geral, a definição de
algoritmo é ilustrada através de qualquer processo “mecânico”, tal como uma receita culinária
ou a troca de pneu de um automóvel. No entanto, aqui, estamos interessados em algoritmos
computacionais, ou seja, algoritmos que descrevem instruções a serem executadas por com-
putador.
Para exemplificar o que entendemos por “algoritmo computacional”, vamos considerar o
problema de se calcular a área A de um quadrado Q de lado l. No ensino médio, aprendemos
que
A = l2 . (2.1)
Então, dado o comprimento l dos lados do quadrado Q, uma forma de resolver o problema é
usar a fórmula acima, ou seja, multiplicar o valor de l por ele próprio. Note que a fórmula em
(2.1) pode ser usada para calcular a área A de qualquer quadrado. Tudo o que precisamos saber
para utilizar a fórmula para obter a área A de qualquer quadrado é o comprimento l do lado
do quadrado.
Suponha, agora, que devemos escrever uma seqüência de instruções para calcular A, a qual
deve ser seguida por uma criança que sabe multiplicar dois números e sempre faz isso de
forma correta. A criança deve nos solicitar o comprimento l do lado do quadrado Q e, depois
de calcularA, ela deve nos informar o valor deA obtido por ela. Este valor deve ser escrito, pela
criança, em uma folha de papel usando lápis ou caneta. Uma possível seqüência de instruções
é
1. Solicite o comprimento l do lado do quadrado.
4
2.1 ALGORITMOS E PROBLEMAS COMPUTACIONAIS 5
2. Multiplique l por l
3. Escreva o resultado da multiplicação na folha de papel.
A seqüência acima, por mais simples que seja, ilustra todos os elementos essenciais da
definição de algoritmo. A seqüência é finita (há apenas três instruções). Cada uma delas está
bem definida, não deixa nenhuma dúvida sobre o que deve ser feito e pode ser realizada em
um período finito de tempo. Há ainda, no nosso exemplo, dois componentes fundamentais dos
algoritmos computacionais: entrada e saída. A entrada consiste do conjunto de dados que deve
ser fornecido ao algoritmo, enquanto a saída é o conjuntode dados produzidos pelo algoritmo.
No exemplo acima, a entrada é o comprimento l do lado do quadrado e a saída é a área A do
quadrado.
O exemplo acima também ilustra uma característica importante dos algoritmos computa-
cionais: eles são agentes transformadores de dados de entrada em dados de saída. Este processo
de transformação é 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 multiplicação de l por l. É importante perceber que um algoritmo não é
a solução de um problema, mas sim um processo para se obter a solução. 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 através de
um algoritmo.
Entrada Algoritmo SaidaPSfrag replacements
Algoritmo
Entrada
Saída
Figura 2.1: A transformação de entrada em saída por um algoritmo.
Um problema computacional possui várias ocorrências (ou instâncias). Uma ocorrência de
um problema computacional é uma instância qualquer da entrada do problema. Por exemplo,
no problema do cálculo da área do quadrado, sabemos que a entrada do problema é o com-
primento l do lado do quadrado. Então, qualquer valor válido para l, ou seja, qualquer real
positivo, é uma instância do problema, por exemplo l = 2. Um algoritmo deve sempre ser
construído para resolver todas as possíveis ocorrências de um problema. O algoritmo do nosso
exemplo contém instruções para o cálculo da área A do quadrado para qualquer valor de l
dado.
Um algoritmo é dito correto se ele sempre termina e produz a resposta correta para todas
as ocorrências de um dado problema. O algoritmo do nosso exemplo, portanto, é correto.
Obviamente, a “criança” que executa as instruções deve saber cumpri-las de forma correta. Na
nossa analogia, a criança é o computador. Os computadores que usamos na prática sempre
cumprem as instruções que lhes damos de forma correta. Se houver algum erro na tentativa de
solucionar um problema computacional através de um computador, este erro está nas próprias
instruções que lhe demos. O computador apenas executa, fielmente, as instruções que lhe
damos.
Quando começamos a construir algoritmos, umas das habilidades mais importantes é
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.2 REPRESENTAÇÃO DE ALGORITMOS 6
aquela de identificar qual é a entrada e qual é a saída do algoritmo a partir da descrição (ou
declaração) do problema. Você deve procurar adquirir e aprimorar esta habilidade sem se pre-
ocupar em como resolver o problema ou escrever o algoritmo. Muitas vezes, o enunciado de
um problema computacional descreve, de forma explícita, qual é a entrada e qual é a saída do
algoritmo:
Escreva um algoritmo que recebe, como entrada, a base e a altura de um retângulo qualquer e
produz como saída a área do retângulo.
Note que o próprio enunciado torna evidente que a entrada consiste dos comprimentos da base
e altura de um retângulo e a saída, da área do retângulo. No entanto, o problema poderia ser
descrito como
Dados a base e a altura de um retângulo qualquer, calcule e escreva a área do retângulo.
Note que, em ambos os casos, não é preciso saber calcular a área do retângulo ou escrever o
algoritmo que faz este cálculo para determinar que a entrada do algoritmo é a base e a altura
de um retângulo e a saída, ou seja, o dado que o algoritmo deve produzir como resposta, é a
área do retângulo.
2.2 Representação de algoritmos
Em geral, algoritmos são descritos através de uma linguagem que se assemelha àquela que
usamos para nos comunicar. O vocabulário das linguagens destinadas à descrição de algo-
ritmos é extremamente pequeno quando comparado ao das linguagens coloquiais, mas rico
o suficiente para resolvermos uma gama enorme de problemas computacionais. Aqui, de-
screveremos algoritmos com uma linguagem conhecida como Portugol, que é utilizada pela
ferramenta VISUALG , que será utilizada na disciplina como forma de apoio ao aprendizado
de algoritmos.
Por exemplo, usando a linguagem Portugol da VISUALG, o algoritmo que vimos na seção
anterior para calcular a área de um quadrado a partir do comprimento de seus lados é descrito
como em 2.1:
Algoritmo 2.1: Algoritmo para calcular a área de um quadrado.
1 algoritmo "Area do quadrado’’
2 var lado, area : real
3 inicio
4 escreva ( "Entre com o comprimento dos lados do quadrado: " )
5 leia ( lado )
6 area <- lado * lado
7 escreva ( "A area do quadrado e: " , area )
8 fimalgoritmo
Há uma série de detalhes sintáticos da linguagem Portugol da ferramenta VISUALG que
devem ser dominados para que você possa escrever seus algoritmos usando esta linguagem.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.3 RESOLUÇÃO DE PROBLEMAS 7
Parte do processo de aprendizado de construção de algoritmos é dedicada à familiarização
com os aspectos sintáticos de alguma linguagem de descrição de algoritmos. Felizmente, as
linguagens de descrição de algoritmos possuem estruturas sintáticas bastante parecidas entre
si. Isto faz com que o uso de outra linguagem, após o aprendizado da primeira, seja bastante
facilitado.
Uma outra forma de descrevermos algoritmos é através do uso de fluxogramas, que são di-
agramas com figuras que identificam as várias instruções do algoritmo. Nesta disciplina, tam-
bém utilizaremos fluxogramas, embora a principal forma de descrição seja mesmo a linguagem
Portugol.
area <− lado * lado
fim
area
lado
inicio
Figura 2.2: Fluxograma do algoritmo de cálculo da área do quadrado.
2.3 Resolução de Problemas
Todo algoritmo está relacionado com a solução de um determinado problema computa-
cional. Portanto, construir um algoritmo para um dado problema significa, antes de mais nada,
determinar uma forma para solucionar um problema e descrevê-la como uma seqüência finita
de instruções em alguma linguagem. A tarefa de encontrar a solução de um problema qual-
quer é, muitas vezes, realizada de forma empírica e um tanto quanto desorganizada; ocorrem
vários procedimentos mentais, dos quais raramente tomamos conhecimento. A organização do
processo de resolução de problemas é extremamente desejável, pois somente assim podemos
verificar onde o processo não é eficiente. Identificadas as deficiências deste processo, procu-
ramos formas de corrigi-las e, consequentemente, aumentamos a nossa capacidade de resolver
problemas.
A capacidade para resolver problemas pode ser vista como uma habilidade a ser adquirida.
Esta habilidade, como qualquer outra, pode ser obtida essencialmente pela combinação de
duas partes:
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.4 COMPUTADORES 8
• conhecimento e
• destreza.
Conhecimento é adquirido pelo estudo. Em termos de resolução de problemas, está rela-
cionado a que táticas e estratégias usar e quando usar. Destreza é adquirida pela prática. A
experiência no uso do conhecimento (prática) nos dá mais agilidade na resolução de proble-
mas.
2.4 Computadores
O que é um computador? De acordo com o Webster’s New World Dictionary of the American
Language (segunda edição), um computador é “uma máquina eletrônica que, por meio de in-
struções e informações armazenadas, executa rápida e frequentemente cálculos complexos ou
compila, correlaciona e seleciona dados”. Basicamente, um computador pode ser imaginado
como umamáquina quemanipula informação na forma de números e caracteres. A informação
é denominada, de maneira geral, de dado. O que faz dos computadores máquinas notáveis é
a extrema rapidez e precisão 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 questõesinerentes a este processo:
“Como informamos ao computador o algoritmo que deve ser executado para obtermos o resul-
tado desejado?”, “Como fornecemos a entrada do algoritmo?” e “Como recebemos o resultado
do algoritmo?”
O ato de instruir o computador para que ele resolva um determinado problema é con-
hecido como programação. Esta tarefa nada mais é do que inserir no computador as ações
do algoritmo e os dados referenciados pelas ações. Estas, quando executadas pelo coputador,
produzem a solução do problema. Entretanto, antes de inserir as ações e os dados no computa-
dor, devemos reescrevê-las em uma linguagem apropriada para descrever algoritmos com-
putacionais, ou seja, em uma linguagem de programação. O termo programa é comumente
empregado para designar o algoritmo em uma linguagem de programação. Entretanto, não há
distinção conceitual entre algoritmo e programa1. O Algoritmo 2.1 escrito em linguagem C é
mostrado no Programa 2.1. Compare os dois!
Cadamodelo de computador possui uma linguagem de programação própria, denominada
linguagem de máquina, e, em geral, distinta das linguagens de máquina dos demais modelos
de computador. Esta é a única linguagem de programação que o computador realmente en-
tende. No entanto, para evitar que nós tenhamos de aprender a linguagem de máquina de
cada computador diferente para o qual queremos programar, muitas linguagens de progra-
mação independentes de máquina foram criadas. Se você aprende uma linguagem indepen-
dente de máquina, estará apto, pelo menos em princípio, a programar qualquer computador
usando essa linguagem.
As linguagens de programação independentes de máquina não são compreendidas pelos
computadores. Então, para que elas possam ser úteis para nós, um programa denominado
1Em Teoria da Computação, existe uma distinção, mas ela não será levada em conta aqui.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.4 COMPUTADORES 9
compilador deve estar presente no computador. Um compilador para uma determinada lin-
guagem de programação realiza a tradução automática de um programa escrito em uma certa
linguagem para um programa equivalente escrito na linguagem de máquina. Tudo que pre-
cisamos fazer para executar um programa escrito em uma linguagem de programação que não
seja a linguagem de máquina do computador é compilar o nosso programa com um compi-
lador específico para aquela linguagem e, em seguida, executar o programa produzido pelo
compilador.
Programa 2.1: Programa em linguagem C para calcular a área de um quadrado.
1 #include <stdio.h>
2 void main()
3 {
4 double lado, area ;
5 printf( "Entre com o comprimento dos lados do quadrado:" ) ;
6 scanf( "%f\n" , &lado ) ;
7 area = lado * lado ;
8 printf( "A area do quadrado e: %f\n" , area ) ;
9 return ;
10 }
Tanto o algoritmo quanto os seus dados de entrada são inseridos nos computadores por
meio de equipamentos eletrônicos conhecidos como periféricos de entrada. O teclado e o
mouse são exemplos de periféricos de entrada. As instruções e os dados inseridos no computa-
dor através de um periférico de entrada são armazenados em um dispositivo do computador
denominado memória (primária ou secundária). Os dados de saída resultantes da execução
do algoritmo pelo computador são apresentados também por meio de equipamentos eletrôni-
cos denominados periféricos de saída. O monitor de vídeo e a impressora são exemplos de
periféricos de saída.
O computador executa um determinado programa através de um dispositivo interno de-
nominado unidade central de processamento, mais conhecido no mundo dos computadores
pela sua abreviação em inglês: CPU (Central Processing Unit). A CPU é responsável por buscar
as instruções e os dados do programa que estão armazenados na memória do computador, de-
codificar as instruções e executar a tarefa descrita por elas com os respectivos dados. A CPU
pode ser vista como o “cérebro” do computador.
No mundo dos computadores, você ouvirá as pessoas falarem sobre hardware e software.
Hardware se refere à máquina propriamente dita e a todos os periféricos conectados a ela.
Software se refere aos programas que fazem a máquina realizar alguma tarefa. Muitos “pa-
cotes” de software estão disponíveis nos dias atuais. Eles incluem processadores de texto,
planihas eletrônicas, sistemas gerenciadores de banco de dados, jogos, sistemas operacionais e
compiladores. Você pode e aprenderá a criar seus próprios softwares. Para criar software, você
deverá adquirir competências e habilidades para: (1) desenvolver algoritmos para solucionar
problemas computacionais e (2) usar uma linguagem de programação. Aqui, dedicamo-nos à
(1).
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.5 EXERCÍCIOS PROPOSTOS 10
2.5 Exercícios propostos
1. O primeiro passo no desenvolvimento de um algoritmo para um dado problema com-
putacional é o entendimento da entrada e da saída do problema. Este entendimento deve
preceder qualquer tentativa de desenvolvimento de uma solução para o problema. Neste
exercício, você deve descrever qual é a entrada e qual é a saída de cada um dos problemas
listados abaixo:
(a) Dado um número inteiro qualquer, calcule e escreva o antecessor e o sucessor do
número dado.
(b) Dados três números reais não-negativos, calcule e escreva a média aritmética dos
números dados.
(c) Dado um número real qualquer, calcule e escreva a terça parte do número dado.
(d) Dados o termo inicial e a razão de uma PA, bem como um número inteiro positivo
n, calcule e escreva o valor do n-ésimo termo dessa PA.
(e) Escreva um algoritmo para ler o valor de uma temperatura em graus centrígados e
escrever a mesma temperatura em graus Fahrenheit. Se c é o valor da temperatura
em graus centrígados, então a temperatura, f , em Fahrenheit é dada por
f =
9 · c+ 160
5
.
(f) Chico Bento deseja calcular o saldo atual de uma de suas aplicações 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 residência 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 sétimo do salário mín-
imo. Então, dados o valor do salário mínimo e a quantidade de quilowatts gasta na
residência 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 média, 12 km com um litro de gasolina.
Ele realizou uma viagem com seu carro e está interessado em saber quantos litros de
combustível o carro consumiu. Para tal, ele dispõe de duas informações: o tempo
gasto dirigindo e a velocidade média do carro. Escreva um algoritmo para calcular
quantos litros de combustível o carro de Chico Bento consumiu.
(i) Escreva um algoritmo para ler um valor de hora, em termos de três números inteiros,
hora, minuto e segundos, e calcular e escrever o número de segundos que se passou
desde o começo do dia até o valor da hora que foi fornecido como entrada para o
algoritmo.
(j) Dada uma centena, isto é, um número inteiro positivo da forma xyz tal que x é um
dígito de 1 a 9 e tanto y quanto z são dígitos de 0 a 9, calcule e escreva a unidade do
número dado.
Por exemplo, se o número dado é igual a 147, a solução do problema é 7. Observe
que a entrada do problema consiste de um único valor, que é um número inteiro
positivo representando uma centena, e não os três dígitos da centena.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
2.5 EXERCÍCIOS PROPOSTOS 11
2. Se você puder, escreva um algoritmo (ou seja, uma seqüência de instruções) para resolver
cada um dos problemas acima. Você nãoprecisa escrever as instruções na linguagem
do VISUALG, mas sim de forma livre, como na primeira seqüência de instruções que foi
dada para o problema da área do quadrado.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 3
TIPOS DE DADOS E VARIÁVEIS
3.1 Tipos de dados
Os dados manipulados por um algoritmo podem possuir natureza distinta, isto é, podem
ser números, letras, frases, etc. Dependendo da natureza de um dado, algumas operações
podem ou não fazer sentido quando aplicadas a eles. Por exemplo, não faz sentido falar em
somar duas letras. Para poder distinguir dados de naturezas distintas e saber quais operações
podem ser realizadas com eles, os algoritmos utilizam o conceito de tipo de dados.
O tipo de um dado define o conjunto de valores ao qual o dado pertence, bem como o con-
junto de todas as operações que podem atuar sobre qualquer valor daquele conjunto de valores.
Por exemplo, como veremos mais adiante, a linguagem que utilizaremos para descrever nos-
sos algoritmos possui o tipo de dado inteiro, que consiste no conjunto de todos os números
inteiros, denotado por Z, e todas as operações que podem ser aplicadas aos números inteitos
(isto é, adição, subtração, multiplicação, divisão inteira e resto).
A seguir, descrevemos os tipos de dados oferecidos pela linguagem Portugol do VISUALG.
Na nossa descrição, o nome de um tipo é escrito no formato tipo, assim como as demais palavras
reservadas da linguagem Portugol. Além disso, ao definirmos um dado tipo de dados, não
fornecemos uma descrição detalhada das operações que atuam sobre seus valores, pois tais
operações serão objetos de estudo das próximas aulas.
• inteiro: consiste dos números inteiros e das operações de adição, subtração, multipli-
cação, divisão inteira e resto. Na linguagem Portugol, os números inteiros são escritos
apenas como a concatenação dos dígitos 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, tal como em 5, 100 e
1678. Números negativos são representados com o sinal “−” na frente do número, tal
como −23.
• real: consiste dos números reais e das operações de adição, subtração, multiplicação,
divisão. Na linguagem Portugol, os números reais são caracterizados por possuírem uma
parte inteira e uma parte fracionária. Por exemplo, as partes inteira e fracionária do número
real 3.141596 são 3 e 141596, respectivamente. Note que um “ponto” e não uma vírgula é
usado para separar as partes inteira e fracionária.
Como sabemos, os números reais incluem os números inteiros. No entanto, para evitar
ambigüidades na escrita de algoritmos, assumimos que todo número escrito sem a parte
fracionária é do tipo inteiro. Por exemplo, 5 e 5.0 se referem ao mesmo número (cinco),
mas o primeiro é do tipo inteiro e o segundo, do tipo real. Assim como os números
inteiros negativos, números reais negativos são representados com o sinal “−” na frente
do número, tal como 3.141596.
12
3.2 VARIÁVEIS 13
caractere: consiste de um único símbolo ou de uma concatenação de símbolos do alfabeto
usado pela linguagem Portugol. Este alfabeto inclui todas as letras do alfabeto romano,
todos os dígitos, 0, 1, . . . , 9 e os caracteres de pontuação, tais como ?, ., . . ., entre muitos
outros símbolos. Os elementos do conjunto de valores do tipo caractere devem ser es-
critos, nos algoritmos, entre aspas duplas, como, por exemplo, "a”, "Esta e uma frase
formada por caracteres”. Há um elemento especial, “”, que é denominado de palavra
vazia, pois não possui nenhum símbolo.
• logico: inclui apenas os valores lógicos falso e verdadeiro e as operações de negação,
conjunção e disjunção. Nós estudaremos este tipo em maiores detalhes mais adiante.
3.2 Variáveis
Um algoritmo manipula dados, que podem ser dados variáveis ou constantes. Dados var-
iáveis são representados por variáveis, enquanto dados constantes são representados por con-
stantes1.
Uma variável 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 inúmeras vezes durante a execução do algoritmo. Em um ambiente computa-
cional de verdade, a caixa correspondente a uma variável é uma posição da memória do com-
putador.
Uma variável possui nome, tipo e conteúdo. O nome de uma variável deve ser único,
isto é, identificar, de forma única, a variável no algoritmo. O tipo de uma variável define os
valores que podem ser armazenados na variável. O conteúdo de uma variável é o valor que
ela armazena. É importante lembrar que uma variável só pode armazenar um valor de cada
vez. No entanto, ela pode assumir vários valores distintos do mesmo tipo durante a execução
do algoritmo.
O ato de se criar uma variável é conhecido como declaração de variável.
Na linguagem Portugol, declararamos uma variável usando uma sentença da seguinte
forma:
var nome : tipo
onde nome é o nome da variável e tipo é o tipo da variável.
Por exemplo, a sentença
var lado : real
declara uma variável de nome lado do tipo real.
Podemos declararmais de uma variável domesmo tipo emumamesma linha. Por exemplo,
var lado, area : real
1Não discutiremos constantes neste momento.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.2 VARIÁVEIS 14
Note que nenhum conteúdo (isto é, valor) foi associado à variável durante a sua declaração.
Esta associação é denominada definição e deve ser realizada após a declaração da variável
usando uma instrução de leitura ou um comando de atribuição. Vamos detalhar essas duas
formas.
A instrução de leitura tem a forma
leia ( nome )
onde nome é o nome de uma variável. Por exemplo,
leia ( lado )
é uma instrução de leitura que atribui um valor à variável lado. O valor atribuído pela in-
strução deve ser fornecido como entrada para o algoritmo durante a sua execução. Para você
ter uma idéia mais concreta do que estamos falando, demonstraremos, em sala de aula, a exe-
cução da instrução de leitura do comprimento dos lados de um quadrado que escrevemos para
o Algoritmo 2.1.
A instrução de atribuição possui a forma
nome <- valor
onde nome é o nome de uma variável e valor é um valor do mesmo tipo de dados da variável.
Por exemplo,
lado <- 2.5
atribui o valor 2.5 à variável de nome lado. Para que uma instrução de atribuição faça sentido,
a variável lado deve ser do tipo real e deve ter sido declarada antes da instrução de atribuição
ser executada.
O símbolo <- é conhecido como operador de atribuição.
Muitas vezes, o valor atribuído a uma variável através de uma instrução de atribuição é
resultante de uma expressão aritmética ou outro tipo de expressão que estudaremosmais adiante.
Por exemplo,
area <- lado * lado
é uma instrução de atribuição que atribui o valor da variável lado ao quadrado à variável area.
O que vemos no lado direito do operador de atribuição, lado * lado, é um exemplo de expressão
aritmética.
Um valor atribuído a uma variável permanece associado a ela até que uma instrução de
atribuição, que o substitua por outro, seja executada. Em qualquer dado instante de tempo
durante a execução de um algoritmo, o valor armazenado emuma qualquer variável (se algum)
é denominado valor atual (ou valor corrente) da variável. Enquanto não atribuirmos um valor
a uma variável, a variável permanecerá com valor desconhecido. Finalmente, é importante
lembrar que uma variável só poderá receber uma valor através de uma instrução de leitura ou
atribuição.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.3 EXEMPLOS 15
3.3 Exemplos
Seguem abaixo alguns exemplos de declaração de variáveis:
var fruta : caractere
var letra : caractere
var resultado : logico
var altura : real
var idade : inteiro
A seguir, temos exemplos de instruções de atribuição que atribuem valores a essas var-
iáveis:
fruta <- "maçã"
letra <- "c"
resultado <- falso
altura <-1.83
idade <- 5
As mesmas variáveis podem ter valores atribuídos a elas através de instruções de leitura
como segue:
leia ( fruta )
leia ( letra )
leia ( altura )
leia ( idade )
Note que não escrevemos uma instrução de leitura para a variável resultado. Isto se deve ao
fato de instruções de leitura não poderem ser aplicadas a variáveis do tipo logico.
3.4 Nomes de variáveis
Na linguagem Portugol, usamos as seguintes regras para criar um nome de variável:
1. Nomes de variáveis devem possuir como primeiro caractere uma letra ou o símbolo ’_’
(sublinhado). Os demais caracteres, se algum, devem ser letras, números ou sublinhado.
2. Nomes de variáveis não podem ser iguais a palavras reservadas.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.4 NOMES DE VARIÁVEIS 16
3. Nomes de variáveis podem ter, no máximo, 127 caracteres.
4. Não há diferença entre letras maiúsculas e minúsculas em nomes de variáveis.
De acordo com a regra 1, nomes de variáveis não podem conter espaços em branco. De
acordo com a regra 2, nomes de variáveis não podem ser palavras reservadas da linguagem
Portugol. Uma palavra reservada é uma palavra que possui um significado especial para a
linguagem Portugol. Em geral, uma palavra reservada identifica uma instrução. Neste texto,
tais palavras aparecem sublinhas. O conjunto de palavras reservadas do Portugol é mostrado
na Tabela 3.1.
aleatorio e grauprad passo
abs eco inicio pausa
algoritmo enquanto int pi
arcos entao interrompa pos
arcsen escolha leia procedimento
arctan escreva literal quad
arquivo exp log radpgrau
asc faca logico raizq
ate falso logn rand
caractere fimalgoritmo maiusc randi
caso fimenquanto mensagem repita
compr fimescolha minusc se
copia fimfuncao nao sen
cos fimpara numerico senao
cotan fimprocedimento numpcarac timer
cronometro fimrepita ou tan
debug fimse outrocaso var
declare funcao para verdadeiro
xou
Tabela 3.1: Palavras reservadas da linguagem Portugol.
Por exemplo,
_12234, fruta e x123
são nomes válidos para variáveis, mas
maria bonita, pi, fru?ta e 1xed
não são. O nome maria bonita contém um espaço em branco. O nome pi é uma palavra reser-
vada. O nome fru?ta contém um caractere que não é letra, número nem sublinhado, ?. O nome
1xed inicia com um número. Com exceção de pi, que viola a regra 2, os demais nomes violam a
regra 1.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.5 EXERCÍCIOS RESOLVIDOS 17
3.5 Exercícios Resolvidos
1. Escreva a declaração de uma variável do tipo real de nome x.
solução:
var x : real
2. Escreva a declaração de uma variável do tipo caractere de nome carro.
solução:
var carro : caractere
3. Escreva a instrução de atribuição que atribui o valor 2.3 à variável do problema 1.
solução:
x <- 2.3
4. Escreva a instrução de atribuição que atribui o valor "corsa" à variável do problema 2.
solução:
carro <- "corsa"
5. Quais dos seguintes nomes são válidos como nomes de variáveis?
(a) xyz_2
(b) _
(c) ____
(d) x123
(e) 123y
(f) 1_2
solução:
(a), (b), (c) e (d).
3.6 Exercícios propostos
1. Escreva a declaração de uma variável do tipo caractere de nome rua.
2. Escreva a instrução de atribuição que atribui o nome de sua rua à variável do problema
1.
3. Escreva a declaração de uma variável do tipo logico de nome achou.
4. Escreva a instrução de atribuição que atribui a palavra reservada verdadeiro à variável
do problema 3.
5. Quais dos seguintes nomes são válidos como nomes de variáveis?
(a) meucarro
(b) salute!
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
3.6 EXERCÍCIOS PROPOSTOS 18
(c) x_y_1
(d) ___
(e) 34
6. Escreva o tipo de dado ideal para se representar cada uma das seguintes informações:
(a) O nome de uma rua
(b) A data de nascimento de uma pessoa
(c) Se uma pessoa é diabética ou não
(d) O saldo de uma conta bancária
(e) O resultado de uma operação de raiz quadrada
7. Identifique o tipo de dados dos seguintes valores:
(a) "9 de agosto de 1968"
(b) 1.3
(c) falso
(d) −31
(e) "?"
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 4
ENTRADA E SAÍDA
4.1 Instruções de entrada e saída
Todo algoritmo necessita de uma forma de obtenção dos dados de entrada do problema,
assim como uma forma de comunicação da saída por ele produzida. Para tal, os algoritmos
contam com instruções de entrada e saída. Na linguagem Portugol, a instrução de leitura é leia
e a instrução de saída é escreva. Como vimos na aula anterior, a instrução de leitura requer o
nome de uma variável para armazenar o dado de entrada a ser obtido.
Por exemplo,
leia( lado )
onde lado é o nome de uma variável. Quando a instrução acima é executada, o valor lido passa
a ser o conteúdo de lado. Logo, para acessar o valor lido, basta usarmos o nome da variável. É
importante lembrar que a variável tem de ser declarada antes de seu uso pela instrução de
leitura.
A instrução de escrita, na linguagem Portugol, é denominada escreva. Esta instrução tam-
bém requer um argumento, que corresponde ao valor a ser escrito como saída. Este valor pode
ser o conteúdo de uma variável ou uma constante do tipo inteiro, real ou caractere.
Por exemplo,
escreva( lado )
escreve como saída o valor da variável de nome lado.
É interessante frisar que a instrução de escrita não é usada apenas para escrever o resultado
do algoritmo, mas sim para escrever qualquer informação que auxilie a comunicação entre o
algoritmo e o “mundo exterior”. Por exemplo, é comum escrevermos uma mensagem antes de
uma instrução de leitura. Esta mensagem, em geral, é uma descrição muito sucinta do valor
que o algoritmo espera receber do “mundo exterior” para atribuir à variável na instrução de
leitura.
Por exemplo, a instrução
escreva( "Entre com o comprimento dos lados do quadrado: ")
pode preceder a instrução
leia( lado )
para indicar ao “mundo exterior” que o algoritmo espera um valor correspondente ao com-
primento dos lados de um quadrado. A mensagem “Entre com o comprimento dos lados do
19
4.2 A ESTRUTURA DE UM ALGORITMO 20
quadrado: ” é um valor constante, ou seja, um valor do conjunto de valores do tipo caractere.
Quando a instrução de escrita acima é executada, a saída correspondente é a sentença entre
aspas duplas:
Entre com o comprimento dos lados do quadrado:
O uso da instrução de escrita para emitir mensagens é motivado pelo fato de um programa
de computador, em geral, interagir com o ser humano durante sua execução; isto é, o “mundo
exterior” é, em geral, um humano. Mais especificamente, é bastante comum que a entrada de
um programa seja fornecida por um ser humano. Neste caso, as mensagens de saída têm como
objetivo auxiliar a comunicação entre o programa e o ser humano, que é conhecido por usuário.
Em um ambiente de programação típico, as mensagens de saída aparecem em um monitor de
vídeo e os dados de entrada são fornecidos ao programa por meio de um teclado ou mouse.
4.2 A estrutura de um algoritmo
Um algoritmo escrito em Portugol pode ser tipicamente dividido nas seguintes partes:
• A linha de cabeçalho, que é a primeira linha do algoritmo, contém a palavra
algoritmo
seguida por um texto que identifica o algoritmo.
• A declaração de variáveis, que é a seção em que as variáveis são declaradas, é iniciada
pela palavra var e seguida por uma ou mais declarações de variáveis.
• O corpo do algoritmo, que contém as instruções que, de fato, fazem o “trabalho” descrito
pelo algoritmo.
O corpo do algoritmo se inicia com a palavra
inicio
• A linha final, que é obrigatoriamente a última linha do algoritmo, contém a palavra
fimalgoritmo
que especifica o término do algoritmo.
Os algoritmos escritos na linguagem Portugol também possuem algumas particularidades
que os tornam mais clarose mais fáceis de serem lidos e entendidos. As principais característi-
cas são:
• Cada instrução do algoritmo é escrita em uma linha dedicada apenas à instrução.
• As declarações de variáveis e o conteúdo do corpo do algoritmo são identados com relação
à linha de cabeçalho e a linha final. Além disso, pode ser que haja linhas em “branco”
entre uma seqüência de linhas. Essas linhas em branco servem para separar partes do
algoritmo que estão menos relacionadas.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.2 A ESTRUTURA DE UM ALGORITMO 21
• O algoritmo pode conter comentários. Comentários são linhas não “executáveis”, ou seja,
elas não fazem parte do processo de produção da saída do algoritmo e servem apenas
para nos auxiliar na leitura e entendimento da solução do algoritmo. As linhas de co-
mentário se iniciam obrigatoriamente com o símbolo //.
O Algoritmo 4.1 lê o valor de uma variável, denominada num, e escreve este mesmo valor
como saída.
Algoritmo 4.1: Algoritmo para ler um numero inteiro e escrever o valor lido.
1 //
2 // Este algoritmo exemplifica as instrucoes de entrada e saida
3 //
4 algoritmo "Leitura e escrita"
5 var
6 //
7 // Secao de declaracao de variaveis
8 //
9 num : inteiro
10 inicio
11 // Escreve uma mensagem para indicar o que deve ser lido pelo algoritmo
12 escreva ( "Entre com um numero inteiro: " )
13
14 // Realiza a leitura de um numero inteiro e o associa a uma variavel
15 leia ( num )
16
17 // Escreve o valor do numero lido
18 escreva ( "O numero que voce forneceu foi: " , num )
19 fimalgoritmo
Alguns comentários sobre o algoritmo acima:
• O nome do algoritmo foi escrito cercado por aspas duplas:
algoritmo “Leitura e escrita”
• Devemos declarar uma variável para cada dado de entrada. No problema computacional
acima, a entrada consiste apenas de um número inteiro. Logo, declaramos apenas uma
variável para a entrada do problema: num.
• A instrução de saída foi utilizada para emitir uma mensagem,
escreva ( “Entre com um numero inteiro: ” )
e para escrever a saída do algoritmo:
escreva ( “O numero que voce forneceu foi: ” , num )
Note que a linha acima possui dois “dados” separados por vírgula. O primeiro é a men-
sagem e o segundo é a variável num. Neste caso, os dados são escritos no dispositivo de
saída em uma mesma linha, separados por um espaço e sem a vírgula.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.3 EXERCÍCIOS RESOLVIDOS 22
4.3 Exercícios resolvidos
1. Considere o Algoritmo 4.2 para ler e escrever um número e uma palavra:
Algoritmo 4.2: Algoritmo para ler um numero e uma palavra e escrever ambos.
1 //
2 // Este algoritmo le e escreve um numero e uma palavra
3 //
4 algoritmo "Leitura e escrita de numero e palavra"
5 var
6 //
7 // Secao de declaracao de variaveis
8 //
9 num : inteiro
10 pal : caractere
11 inicio
12 // Escreve uma mensagem para solicitar um numero
13 escreva ( "Entre com um numero inteiro: " )
14
15 // Realiza a leitura de um numero inteiro e o atribui a uma variavel
16 leia ( num )
17
18 // Escreve uma mensagem para solicitar uma palavra
19 escreva ( "Entre com uma palavra: " )
20
21 // Realiza a leitura de uma palavra e a atribui a uma variavel
22 leia ( pal )
23
24 // Escreve numero e palavra lidos
25 escreva ( "O numero e a palavra fornecidos foram: " , num , " e ", pal )
26 fimalgoritmo
Então, responda:
(a) Quais são os dados de entrada do algoritmo?
(b) Qual(is) é(são) a(s) variável(is) que armazena(m) o(s) valor(es) de entrada?
(c) Se fornecermos o o número inteiro 5 e a palavra “algoritmo” como entrada para o
algoritmo, o que o algoritmo escreve como saída?
solução:
1. (a) Um número inteiro e uma palavra.
(b) num e pal.
(c) O numero e a palavra fornecidos foram: 5 e algoritmo
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
4.4 EXERCÍCIOS PROPOSTOS 23
4.4 Exercícios propostos
1. Escreva um algoritmo para ler um número real e uma letra e escrever o número e a letra
lidos.
2. Use a ferramenta VISUALG para executar o algoritmo que você escreveu para o problema
anterior.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 5
EXPRESSÕES ARITMÉTICAS – PARTE 1
5.1 Operadores aritméticos
Os operadores aritméticos definem as operações aritméticas que podem ser realizadas sobre
os números inteiros e reais. Para os inteiros, as operações aritméticas são a adição, subtração,
multiplicação e resto. Para os números reais, as operações aritméticas são a adição, subtração,
multiplicação e divisão. Nesta aula, restringiremos nossa atenção aos números inteiros apenas.
Na linguagem Portugol, os operadores aritméticos correspondentes às operações definidas so-
bre os inteiros são
• + (adição)
• − (subtração ou menos unário)
• ∗ (multiplicação)
• \ (divisão inteira)
• % (resto – aplicado apenas aos valores inteiros).
Com os operadores acima, podemos escrever expressões aritméticas que envolvem constantes
e variáveis inteiras. Por exemplo, suponha que a, b e c sejam variáveis do tipo inteiro. Então,
temos que
a+ b+ c, a− b ∗ c%2, e − 5 + 3 ∗ 8 \ 2
são todas expressões aritméticas válidas na linguagem Portugol.
Nos exemplos acima, tivemos o cuidado de usar operandos do mesmo tipo. A razão para
tal é que, por definição, cada operador aritmético atua sobre valores de um mesmo tipo e o
resultado da operação deve sempre ser um valor do mesmo tipo dos operandos. Logo, não
faz sentido escrevermos algo como a + 2 quando a é uma variável ou constante do tipo real,
pois existe uma ambigüidade em relação ao resultado da operação. No entanto, como veremos
mais adiante, podemos definir regras semânticas associadas aos operadores que nos permitem
interpretar, de forma única, o resultado da operação aritmética correspondente. Tais regras nos
permitirão escrever expressões aritméticas envolvendo variáveis e constantes dos tipos inteiro
e real.
24
5.2 PRECEDÊNCIA DE OPERADORES 25
5.2 Precedência de operadores
Qual é o valor da expressão aritmética
5 ∗ 3%2 ?
Podemos dizer que o valor da expressão é igual a 1, se avaliarmos 5 ∗ 3 primeiro e, depois,
15%2, ou podemos dizer que é igual a 5 se avaliarmos 3%2 primeiro e, depois, 5 ∗ 1. As duas
respostas são igualmente válidas. No entanto, como não podemos permitir ambigüidades em
algoritmos, devemos definir regras de precedência de operadores, que são regras para definir a
ordem em que os operadores aritméticos que vimos são aplicados em uma expressão aritmética
qualquer.
Na linguagem Portugol, os operadores possuem prioridades associadas com eles. A op-
eração associada a um operador com prioridade p é sempre executada antes da operação as-
sociada a um operador com prioridade q sempre que p > q. Quando p = q, a operação cor-
respondente ao operador mais à esquerda é executado. O operador de maior prioridade é o
menos unário, −. Em seguida, temos os operadores ∗, \ e %. Finalmente, com a prioridade
mais baixa, temos os operadores + e −, onde + e − são os operadores de adição e subtração,
respectivamente. A Tabela 5.1 resume essas prioridades.
Operador Símbolo Prioridade
menos unário − mais alta
multiplicação, divisão inteira e resto ∗, \ e% ↑
adição e subtração +, − mais baixa
Tabela 5.1: Operadores aritméticos sobre os inteiros e suas prioridades.
Por exemplo, em
a+ b+ c ,
a operação a+ b é realizada e, em seguida, o resultado dela é adicionado ao valor de c, pois os
operadores possuem a mesma prioridade e, portanto, as operações são realizadas da esquerda
para a direita.
Na expressão aritmética
a− b ∗ c%2 ,
a operação b ∗ c é efetuada primeiro e, em seguida, o resto da divisão de b ∗ c por 2 é calculado.
Finalmente, o resto é subtraído de a. Note que a multiplicação foi efetuada antes da divisão,
pois os operadores ∗ e% possuem a mesma prioridade, mas ∗ está maisà esquerda.
Uma boa forma de se familiarizar com os operadores aritméticos e as regras de precedência
é escrevendo algoritmos para escrever o resultado de expressões aritméticas. O Algoritmo 5.1
calcula e escreve, usando a instrução escreval, o resultado de expressões envolvendo números
inteiros. A instrução escreval faz o mesmo que a instrução escreva, mas gera um “salto de
linha” após a escrita. Um algoritmo mais interessante, o Algoritmo 5.2, recebe, como entrada,
três inteiros quaisquer e calcula e escreve o resultado de algumas expressões aritméticas envol-
vendo os inteiros lidos.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.3 ALTERAÇÃO DE PRIORIDADES 26
5.3 Alteração de prioridades
Algumas vezes é desejável alterar a ordem (imposta pelas regras de precedência) segundo
a qual as operações são realizadas em uma expressão aritmética. Para tal, fazemos uso de
parênteses. Por hipótese, todo operador possui prioridade mais baixa do que a dos parênteses.
Isto garante que os operandos correspondentes ao valor das expressões entre parênteses se-
jam calculados antes de serem usados pelos demais operadores. É importante destacar que os
parênteses devem ocorrer em pares (um aberto e um fechado) nas expressões e podem ocorrer
“aninhados” em diversos níveis.
Algoritmo 5.1: Algoritmo para calcular algumas expressões aritméticas envolvendo números
inteiros.
1 algoritmo "Calculo de expressoes aritmeticas"
2
3 inicio
4 escreval( "O resultado da expressao 5 * 3 % 2 e: ", 5 * 3 % 2 )
5
6 escreval( "O resultado da expressao -5 * 3 % 2 \ 8 e: ", -5 * 3 % 2 \ 8 )
7
8 escreval( "O resultado da expressao -5 - 3 - 6 * 3 e: ", -5 - 3 - 6 * 3 )
9
10 fimalgoritmo
Por exemplo, na expressão
(a− b) ∗ (c%2) ,
a operação a − b é realizada primeiro. Em seguida, a operação c%2 é realizada e, por último,
a multiplicação dos resultados das duas operações anteriores entre os parênteses é realizada.
Mas, como sabemos disso? A idéia é imaginar as expressões entre parênteses como operandos
a serem “descobertos”. Com isso emmente, a expressão acima pode ser imaginada como tendo
a forma
op1 ∗ op2 ,
onde op1 e op2 são as expressões (a − b) e (c%2). Então, o que temos é uma simples mul-
tiplicação de dois valores, op1 e op2. No entanto, para que esta multiplicação seja realizada,
precisamos dos valores op1 e op2. Para tal, assumimos que o valor, op1, à esquerda do operador
de multiplicação, ∗, será obtido antes do valor, op2, à direita dele. Para calcular op1, avaliamos
a expressão
a− b ,
que se encontra dentro do parênteses. Neste momento, descobrimos que a subtração a − b
é a primeira operação aritmética realizada. Uma vez que o valor op1 tenha sido descoberto,
avaliamos
c%2 ,
que é a expressão correspondente ao valor op2. Neste momento, descobrimos que a operação
de resto de divisão, c%2, é a segunda operação aritmética realizada. Neste momento, dispomos
dos valores op1 e op2 e, portanto, podemos realizar a multiplicação op1 ∗ op2, que passa a ser
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.3 ALTERAÇÃO DE PRIORIDADES 27
a terceira operação realizada. Logo, os operadores são aplicados na ordem −, % e ∗. Usamos a
notação
(a−1 b) ∗3 (c%2 2)
para indicar este fato. Isto é, os operadores possuem índices que indicam a ordem em que são
aplicados.
Algoritmo 5.2: Algoritmo para calcular algumas expressões aritméticas com variáveis inteiras.
1 algoritmo "Expressoes aritmeticas envolvendo variaveis e constantes"
2 var
3 a , b , c : inteiro
4 inicio
5 escreva( "Entre com o valor da variavel a: " )
6 leia( a )
7
8 escreva( "Entre com o valor da variavel b: " )
9 leia( b )
10
11 escreva( "Entre com o valor da variavel c: " )
12 leia( c )
13
14 escreval( "O resultado da expressao a * b % c e: ", a * b % c )
15
16 escreval( "O resultado da expressao -a * b % c * 8 e: ", -a * b % c * 8 )
17
18 escreval( "O resultado da expressao -a - b - c * 3 e: ", -a - b - c * 3 )
19
20 fimalgoritmo
A expressão
((2 + 3)− (1 + 2)) ∗ 3− (3 + (3− 2))
é bem mais complexa do que a anterior, mas podemos determinar a ordem em que os oper-
adores são aplicados da mesma forma que antes. O primeiro passo é substituir as expressões
dentro dos parênteses por operandos a serem descobertos. Isto é feito para os parênteses mais
externos:
op1 ∗ 3 − op2 .
Agora, vemos que se os valores entre parênteses fossem conhecidos, haveria apenas duas op-
erações a serem realizadas: uma multiplicação e uma adição. A multiplição possui prioridade
sobre a adição e ela precisa do valor op1 para ser realizada. Então, considere a expressão corre-
spondente a op1:
(2 + 3)− (1 + 2) .
Esta expressão contém outras expressões dentro de parênteses e, assim como antes, ela pode
ser vista como
op3 − op4 .
onde op3 e op4 correspondem às expressões 2 + 3 e 1 + 2, respectivamente. Para realizarmos
a operação de subtração acima, precisamos dos valores op3 e op4. Por estar à esquerda do
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.4 A INSTRUÇÃO DE ATRIBUIÇÃO 28
operador, o valor op3 é descoberto primeiro. Isto implica que a primeira operação realizada é a
adição
2 + 3
e a próxima é a adição
1 + 2 .
Em seguida, temos a subtração op3 − op4:
(2 + 3)− (1 + 2) .
Depois que a subtração acima for realizada, o valor op1 se torna conhecido e, consequente-
mente, a multiplicação op1 ∗ 3 pode ser realizada, tornando-se a quarta operação realizada. O
resultado desta operação é o primeiro operando disponível da subtração em op1 ∗ 3 − op2.
Mas, esta subtração não pode ser efetuada antes do valor op2 ser conhecido, ou seja, antes da
expressão
3 + (3− 2)
ser avaliada. Assim como fizemos antes, podemos imaginar a expressão acima tendo a forma
3 + op5 ,
onde op5 é o valor da expressão, 3 − 2, entre parênteses. A adição na expressão acima precisa
do valor op5 para ser realizada. Isto significa que a subtração 3 − 2 é a quinta operação real-
izada. Depois dela, a adição 3 + op5 é realizada, tornando-se a sexta operação realizada. Logo
em seguida, o valor op2 se torna conhecido, o que possibilita a realização da sétima e última
operação, que é a subtração em op1 ∗ 3 − op2. Usando a notação de subscrito, temos a seguinte
ordem:
((2 +1 3)−3 (1 +2 2)) ∗4 3−7 (3 +6 (3−5 2)) .
5.4 A instrução de atribuição
Quando utilizamos expressões aritméticas em nossos algoritmos, necessitaremos, muito
freqüentemente, armazenar o valor da expressão em uma variável. Como vimos na Aula 3, a
atribuição de um valor a uma variável pode ser realizada através da instrução de leitura leia
ou do operador de atribuição <-. A instrução leia é usada apenas quando o valor a ser atribuído
à variável é fornecido como entrada para o algoritmo. Como o valor que queremos atribuir à
variável é resultante da avaliação de uma expressão aritmética, devemos usar o operador de
atribuição.
Por exemplo, suponha que o resultado da expressão
5 ∗ %2
deva ser atribuído a uma variável inteira de nome resultado. Então, a atribuição pode ser real-
izada da seguinte forma:
resultado<- 5 ∗ %2
Para um exemplo mais concreto do uso do operador de atribuição, considere o Algo-
ritmo 5.3, que lê dois números inteiros, calcula o quadrado da soma dos dois números lidos,
atribui o resultado a uma variável inteira, usando o operador <-, e escreve o valor da variável.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.5 EXERCÍCIOS RESOLVIDOS 29
5.5 Exercícios resolvidos
1. Considere a expressão polinomial
5x3 + 7x2 − 3x− 1 ,
onde x é uma variável. Escreva a expressão acima usando a linguagem Portugol.
solução:
5 ∗ x ∗ x ∗ x+ 7 ∗ x ∗ x− 3 ∗ x− 1 .
2. Avalie a seguinte expressão aritmética de acordo com as regras de precedência da lin-
guagem Portugol:
2− 3 ∗ 5
solução:
2− 3 ∗ 5 = 2− 15 = −13 .
Algoritmo 5.3: Algoritmo para calcularo quadrado da soma de dois inteiros.
1 algoritmo "Quadrado da soma de 2 inteiros"
2 var
3 a , b , quadrado : inteiro
4 inicio
5 escreva( "Entre com o primeiro inteiro: " )
6 leia( a )
7
8 escreva( "Entre com o segundo inteiro: " )
9 leia( b )
10
11 quadrado <- ( a + b ) * ( a + b )
12
13 escreva ( "O quadrado da soma dos inteiros lidos e: " , quadrado )
14 fimalgoritmo
5.6 Exercícios propostos
1. Escreva a expressão abaixo usando a linguagem Portugol:
x0 + v · t
2. Avalie a seguinte expressão aritmética de acordo com as regras de precedência da lin-
guagem Portugol:
(2− 3) ∗ 5
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
5.6 EXERCÍCIOS PROPOSTOS 30
3. Suponha que a linha 11 do Algoritmo 5.3 seja substituída por
quadrado<- a + b ∗ a + b
Você acha que o algoritmo continuará correto? Justifique sua resposta.
4. Suponha que a linha 11 do Algoritmo 5.3 seja substituída pelas duas seguintes linhas:
quadrado<- a + b
quadrado<- quadrado ∗ quadrado
Você acha que o algoritmo continuará correto? Justifique sua resposta.
5. Escreva um algoritmo, usando a linguagem Portugol, para ler dois números inteiros, cal-
cular o cubo da soma desses dois números e escrever o resultado calculado como saída.
6. Implemente o algoritmo anterior usando a ferramenta VISUALG.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 6
PROVA DE AVALIAÇÃO DE
CONHECIMENTO PRÉVIO
Essa aula será dedicada à aplicação de uma prova de conhecimento prévio. A prova tem por
objetivo avaliar conhecimentos básicos de matemática e raciocínio lógico adquiridos no ensino
fundamental e médio, 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 não prejudicará quem não a fizer ou apresentar um desempenho
baixo.
31
AULA 7
EXPRESSÕES ARITMÉTICAS – PARTE 2
7.1 Operadores aritméticos sobre os reais
Como vimos na aula anterior, os operadores aritméticos definem as operações aritméticas
que podem ser realizadas sobre os números inteiros e reais. Já estudamos os operadores ar-
itméticos que atuam sobre os inteiros e, nesta aula, estudaremos aqueles que atuam sobre os
reais:
• + (adição).
• − (subtração ou menos unário).
• ∗ (multiplicação).
• / (divisão).
Observe que os três primeiros operadores são comuns aos reais e inteiros. Observe também
que o operador de divisão, /, está definido apenas para os reais. Por sua vez, o operador de
resto, %, está definido apenas para os inteiros. A Tabela 7.1 lista os operadores aritméticos
sobre os reais e suas respectivas prioridades. Ao escrevermos expressões aritméticas, podemos
alterar a prioridade desses operadores com o uso de parênteses da mesma forma que vimos
antes.
Operador Símbolo Prioridade
menos unário − mais alta
multiplicação e divisão ∗, / ↑
adição e subtração +, − mais baixa
Tabela 7.1: Operadores aritméticos sobre os reais e suas prioridades.
Por exemplo, considere a expressão
3a+ 2b
c− a− 1
1 +
a+ b
2c
,
onde a, b e c são variáveis. Na linguagem Portugol, a expressão acima pode ser escrita como
segue:
(3.0 ∗ a+ 2.0 ∗ b) / (c− (a− 1.0) / (1.0 + (a+ b) / (2.0 ∗ c))) .
32
7.2 REGRAS SEMÂNTICAS 33
É importante notar que todos os parênteses são necessários para que a expressão, na lin-
guagem Portugol, seja equivalente à expressão aritmética dada. Abaixo, indicamos, com
índices nos operadores, a ordem em que as operações da expressão são executadas quando
a expressão é 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 expressão acima para quaisquer valores de a, b e c
fornecidos como entrada. O valor da expressão é atribuído a uma variável antes de ser escrito
como saída.
Algoritmo 7.1: Algoritmo para calcular expressão aritméticas com variáveis reais.
1 algoritmo "Expressoes aritmeticas com variaveis e constantes reais"
2 var
3 a , b , c , res : real
4 inicio
5 escreva( "Entre com o valor da variavel a: " )
6 leia( a )
7
8 escreva( "Entre com o valor da variavel b: " )
9 leia( b )
10
11 escreva( "Entre com o valor da variavel c: " )
12 leia( c )
13
14 res <- ( 3.0 * a + 2.0 * b ) /
15 ( c - ( a - 1.0 ) / ( 1.0 + ( a + b ) /
16 ( 2.0 * c ) ) )
17
18 escreva ( "O resultado da expressao e: ", res )
19 fimalgoritmo
7.2 Regras semânticas
Na expressão
(3.0 ∗ a+ 2.0 ∗ b) / (c− (a− 1.0) / (1.0 + (a+ b) / (2.0 ∗ c))) ,
as constantes foram escritas com números reais e as variáveis são todas do tipo real. Logo,
cada operador aritmético atuará sobre dois valores reais e produzirá outro valor real. No en-
tanto, é possível, na linguagem Portugol, escrevermos expressões aritméticas que envolvam
constantes e variáveis dos tipos inteiro e real. Para que tais expressões façam “sentido”, defin-
imos a seguinte regra semântica: se os dois operandos de um operador binário possuem tipos
distintos (um é do tipo inteiro e o outro, do tipo real), o valor do tipo inteiro é convertido para
o valor do tipo real equivalente. Logo, a operação é executada sobre dois valores reais e o
resultado é um valor do tipo real.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.3 UM ALGORITMO ENVOLVENDO CONSTANTES E VARIÁVEIS REAIS 34
Por exemplo, na expressão
(a− b) ∗ (c / 2) ,
se as variáveis a, b e c são do tipo real, o inteiro 2 é convertido (automaticamente) para o real 2.0
imediatamente antes da operação de divisão ser executada. Em outras palavras, na linguagem
Portugol, a expressão acima é equivalente à expressão:
(a− b) ∗ (c / 2.0) .
De maneira geral, o operador de divisão, /, pode ser utilizado para dividir valores inteiros.
Por exemplo,
5 / 2
é igual ao valor real 2.5. Na expressão acima, não há nenhuma constante ou variável do tipo
real. Mas, mesmo assim, os valores inteiros, que são operandos do operador /, são conver-
tidos para os valores reais equivalentes antes da operação de divisão ser efetuada. Logo, nós
podemos dividir dois inteiros usando /, mas o resultado da divisão é um valor do tipo real
e não inteiro. Quando desejarmos realizar a divisão inteira dos dois inteiros, devemos usar o
operador \.
Um outro aspecto importante das expressões aritméticas envolvendo valores inteiros e reais
é a precedência de operadores. O que acontece se a expressão contiver os operadores / e %?
Como sabemos, o operador% só pode ser aplicado a inteiros. Mas, nada impede que ele ocorra
em uma expressão aritmética que envolva inteiros e o operador /. Por exemplo, considere a
expressão
5%2 / 2 .
Na linguagem Portugol, o operador % possui prioridade igual a do operador /. Logo, a oper-
ação 5%2 é realizada primeiro, produzindo o inteiro 1 como resultado. Em seguida, a operação
1 / 2 é realizada. Isto significa que os valores inteiros serão convertidos (automaticamente) para
valores reais equivalentes e a divisão será executada, gerando o valor 0.5. Bem, e se a expressão
fosse
5 / 2%2 ?
Neste caso, a divisão 5 / 2 é a primeira operação realizada, gerando o número real 2.5 como
resultado. Em seguida, a operação 2.5%2 deve ser realizada. Mas, como o operador % não
pode atuar sobre números reais, a operação 2.5%2 não pode ser realizada. Você poderia imag-
inar que o número 2.5 seria convertido em um número inteiro (por arredondamento ou trunca-
mento), de modo que a operação pudesse ser efetuada. Na linguagem Portugol, nenhum valor real
pode ser automaticamente convertido em um valor inteiro. Isto significa que a segunda expressão
aritmética acima é inválida na linguagem Portugol. A ferramenta VISUALG acusará um erro se
tentarmos utilizar esta expressão em um algoritmo (verifique!). Em uma aula futura, veremos
uma função da linguagem Portugol que nos permitirá obter a parte inteirade um um valor real
qualquer.
7.3 Um algoritmo envolvendo constantes e variáveis reais
Considere o problema de desenvolver um algoritmo para determinar o volume, V , de uma
esfera a partir do raio, r, da esfera. Como sabemos, a relação entre os valores V e r é dada pela
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.4 EXERCÍCIOS RESOLVIDOS 35
fórmula
V =
4
3
· pi · r3 . (7.1)
O nosso algoritmo deve ler o valor do raio r da esfera, calcular o valor de V e escrever este
valor como saída. Para calcular o valor de V , nosso algoritmo pode se utilizar da fórmula em
Eq. (7.1). Uma das particularidades da fórmula é que ela utiliza a constante pi. Para lidar com
situações como essa, a linguagem Portugol possui uma palavra reservada, chamada pi, que
representa a constante pi. Logo, na linguagem Portugol, a fórmula acima pode ser escrita como
segue:
(4 / 3) ∗ pi ∗ raio ∗ raio ∗ raio ,
onde assumimos que raio é o nome da variável que representa o raio r da esfera. Se a linguagem
Portugol não nos fornecesse a constante pi, poderíamos escrever uma expressão para a fórmula,
tal como
(4 / 3) ∗ 3.141596 ∗ raio ∗ raio ∗ raio ,
que se utiliza de um valor aproximado para o número pi. No entanto, o uso da palavra pi é
mais recomendado, pois ela faz com que a sintaxe da expressão resultante seja mais legível e
significante.
Uma vez que saibamos como escrever, na linguagem Portugol, a expressão arimética 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. Então, devemos declarar
uma variável, digamos raio, para representar o valor de r. Após calcularmos o valor do volume,
V , da esfera usando a fórmula em Eq. (7.1), atribuimos este valor a uma outra variável, digamos
volume, que precisa ser declarada também. As duas variáveis do algoritmo são do tipo real.
Finalmente, escreveremos o valor da variável volume como saída. O algoritmo resultante é o
Algoritmo 7.2.
Algoritmo 7.2: Algoritmo para calcular o volume da esfera.
1 algoritmo "Volume da esfera"
2 var
3 raio, volume : real
4 inicio
5 escreva( "Entre com o valor do raio da esfera: " )
6 leia( raio )
7
8 volume <- ( 4 / 3 ) * pi * raio * raio * raio
9
10 escreva ( "O volume da esfera de raio " , raio , " e " , volume )
11 fimalgoritmo
7.4 Exercícios resolvidos
1. Escreva a seguinte expressão aritmética usando a linguagem Portugol e indique a ordem
em que os operadores são aplicados na avaliação da expressão (use índices ao lado dos
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.5 EXERCÍCIOS PROPOSTOS 36
operadores):
1
1 +
1
1 + a
.
Assuma que a é uma variável do tipo real.
solução:
A expressão escrita em Portugol é a seguinte:
1 / (1 + (1 / 1/(1 + a)))
Você também poderia ter escrito
1.0 / (1.0 + (1.0 / 1.0/(1.0 + a)))
A ordem de avaliação 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 retân-
gulo, determine a área do retângulo e escreva a área como saída.
solução:
Algoritmo 7.3: Algoritmo para calcular a área de um retângulo.
1 algoritmo "Area de um retangulo"
2 var
3 base, altura, area : real
4 inicio
5 escreva( "Entre com o comprimento da base do retangulo: " )
6 leia( base )
7
8 escreva( "Entre com o valor da altura do retangulo: " )
9 leia( altura )
10
11 area <- base * altura
12
13 escreva ( "A area do retangulo e " , area )
14 fimalgoritmo
7.5 Exercícios propostos
1. Escreva a seguinte expressão aritmética usando a linguagem Portugol e indique a ordem
em que os operadores são aplicados na avaliação da expressão (use índices ao lado dos
operadores):
1
b
+
5
2 +
1
1 + a
.
Assuma que a e b são variáveis do tipo real.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
7.5 EXERCÍCIOS PROPOSTOS 37
2. Escreva um algoritmo para calcular a área de um círculo. A entrada do seu algoritmo é o
valor do raio do círculo. A saída é o valor da área do círculo.
3. Implemente o algoritmo anterior usando a ferramenta VISUALG.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
AULA 8
EXPRESSÕES RELACIONAIS
8.1 Operadores relacionais
Uma expressão relacional, ou simplesmente relação, é uma comparação entre dois valores
de ummesmo tipo. Esses valores são representados na relação através de constantes, variáveis
ou expressões aritméticas. A operação de comparação é realizada por um operador relacional.
Na linguagem Portugol da ferramenta VISUALG, temos os operadores relacionais mostrados
na Tabela 8.1.
Operador Descrição
= igual a
<> diferente de
> maior que
< menor que
>= maior ou igual a
<= menor ou igual a
Tabela 8.1: Operadores relacionais da linguagem Portugol.
Como exemplo, suponha que a, b e c sejam variáveis do tipo inteiro. Então, temos que
a = 2 , a > b e c <= b
são todos exemplos de expressões relacionais. Na expressão
a = 2 ,
estamos comparando o valor da variável a com a constante 2. O resultado desta comparação é
o valor lógico verdadeiro se o valor de a é igual a 2; caso contrário, o resultado é o valor lógico
falso. Na expressão
a > b ,
estamos comparando os valores das variáveis a e b. O resultado desta comparação é o valor
lógico verdadeiro se o valor de a é maior do que o de b. Caso contrário, o resultado é o valor
lógico falso. Na expressão
c <= b ,
estamos comparando os valores das variáveis c e b. O resultado desta comparação é o valor
lógico verdadeiro se o valor de c é menor ou igual ao valor de b. Caso contrário, o resultado é
o valor lógico falso.
38
8.2 RELAÇÕES E EXPRESSÕES ARITMÉTICAS 39
8.2 Relações e expressões aritméticas
As relações podem envolver expressões aritméticas. Por exemplo,
a > (b+ c) e c <= (5− a) ,
onde a, b e c são variáveis do tipo inteiro, são relações válidas na linguagem Portugol. Na
primeira delas, estamos comparando o valor de a com o valor resultante da expressão arit-
mética
b+ c .
Na segunda delas, estamos comparando o valor de c com o valor resultante da expressão arit-
mética
5− a .
Em particular, podemos escrever relações da forma
(b+ c) <= (c− 10) .
Isto é, podemos ter expressões aritméticas nos dois “lados” de um operador relacional. Neste
caso, estamos comparando o valor da expressão aritmética do lado esquerdo do operador com
o valor da expressão aritmética do lado direito do operador relacional. Além disso, não pre-
cisamos sequer usar os parênteses que utilizamos nos exemplos acima. Isto é, basta-nos escr-
ever
a > b+ c , c <= 5− a e b+ c <= c− 10 ,
que são as mesmas expressões, em Portugol, que
a > (b+ c) , c <= (5− a) e (b+ c) <= (c− 10) .
Isto porque qualquer operador arimético possui prioridade maior do que qualquer operador
relacional. Logo, a operação de comparação em uma expressão relacional é sempre realizada
por último.
8.3 Relações envolvendo tipos não inteiros
É importante ressaltar que os operadores relacionais não se aplicam apenas a valores do
tipo inteiro. De fato, eles também podem ser usados com valores do tipo real e caractere. Em
particular, se a é uma variável do tipo real, então
a <= 5.7
é uma expressão que compara o valor de a com o número 5.7, do tipo real. Na expressão acima,
se a fosse do tipo inteiro, seu valor seria primeiro convertido para o valor real equivalente e,
depois, comparado com 5.7. Analogamente, se considerarmos uma expressão relacional tal
como
b <> 5 ,
onde b é uma variável do tipo real, o valor 5, do tipo inteiro, é primeiro convertido para o valor
do tipo real equivalente, isto é, para 5.0, e, em seguida, comparado com o valor real da variável
b.
DIM0320 - 2011.1 - DIMAP/UFRN PROF. MARCELO FERREIRA SIQUEIRA
8.3 RELAÇÕES

Continue navegando