Programação com Pascal

Transcrição

Programação com Pascal
Lógica de Programação
com Pascal
Teoria e Prática
Este material visa auxiliar no aprendizado da
programação com Pascal através de exemplos práticos.
Edeyson Andrade Gomes
IFBA – 2016
4ª Edição – Revisão 04.2016
SUMÁRIO
1 __________________________________________________________________ 10
INTRODUÇÃO À PROGRAMAÇÃO ________________________________________ 10
Linguagem Natural ________________________________________________________ 13
Fluxogramas ______________________________________________________________ 16
Início e Fim de Fluxo ______________________________________________________________ 16
Entrada Manual de Dados _________________________________________________________ 17
Exibição ________________________________________________________________________ 17
Processo _______________________________________________________________________ 18
Sequencia ______________________________________________________________________ 18
Decisão ________________________________________________________________________ 19
Repetição_______________________________________________________________________ 26
Exemplos ________________________________________________________________ 33
Exemplo 1: calculo da raiz de uma equação do primeiro grau. ____________________________ 33
Exemplo 2: Determinar os tipos dos triângulos em função da quantidade de lados. ___________ 34
Exemplo 3: Ler 2 valores inteiros e distintos do teclado e ordená-los. ______________________ 36
Exemplo 4: Imprimir o número 5 dez vezes. ___________________________________________ 37
Exemplo 5: Imprimir todos os números naturais entre 1 e N. _____________________________ 38
Exemplo 6: Determinar todos os divisores naturais de um número natural N. ________________ 40
2 __________________________________________________________________ 42
A LINGUAGEM PASCAL ________________________________________________ 42
2.1 Estrutura de um Programa Pascal __________________________________________ 42
2.1.1 Cabeçalho __________________________________________________________________ 42
2.1.2 Área de Declarações _________________________________________________________ 43
2.2.3 Corpo do Programa __________________________________________________________ 46
Identificadores ____________________________________________________________ 51
Palavras Reservadas ______________________________________________________________ 52
Comentários ____________________________________________________________________ 52
2.1 Variáveis______________________________________________________________ 52
2.2 Constantes ____________________________________________________________ 53
2.3 Tipos de Dados_________________________________________________________ 53
Inteiros ________________________________________________________________________ 53
Reais __________________________________________________________________________ 55
Caracteres ______________________________________________________________________ 57
Tipos Lógicos ____________________________________________________________________ 61
3 __________________________________________________________________ 64
EXPRESSÕES _________________________________________________________ 64
3.1 Prioridades das Operações _______________________________________________ 64
3.2 Tipos de Expressões _____________________________________________________ 65
3.3 Tipos de Operadores ____________________________________________________ 65
Operador de Atribuição ___________________________________________________________ 65
Operadores Aritméticos ___________________________________________________________ 66
Operador de Concatenação ________________________________________________________ 69
Operadores Relacionais ___________________________________________________________ 69
Operadores Lógicos ______________________________________________________________ 73
4 __________________________________________________________________ 77
ESTRUTURAS DE DECISÃO ______________________________________________ 77
4.1 IF .. THEN _____________________________________________________________ 78
4.2 IF .. THEN .. ELSE _______________________________________________________ 80
4.3 CASE _________________________________________________________________ 88
4.4 EXERCÍCIOS ___________________________________________________________ 92
5 __________________________________________________________________ 95
ESTRUTURAS DE REPETIÇÃO ____________________________________________ 95
5.1 FOR __________________________________________________________________ 96
5.1.1 Exemplos de Uso do FOR _____________________________________________________ 104
5.2 WHILE .. DO __________________________________________________________ 109
5.3 REPEAT .. UNTIL _______________________________________________________ 116
6. Arrays ___________________________________________________________ 120
Apêndice B – Exercícios _______________________________________________ 127
Apêndice C – Exemplos de Código _______________________________________ 135
C1 - Tipos, Variáveis e Constantes ___________________________________________ 135
C3 - Condicionais_________________________________________________________ 144
C4 - For ________________________________________________________________ 146
LISTAGENS
Listagem 2.1 - Cabeçalho de programa Pascal. ........................................................................... 43
Listagem 2.2 – Utilização de Unit. ............................................................................................... 44
Listagem 2.3 – Declaração de Variáveis. ..................................................................................... 46
Listagem 2.4 – Programa que lê 2 números e calcula a soma. ................................................... 47
Listagem 2.5 - Programa que lê 3 variáveis e calcula a média. ................................................... 50
Listagem 2.6 – Exemplo de uso de Inteiros ................................................................................. 55
Listagem 2.7 – Uso de Reais em Pascal ....................................................................................... 56
Listagem 2.3 – Exemplo com Strings ........................................................................................... 59
Listagem 2.4 – Exemplo com Char .............................................................................................. 60
Listagem 2.5 – Exemplo com Boolean......................................................................................... 61
Listagem 2.6 – Exemplo com Variáveis e Constantes ................................................................. 62
Listagem 3.1 – Operador de Atribuição ...................................................................................... 65
Listagem 3.2 – Uso de DIV e MOD .............................................................................................. 67
Listagem 3.3 – Uso de DIV e MOD com Unidade, Dezena e Centena ......................................... 68
Listagem 3.4 - Concatenação de Strings ..................................................................................... 69
Listagem 3.5 – Operadores Relacionais com Integer .................................................................. 70
Listagem 3.6 – Operadores Relacionais com String .................................................................... 71
Listagem 3.7 – Operadores Relacionais com Reais ..................................................................... 72
Listagem 3.8 – Operadores Lógicos............................................................................................. 74
Listagem 4.1 – Seleção com uma Via – IF .. THEN ....................................................................... 79
Listagem 4.2 – Seleção com 2 Vias – IF .. THEN .. ELSE .............................................................. 81
Listagem 4.3 - Seleção com duas Vias ......................................................................................... 82
Listagem 4.4 - Calcula Desconto 1............................................................................................... 86
Listagem 4.5 – Algoritmo URA 01 Case ....................................................................................... 90
Listagem 4.6 – Programa Triângulos. .......................................................................................... 93
Edeyson Andrade Gomes
www.edeyson.com.br
Listagem 4.7 – Programa Paridade. ............................................................................................ 94
Listagem 5.1 – Uso de For para repetir 100 teste de notas. ....................................................... 99
Listagem 5.2 – For Simples com 8 passos. ................................................................................ 100
Listagem 5.3 – Exemplo do FOR com 2 passos. ........................................................................ 102
Listagem 5.4 – Exemplo de FOR com alteração do contador. .................................................. 103
Listagem 5.5 – Divisores de N. ................................................................................................. 105
Listagem 5.6 – Conta Divisores de N. ....................................................................................... 107
Listagem 5.5 – Listagem de números de 1 a 10 ........................................................................ 109
Listagem 5.6 – Listagem de números de 1 a 10 ........................................................................ 110
Listagem 5.7 – Listagem de números de 1 a 10 ........................................................................ 111
Listagem 5.8 – Listagem de números de 1 a 10 ........................................................................ 112
Listagem 5.9 – While ................................................................................................................. 114
Listagem 5.10 – Listagem de números de 1 a 10 ...................................................................... 117
Listagem 5.11 – Listagem de números de 1 a 10 ...................................................................... 118
TABELAS
Tabela 2.1 – Tipos Inteiros .......................................................................................................... 53
Tabela 2.2 - Tipos Reais ............................................................................................................... 55
Tabela 3.1 – Precedência de Operadores ................................................................................... 64
Tabela 3.2 – Operadores Relacionais .......................................................................................... 70
Edeyson Andrade Gomes
www.edeyson.com.br
FIGURAS
Figura 1.1 – Símbolos de um Fluxograma ................................................................................... 16
Figura 1.2 – Início e Fim de Fluxo ................................................................................................ 16
Figura 1.3 – Símbolo de Entrada Manual de Dados .................................................................... 17
Figura 1.4 – Símbolo de Exibição de Dados ................................................................................. 17
Figura 1.5 – Símbolo de Processo em Fluxograma...................................................................... 18
Figura 1.6 –Fluxograma de Sequencia ........................................................................................ 18
Figura 1.7 – Decisão em Fluxograma .......................................................................................... 19
Figura 1.8 – Cálculo de média de duas notas .............................................................................. 20
Figura 1.9 – Decisão com 1 via em Fluxograma ......................................................................... 21
Figura 1.10 – Exemplo de Decisão com 1 via ............................................................................. 22
Figura 1.11 – Decisão com 2 vias em Fluxograma ...................................................................... 23
Figura 1.12 – Exemplo de Decisão com 2 vias ............................................................................ 24
Figura 1.13 – Decisão com 2 vias em Fluxograma....................................................................... 24
Figura 1.14 – Exemplo de Decisão com N vias ........................................................................... 25
Figura 1.15 – Exemplo de Repetição .......................................................................................... 27
Figura 1.16 – Fluxograma de Repetição ..................................................................................... 27
Figura 1.17 Repetição com Teste Antecipado ............................................................................. 29
Figura 1.18 Exemplo de Repetição com Teste Antecipado ......................................................... 30
Figura 1.19 Repetição com Teste Postergado ............................................................................. 31
Figura 1.20 Exemplo de Repetição com Teste Postergado ......................................................... 32
Figura 1.21 Exemplo de Equação do 1º Grau .............................................................................. 33
Figura 1.22 Exemplo do Algoritmo Triângulos ............................................................................ 35
Figura 1.23 - Fluxograma: Ordenar 2 números ........................................................................... 36
Figura 1.24 - Fluxograma: Imprimir o número 5 dez vezes ......................................................... 38
Figura 1.25 - Fluxograma: Números naturais entre 1 e N ........................................................... 39
Figura 1.26 - Fluxograma: Divisores naturais de N...................................................................... 41
Figura 2.1 - Fluxograma: Soma de a e b. ..................................................................................... 48
Figura 2.2 - Fluxograma: Média de 3 números. .......................................................................... 49
Figura 2.3 – Abstração de memória. ........................................................................................... 51
Figura 2.4 – Alocação de variáveis. ............................................................................................. 54
Figura 2.5 – Fluxograma do programa InteirosEmPascal. ........................................................... 54
Figura 2.6 – Fluxograma do programa ReaisEmPascal................................................................ 56
Figura 2.7 – Alocação de Strings. ................................................................................................ 57
Figura 3.1 – Divisão de Inteiro..................................................................................................... 66
Figura 4.1 – Fluxograma de sequência ........................................................................................ 77
Figura 4.2 – Fluxograma da seleção com uma Via ..................................................................... 78
Figura 4.3 – Fluxograma da seleção com duas Vias .................................................................... 80
Figura 4.4 - Fluxograma da seleção com duas Vias ..................................................................... 83
Figura 4.5 – Fluxograma do Algoritmo Calcula Desconto 1 ........................................................ 85
Figura 4.6 - Fluxograma do Algoritmo Calcula Desconto 2 ......................................................... 87
Figura 4.7 - Fluxograma do algoritmo URA 01 CASE ................................................................... 89
Figura 4.8 - Fluxograma do algoritmo Triângulos ....................................................................... 92
Figura 4.9 - Fluxograma do algoritmo Paridade .......................................................................... 94
Figura 5.1 – Fluxograma FOR ...................................................................................................... 97
Figura 5.2 – Fluxograma RepeteTesteNotas ............................................................................... 98
Figura 5.3 – Fluxograma do ForSimples .................................................................................... 100
Figura 5.4 – Fluxograma Divisores de N .................................................................................... 104
Figura 5.5 – Fluxograma Contadores de Divisores de N. .......................................................... 106
Figura 6.AA – While com Contador ........................................................................................... 111
Figura 7.BB – Pares entre 1 e 10 com WHILE ............................................................................ 112
Edeyson Andrade Gomes
www.edeyson.com.br
Figura 8.CC................................................................................................................................. 113
Figura 9.DD – While................................................................................................................... 114
Figura 10.EE – Repeat Until de 1 a 10 ....................................................................................... 117
Figura 11.FF ............................................................................................................................... 119
Figura 12.XYZ ............................................................................................................................. 120
Figura 13 .................................................................................................................................... 121
10
Programação com Pascal
1
INTRODUÇÃO À PROGRAMAÇÃO
Um dos maiores desafios para um professor de programação é fazer com que seus
alunos consigam descrever detalhadamente uma solução para um problema. Por
exemplo: quais os passos necessários para calcular a idade média de uma coleção de
pessoas?
Fazê-los entender um problema não é o mais difícil, todavia, fazê-los organizar uma
linha de raciocínio lógico e bem estruturado para uma solução que seja coerente, efetiva
e eficaz não é trivial.
As principais dificuldades apresentadas estão na abstração do problema e da solução,
pois:
a) O aluno precisa compreender o problema para poder resolvê-lo;
b) A descrição da solução deve ser textualmente bem detalhada;
c) É difícil prover uma descrição da solução que seja completa.
Comumente, encontram-se soluções de alunos que omitem passos que são considerados
óbvios, embora não sejam a leitores que desejam entender tais soluções.
Este livro tem como objetivo ajudar o aluno a desenvolver a habilidade de descrever
soluções computacionais coerentes, sem ambiguidades e completas. Para isto, foca-se o
desenvolvimento do raciocínio lógico baseando-se num universo de problemas da
matemática e física do ensino médio.
Alunos do ensino médio são confrontados com problemas como a extração de raízes de
uma equação do segundo grau. Para a solução, aprendem um conjunto ordenado de
passos. São estes passos que compõem um algoritmo.
Um algoritmo deve descrever detalhadamente uma sequência finita e ordenada de
passos necessários à solução de um determinado problema ou uma classe de problemas.
É uma forma de descrever possíveis soluções a problemas do mundo real, objetivando
sua implementação no mundo computacional.
A maioria dos problemas pode ser resolvida por um algoritmo que deve possuir 5
características essenciais:
1. Finitude: Todo algoritmo deve sempre terminar após um número finito
de passos.
2. Definição: Cada passo de um algoritmo deve ser definido de forma clara.
a.
As ações devem ser definidas rigorosamente e sem ambiguidades
para que não sejam cometidos erros durante a resolução do
problema.
b.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
3. Entradas: Um algoritmo deve ter zero ou mais entradas.
a. Por exemplo, uma equação do segundo grau precisa informar os
valores de a, b e c, pois sua forma é ax2 + bx + c e são estes
valores que diferenciam as equações.
4. Saídas: Um algoritmo deve ter uma ou mais saídas.
a. Por exemplo, uma equação de segundo grau tem duas raízes: x’ e
x’’.
5. Efetividade: Um algoritmo deve ser efetivo.
a. Todas as operações devem ser suficientemente básicas de modo
que possam ser executadas com precisão em um tempo finito por
um humano usando papel e lápis.
b. Cada passo da solução deve ser simples, embora sua composição
leve a solução de algo complexo.
A elaboração de um algoritmo deve seguir 6 passos fundamentais:
1. Compreender o problema, descrevendo-o de forma clara e precisa.
a. Um problema só pode ser resolvido se for bem entendido, o que
requer uma descrição compreensível e clara.
2. Identificar os dados de entrada e saída.
a. Todo problema tem 0 ou mais dados de entrada.
i. Por exemplo, uma equação do segundo grau requer 3 dados
de entrada (a, b e c).
b. Todo problema tem 0 ou mais dados de saída.
i. Por exemplo, uma equação do segundo grau onde delta é
menor que zero não possui raízes, logo, não tem dados de
saída. Em caso contrário, tem duas saídas: x’ e x’’.
3. Determinar o que é preciso para transformar dados de entrada em
dados de saída:
a. Definição de uma sequência de passos que permitam a solução de
maneira automática e repetitiva.
i. Usar a estratégia top-down1, sempre buscando passos simples
que sejam compostos na solução;
1
A estratégia top-down consiste em dividir um problema em partes menores e extremamente simples
(subproblemas) de modo que seja mais fácil a sua resolução.
11
12
Programação com Pascal
ii. Observar regras e limitações (como exceções ao problema);
iii. Identificar todas as ações a realizar, usando sempre passos
simples para a solução.
iv. Eliminar possíveis ambiguidades.
4. Construir o algoritmo.
5. Testar o algoritmo.
6. Executar o algoritmo.
Um algoritmo bem definido e estruturado garante sua compreensão por terceiros em
qualquer linguagem de programação.
Um grave problema que se destaca na elaboração de algoritmos é que se ele não for
descrito de forma padronizada e estruturada, possivelmente não será compreendido por
outras pessoas, apenas por seus criadores. Para evitar esse possível problema,
algoritmos costumam ser representados de três formas, como seguem:
1. Linguagem Natural: Os algoritmos são descritos detalhadamente em
linguagem natural. Por exemplo, em português estruturado.
2. Fluxograma: Os algoritmos são representados graficamente.
a. Usam-se formas geométricas padronizadas para descrever ações e
decisões na resolução do problema.
3. Pseudo-linguagem: Os algoritmos são descritos através de uma linguagem
intermediária entre a linguagem natural e uma linguagem de programação.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Linguagem Natural
Um exemplo de uso de Linguagem Natural está na especificação de como criar um
XBurger. Uma possível solução está a seguir:
1. Início do Algoritmo XBurger.
a. Pegar um pão;
b. Abrir o pão ao meio;
c. Passar manteiga no pão;
d. Colocar queijo no pão;
e. Colocar presunto no pão;
f. Colocar ovo frito no pão;
g. Fechar o pão.
2. Fim do Algoritmo XBurger.
Algumas perguntas que podem surgir ao leitor são:
1. Onde estavam a manteiga, o queijo e o presunto?
2. Quem fritou o ovo? Isso faz parte do algoritmo?
3. Podemos definir um algoritmo fritar ovo e reusá-lo?
A especificação de um algoritmo deve ser tão detalhada quanto possível para evitar
dúvidas ou ambiguidades. Tais perguntas deveriam ser respondidas numa especificação
mais clara e detalhada do Algoritmo XBurger. Por exemplo, pode-se definir que o
algoritmo tem como entradas: um pão, um ovo frito (logo, não faz parte do algoritmo
fritar o ovo), manteiga, queijo e presunto. Como dado de saída tem-se o sanduíche.
Outro exemplo em Linguagem Natural é como extrair as raízes de uma equação do
segundo grau na forma ax2 + bx + c. Sabe-se que:
𝒙=
−𝒃 ± √∆
𝟐𝒂
i.
∆ = b2 - 4ac
ii.
x1 = (-b + √∆) / 2a
iii.
x2 = (-b - √∆) / 2a
iv.
a deve ser diferente de 0, senão a equação é de 1º grau.
v.
∆ deve ser maior que zero para ter raízes reais.
A definição do algoritmo, em linguagem natural, para extrair as raízes de uma equação
do segundo grau pode ser a seguinte:
13
14
Programação com Pascal
1. Início do Algoritmo Raízes
a. Obter os coeficientes a, b e c (dados de entrada).
b. Se a é igual a zero:
i. Informar que esta é uma equação de 1º grau e terminar
o algoritmo.
c. Caso contrário:
i. Calcular delta = b2 - 4ac
ii. Se delta for negativo:
1. Informar que a equação não tem raízes reais e
terminar o algoritmo.
iii. Caso contrário:
1. Calcular:
a. x1 = (-b + √∆) / 2a
b. x2 = (-b - √∆) / 2a
2. Fornecer como resultado x1 e x2
3. Terminar o algoritmo.
2. Fim do Algoritmo Raízes
Vale ressaltar os dados de entrada e saída do algoritmo. Pela definição, uma equação de
segundo grau precisa dos seguintes dados de entrada: a, b e c. Como dados de saída,
provê os valores de x1 e x2 (x’ e x’’, respectivamente). E delta? É dado de entrada ou
de saída?
Na solução de um problema é comum o uso de dados temporários que auxiliam os
cálculos, armazenando valores intermediários. Dados como delta são comumente
denominados, em programação, de variáveis. A variável delta é, então, um dado
necessário ao cálculo das raízes da equação do segundo grau.
Como se pode notar, a definição do Algoritmo Raízes especifica detalhadamente como
calcular as raízes de uma equação do segundo grau.
Observação:
1. O Algoritmo Raízes foi escrito usando um recurso textual que facilita sua
legibilidade, que é a indentação. Note que as ações que compõem blocos ficam
indentados.
Outra forma de representação de um algoritmo é via o uso de uma linguagem de
programação de alto nível, ou Pseudocódigo. Neste caso, aproxima-se bastante da
programação formal em computadores, mas distancia-se da linguagem escrita e falada
comumente pelos humanos.
A programação consiste na codificação precisa de um algoritmo (em qualquer
representação adotada) segundo uma linguagem de programação específica. Um
programa é uma formalização de um algoritmo em uma determinada linguagem de
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
programação, segundo suas regras de sintaxe e semântica, de forma a permitir que o
computador possa entender sua sequencia de ações.
A proposta deste material é ensinar algoritmos e programação através de múltiplos
meios de representação e usando as linguagens de programação Pascal.
15
16
Programação com Pascal
Fluxogramas
Um Fluxograma é um diagrama que representa o esquema de solução de
um problema. Ele apresenta a linha de raciocínio lógico independente de linguagem de
programação e é inteligível por humanos e computadores.
Sua representação gráfica é feita por símbolos como na Figura 1.1.
Início e Fim de
Fluxo
Processo
Entrada Manual de
Dados
Exibição
Decisão
Figura 1.1 – Símbolos de um Fluxograma
Fluxogramas representam diversas estruturas de controle, detalhadas a seguir.
Início e Fim de Fluxo
Todo Algoritmo precisa informar em sua representação onde ele inicia e onde termina.
Embora o símbolo de início e fim seja o mesmo, seu rótulo é que os diferencia, como
apresenta a Figura 1.2.
Exemplo de Algoritmo:
1. Início do Algoritmo
2. Fim do Algoritmo
Início
Fim
Figura 1.2 – Início e Fim de Fluxo
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Entrada Manual de Dados
Uma entrada manual de dados representa a obtenção de ou mais dados de entrada
para a execução do algoritmo, como mostra a Figura 1.3.
Exemplo de Algoritmo:
1. Início do Algoritmo
a. Entrada manual de dados:
i. Ler os valores de a, b e c numa equação do 2º grau
(dados de entrada);
2. Fim do Algoritmo
Início
Fim
a, b, c
Figura 1.3 – Símbolo de Entrada Manual de Dados
O uso de [Ler os valores de a, b e c] significa que os valores de a, b e c terão de ser
fornecidos ao algoritmo. É uma condição necessária a seu funcionamento.
Exibição
Uma exibição apresenta (em tela, impresso, etc) um ou mais dados de saída da
execução do algoritmo, como se pode ver na Figura 1.4.
Exemplo de Algoritmo:
1. Início do Algoritmo
a. Entrada manual de dados:
i. Ler os valores de a, b e c numa equação do 2º grau
(dados de entrada);
b. Exibir os valores de a, b e c
2. Fim do Algoritmo
Início
a, b, c
a, b, c
Figura 1.4 – Símbolo de Exibição de Dados
Fim
17
18
Programação com Pascal
Processo
Um processo representa a transformação de um ou mais dados de entrada em dados
temporários (intermediários) ou de saída, como apresenta a figura 1.5.
Exemplo de Algoritmo:
1. Início do Algoritmo
a. Entrada manual de dados: Ler um valor inteiro para n1
(dados de entrada);
b. Processo:
i. Calcular delta = b2 - 4ac
c. Exibir o valor de delta.
2. Fim do Algoritmo
Início
a, b, c
delta = (b * b) –
(4 * a * c)
Fim
delta
Figura 1.5 – Símbolo de Processo em Fluxograma
Sequencia
Uma Sequencia representa a execução de um conjunto de ações em série. Não existe a
possibilidade de alteração da ordem de processamento das ações.
Por exemplo:
Entrada
Ação 1
Ação 2
Saída
Figura 1.6 –Fluxograma de Sequencia
Na Figura 1.6, apresenta-se uma sequência onde as Ações 1 e 2 ocorrerão sempre e na
mesma ordem.
Observação:
1. Pode-se inferir uma Sequencia na Figura 1.5, onde a leitura de a, b e c antecede o
cálculo de delta que, por sua vez, antecede sua exibição.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Decisão
Uma Decisão representa a avaliação de uma condição (expressão lógica) que pode ser
Verdadeira ou Falsa e seu símbolo permite dois caminhos possíveis à sequência de
ações. Como exemplo de algoritmo que usa decisão, voltemos ao cálculo das raízes de
uma equação do segundo grau, cujo fluxograma é ilustrado na Figura 1.7:
1. Início do Algoritmo Raízes
a. Obter o coeficiente a (dado de entrada).
b. Se a é igual a zero: (decisão 1)
i. Informar que esta é uma equação de 1º grau e terminar
o algoritmo.
c. Caso contrário:
i. Obter os coeficientes b e c (dados de entrada).
ii. Calcular delta = b2 - 4ac
iii. Se delta for negativo: (decisão 2)
1. Informar que a equação não tem raízes reais e
terminar o algoritmo.
iv. Senão:
1. Calcular:
a. x1 = (-b + √∆) / 2a
b. x2 = (-b - √∆) / 2a
2. Fornecer como resultado x1 e x2
3. Terminar o algoritmo.
2. Fim do Algoritmo Raízes
Início
a
a=0
SIM
A Equação é
do 1º grau.
NÃO
b, c
delta = b2 – 4ac
delta >= 0
NÃO
A Equação
não tem
raízes reais
SIM
x1 = (-b + √∆)/(2a)
x2 = (-b – √∆)/(2a)
Exibe x1 e
x2
Figura 1.7 – Decisão em Fluxograma
Fim
19
20
Programação com Pascal
Como visto no exemplo anterior, a descrição do algoritmo exige duas tomadas de
decisão: uma para testar o valor de a e a outra para testar o valor de delta. Com base no
resultado, toma-se um de dois caminhos possíveis. Existem vários tipos de decisão que
podemos tomar num algoritmo e os descreveremos a seguir.
Vamos testar o algoritmo usando 2 exemplos:
1. Equação : 3x + c
a. Obter o coeficiente a
i. Neste caso, a = 0. Logo, o algoritmo vai informar que esta
é uma equação de 1º grau e terminar.
2. Equação : x2 - 2x – 3
a. Obter o coeficiente a
i. Neste caso, a = 1. Logo, o algoritmo prossegue.
b. Obter os coeficientes b e c
i. Neste caso, b = -2 e c = -3.
c. Calcular delta = b2 - 4ac
i. delta = (–2)² – 4 * 1 * (–3) = 4 + 12 = 16
d. Como delta >= 0, o algoritmo continua.
e. Calcular x1 e x2:
i. X1 = (2 + 4) / 2 = 3
ii. X2 = (2 – 4) / 2 = -1
f. Exibe 3 e -1
Decisão com 1 Via
Imagine um algoritmo que deva calcular a média aritmética de duas avaliações [media =
(nota1 + nota2)/2] e a imprima. Temos um fluxo linear único que é: obter as notas (n1 e
n2), calcular a média e imprimi-la. A seguir, o fluxograma que o descreve.
Figura 1.8 – Cálculo de média de duas notas
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Uma alteração possível a este algoritmo é: caso a média calculada seja maior ou igual a
6, imprima parabéns e continue o fluxo normal. Note que inserimos uma tomada de
decisão (o teste da média). O fluxo será alterado (teremos uma adição de passos) SE a
nota for maior ou igual a 6. Neste caso, teremos uma adição ao comportamento inicial
do algoritmo.
Uma Decisão com uma Via representa uma tomada de decisão (testa-se uma condição)
que permite alterar o fluxo de processamento executando ou não uma Ação 1.
Normalmente é construída em Linguagem Natural assim: Se expressão lógica é
verdadeira então execute a Ação 1.
Por exemplo, na Figura 1.9 a Ação 1 só será executada se o resultado da decisão
(avaliação de uma expressão lógica) for verdadeiro. Em caso contrário a Ação 1 não
será executada.
Entrada
Decisão
Verdade
Ação 1
Falso
Saída
Figura 1.9 – Decisão com 1 via em Fluxograma
O uso de Decisão com 1 Via para imprimir Parabéns se a média for maior ou igual a 6 é
exemplificado no Algoritmo a seguir, representado na Figura 1.10:
1. Início do Algoritmo.
a. Entrada manual de dados:
i.
Ler dois números n1 e n2 (dados de entrada);
b. Processo:
i.
Calcular a média aritmética de n1 e n2 e atribuir à
variável média;
c. Decisão com 1 Via:
i.
Se a média for maior ou igual a 6, imprimir
“Parabéns!”.
d. Exibição:
i.
Exibir a média (dado de saída).
2. Fim do Algoritmo.
21
22
Programação com Pascal
Figura 1.10 – Exemplo de Decisão com 1 via
Observa-se que neste exemplo, apresentado na Figura 1.10, a exibição de Parabéns
ocorrerá se e somente se a média for maior ou igual a 6.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Decisão com 2 Vias
Suponha que o algoritmo anterior deve ser alterado para avaliar a média dos alunos e
determinar se o mesmo está aprovado (média >=6) ou reprovado (média < 6). Neste
caso, têm-se apenas dois resultados possíveis e distintos na análise da média, ou seja, 2
Vias na tomada de decisão.
Uma Seleção com duas Vias representa uma tomada de decisão que resulte num fluxo
de processamento que segue por 1 das 2 vias possíveis, dependendo do valor lógico da
expressão avaliada no início da estrutura.
Por exemplo, na Figura 1.11 a Ação 1 só será executada se o resultado da decisão for
verdadeiro. Em caso contrário, a Ação 2 será executada. Assim, as ações 1 e 2 são
mutuamente exclusivas.
Normalmente é construída em Linguagem Natural assim: Se expressão lógica é
verdadeira então execute a Ação 1, senão, execute a Ação 2.
Entrada
Decisão
Verdade
Falso
Ação 1
Ação 2
Saída
Figura 1.11 – Decisão com 2 vias em Fluxograma
Exemplo de Algoritmo (representado na Figura 1.11):
1. Início do Algoritmo.
a. Entrada manual de dados: Ler dois números n1 e n2
(dados de entrada);
b. Processo: calcular a média aritmética de n1 e n2 e
atribuir à variável média;
c. Decisão com 2 Vias:
i. Se a média for maior ou igual a 6, imprimir
“Aprovado!”.
ii. Senão, imprimir “Reprovado!”
d. Exibição: Exibir a média (dado de saída).
2. Fim do Algoritmo.
23
24
Programação com Pascal
Figura 1.12 – Exemplo de Decisão com 2 vias
Decisão com N Vias
A Decisão com várias (N) Vias apresenta uma tomada de decisão onde o fluxo de
processamento segue por 1 das N vias, dependendo do valor lógico da expressão
avaliada no início da estrutura. Ou seja, o valor testado na tomada de decisão pode ter N
resultados.
Por exemplo, na Figura 1.13, uma das ações será executada em função do valor da
condição avaliada. As condições são mutuamente exclusivas.
Entrada
Avalia
Condição
Caso 1
Ação 1
Caso 2
Caso 3
Ação 2
Caso N
Ação 3
...
Ação N
Saída
Figura 1.13 – Decisão com 2 vias em Fluxograma
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Como exemplo, propomos um algoritmo que deve receber como entrada o código da
operadora de telefonia móvel / celular e imprimir o nome desta operadora (representado
na Figura 1.14). Se a operadora tiver código 1, imprima Oi; se for 2, imprima Claro; se
for 3, imprima Tim, e assim, sucessivamente para todas as operadoras cadastradas.
Observa-se que a tomada de decisão baseia-se na avaliação do código, que pode ter N
valores possíveis. Assim, necessita-se de uma Decisão com N vias.
1. Início do Algoritmo.
a. Entrada manual de dados:
i. Ler um valor para codigo (dado de entrada);
b. Decisão com N Vias:
i. Selecione o valor de codigo.
Caso:
1. atribua à operadora o valor “Oi”;
2. atribua à operadora o valor “Claro”;
3. atribua à operadora o valor “Tim”;
4. atribua à operadora o valor “Vivo”;
ii. Qualquer outro valor, termine o algoritmo.
c. Exibição: Exibir a operadora (dado de saída).
2. Fim do Algoritmo.
Início
codigo
1
codigo
4
2
3
operadora =
Oi
operadora =
Vivo
operadora =
Claro
operadora =
Tim
Outro Valor
operadora
Fim
Figura 1.14 – Exemplo de Decisão com N vias
25
26
Programação com Pascal
Repetição
Imagine um problema que requer a impressão de todos os números inteiros entre 1 e 5,
ou seja, o intervalo [1, 5]. O algoritmo para resolver isso pode ser o seguinte:
1. Início do Algoritmo 1 a 5.
a. Exibir 1;
b. Exibir 2;
c. Exibir 3;
d. Exibir 4;
e. Exibir 5;
2. Fim do Algoritmo 1 a 5.
Várias questões podem ser apresentadas para provar que a solução anterior não é
eficiente:
1. Como imprimir todos os números entre 1 e 10.000? Usar 10.000 linhas de
código?
2. Como imprimir os números entre a e b, sendo estes dois inteiros? Neste
caso, a e b serão dados de entrada.
3. Como imprimir os números maiores que c entre a e b? Esta alteração vai
necessitar de uma Decisão com 1 Via.
Para resolver tais questões, quando o problema original requer um conjunto de
comandos que se repete, usam-se as estruturas de repetição (também chamada de
laço). Uma nova solução para o Algoritmo de 1 a 5 pode ser:
1. Início do Algoritmo 1 a 5.
a. i = 1;
b. Repita 5 vezes:
i. Exibir i;
ii. i = i + 1;




valor inicial do intervalo [1,5].
são 5 valores no conjunto.
exibe o valor atual de i.
i assume seu valor anterior
acrescido de 1.
2. Fim do Algoritmo 1 a 5.
Vamos ver como seria a execução do algoritmo (como ilustra a Figura 1.15): iniciamos
o algoritmo com i = 1 (primeiro valor do intervalo).
Observação:
1. i é uma variável temporária que armazena o valor a ser impresso.
2. Note que executar i = i + 1 significa: atribua a i seu valor anterior acrescido de 1.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Passo 1
Passo 2
Passo 3
Passo 4
Passo 5
•i = 1;
•exibe 1;
•i = 1 + 1
•exibe 2;
•i = 2 + 1
•exibe 3;
•i = 3 + 1;
•exibe 4;
•i = 4 + 1;
•exibe 5;
•i = 5 + 1;
Figura 1.15 – Exemplo de Repetição
O fluxograma padrão para Repetição é apresentado na Figura 1.16. Observa-se uma
Condição (um teste feito) que determina se a repetição chegou ao fim ou não. Caso não,
os comandos são novamente executados.
Figura 1.16 – Fluxograma de Repetição
O exemplo anterior (Algoritmo 1 a 5) funciona bem para imprimir todos os números
num intervalo conhecido previamente. No exemplo, o intervalo inteiro [1, 5]. Sabemos
o início do intervalo (1), seu final (5) e o total de números a imprimir (5). Este total é
que limita a repetição (Repita 5 vezes).
Para imprimir os números entre 10 e 20, intervalo [10, 20], a alteração é a seguinte:
1. Início do intervalo = 10;
2. Final do intervalo = 20;
3. Total de números no intervalo: 11;
a. [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20].
27
28
Programação com Pascal
1. Início do Algoritmo 10 a 20.
a. i = 10;

b. Repita 11 vezes:

i. Exibir i;

ii. i = i + 1;

valor inicial do intervalo.
são 11 valores no conjunto.
exibe o valor atual de i.
i assume seu valor anterior
acrescido de 1.
2. Fim do Algoritmo 10 a 20.
Vamos a um desafio: como imprimir os números maiores que c entre 10 e 50? Dica:
Esta alteração vai necessitar de uma Decisão com 1 Via.
1. Início do intervalo = 10;
2. Final do intervalo = 50;
3. Total de números no intervalo: 51;
a. [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20... 49, 50].
Apresentaremos uma solução ao desafio:
1. Início do Algoritmo DesafioIntervalo.
a. Entrada manual de dados:
i. Ler um valor para c (dado de entrada);
b. i = 10;
c. Repita 51 vezes:
i. Decisão com 1
ii. Se i > c então
1. Exibir i;
iii. i = i + 1;
 valor inicial do intervalo.
 são 51 valores no conjunto.
Via:
 exibe o valor atual de i.
 i assume seu valor anterior
acrescido de 1.
2. Fim do Algoritmo DesafioIntervalo.
Observe que i só será exibido se seu valor for maior que c. Isso é garantido pelo teste Se
i > c então ... o que está aninhado com o então (Exibir i) só será executado
se a condição for verdadeira.
Na maioria das vezes o uso de Repetição requer um teste ou avaliação de condição para
executar ou não um bloco de comandos. Comumente, as repetições usam testes
Antecipados ou Postergados.
Usamos a Repetição com Teste Antecipado quando há a necessidade de tomar uma
decisão que determine se uma ação será executada, repetindo-a se necesário.
Normalmente é construída em Linguagem Natural assim: Enquanto a expressão lógica
é verdadeira, execute a Ação 1.
Por exemplo: enquanto o valor da variável a for menor que 10 some 1 à variável a.
Neste caso, quando variável a for maior ou igual a 10 a repetição da ação (some 1 à
variável a) se encerra.
Nota-se que, se antes do teste a variável a já for maior ou igual a 10 nenhuma ação será
tomada, pois o teste da expressão lógica precede a ação. O teste funciona como uma
condição de parada das repetições.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
No exemplo da Figura 1.17 a Ação 1 será executada sempre que, e apenas se, o Teste
de Condição retornar um valor verdadeiro.
Entrada
Teste de
Condição
V
Ação 1
F
Saída
Figura 1.17 Repetição com Teste Antecipado
O algoritmo a seguir, representado no fluxograma da Figura 1.18, imprime todos os
valores inteiros entre um valor de início x e 10 (intervalo [x, 10]). Note que se o valor
inicial de x for maior que 10, nenhum valor será impresso, pois o teste iniciará falso.
1. Início do Algoritmo.
a. Entrada de dados:
i. Ler um valor para x (dado de entrada);
b. Repetição com Teste Antecipado:
i. Enquanto o valor de x <= 10:
1. Exibição:
a. Exibir o valor de x (dado de saída).
2. Some 1 a x.
2. Fim do Algoritmo.
Note que se a linha 2 (Some 1 a x) não for colocada no algoritmo, a repetição ocorrerá
para sempre (isso é chamado de laço infinito). Imagine que o usuário digite o valor 1
para x. Sem a linha 2 o teste (enquanto x <= 10) sempre será verdadeiro.
29
30
Programação com Pascal
Figura 1.18 Exemplo de Repetição com Teste Antecipado
A Repetição com Teste Postergado é semelhante à Repetição com Teste Antecipado,
mudando apenas quando efetuar o teste.
Usa-se a Repetição com Teste Postergado quando há a necessidade de executar uma
ação e somente após determinar se tal ação será executada novamente. Neste caso, a
ação será executada ao menos uma vez.
Normalmente é construída em Linguagem Natural assim: Repita a Ação 1 até que a
expressão lógica torne-se verdadeira.
Por exemplo: some 1 à variável a até que seu valor seja maior que 10. Nota-se que a
ação que muda o valor de a sempre será executada uma vez, independente do seu valor
inicial, como ilustra a Figura 1.19.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Entrada
Ação 1
V
Teste de
Condição
F
Saída
Figura 1.19 Repetição com Teste Postergado
O algoritmo a seguir, representado na Figura 1.20, imprime todos os valores inteiros
entre um valor de x e 10. Note que mesmo se o valor de x for maior que 10 ao menos
um valor será impresso, pois o teste ocorre após a ação.
1. Início do Algoritmo.
a. Entrada de dados:
i. Ler um valor para x (dado de entrada);
b. Repetição com Teste Postergado:
i. Repita
1. Exibição:
a. Exibir o valor de x (dado de saída).
2. Some 1 a x.
ii. Até que o valor de x seja > 10.
2. Fim do Algoritmo.
31
32
Programação com Pascal
Figura 1.20 Exemplo de Repetição com Teste Postergado
Os recursos vistos até agora – linguagem natural e fluxogramas – são a base do
aprendizado para o bom desenvolvimento de programas. A lógica pode ser explorada
independente da codificação esperada.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Exemplos
Apresentaremos um conjunto de exemplos para fixação dos conceitos vistos neste
capítulo. Cada um conterá uma descrição em Linguagem Natural e seu Fluxograma.
Exemplo 1: calculo da raiz de uma equação do primeiro grau.
Sabe-se que a forma da equação de 1º grau é: y = ax + b
A descrição da solução em linguagem natural pode ser:
1.
2.
Início do Algoritmo Raiz 1º Grau
a. Obter o coeficiente a (dado de entrada).
b. Se a é igual a zero:
i. Informar que não há raízes para a equação e
terminar o algoritmo.
c. Obter o coeficiente b (dado de entrada).
d. Calcular o valor de x : x = -b / a
e. Exibir o valor de x
f. Terminar o algoritmo.
Fim do Algoritmo Raiz 1º Grau
O Fluxograma da solução proposta é apresentado na Figura 1.21.
Início
a
a=0
SIM
NÃO
b
Não há raiz
para a
equação
x = -b/a
x
Fim
Figura 1.21 Exemplo de Equação do 1º Grau
33
34
Programação com Pascal
Exemplo 2: Determinar os tipos dos triângulos em função da quantidade de lados.
1. Equilátero: todos os lados são iguais.
2. Isósceles: pelo menos dois lados são iguais.
3. Escaleno: os três lados são diferentes.
Para esta solução combinaremos 2 Decisões de 1 Via e usaremos a estrutura:
SE (condição1 é verdadeira) ENTÃO
Ação 1
SENÃO
SE (condição 2 é verdadeira) ENTÃO
Ação 2
SENÃO
Ação 3
Nesta estrutura a Ação 1 só será executada se a condição1 for verdadeira. Neste caso,
não entra no SENÃO. Se a condição1 for falsa, e apenas neste caso, será feita a
avaliação da condição 2. Se esta for verdadeira, executa a Ação 2. Em caso das duas
condições testadas serem falsas, executa a Ação 3.
A descrição da solução em linguagem natural pode ser:
1. Início do Algoritmo Triângulos
a. Obter os lados a, b e c
b. Se os três lados são iguais:
i. Exibir Equilátero.
c. Senão:
i. Se dois lados são iguais:
1. Exibir Isósceles.
ii. Senão:
1. Exibir Escaleno.
2. Fim do Algoritmo Triângulos
O Fluxograma da solução proposta é apresentado na Figura 1.22.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Início
a, b, c
a=beb=c
V
Equilátero
F
a=b
ou a = c
ou b = c
V
F
Isósceles
Triângulo
Escaleno
Fim
Figura 1.22 Exemplo do Algoritmo Triângulos
35
36
Programação com Pascal
Exemplo 3: Ler 2 valores inteiros e distintos do teclado e ordená-los.
Quais os passos do Algoritmo que se deseja? Vejamos:
1. Pensemos assim:
a. n1 e n2 serão dados de entrada: inteiros providos pelo usuário ao
algoritmo.
b. maior e menor serão dados de saída: informarão qual o maior e o
menor valor de entrada, respectivamente.
2. Só há duas opções a testar: Ou n1 é o maior dos dois (passo 2.a) ou não é
(passo 2.b).
a. Se (n1 > n2), então maior = n1 e menor = n2.
b. Senão (em caso contrário, n1 < n2), maior = n2 e menor = n1.
3. Imprime os valores menor e maior.
Observação:
1. Os dados de saída menor e maior são necessários? A resposta é: eles foram usados
apenas para facilitar a legibilidade do algoritmo.
Vejamos o Algoritmo em Linguagem Natural:
a. Início do Algoritmo
1. Ler valores para n1 e n2.
2. Se n1 > n2, então:
1. atribuir n1 a maior e n2 a menor.
3. Senão:
1. atribuir n2 a maior e n1 a menor.
4. Imprimir os valores menor e maior.
b. Fim do Algoritmo
A Figura 1.23 ilustra o Fluxograma do algoritmo proposto.
Início
n1, n2
V
n1 > n2
F
maior = n2
menor = n1
maior = n1
menor = n2
menor,
maior
Fim
Figura 1.23 - Fluxograma: Ordenar 2 números
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Exemplo 4: Imprimir o número 5 dez vezes.
A solução deste problema cai no que chamamos de repetição. Devemos repetir a
impressão do número 5 dez vezes. Uma solução trivial, embora pouco eficiente, seria:
Início do Algoritmo
1. Imprimir o número
2. Imprimir o número
3. Imprimir o número
4. Imprimir o número
5. Imprimir o número
6. Imprimir o número
7. Imprimir o número
8. Imprimir o número
9. Imprimir o número
10. Imprimir o número
Fim do Algoritmo
5
5
5
5
5
5
5
5
5
5
O algoritmo proposto acima está correto e faz o que se pede. Porém, como seria a
solução caso se deseje imprimir o número 5 um milhão de vezes? O algoritmo terá um
milhão de linhas? A solução ideal é usar a linguagem natural para informar a repetição
de algo, como segue:
Início do Algoritmo
1. Repetir 10 vezes
a. Imprimir o número 5
Fim do Algoritmo
Note que um laço Repetir comandos N vezes (comandos pode ser um único comando
ou um bloco com vários comandos) pode ser criado assim num Fluxograma:
1. Cria-se uma variável de controle iniciada com 1.
2. Testa-se se a variável de controle é menor ou igual a N. (Pois a repetição
será de N vezes).
3. Executa-se o comando ou bloco de comandos.
4. Incrementa-se a variável de controle.
5. Volta-se ao passo 2 (esta volta é que constrói o laço).
Vejamos isso no Fluxograma ilustrado na Figura 1.24.
37
38
Programação com Pascal
Início
Conta é a
variável de
controle
Este teste controla
quantas vezes o
laço será executado
Conta = 1
Conta <= 10
F
Fim
V
5
Conta = Conta
+1
O incremento em 1
garante
que Conta mude de
valor
Figura 1.24 - Fluxograma: Imprimir o número 5 dez vezes
Exemplo 5: Imprimir todos os números naturais entre 1 e N.
A solução deste problema necessita de um laço de repetição. Devemos repetir a
impressão de um número contido no intervalo [1, N]. Uma solução possível é:
Início do Algoritmo
a. Ler N
b. Faça a variável valor variar entre todos os valores no intervalo [1 e N]
i.
Imprima valor
Fim do Algoritmo
Note que necessitaremos novamente de um laço Faça algo N vezes (algo aqui será a
impressão de um número natural). O problema é bem parecido com o anterior, pois
inicia em 1 e varia até N. Logo, vamos à mesma solução:
1. Cria-se uma variável de controle iniciada com 1.
2. Testa-se se a variável de controle é menor ou igual a N, pois se desejam os
números entre 1 e N, inclusive.
3. Imprime-se o valor da variável de controle, pois ela será o próprio número no
intervalo.
4. Incrementa-se a variável de controle em 1, pois tem-se uma sequência de
números naturais.
5. Volta-se ao passo 2 (esta volta é que constrói o laço).
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Uma revisão do algoritmo em linguagem natural é a seguinte:
1. Início do Algoritmo
a. Leia um valor inteiro para N
b. Faça valor igual a 1
c. Enquanto valor <= N Faça:
i. Imprima valor
ii. valor = valor + 1
2. Fim do Algoritmo
Vamos testar o Algoritmo e seus passos:
1. Ler N – suponha que N seja 5
2. Faça a variável valor variar entre todos os valores no intervalo [1 e 5] –
logo, valor assumirá os seguintes valores {1, 2, 3, 4, 5}
3. Serão impressos os valores 1, 2, 3, 4, 5
4. Quando valor for igual a 6 o teste (valor <= N) falha, pois N=5.
Vejamos isso no Fluxograma ilustrado na Figura 1.25.
Início
n
valor = 1
valor <= n
N
Fim
V
valor = valor + 1
valor
Figura 1.25 - Fluxograma: Números naturais entre 1 e N
Notem que neste fluxograma há um Laço de repetição de N vezes. O controle do laço é
feito no teste (valor <= n), ou seja, valor inicia com 1 e varia até n. O teste garante que
valor não será maior que n. Se valor for menor ou igual a n, imprime-se o valor e
soma-se um a ele para que este assuma o próximo número no intervalo [1, N].
39
40
Programação com Pascal
Exemplo 6: Determinar todos os divisores naturais de um número natural N.
O objetivo do algoritmo proposto é: dado um valor inteiro N qualquer, imprimir
todos os seus divisores.
Por exemplo, supondo N = 12, como saber seus divisores? Uma solução é testar
todos os números entre 1 e 12. O teste é para saber se algum destes números
divide 12, ou seja, se o resto da divisão de 12 por cada um deles é zero.
Observação:
1. Cabe lembrar que A é divisor de N se o resto da divisão de N por A é zero.
2. Em muitas linguagens de programação este teste é feito pela operação MOD. Se N
MOD A = 0, então A divide N.
1. Início do Algoritmo
a. Ler N
b. Faça a variável Divisor variar entre todos os valores no
intervalo [1 e N]
c. Para cada valor de Divisor faça:
1. Atribua à variável Resto o resto da divisão de N por
Divisor.
2. Se Resto = 0, então imprima o valor de Divisor
2. Fim do Algoritmo
Veja que a letra c do algoritmo faz com que todos os números entre 1 e N sejam
testados. Outra forma de escrever o algoritmo, mais próximo da programação, é:
1. Início do Algoritmo
a. Leia um valor inteiro para N
b. Faça Divisor igual a 1
c. Enquanto Divisor <= N Faça
i. Resto = N MOD Divisor
ii. SE (Resto = 0) ENTÃO
1. Imprima Divisor
iii. Divisor = Divisor + 1
2. Fim do Algoritmo
Note que o passo b do algoritmo (Faça a variável Divisor variar entre todos os valores
no intervalo [1 e N]) é destacado no fluxograma, ilustrado na Figura 1.26.
Edeyson Andrade Gomes
www.edeyson.com.br
Introdução à Programação
Início
N
Divisor = 1
F
Divisor <= N
Fim
V
Resto = resto da divisão
de N por Divisor
Resto = 0
V
Divisor
F
Divisor =
Divisor + 1
Figura 1.26 - Fluxograma: Divisores naturais de N
41
42
Programação com Pascal
2
A LINGUAGEM PASCAL
A linguagem Pascal foi desenvolvida no início da década de 1970 por Nicklaus Wirth,
na Universidade Técnica de Zurique, Suíça. O primeiro compilador para a linguagem
foi disponibilizado em 1970.
O objetivo do Pascal é ser uma linguagem de programação de alto nível voltada ao
ensino da programação estruturada. Por ser simples, é ideal para a introdução à
programação.
2.1 Estrutura de um Programa Pascal
Todo programa em Pascal é dividido em três áreas distintas: cabeçalho, área de
declarações e corpo.
cabeçalho
área de declarações
corpo
2.1.1 Cabeçalho
O cabeçalho é uma área utilizada para que se possa identificar um programa através de
um nome (instrução program).
{Sintaxe:}
program nomeDoPrograma;
Exemplo:
program adicionaNumeros;
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
área de declarações
corpo
Observações:
1. O nome de um programa é um identificador e deve ser único neste.
O programa da Listagem 1.1, chamado de adicionaNumeros, iniciaria assim:
1. program adicionaNumeros;
2. {Programa que lê 2 números e imprime sua soma.}
Listagem 2.1 - Cabeçalho de programa Pascal.
Note que no trecho de programa da Listagem 2.1 anterior, a linha 2 apresenta um
comentário, pois o texto está entre { }. A linha 1 usa a instrução program para dar
nome ao programa. No caso, adicionaNumeros.
Observações:
1. Nossos programas sempre aparecerão em caixas como a da Listagem 1.1.
2. O uso de { } serve para definir comentários: descrições ou informações, em texto livre,
que auxiliem no entendimento do código.
2.1.2 Área de Declarações
A Área de Declarações de um programa é utilizada para criar identificadores que não
sejam predefinidos.
Toda variável (dado de entrada, temporário ou de saída) que quisermos usar num
programa precisa ser identificado por um nome único. Um cuidado que se deve ter é que
Pascal reserva alguns nomes como integer, real, boolean, etc.
Observação:
1. O uso de variáveis e sua nomenclatura serão detalhados durante o texto.
A área de declarações pode ser subdividida em sete subáreas: uses, label, const, type,
var, procedure e function.
43
44
Programação com Pascal
Utilização de Units
As units são conjuntos de funções que já estão prontas para serem usadas pelo
programador. Por exemplo, se quisermos limpar a tela ou ler o teclado já existem
funções prontas para isso nas units, evitando o trabalho de reescrevê-las. São elas:
1. CRT: possui a maior parte das rotinas e variáveis de geração de som, controle
de vídeo e teclado;
2. DOS: possui as rotinas que envolvem a utilização do sistema operacional;
3. GRAPH: possui rotinas destinadas a manipulações gráficas;
4. OVERLAY: possibilita gerenciar as atividades de um programa economizando
memória;
5. PRINTER: permite declarar um arquivo tipo texto com o nome LST e associálo à impressora;
6. SYSTEM: possui a maior parte das rotinas padrão da linguagem Pascal e é
usada de forma automática.
Para se fazer uso de units é necessário o uso da instrução uses antes da declaração da
instrução var.
{Sintaxe:}
uses nomeDaUnidade;
Nosso programa continuaria como apresenta a Listagem 1.2.
1. program adicionaNumeros;
2. {Programa que lê 2 números e imprime sua soma.}
3.
4. {Usa a biblioteca CRT onde está a função ReadKey; esta serve para ler
uma tecla digitada pelo usuário}
5. uses crt;
Listagem 2.2 – Utilização de Unit.
Note que no programa da Listagem 2.2 as linhas 2 e 4 apresentam comentários, pois
estão entre { }.
A linha 1 usa a instrução program para dar nome ao programa (adicionaNumeros). A
linha 5 usa a instrução uses para habilitar as funções da biblioteca CRT.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Observações:
1. Na Listagem 1.2, as linhas 2 e 4 apresentam comentários.
2. Comentários são textos livres, escritos dentro do código-fonte para explicar e
detalhar algo. Não são compilados e não contam como linha de código – LOC (Line
of Code).
Declaração de Variáveis
Nos problemas comuns da matemática e física nos deparamos com variáveis – símbolos
(comumente letras ou nomes) que representam valores ou expressões. Por exemplo,
uma equação do segundo grau2 possui a forma: ax2 + bx + c. Logo, são exemplos de
equação do segundo grau: x2 + 2x + 1 e 2x2 + 3x + 4.
Cabe-nos observar que as equações do 2º grau variam, entre si, sempre num aspecto: os
valores de a, b e c. Para a matemática, a, b e c são constantes (coeficientes), pois a
equação 2x2 + 3x + 4 já tem tais valores definidos (a = 2, b = 3 e c = 4).
Para a programação, se quisermos montar uma equação do segundo grau a partir da
fórmula ax2 + bx + c, precisamos saber a parte que varia entre elas, ou seja, as
variáveis para o algoritmo: a, b e c. Pode-se afirmar que a, b e c serão dados de entrada
do algoritmo e as raízes (x’ e x’’), os de saída.
Da mesma forma, na física temos a equação da velocidade na forma: v = vo + at2.
Para sabermos a velocidade final de um corpo, precisamos conhecer os valores das
variáveis: velocidade inicial (vo), aceleração (a) e tempo (t).
Sempre que tivermos um problema a resolver num mesmo domínio de aplicação, o que
mudar entre um problema e outro similar são variáveis para o algoritmo.
Para a programação, variáveis são áreas de memória que possuem nome e podem
armazenar valores de tipos predeterminados. Assim, um programador pode criar uma
variável média, do tipo real, e ela pode armazenar valores reais durante a execução do
programa. Onde a variável média será alocada na memória cabe ao Sistema Operacional
saber (e a apenas ele).
Observações:
1. É muito mais fácil recordar o nome de uma variável que seu endereço na
memória.
2. Por exemplo, se uma máquina tem 4GB de memória, teremos endereços
possíveis entre 0 e 4294967296. É mais fácil lembrar-se do nome média que do
endereço 2134567112.
3.
2
Toda equação da forma ax² + bx + c = 0, em que a, b e c são números reais com a ≠ 0, é chamada de
equação do 2° grau. Quando b = 0 ou c = 0 tem-se uma equação do 2º grau incompleta.
45
46
Programação com Pascal
Para a solução de problemas como os citados são necessárias variáveis declaradas num
programa, o que é feito via a instrução var. Cada variável tem um nome único no
programa (identificador) e um tipo (inteiro, real, lógico, etc).
{Sintaxe:}
var nomeDaVariável
: tipo de dado;
nomeDeOutraVariável : tipo de dado;
Observações:
1. Após o nome de cada variável deve ser utilizado o símbolo dois-pontos ( : ) seguido pelo
tipo de dado que a variável irá receber, seguido de ponto-e-vírgula.
2. Caso as variáveis sejam de mesmo tipo, estas poderão ser relacionadas separadas por
vírgula. Por exemplo: var a, b, c : integer; Isso define as variáveis a, b e c como sendo do
tipo integer (inteira).
Nosso primeiro programa continuaria como apresenta a Listagem 2.3.
1 program adicionaNumeros;
2 {Programa que lê 2 números e imprime sua soma.}
4 {Usa a biblioteca CRT onde está a função ReadKey}
5 uses crt;
7 {Declara a, b e soma como variáveis inteiras}
8 var
9
a, b : integer;
10
soma : integer;
Listagem 2.3 – Declaração de Variáveis.
Note que na Listagem 1.3 a linha 8 apresenta a instrução var iniciando uma área de
declaração de variáveis. A linha 9 define duas variáveis inteiras chamadas a e b e a
linha 10 define uma variável do tipo inteira (integer) chamada soma.
2.2.3 Corpo do Programa
Após o Cabeçalho e a Área de Declarações, temos o programa em Pascal escrito numa
área denominada Corpo do Programa, que tem início com a instrução begin e é
finalizada pela instrução end, seguida do símbolo ponto ( . ). O uso destas instruções
caracteriza o que é chamado de bloco de comandos, como indicado abaixo:
{Sintaxe:}
begin
bloco de comandos;
end.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Observações:
1. O corpo do programa pode conter vários blocos de comandos.
Nosso programa continuaria como apresenta a Listagem 1.4.
1 program adicionaNumeros;
2 {Programa que lê 2 números e imprime sua soma.}
4 {Usa a biblioteca CRT onde está a função ReadKey}
5 uses crt;
7 {Declara a, b e soma como variáveis inteiras}
8 var
9
a, b : integer;
10
soma : integer;
12 begin
13
{limpa a tela}
14
clrscr;
16
{escreve na tela (prompt de comandos)}
17
writeln('Insira o valor de a: ');
19
{espera que o usuário digite algo e atribui o que for digitado à
variável a}
20
readln(a);
22
23
writeln('Insira o valor de b: ');
readln(b);
25
26
27
{soma a com b e atribui o resultado a soma}
soma := a + b;
writeln('A soma de ', a, ' com ', b, ' eh ', soma);
29
{para o programa até que alguma tecla seja pressionada}
30
readkey;
31 end.
Listagem 2.4 – Programa que lê 2 números e calcula a soma.
Descrição do primeiro programa exemplo
O objetivo do programa da Listagem 2.4 é efetuar a leitura de dois valores numéricos
(variáveis a e b), fazer a operação de adição entre elas, atribuir o resultado à variável
soma e apresentar o resultado obtido. Destaca-se o seguinte:
1.
2.
3.
4.
O corpo do programa está delimitado pelas linhas 12 (begin) e 31 (end.).
A linha 14 apresenta uma instrução (clrscr) usada para limpar a tela.
As linhas 17, 22 e 27 usam uma instrução (writeln) para imprimir na tela.
As linhas 20 e 23 usam uma instrução (readln) para ler um valor do teclado
e associar a uma variável.
5. A instrução da linha 30 (readkey) para o programa até que algo seja
teclado.
47
48
Programação com Pascal
Outra forma de representar o algoritmo adicionaNumeros é usando a Linguagem
Natural, como segue:
1. Início do Algoritmo adicionaNumeros
a. Declarar as variáveis a, b e soma;
b. Solicitar ao usuário para inserir o valor de a;
c. Ler um valor para a variável a;
d. Solicitar ao usuário para inserir o valor de b;
e. Ler um valor para a variável b;
f. Efetuar a soma das variáveis a e b, colocando o resultado na
variável soma;
g. Apresentar o valor resultante da variável soma;
h. Aguardar até que algo seja pressionado.
2. Fim do Algoritmo adicionaNumeros.
O fluxograma que representa o algoritmo adicionaNumeros está representado na Figura 2.1.
Início
Insira o valor
de a:
a
Insira o valor
de b:
b
soma = a + b
Fim
'A soma de ',
a, ' com ', b, '
eh ', soma
Figura 2.1 - Fluxograma: Soma de a e b.
Observações:
1. Os comandos read e readln são responsáveis por entrada de dados, como leitura pelo
teclado.
a. ReadLn(var) lê um valor do teclado e atribui à variável var.
b. O programa fica parado até que a tecla ENTER seja pressionada. Tudo o que
for digitado antes de ENTER será colocado na variável (var).
2. Os comandos write e writeln são responsáveis por saída de dados, como impressão na
tela.
a. WriteLn(var) imprime o valor da variável (var) na tela.
3. O uso de LN (acrônimo para New Line – Nova Linha) indica que uma nova linha deve ser
usada após o comando.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Vamos a outro exemplo comentado que serve para calcular a média aritmética de 3
valores. Ele deve ler três variáveis numéricas (a, b e c) e calcular a média aritmética
destas, apresentando o resultado obtido.
Algoritmo usado em Linguagem Natural:
1. Início do Algoritmo Média de 3 Números
a. Solicitar ao usuário para digitar o valor da variável a;
b. Ler um valor para a variável a;
c. Solicitar ao usuário para digitar o valor da variável b;
d. Ler um valor para a variável b;
e. Solicitar ao usuário para digitar o valor da variável c;
f. Ler um valor para a variável c;
g. Calcular a média como a soma de a, b e c dividida por 3.
h. Imprimir os três valores lidos e a média.
2. Terminar o Algoritmo Média de 3 Números.
O fluxograma que ilustra o Algoritmo |Média de 3 Números está ilustrado na Figura 2.2
a seguir:
Início
Digite o valor
de a:
a
Digite o valor
de b:
b
Digite o valor
de c:
Fim
'A media entre
', a, ', ', b, ' e ',
c, ' eh: '
média = (a + b +
c) / 3
c
Figura 2.2 - Fluxograma: Média de 3 números.
A implementação do Algoritmo Média de 3 Números é apresentada na Listagem 2.5.
49
50
Programação com Pascal
1 {O programa deve ler 3 variáveis inteiras, calcular a media
aritmética e atribuir a uma variável media.
2 Qual deve ser o tipo da variável media? Por quê?
3 }
4 program media3N;
6 uses crt;
8 var
9
a, b, c : integer;
10
media : real;
12 begin
13
writeln('Digite o valor de a: ');
14
readln(a);
16
17
writeln('Digite o valor de b: ');
readln(b);
19
20
writeln('Digite o valor de c: ');
readln(c);
22
23
24
media := (a + b + c) / 3;
write('A media entre ', a, ', ', b, ' e ', c, ' eh: ');
writeln(media:3:2);
26
readkey;
27 end.
Listagem 2.5 - Programa que lê 3 variáveis e calcula a média.
No programa da Listagem 2.5 destaca-se o seguinte:
1. O cabeçalho do programa está entre as linhas 1 e 4.
2. As declarações do programa estão entre as linhas 8 e 10.
3. O corpo do programa está delimitado pelas linhas 12 e 27.
4. As linhas 13, 16, 19, 23 e 24 usam instruções – writeln e write – para
imprimir na tela.
5. As linhas 14, 17 e 20 usam uma instrução para ler os valores de a, b e c,
respectivamente.
6. Na linha 22 calcula-se a média aritmética de a, b e c, atribuindo-a à variável
media.
7. A linha 24 imprime a média formatada com 3 dígitos decimais e 2
decimais. Por isso a variável media é seguida por :3:2, respectivamente.
Observações:
1. A variável media precisa ser real, pois a divisão de inteiros nem sempre é um inteiro. Por
exemplo, 7/3.
2. O uso de media:3:2 na impressão significa que o resultado será formatado com 3
dígitos antes da vírgula e 2 dígitos depois.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Identificadores
A memória do computador pode ser abstraída como um enorme armário de gavetas,
onde cada gaveta possui uma identificação numérica única, sequencial, e só pode
armazenar um caractere (alfanumérico) ou um número entre 0 e 255, como ilustra a
Figura 2.3, que representa uma memória com 1024 posições (bytes).
Figura 2.3 – Abstração de memória.
As máquinas modernas trabalham com bilhões de bytes de armazenamento, o que torna
difícil memorizar o endereço de cada elemento armazenado. Para facilitar o trabalho do
programador, cada região de memória que armazene algo pode receber um nome identificador.
Os identificadores servem para definir variáveis, constantes, tipos de dados,
procedimentos e funções e estes precisam de um nome que forneça uma identificação
única.
Nomes (identificadores) em Pascal devem seguir as seguintes regras de construção:
1. Iniciar sempre por uma letra (a - z, A - Z) ou um sublinhado (_);
2. O restante do identificador deve conter apenas letras, sublinhado ou dígitos (09). Não pode conter outros caracteres; e
3. Pode ter qualquer tamanho, desde que os primeiros 63 caracteres sejam
significativos.
Não existe distinção entre letras maiúsculas e minúsculas no nome de um
identificador. Por exemplo, os nomes ALPHA, alpha e Alpha são equivalentes para o
Pascal.
Observações:
1. CamelCase é a denominação em inglês para a prática de escrever palavras compostas,
ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços.
a. É um padrão largamente utilizado em diversas linguagens de programação,
como Java, Ruby e Python.
b. Exemplos: NomeDoCliente, TipoDePeça, MediaPonderada, MediaDe3Numeros.
51
52
Programação com Pascal
Palavras Reservadas
Pascal reconhece certo grupo de palavras como sendo reservadas. Elas têm
significado especial e não podem ser usadas como identificadores em um programa
para objetos criados pelo programador.
São elas: absolute, and, array, asm, begin, case, const, constructor, destructor, div, do,
downto, else, end, file, for, function, goto, if, implementation, in, inherited, inline,
interface, label, mod, nil, not, object, of, on, operator, or, packed, procedure,
program, record, reintroduce, repeat, self, set, shl, shr, string, then, to, type, unit,
until, uses, var, while, with, xor.
Comentários
Comentários são textos escritos dentro do código-fonte para explicar ou descrever
alguns aspectos relativos ao mesmo ou para esclarecer detalhes de programação que
podem não ficar claros. Seu principal objetivo é adicionar informação textual ao código,
facilitando seu entendimento por leitores.
A sintaxe requerida aos comentários permite o uso de chaves como em: {
comentário } ou de parêntesis e asteriscos, como em: (* comentário *).
2.1 Variáveis
Uma variável é uma região da memória, identificada através de um nome, cujo valor
pode mudar durante a execução do programa. Como Pascal é uma linguagem fortemente
tipada, cada variável precisa obrigatoriamente de um tipo de dados predeterminado
(informando se é inteiro, real, caractere, texto, etc.).
{Sintaxe:}
var
variável : tipo de dado;
variável1, variável2 : tipo de dado2;
Nesta especificação de sintaxe, variável tem seu tipo definido por tipo de dado. Note
que variável1 e variável2 são definidas juntas, separadas por vírgulas e atribuindo-lhes
um único tipo de dados. Isso pode ser feito para qualquer número de variáveis que
compartilhem um mesmo tipo de dados.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
2.2 Constantes
Uma constante é uma região rotulada da memória através de um nome cujo valor não
pode mudar durante a execução do programa. Um exemplo de uso de constantes em
programas é o uso de π (3,1415926...) para aplicações da matemática.
{Sintaxe:}
const
nomeDaConstante = expressão;
2.3 Tipos de Dados
Um tipo de dado especifica as características, ou seja, quais os possíveis valores e
operações que um dado possui. Por exemplo, um valor inteiro pode ser somado a outro,
subtraído, multiplicado, etc.
Variáveis, como apresentado em sua sintaxe, requerem um tipo de dado em sua
definição.
A linguagem Pascal fornece ao programador um conjunto de tipos de dados
predefinidos e que serão descritos a seguir.
Inteiros
Inteiros são valores numéricos positivos ou negativos, excluindo-se qualquer número
fracionário. Em Pascal, este tipo de dado pode ser referenciado por um dos seguintes
identificadores: Byte, Shortint, Smallint, Word, Integer, Cardinal, Longint,
Longword, Int64 e QWord.
Tabela 2.1 – Tipos Inteiros
Tipo
Valores
Byte
Shortint
Smallint
Word
Integer
Cardinal
Longint
Longword
Int64
0..255
-128 .. 127
-32768 .. 32767
0 .. 65535
Smallint ou Longint
Longword
-2147483648 .. 2147483647
0 .. 4294967295
-9223372036854775808 ..
9223372036854775807
0 .. 1844674473709551615
QWord
Tamanho
em Bytes
1
1
2
2
2 ou 4
4
4
4
8
8
A Tabela 2.1 apresenta o nome de cada tipo, quantos bytes necessitam para ser
armazenados e seus limites de valores.
53
54
Programação com Pascal
Retornando à memória do computador, seus endereços são sequenciais e contíguos.
Assim, a declaração da variável alfa do tipo Longint vai reservar 4 bytes na memória e
associar ao nome alfa apenas o primeiro deles.
Figura 2.4 – Alocação de variáveis.
Desta forma, se a variável alfa for alocada no endereço n+2, ele e os 3 próximos (4
bytes contíguos) ficam reservados para armazenar seu valor, mas alfa fica associada
apenas ao primeiro endereço (n+2).
A definição de variáveis inteiras é feita com a seguinte sintaxe:
{Sintaxe:}
variável : integer;
O Fluxograma da Figura 2.5 apresenta um exemplo de uso de Inteiros baseado na
segunda lei de Newton, que determina a relação entre força, massa e aceleração: Força
= massa * aceleração. Conhecidas a massa e a aceleração, qual a força, em newtons?
Início
massa = 100
aceleracao = 2
forca = massa * aceleracao
'A forca eh: ',
forca
Fim
Figura 2.5 – Fluxograma do programa InteirosEmPascal.
A implementação do algoritmo do fluxograma da Figura 2.5 está na Listagem 2.6,
descrito a seguir.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
1 program InteirosEmPascal;
2 {Este programa vai demonstrar o uso de Inteiros em Pascal.}
4 uses crt;
6 var
7
forca : integer;
8
massa, aceleracao : integer;
9 begin
10
massa := 100;
11
aceleracao := 2;
12
forca := massa * aceleracao;
13
writeln ('A forca eh: ', forca);
14
readkey;
15 end.
Listagem 2.6 – Exemplo de uso de Inteiros
No programa da Listagem 2.6 destaca-se o seguinte:
1. Na linha 7 declara-se a variável forca do tipo integer.
2. A linha 8 apresenta a declaração de duas variáveis inteiras: massa e
aceleração. Embora as três variáveis pudessem ter sido declaradas numa
única linha, optou-se por duas declarações separadas para exemplificação.
3. Na linha 10 atribui-se o valor 100 à variável massa, enquanto na linha 11
atribui-se 2 à variável aceleração.
4. Na linha 12 atribui-se à variável forca o produto entre massa e aceleração.
5. A linha 13 imprime o valor resultante da forca.
A execução do programa imprimirá:
A forca eh: 200
Reais
O tipo de dado real permite trabalhar com números fracionários, tanto positivos como
negativos, sendo sua capacidade de armazenamento maior que dos números inteiros.
Vejamos os tipos: Real, Single, Double, Extend, Comp e Currency.
Tabela 2.2 - Tipos Reais
Tipo
Valores
Real
Single
Double
Extended
Comp
Currency
Depende da Plataforma
1.5E-45 .. 3.4E38
5.0E-324 .. 1.7E308
1.9E-4932 .. 1.1E4932
-2E64+1 .. 2E63-1
Dígitos
Signific.
7-8
15-16
19-20
19-20
A definição de variáveis reais é feita com a seguinte sintaxe:
Tamanho
em Bytes
4 ou 8
4
8
10
8
55
56
Programação com Pascal
{Sintaxe:}
variável : real;
O Fluxograma da Figura 2.7 representa o algoritmo que calcula a massa de um corpo
sabendo-se a força aplicada ao mesmo e sua aceleração. Como a massa é calculada pela
razão entre força e aceleração (massa = força / aceleração), seu resultado pode resultar
num número não inteiro. Assim, um tipo real é requerido.
Início
forca = 235
aceleracao = 2
massa = forca / aceleracao
‘A massa eh:
', massa:3:2
Fim
Figura 2.6 – Fluxograma do programa ReaisEmPascal.
A implementação do algoritmo do fluxograma da Figura 2.6 está na Listagem 2.7,
descrito a seguir.
1 program ReaisEmPascal;
2 {Este programa vai demonstrar o uso do tipo Real em Pascal.}
4 uses crt;
6 var
7
forca : real;
8
massa, aceleracao : real;
9 begin
10
forca := 235;
11
aceleracao := 2;
12
massa := forca / aceleracao;
13
writeln ('A massa eh: ', massa:3:2);
14
readkey;
15 end.
Listagem 2.7 – Uso de Reais em Pascal
No programa da Listagem 2.7 destaca-se o seguinte:
1. Na linha 7 declara-se a variável forca do tipo real.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
2. A linha 8 apresenta a declaração de duas variáveis reais: massa e aceleração.
Embora as três variáveis pudessem ter sido declaradas numa única linha,
optou-se por duas declarações separadas para exemplificação.
3. Na linha 10 atribui-se o valor 235 à variável forca, enquanto na linha 11
atribui-se 2 à variável aceleração.
4. Na linha 12 atribui-se à variável massa a razão entre forca e aceleração.
5. A linha 13 imprime o valor resultante da massa.
A execução do programa imprimirá:
A massa eh: 117.50
Observações:
1. Write e WriteLn permitem que sejam definidos formatos aos números.
a. Estes formatos são úteis na impressão de números reais para evitar a forma
com exponenciação.
b. O formato é: numero:tamanho:precisão
i. numero é o número que se quer imprimir.
ii. tamanho informa a largura da saída.
iii. precisão informa com quantos dígitos o numero será impresso.
Caracteres
String
Strings são sequências contendo letras, números e símbolos especiais e devem ser
representadas entre delimitadores (apóstrofos, em Pascal). Este tipo de dado é
referenciado pelo identificador string, podendo armazenar de 1 até 255 caracteres.
Retornando à memória do computador, uma string, assim como os demais tipos
primitivos, ocupa endereços contíguos na memória. Logo, a declaração da variável
nome do tipo String precisa reservar tantos bytes quanto for o seu tamanho. Por
exemplo: suponha a variável nome do tipo string e que seu valor seja ‘Edeyson’.
Necessitam-se de 7 bytes contíguos de memória para armazenar a variável nome.
Figura 2.7 – Alocação de Strings.
57
58
Programação com Pascal
Supondo que na memória representada na Figura 2.7 a variável nome esteja no
endereço n+2 (note que há 7 bytes contíguos reservados para isso) de memória e a
variável alfa, do tipo Longint, esteja no endereço n+9, o que acontecerá se mudarmos o
valor de nome para ‘Edeyson Gomes’? O novo valor de nome necessita de mais 6
bytes contíguos. Ressalta-se que os 4 bytes iniciados em n+9 já estão reservados.
A solução usada pelo gerenciamento de memória é mudar nome de lugar, encontrando
um espaço contíguo livre que o caiba, alterando seu endereço. Logo, alterar o conteúdo
de uma String, aumentando sua quantidade de caracteres, leva a uma movimentação
daquela na memória, mudando o endereço da variável. O ponto positivo disso é que é
totalmente transparente ao programador.
Para definir uma variável do tipo string, cujo conteúdo pode ter até 255 caracteres, usase a seguinte sintaxe:
{Sintaxe:}
variável : string;
Como a sintaxe anterior não especifica um tamanho, a variável definida sempre ocupará
255 bytes na memória, pois o Pascal na tem como saber quantos bytes realmente serão
necessários.
Para o caso de variáveis string que o programador conheça o tamanho máximo, pode-se
usar a seguinte sintaxe para determiná-lo:
{Sintaxe:}
variável : string[tamanho];
O uso de colchetes determina que a variável tenha um conteúdo de até tamanho
caracteres. A Listagem 2.3 apresenta um exemplo de uso de Strings.
1 program StringsEmPascal;
2 {Este programa vai demonstrar o uso de String em Pascal.}
4 uses crt;
6 var
7
endereco : string;
8
nome : string[30];
9
CPF : string[11];
{endereço é uma cadeia com 0 a 255 caracteres.}
{O uso de [] delimita o número de caracteres.
Neste caso CPF tem 11 caracteres.}
11 begin
12
endereco := 'Rua dos Alferes, 1234, Ap. 1001, Barra, Salvador, Bahia CEP: 40.130.280';
13
nome:= 'Jose da Silva Santos';
14
CPF := '12345678901';
15
writeln('Endereco: ', endereco, ' Cliente: ', nome, ' CPF: ', cpf);
16
readkey;
17 end.
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Listagem 2.3 – Exemplo com Strings
No programa da Listagem 8 destaca-se o seguinte:
1. Na linha 7 declara-se a variável endereco que terá até 255 caracteres (é o
limite máximo de uma string),
2. A linha 8 apresenta a declaração da variável nome que terá, no máximo, 30
caracteres.
3. A linha 8 apresenta a declaração da variável CPF que terá, no máximo, 11
caracteres.
4. Na linha 12 atribui-se um valor à variável endereço. Note que atribuição de
string requer o uso de apóstrofos.
5. A linha 15 faz-se a impressão das três variáveis e seus valores.
A execução do programa imprimirá:
Endereco: Rua dos Alferes, 1234, Ap.
1001, Barra, Salvador, Bahia - CEP:
40.130.280 Cliente: Jose da Silva
Santos CPF: 12345678901
Observações:
1. Write e WriteLn permitem imprimir múltiplos valores separando-os por vírgulas.
a. A impressão de constantes string é feita colocando-as entre apóstrofos.
b. O comando writeln('Endereco: ', endereco); imprimirá Endereco: seguido pelo
valor da variável endereco.
59
60
Programação com Pascal
Char
Pascal suporta o tipo Char, que ocupa exatamente 1 byte e contém um caractere ASCII
(American Standard Code for Information Interchange). Para definir uma variável do
tipo char usa-se a seguinte sintaxe:
{Sintaxe:}
variável : char;
A Listagem 2.4 apresenta um exemplo de uso de char.
1 program CharEmPascal;
2 {Este programa vai demonstrar o tipo Char do Pascal}
3
4 uses crt;
5
6 var
7
letraAMinuscula, letraAMaiuscula : char;
8
letraBMinuscula, letraBMaiuscula : char;
9
sexo : char;
{char representa um único caracter. Neste caso
sexo pode ser 'M' ou 'F'}
10
11 begin
12
{Atribuições de valores às variáves}
13
sexo := 'M';
14
letraAMinuscula := 'a';
15
letraAMaiuscula := #65;
16
17
letraBMinuscula := #98;
18
letraBMaiuscula := 'B';
19
20
writeln('Sexo: ', sexo);
21
writeln('Letras Maiusculas: ', letraAMaiuscula, letraBMaiuscula);
22
writeln('Letras Minusculas: ', letraAMinuscula, letraBMinuscula);
23
readkey;
24 end.
Listagem 2.4 – Exemplo com Char
Nas linhas 7, 8 e 9 definem-se variáveis do tipo char.
Um caractere pode ser especificado colocando-o entre delimitadores (apóstrfos), como
'a' ou 'B', por exemplo, nas linhas 14 e 18. Também pode ser especificado pelo seu valor
de caracteres (normalmente um código ASCII), precedendo o valor ordinal com o
símbolo (#). Por exemplo, na linha 15, especificando #65 é o mesmo que 'A'. O
resultado da execução do programa é:
Sexo: M
Letras Maiusculas: AB
Letras Minusculas: ab
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
Tipos Lógicos
No Capítulo 1 apresentamos o símbolo de fluxograma para decisão usado sempre que é
necessária a avaliação de uma condição (que pode ser Verdadeira ou Falsa) para uma
tomada de decisão: a escolha de um dos caminhos possíveis à sequência de ações.
Comumente, as linguagens de programação apresentam o tipo Boolean, com dois
possíveis valores predefinidos: true e false. Qualquer expressão que resulte em um
valor booleano (verdadeiro ou falso) também pode ser atribuída a um tipo booleano.
Para definir uma variável do tipo boolean usa-se a seguinte sintaxe:
{Sintaxe:}
variável : char;
A Listagem 2.5 apresenta exemplos de uso do tipo boolean.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
program BooleanEmPascal;
{Este programa vai demonstrar o tipo boolean do Pascal}
uses crt;
var
aprovado : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
maior, menor, igual : boolean;
begin
{Atribuições de valores às variáves}
aprovado := true;
{Atribui TRUE a aprovado}
maior := 2 > 1;
{Atribui o resultado do teste: 2 > 1? a maior}
igual := 2 = 1;
{Atribui o resultado do teste: 2 > 1? a igual}
menor := 2 < 1;
{Atribui o resultado do teste: 2 > 1? a menor}
writeln('Aprovado: ', aprovado);
writeln('2 > 1? eh: ', maior);
writeln('2 = 1 eh: ', menor);
writeln('2 = 1 eh: ', igual);
readkey;
end.
Listagem 2.5 – Exemplo com Boolean
O resultado da execução do programa é:
Aprovado: TRUE
2 > 1? eh: TRUE
2 = 1 eh: FALSE
2 < 1 eh: FALSE
61
62
Programação com Pascal
A linha 11 atribui diretamente o valor TRUE à variável aprovado. As linhas 12 a 14
atribuem o valor lógico do teste às variáveis maior, igual e menor.
Note que uma atribuição tem duas partes: uma antes do := e outra depois. No caso da
linha 12 estamos atribuindo à variável maior o resultado da expressão que avalia se 2 é
maior que 1, o que é verdade (TRUE). As linhas 13 e 14 seguem o mesmo princípio,
atribuindo a igual e a menor o resultado dos respectivos testes lógicos.
A Listagem 2.6 a seguir apresenta um exemplo com variáveis e constantes que serve
para calcular a área de um círculo com a fórmula πR2, onde R representa o raio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program VariaveisEConstantes;
{Este programa vai demonstrar variáveis e constantes no Pascal}
uses crt;
var
area, raio : real;
{Declara area e raio como variáveis REAIS}
const
pi = 3.1415926536;
{Declara pi como uma constante}
begin
{Atribuições de valores às variáves}
raio := 10;
area := pi * raio * raio;
writeln('A area do circulo de raio 10 eh: ', area:3:4);
raio := 15;
area := pi * raio * raio;
writeln('A area do circulo de raio 15 eh: ', area:3:4);
{pi := 10;}
readkey;
end.
Listagem 2.6 – Exemplo com Variáveis e Constantes
O programa VariaveisEConstantes declara na linha 7 as variáveis área e raio do tipo
REAL. Como o nome já informa, as variáveis podem mudar de valor durante a
execução do programa, mas as constantes, como pi, não. As linhas 14, 15, 18 e 19
exemplificam isso, mudando os valores de raio e área.
Para um novo valor do raio é calculada a área de um círculo usando-se a fórmula: area =
π * raio2 (calculado como raio * raio).
A constante matemática π é representada no programa pela constante pi, cujo valor é
atribuído na própria declaração, como é visto na linha 10.
O resultado da execução do programa da Listagem 2.6 é:
Edeyson Andrade Gomes
www.edeyson.com.br
A LINGUAGEM PASCAL
A area do circulo de raio 10 eh: 314.1593
A area do circulo de raio 15 eh: 706.8583
63
64
Programação com Pascal
3
EXPRESSÕES
Expressões são arranjos de operandos (variáveis, constantes ou valores gerados por
funções) e operadores (operações a serem efetuadas sobre os operandos) que ocorrem
nas atribuições ou em testes e produzem um valor de um determinado tipo. Um exemplo
de expressão é: ax2 + bx + c, que em linguagem de programação é representada
comumente como: a*x*x + b*x + c.
Um operador pode ser binário, ou seja, requer 2 operandos (como em X / Y e em A * B)
ou unário, isto é, exige apenas um argumento (como em -X).
Cada tipo de dados possui um conjunto de operadores relacionados. Cada
linguagem traz símbolos para operadores como adição, a subtração, a
multiplicação, a divisão, a potenciação, etc.
3.1 Prioridades das Operações
Se vários operadores aparecerem em uma mesma expressão, sua ordem de execução
(precedência) será dada segundo os seguintes critérios:
1. Pelo emprego explícito de parênteses;
2. Pela ordem de precedência existente entre os operadores; e
3. Se existirem operadores de mesma ordem de precedência, a avaliação será feita
da esquerda para a direita.
Como exemplo do uso de precedência, qual o resultado da expressão: 3 + 2 * 5? A
resposta será 25 ou 13?
Na matemática, a multiplicação precede a soma. Logo, a expressão pode ser lida assim:
3 + (2 * 5), o que resulta em 13. O uso de parêntesis facilita a leitura de expressões com
múltiplos operadores, explicitando sua precedência.
A Tabela 3.1 apresenta a ordem de precedência dos operadores (da maior para a menor):
Tabela 3.1 – Precedência de Operadores
ORDEM DE
OPERADOR
PRECEDÊNCIA
not, @
1
Edeyson Andrade Gomes
*, /, div, mod, and, shl, shr,
as
+, -, or, xor
2
<, <>, >, <=, >=, in, is
4
3
www.edeyson.com.br
EXPRESSÕES
3.2 Tipos de Expressões
As expressões podem ser divididas em três grupos:

Numérica - quando os operandos e o resultado são numéricos (inteiros ou reais).

Literal - quando os operandos e o resultado são literais do tipo string (não pode
ser char). Só existe um operador para expressões literais: Concatenação ( + ).

Lógica - quando seu resultado é do tipo boolean (TRUE ou FALSE).
3.3 Tipos de Operadores
Existem vários operadores para a realização de expressões em Pascal, como detalhado a
seguir.
Operador de Atribuição
O operador de atribuição é utilizado para atribuir o valor de uma expressão a uma
variável.
{Sintaxe:}
nomeDaVariável := expressão;
A Listagem 3.1 apresenta exemplos de atribuições documentados no código via
comentários.
1 program VariaveisPascal;
2
3 var
4
a, b, c : integer; {Declara a, b e c como variáveis inteiras}
5
media : real;
{Declara media do tipo real}
6
aprovado : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
7
endereco : string; {endereço é uma cadeia com 0 a 255 caracteres.}
8
CPF : string[11];
{O uso de [] delimita o número de caracteres.}
9
sexo : char;
{char representa um único caracter.}
10
11 begin
12
{Atribuições de valores às variáves}
13
endereco := 'Rua dos Alferes, 1234, Ap. 1001, Barra, Salvador,
Bahia - CEP: 40.130.280';
14
nome:= 'Jose da Silva Santos';
15
CPF := '12345678901';
16
writeln('Endereco: ', endereco, ' Cliente: ', nome, ' CPF: ', cpf);
17
sexo := 'M';
18
a := 7;
19
b := a + 2;
20
c := 8;
21
media := (a + b + c) / 3;
22
readkey;
23 end.
Listagem 3.1 – Operador de Atribuição
65
66
Programação com Pascal
Das linhas 13 a 21, exceto a linha 16, temos atribuições de valores às variáveis de
diversos tipos. Note que o que está após o := é uma expressão.
Operadores Aritméticos
Os operadores aritméticos são utilizados para efetuar operações aritméticas com
números inteiros e reais (e seus subtipos). São eles: Subtração (-), Adição (+) e
Multiplicação (*). São exemplos de expressões onde a, b e c podem ser inteiros ou
reais:
1. a := a * 3;
2. b := 7 + 15;
3. c := 10 – 1;
A (/) é chamada de Divisão Real, pois sempre resultará num número real. Não se pode
garantir que a divisão de dois inteiros resultará num número inteiro, como é o caso da
divisão de 10 por 3.
Por exemplo, suponha uma variável com nome total do tipo real. A expressão
total := 16 / 3 atribuirá como resultado a total o valor 5,3333.
Observações:
1. Suponha que se deseja saber se um número inteiro a é múltiplo de 2. Para isto, necessitase saber o resto da divisão de a por 2. Apenas se o resto for 0, a é múltiplo de 2.
2. Para resolver tal problema, o operador MOD fornece o resto inteiro da divisão.
3. Ainda há o operador DIV para obter a parte inteira da divisão entre inteiros.
Figura 3.1 – Divisão de Inteiro.
A Figura 3.1 ilustra a divisão de um número inteiro a por 2. Assim, as seguintes
expressões retornam o quociente e o resto inteiros da divisão.
1. resto := a MOD 2;
2. quociente := a DIV 2;
A listagem 3.2 apresenta um código que ilustra o uso de DIV e MOD apresentando o
dividendo, divisor, quociente e resto numa divisão inteira e a Listagem 3.3 demonstra
como extrair todos os dígitos de um número com 3 dígitos.
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSÕES
1 program UsoDivMod;
2 {Este programa demonstra o uso de DIV e MOD como operadores de
inteiros.}
3
4 uses crt;
5
6 var
7
dividendo, divisor, quociente, resto : integer;
8
quocienteReal : real;
9
10 begin
11
dividendo := 10;
12
divisor := 3;
13
quociente := dividendo div divisor;
14
quocienteReal := dividendo / divisor;
15
16
resto := dividendo mod divisor;
17
18
writeln('Dividendo: ', dividendo:3, '
Divisor: ', divisor:3);
19
writeln('Quociente: ', quociente:3, '
Resto : ', resto:3);
20
writeln('Quociente Real: ', quocienteReal:3:4);
21
22
readkey; {Para o programa até que algo seja teclado}
23 end.
Listagem 3.2 – Uso de DIV e MOD
Na Listagem 3.2, as linhas 7 e 8 definem as variáveis dividendo, divisor, quociente e
resto como inteiros e quocienteReal como real. Tais variáveis representarão os
elementos numa divisão.
As linhas 11 e 12 iniciam o dividendo com 10 e o divisor com 3. A divisão entre 10 e 3
é uma dízima periódica 3.333, que será o valor de quocienteReal calculado na linha 14.
Pensando-se numa divisão com todos os fatores inteiros, quociente (linha 13) assumirá
o valor 3 e resto (linha 16) assumirá o valor 1. Vale lembrar que 10 dividido por 3 é
igual a 3 com resto 1 (10 = 3 * 3 + 1).
O resultado da execução do programa da Listagem 3.2 é:
Dividendo: 10
Divisor: 3
Quociente: 3
Resto : 1
Quociente Real: 3.3333
67
68
Programação com Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program UsoDivMod2;
{Este programa vai demonstrar o uso de DIV e MOD.}
uses crt; {Usa a biblioteca CRT onde está readkey}
var
numero, centena, dezena, unidade, resto : integer;
{Operações sobre Inteiros: +, -, *, DIV e MOD}
begin {inicia o programa}
{Atribuições de valores às variáves}
numero := 367;
{XYZ = X * 100 + YZ}
centena := numero div 100; {centena = X}
resto := numero mod 100;
{resto = YZ} {YZ = Y * 10 + Z}
dezena := resto div 10;
{dezena = Y}
unidade := resto mod 10;
{unidade = Z}
writeln('Centena: ', centena);
writeln('Dezena: ', dezena);
writeln('Unidade: ', unidade);
readkey; {Para o programa até que algo seja teclado}
end.
{termina o programa}
Listagem 3.3 – Uso de DIV e MOD com Unidade, Dezena e Centena
O objetivo do programa da Listagem 3.3 é apresentar os valores de unidade, dezena e
centena de um número. Na linha 12 atribui-se o valor 367 à variável numero. Note que
367 = 3 * 100 + 67 = (3 * 100) + (6 * 10) + 7.
A linha 13 atribui à variável centena o valor de numero div 100, ou seja, o quociente
inteiro da divisão entre 367 e 100, que resulta em 3.
A linha 14 atribui à variável resto o valor de numero mod 100, o que representa o resto
inteiro da divisão. Como número é igual a 367, resto será 67.
Seguindo o raciocínio do uso de DIV e MOD, a linha 15 atribui 6 a dezena e a linha 16
atribui 7 a unidade.
O resultado da execução do programa da Listagem 3.3 é:
Centena: 3
Dezena : 6
Unidade: 7
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSÕES
Operador de Concatenação
O operador de concatenação efetua a junção de duas variáveis ou constantes do tipo
string. Por exemplo, suponha as strings nome e sobrenome. Nome armazena
‘Edeyson’ e sobrenome, ‘Gomes’. Como obter uma string com o nome completo?
Variáveis e constantes do tipo string suportam a operação de soma (+) que funciona
com a concatenação (junção).
A Listagem 3.4 exibe um exemplo de concatenação de strings.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program ConcatenacaoDeStrings;
{Este programa vai demonstrar a Concatenação de Strings em Pascal.}
uses crt;
var
nome
: string[20];
sobrenome
: string[20];
nomeCompleto : string[40];
{Definição de variáveis}
begin
nome := 'Edeyson';
{Atribui Edeyson para a var. nome}
sobrenome:= 'Gomes';
{Atribui Gomes para a var. sobrenome}
nomeCompleto := nome + ' ' + sobrenome;
{Concatena nome,
espaço em branco e sobrenome}
15
writeln('Nome Completo: ', nomeCompleto); {Exibe o nome completo}
16
17
readkey;
18 end.
Listagem 3.4 - Concatenação de Strings
Na Listagem 3.4, as linhas 7, 8 e 9 declaram strings com tamanho fixo. As variáveis
nome e sobrenome só podem armazenar cadeias de caracteres com, no máximo, 20
caracteres. Já a variável nomeCompleto pode armazenar cadeias de até 40 caracteres.
Na linha 12 atribui-se a string ‘Edeyson’ à variável nome. Na linha 13 atribui-se
‘Gomes’ para sobrenome.
Note que na linha 14 faz-se uma operação de concatenação entre strings. Isso significa
que as strings ‘Edeyson’, espaço em branco e ‘Gomes’ serão concatenadas e o
resultado será atribuído à variável nomeCompleto.
O resultado da linha 15 será:
Nome Completo: Edeyson Gomes
69
70
Programação com Pascal
Operadores Relacionais
Os operadores relacionais, apresentados na Tabela 3.2, são utilizados para efetuar a
comparação entre dados de mesmo tipo, por exemplo, se um número inteiro é maior que
outro, se um número real é menor ou igual a outro, se duas strings são iguais, etc.
Tabela 3.2 – Operadores Relacionais
OPERADOR
SÍMBOLO
Maior que
>
Menor que
<
Igual
=
Maior Igual
>=
Menor Igual
<=
Diferente
<>
Exemplo de operadores relacionais:
1 program OperadoresRelacionaisComInteger;
2 {Este programa vai demonstrar Operadores Relacionais
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem
6
inteiro1, inteiro2 : integer;
7
8 begin
9
{Atribuições de valores às variáves}
10
inteiro1 := 10;
11
inteiro2 := 20;
12
13
valorLogico := inteiro1 = inteiro2;
14
writeln('Teste se ', inteiro1, ' = ', inteiro2, '
valorLogico);
15
16
valorLogico := inteiro1 < inteiro2;
17
writeln('Teste se ', inteiro1, ' < ', inteiro2, '
valorLogico);
18
19
valorLogico := inteiro1 > inteiro2;
20
writeln('Teste se ', inteiro1, ' > ', inteiro2, '
valorLogico);
21
22
readkey;
23 end.
do Pascal}
ser TRUE ou FALSE}
: ',
: ',
: ',
Listagem 3.5 – Operadores Relacionais com Integer
Na Listagem 3.5 a linha 5 define uma variável valorLogico do tipo boolean, ou seja,
ela só armazena Verdade (TRUE) ou Falso (FALSE). A linha 6 define duas variáveis
inteiras que são inicializadas nas linhas 10 e 11, respectivamente.
A linha 13, valorLogico := inteiro1 = inteiro2, precisa de destaque aos :=, que é o
símbolo de atribuição do Pascal. Este atribui ao símbolo da esquerda do :=, no caso
valorLogico, o valor lógico ou absoluto do que está à direita do símbolo.
A linha 13 é lida assim: o valor do inteiro1 é igual ao valor do inteiro2? Se sim, atribua
TRUE para valorLogico; se não, atribua FALSE.
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSÕES
A linha 14 imprime o resultado do teste lógico. Note que as linhas 16/17 e 19/20 fazem
algo similar às linhas 13/14, apenas mudando o operador relacional.
O resultado da execução do programa da Listagem 3.5 é:
Teste se 10 = 20 : FALSE
Teste se 10 < 20 : TRUE
Teste se 10 > 20 : FALSE
1 program OperadoresRelacionaisComString;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
6
string1, string2 : string;
7
8 begin
9
{Atribuições de valores às variáves}
10
string1 := 'abc';
11
string2 := 'def';
12
13
valorLogico := string1 = string2;
14
writeln('Teste se ', string1, ' eh = a ', string2, ' : ',
valorLogico);
15
16
valorLogico := string1 > string2;
17
writeln('Teste se ', string1, ' eh > que ', string2, ' : ',
valorLogico);
18
19
valorLogico := string1 < string2;
20
writeln('Teste se ', string1, ' eh < que ', string2, ' : ',
valorLogico);
21
22
readkey;
23 end.
Listagem 3.6 – Operadores Relacionais com String
Na Listagem 15, similar a Listagem 14, a linha 5 define uma variável valorLogico do
tipo boolean, ou seja, ela só armazena Verdade (TRUE) ou Falso (FALSE). A linha 6
define duas variáveis do tipo string (cadeias de caracter) que são inicializadas nas
linhas 10 e 11, respectivamente.
A linha 13 é lida assim: o valor da string1 é igual ao valor do string2? Se sim, atribua
TRUE para valorLogico; se não, atribua FALSE.
A linha 14 imprime o resultado do teste lógico. Note que as linhas 16/17 e 19/20 fazem
algo similar às linhas 13/14, apenas mudando o operador relacional. Note que strings
podem ser comparadas com >, <, etc. O resultado da execução do programa da
Listagem 15 é:
71
72
Programação com Pascal
Teste se abc eh = a def : FALSE
Teste se abc eh > que def : FALSE
Teste se abc eh < que def : TRUE
1 program OperadoresRelacionaisComReal;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
6
real1, real2 : real;
7
8 begin
9
{Atribuições de valores às variáves}
10
real1 := 8/6;
11
real2 := 4/3;
12
13
valorLogico := real1 > real2;
14
writeln('Teste se ', real1:3:4, ' eh > que ', real2:3:4, ' : ',
valorLogico);
15
16
valorLogico := real1 = real2;
17
writeln('Teste se ', real1:3:4, ' eh = a ', real2:3:4, ' : ',
valorLogico);
18
19
valorLogico := real1 < real2;
20
writeln('Teste se ', real1:3:4, ' eh < que ', real2:3:4, ' : ',
valorLogico);
21
22
readkey;
23 end.
Listagem 3.7 – Operadores Relacionais com Reais
A listagem 3.7 é similar a 3.5 e 3.6. Ressaltam-se as linhas 10 e 11 que fazem a
atribuição de números não inteiros às variáveis real1 e real2. Fica como exercício sua
execução e a observação do resultado.
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSÕES
Operadores Lógicos
O Pascal dispõe dos seguintes operadores lógicos: AND (E), OR (OU) e NOT (NÃO,
NEGAÇÃO). Para compreendê-los, vamos fazer uma breve introdução à Lógica.
A lógica é a ciência que estuda a correção do pensamento, do raciocínio. Quando
elaboramos frases como: a) A Lua é maior que a Terra; b) A água do mar é salgada e c)
2 (dois) é o único número primo que é par, podemos determinar a elas um valor lógico
verdadeiro ou falso. Logo, a é falso, b e c são verdadeiros.
Tais frases são chamadas de proposições, pois afirmam fatos, exprimem juízos.
A Lógica Matemática apresenta regras fundamentais do pensamento baseadas em dois
princípios (Axiomas):
a. Princípio da Não Contradição - uma proposição ou é Verdadeira ou é Falsa;
b. Princípio do Terceiro Excluído - toda proposição ou é Verdadeira ou é Falsa apenas esses valores são possíveis.
Nas Listagens 3.5, 3.6 e 3.7 foram elaboradas proposições, por exemplo, em
valorLogico := inteiro1 = inteiro2.
Esta proposição pode ser lida assim: compare o inteiro1 com o inteiro2 e atribua o
resultado assim: verdadeiro se iguais e falso se diferentes.
O valor lógico (verdadeiro ou falso) desta proposição é armazenado na variável
valorLogico e depende dos valores atribuídos a inteiro1 e inteiro2. Como exemplo, se
inteiro1 armazena o valor 10 e inteiro2 armazena o valor 20, valorLogico é FALSO.
As proposições usadas nas Listagens 3.5, 3.6 e 3.7 são ditas Simples ou Atômicas, pois
não contém outra proposição como parte integrante.
Uma proposição é dita Composta quando ela resulta da combinação (via conectivos E
ou OU, por exemplo) de outras proposições. Por exemplo, supondo-se que se queira
saber se um número x pertence ao Intervalo Fechado nos extremos a e b :
x
ϵ [a, b]
={x
ϵ R ; a ≤ x ≤ b }.
Em Pascal necessitamos de uma proposição composta como segue:
valorLogico := (x >= a) AND (x <= b);
Esta proposição é lida da seguinte forma: Teste se x é maior ou igual a a E se x é menor
ou igual a b. Se ambos forem verdade, e apenas neste caso, valorLogico será verdade.
Note o seguinte: supondo o intervalo [1, 5]. Sendo a = 1 e b = 5; se x = 6 o teste 6 >= 1
é verdade, mas 6 <= 5 é falso, logo x = 6 não pertence ao intervalo [1, 5]. Por isso o
valorLogico neste caso é falso.
Uma proposição composta com conectivos AND só é verdade se todas as suas
componentes são verdade.
73
74
Programação com Pascal
Pela teoria básica de conjuntos, define-se A ∩ B por:
A ∩B={x / xϵAex
ϵB}
A
B
Podemos afirmar que x pertence a A ∩ B se, e somente se, x pertence a A AND x
pertence a B, ou seja, pertence aos dois conjuntos simultaneamente. O conectivo AND
opera a interseção entre proposições (e conjuntos).
Vejamos exemplos em Pascal: suponha que A = {1, 2, 3, 4, 5} e B = {4, 5, 6}.
Se x ϵ A, então (x >= 1) AND (x <= 5) é verdade.
Se x ϵ B, então (x >= 4) AND (x <= 6) é verdade.
Se x
ϵ
A ∩ B, então ((x >= 1) AND (x <= 5)) AND ((x >= 4) AND (x <= 6)) é
verdade. Ou seja, x ϵ {4, 5}. De outra forma, x ϵ [1, 5] ∩ [4, 6].
O uso de operadores lógicos é apresentado na Listagem 3.8.
1 program OperadoresLogicos;
2 {Este programa vai demonstrar Operadores Lógicos do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
6
x, inicio, fim : integer;
7
8 begin
9
{Atribuições de valores às variáves}
10
inicio := 0;
11
fim := 10;
12
x := 5;
13
14
valorLogico := (x > inicio) and (x > fim);
15
writeln('Teste se ', x, ' eh > que ', inicio , ' E ', x, ' eh > que
', fim, ' : ', valorLogico);
16
17
valorLogico := (x > inicio) and (x < fim);
18
writeln('Teste se ', x, ' eh > que ', inicio , ' E ', x, ' eh < que
', fim, ' : ', valorLogico);
19
20
valorLogico := (x > inicio) or (x > fim);
21
writeln('Teste se ', x, ' eh > que ', inicio , ' OU ', x, ' eh > que
', fim, ' : ', valorLogico);
22
23
valorLogico := ((x >= 1) and (x <= 5)) AND ((x >= 4) and (x <= 6));
24
writeln('Teste se ', x, ' esta entre 1 e 5 e se ', x, ' esta entre 4
e 6 simultaneamente : ', valorLogico);
25
26
readkey;
27 end.
Listagem 3.8 – Operadores Lógicos
Na Listagem 3.8, as linhas 5 e 6 definem as variáveis e as linhas 10 a 11 as iniciam.
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSÕES
A linha 14 atribui à variável valorLogico o resultado do teste:
(valorLogico := (x > inicio) and (x > fim));
Ou seja, testa se x é maior que inicio AND x é maior que fim. Logo, x tem de ser maior
que o maior valor. Como inicio e fim foram iniciadas com 0 e 10, respectivamente, o
teste só é verdade se x for maior que 10. Como x foi iniciada com 5, valorLogico é
FALSE na linha 14.
A linha 17 atribui à variável valorLogico o resultado do teste:
(valorLogico := (x > inicio) and (x < fim));
Ou seja, se x é maior que inicio AND x é menor que fim. Como inicio e fim foram
iniciadas com 0 e 10, respectivamente, o teste só é verdade se x for maior que 0 AND
menor que 10. Como x foi iniciada com 5, valorLogico é TRUE na linha 14.
A linha 20 atribui à variável valorLogico o resultado do teste:
(valorLogico := (x > inicio) or (x > fim));
Similarmente, o teste só é verdade se x for maior que 0 OR maior que 10.
Diferente do AND, uma proposição composta com OR é verdade se pelo menos uma
das proposições componentes for verdade.
Como x foi iniciada com 5, valorLogico é TRUE, pois 5 é maior que 0, embora 5 seja
menor que 10.
A linha 23 atribui à variável valorLogico o resultado do teste (valorLogico := ( (x >= 1) and
(x <= 5) ) AND ( (x >= 4) and (x <= 6) )), ou seja, x deve estar no conjunto [1, 5] ∩ [4,6].
Note que o AND em maiúsculas só foi usado para destacar os conjuntos na expressão.
Em Pascal não há distinção de maiúsculas e minúsculas.
Como x tem o valor 5, o valorLogico é TRUE na linha 24.
Ainda pela teoria básica de conjuntos, define-se A U B por:
A U B = { x / x ϵ A or x
ϵB}
Podemos afirmar que x pertence a A U B se, e somente se, x pertence a A OR x
pertence a B, ou seja, pertence a um ou ao outro. O conectivo OR opera a união entre
proposições (e conjuntos).
Vejamos um exemplo em Pascal: suponha que A = {1, 2, 3, 4, 5} e B = {4, 5, 6}.
Se x ϵ A, então (x >= 1) AND (x <= 5) é verdade.
Se x ϵ B, então (x >= 4) AND (x <= 6) é verdade.
Se x ϵ A U B, então ((x >= 1) AND (x <= 5)) OR ((x >= 4) AND (x <= 6)) é verdade.
Ou seja, x ϵ {1, 2, 3, 4, 5, 6}. De outra forma, x ϵ [1, 5] U [4, 6].
75
76
Programação com Pascal
Exercícios
1. Elabore um programa que deve:
a. Declarar a variável x como inteira.
b. Solicitar ao usuário para informar um valor para x.
c. Determinar se x pertence aos intervalos:
i. [2, 7] U [10, 15]
ii. [1, 5) U [4, 10) U (20, 26]
iii. [0, 10] ∩ [7, 15]
iv. (0, 10] ∩ (7, 15)
Edeyson Andrade Gomes
www.edeyson.com.br
4
4
ESTRUTURAS DE DECISÃO
Todos os programas de exemplo elaborados até este capítulo apresentam um conjunto
de ações sequenciais onde todas as ações são executadas numa mesma ordem.
O modelo da Figura 4.1 não é único em programas quotidianos. Normalmente o
programador se depara com ações que serão executadas ou não a depender de uma
determinada situação.
Entrada
Ação 1
Ação 2
Saída
Figura 4.1 – Fluxograma de sequência
Quando uma ou mais ações dependem de uma ou mais condições para sua execução,
são necessárias estruturas de decisão que controlem o fluxo de execução do programa
efetuando tomadas de decisão e desvios de operações.
Em Linguagem Natural podem-se descrever tais estruturas de decisão das seguintes
formas:
1. Seleção com uma via: Se a condição é verdadeira então execute a ação 1.
2. Seleção com duas vias: Se a condição é verdadeira então execute a ação 1.
Senão, execute a ação 2.
Em ambas as formas a ação 1 só será executada se e somente se a condição for
verdadeira.
Na forma 1, seleção com uma via, caso a condição seja verdadeira adiciona-se uma ação
ao fluxo normal do programa. Na forma 2, escolhe-se um caminho a seguir, executando
a ação1 ou a ação 2.
Observações:
1. Uma ação, como descrita no texto, não consiste apenas numa instrução. Ela pode
ser executada por um bloco de comandos – bloco de programa com demarcação de
início e fim (usando-se BEGIN e END) que contém uma ou várias instruções.
2. A instrução Pascal end pode ser finalizado com um ponto-e-vírgula ( ; ) e não
apenas com um ponto. O uso de ponto ao final de um end ocorre somente na
finalização de um programa.
77
78
Programação com Pascal
4.1 IF .. THEN
A instrução do Pascal IF condição THEN ação pode ser lida assim: SE a condição é
verdadeira ENTÃO execute a ação.
IF .. THEN tem por finalidade testar uma condição e tomar uma decisão – é uma
seleção com uma via. Se a condição é verdadeira, um bloco de comandos é executado.
Em caso contrário, esse bloco é ignorado.
{Sintaxe:}
IF condição THEN
bloco de comandos
O fluxograma da Figura 4.2 tem por objetivo é ler uma nota e determinar se ela é maior
ou igual a 6. Em caso verdadeiro, deve imprimir ‘Aluno aprovado’.
Início
nota
Nota >= 6.0
SIM
Aluno
aprovado
Fim
Figura 4.2 – Fluxograma da seleção com uma Via
O programa da Figura 4.2 é assim descrito:
1. Início do Algoritmo Nota;
a. Declarar uma variável nota do tipo real;
b. Solicitar um valor para a nota;
c. Se a nota for maior ou igual a 6.0, então imprimir: Aluno
aprovado.
2. Terminar Algoritmo Nota.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
A Listagem 4.1 apresenta o código que implementa o Algoritmo Nota proposto na
Figura 4.2 com seleção com uma via através de IF .. THEN.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program testaNota;
uses crt;
{Declarar uma variável nota do tipo real;}
var nota : real;
begin
{Solicitar um valor para a nota;}
write('Digite uma nota: ');
readln(nota);
{Se a nota for maior ou igual a 6.0, então imprimir: Aluno
aprovado.}
if (nota >= 6.0) then
writeln('Aluno aprovado.');
{Parar o programa até que algo seja pressionado}
readkey;
end.
Listagem 4.1 – Seleção com uma Via – IF .. THEN
Neste programa declara-se uma variável real chamada nota na linha 4. As linhas 7 e 8
solicitam o valor da nota (write) e efetuam sua leitura (readln), respectivamente.
Na linha 10 testa-se se a nota lida é maior ou igual a 6 e, caso seja, e apenas com esta
condição, escreve-se ‘Aluno aprovado’.
Note que se a nota for menor que 6 o programa aguarda uma tecla ser pressionada –
linha 13 – e acaba.
Veja que neste código, após o IF não se colocou o par begin .. end, pois desejava-se
executar uma ação com apenas uma instrução – linha 11.
Caso a ação desejada necessitasse de mais de uma instrução para executar, estas
deveriam estar inseridas em um bloco de comandos (delimitados por begin..end).
79
80
Programação com Pascal
4.2 IF .. THEN .. ELSE
A instrução IF condição THEN ação1 ELSE ação2 tem por finalidade testar uma
condição e tomar uma decisão entre duas possíveis. Se a condição é verdadeira, um
bloco de comandos após o THEN é executado. Se a condição é falsa, um bloco de
comandos após o ELSE é executado.
A instrução IF condição THEN ação1 ELSE ação2 pode ser lida assim: SE a condição
é verdadeira ENTÃO execute a ação1. EM CASO CONTRÁRIO, execute a ação2.
Suponha que no programa da Listagem 4.1 também fosse necessário informar se o
aluno está reprovado. Neste caso, têm-se duas decisões possíveis: Se a nota é maior ou
igual a 6, a decisão é informar ‘Aluno Aprovado’. Senão, se a nota é menor que 6, a
decisão é informar ‘Aluno Reprovado’.
A listagem 4.2 apresenta um código que satisfaz as duas decisões citadas usando IF ..
THEN .. ELSE.
{Sintaxe:}
IF condição THEN
bloco de comandos 1
ELSE
bloco de comandos 2
O fluxograma apresentado na Figura 4.3 apresenta uma solução onde a mensagem
‘Aluno aprovado’ será apresentada se, e somente se, a nota for maior ou igual a seis e
que ‘Aluno aprovado’ será apresentada em caso contrário. Estas são as duas vias
(decisões) possíveis.
Início
nota
NÃO
Nota >= 6.0
Aluno
reprovado
SIM
Aluno
aprovado
Fim
Figura 4.3 – Fluxograma da seleção com duas Vias
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
O programa da Figura 4.3 é assim descrito e implementado na Listagem 4.2:
1. Início do Algoritmo;
a. Declarar uma variável nota do tipo real;
b. Solicitar um valor para a nota;
c. Se a nota for maior ou igual a 6.0, então imprimir: Aluno
aprovado.
d. Senão, imprimir: Aluno reprovado.
2. Terminar Algoritmo.
1
2
3
4
5
6
7
8
9
program testaNota;
uses crt;
{Declarar uma variável nota do tipo real;}
var nota : real;
begin
{Solicitar um valor para a nota;}
write('Digite uma nota: ');
readln(nota);
{Se a nota for maior ou igual a 6.0, então imprimir: Aluno
aprovado.}
if (nota >= 6.0) then
writeln('Aluno aprovado.')
else
writeln('Aluno reprovado.');
10
11
12
13
14
15
{Parar o programa até que algo seja pressionado}
16
readkey;
17 end.
Listagem 4.2 – Seleção com 2 Vias – IF .. THEN .. ELSE
Note que o que diferencia as Listagens 4.1 e 4.2 é que nesta a linha 10 testa se a nota
lida é maior ou igual a 6 e, caso seja, e apenas com esta condição, escreve-se ‘Aluno
aprovado’. Em caso contrário - teste da linha 12 - escreve-se se ‘Aluno reprovado’ –
linha 13.
Observações:
1. Observe que a última linha antes de um ELSE não deve possuir ponto-e-vírgula ( ; ),
como ocorre na linha 11.
Outro exemplo do uso de IF..THEN..ELSE está no programa da Listagem 4.3, que
simula um débito numa conta corrente. O débito só é possível se há saldo e/ou limite
disponíveis para isso. O programa é assim descrito:
1. Início do Algoritmo;
a. Definir as variáveis saldo, limite e valorADebitar como real;
b. Atribuir valores a saldo e limite;
c. Solicitar ao usuário o valor a debitar;
81
82
Programação com Pascal
d. Se o saldo somado ao limite for maior que o valor a debitar,
então:
i. subtraia valorADebitar do saldo;
ii. Imprima 'Debito efetuado com sucesso'.
e. Senão:
i. Imprima 'Saldo insuficiente'.
f. Imprima: 'Fim da transacao. Pressione Alguma Tecla';
g. Pare o programa até que uma tecla seja pressionada.
2. Fim do algoritmo.
A Listagem 4.3 exibe o programa que implementa o referido algoritmo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program TesteContaCorrente;
{importação da biblioteca CRT}
uses crt;
var
{Definição das variáveis saldo, limite e valorADebitar do tipo real}
saldo, limite, valorADebitar : real;
begin
{limpa a tela}
clrscr;
21
22
23
24
25
26
27
28
29
30
31
32
33 end.
{Atribuição de valores a saldo e limite}
saldo := 200;
limite := 500;
{Solicitar ao usuário o valor a debitar.}
writeln('Qual o valor a debitar?');
readln(valorADebitar);
{Se o saldo somado ao limite for maior que o valor a debitar,
então debite o valorADebitar do saldo}
if (saldo + limite > valorADebitar) then
begin
saldo := saldo - valorADebitar;
writeln('Debito efetuado com sucesso.');
end
{Senão, imprima: 'Saldo Insuficiente'}
else
begin
writeln('Saldo insuficiente.');
end;
writeln('Fim da transacao. Pressione Alguma Tecla');
readkey;
Listagem 4.3 - Seleção com duas Vias
Neste código testa-se na linha 21 se a variável saldo somada à variável limite tem valor
maior que a variável valorADebitar. Se isto é verdade, a linha 23 subtrai do saldo o
valorADebitar e a linha 24 imprime o sucesso do débito.
Observações:
1. Note que as linhas 22 a 25 e 28 a 30 compõem blocos de comandos delimitados por
BEGIN .. END.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
O fluxograma correspondente ao programa da Listagem 4.3 é apresentado na Figura 4.4.
Início
saldo = 200
limite = 500
valorADebitar
saldo + limite >
valorADebitar
NÃO
SIM
saldo = saldo - valorADebitar
Saldo Insuficiente
Debito efetuado
com sucesso
Fim da transacao.
Pressione Alguma
Tecla
Fim
Figura 4.4 - Fluxograma da seleção com duas Vias
A instrução IF condição THEN ação1 ELSE ação2 tem uma limitação: ela só oferece
dois caminhos alternativos. Se a condição é verdadeira, segue-se o caminho que executa
a ação1. Em caso contrário, segue-se o caminho que executa a ação2.
Suponha o seguinte problema: uma seguradora dá descontos progressivos no seguro de
automóvel em função da faixa etária do cliente. As faixas são as seguintes:
1. 20 a 25 anos: 3% de desconto;
2. 26 a 30 anos: 5% de desconto;
3. 31 a 45 anos: 8 % de desconto;
4. Acima de 45 anos: 10% de desconto.
Como calcular o desconto com estruturas de decisão com uma ou duas vias? Tal
solução requer um recurso denominado de aninhamento – a composição de tomadas de
decisão.
83
84
Programação com Pascal
Uma especificação em Linguagem Natural para o cálculo do desconto pode ser a
seguinte, que chamaremos de Algoritmo Calcula Desconto 1:
1. Início do Algoritmo Calcula Desconto1;
a. Ler um valor para a variável idade;
b. Desconto é iniciado com 0%;
c. Se a idade está entre 20 e 25 anos, então o desconto é de 3%;
d. Senão:
i. Se a idade está entre 26 e 30 anos, então o desconto é
de 5%;
ii. Senão:
1. Se a idade está entre 31 e 45 anos, então o
desconto é de 8%;
2. Senão:
a. Se a idade é maior que 45 anos, então o
desconto é de 10%;
e. Informar o desconto.
2. Fim do algoritmo Calcula Desconto1.
Um erro comum à especificação em Linguagem Natural seria o seguinte, que
chamaremos de Algoritmo Calcula Desconto 2:
1. Início do Algoritmo Calcula Desconto2;
a. Ler um valor para a variável idade;
b. Desconto é de 0%;
c. Se a idade está entre 20 e 25 anos, o desconto é de 3%;
d. Se a idade está entre 26 e 30 anos, o desconto é de 5%;
e. Se a idade está entre 31 e 45 anos, o desconto é de 8%;
f. Se a idade é maior que 45 anos, o desconto é de 10%;
g. Informar o desconto.
2. Fim do algoritmo Calcula Desconto2.
Embora as duas especificações forneçam o mesmo resultado para o desconto, a primeira
(Algoritmo Calcula Desconto 1) o faz de maneira mais eficiente.
Note que uma pessoa encontra-se numa única faixa etária, logo, se uma condição é
satisfeita (verdadeira) as demais não precisam ser testadas, pois sempre serão falsas. O
desconto sempre inicia em 0%, assumindo-se que não haverá desconto (casos de
pessoas com menos de 20 anos).
A segunda especificação (Algoritmo Calcula Desconto 2) obriga a execução de todos os
testes de condição, mesmo que uma condição já tenha sido verdadeira, o que é
desnecessário.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
85
Início
idade
Desconto = 0%
idade >= 20 e
idade <= 25
NÃO
idade >= 26 e
idade <= 30
NÃO
idade >= 31 e
idade <= 45
SIM
SIM
SIM
Desconto = 3%
Desconto = 5%
Desconto = 8%
NÃO
idade > 45
SIM
Desconto = 10%
Informar
Desconto
Fim
Figura 4.5 – Fluxograma do Algoritmo Calcula Desconto 1
A Figura 4.5 apresenta o fluxograma do algoritmo Calcula Desconto 1.
Como pode ser notado, caso uma condição seja atendida (verdadeira), o algoritmo
determina o novo desconto, informa-o e termina o algoritmo. Caso o teste de uma
condição falhe, testa-se a próxima condição até que uma seja verdadeira, determinando
o novo desconto, informando-o e terminando o algoritmo. Se nehuma condição for
atendida, o desconto será de 0%.
A Listagem 4.4 exibe o programa que implementa o algoritmo Calcula Desconto 1.
86
Programação com Pascal
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
program CalculaDesconto1;
{importação da biblioteca CRT}
uses crt;
var
{Definição das variáveis idade e desconto como inteiras}
idade, desconto : integer;
begin
{limpa a tela}
clrscr;
{Solicitar ao usuário o valor da idade.}
writeln('Qual sua idade?');
readln(idade);
{Atribuição de valor inicial ao desconto}
desconto := 0;
{Seleçõe aninhadas}
if (idade >= 20) and (idade <= 25) then
desconto := 3
else
if (idade >= 26) and (idade <= 30) then
desconto := 5
else
if (idade >= 31) and (idade <= 45) then
desconto := 8
else
if (idade >= 46) then
desconto := 10;
writeln('O desconto eh de ', desconto, '%');
readkey;
end.
Listagem 4.4 - Calcula Desconto 1
Na linha 19 testa-se a idade (se está entre 20 e 25). Se sim, o desconto será de 3%,
senão, abre-se um novo “ninho” de testes. Por isso usa-se o termo aninhamento.
A linha 22 inicia um “ninho” que só será executado se, e somente se, o teste anterior
falhar, o que economiza a quantidade de testes realmente realizados.
A Figura 4.6 apresenta o fluxograma do algoritmo Calcula Desconto 2. Nele, mesmo
que uma condição seja atendida (verdadeira), o algoritmo continua a testar
desnecessariamente as demais condições para determinar o novo desconto, informandoo e terminando.
Embora o Algoritmo Calcula Desconto 1 seja mais eficiente que o 2, ainda há um
problema. Imagine que a seguradora trabalhe com um conjunto com 20 condições de
cálculo de seguro. Com ficaria o fluxograma e o aninhamento? Neste caso, usa-se a
Seleção com Múltiplas Vias.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
87
Início
idade
Desconto = 0%
idade >= 20 e
idade <= 25
SIM
NÃO
idade >= 26 e
idade <= 30
NÃO
Desconto = 3%
idade >= 31 e
idade <= 45
SIM
NÃO
Desconto = 5%
SIM
idade > 45
Desconto = 8%
SIM
Desconto = 10%
Informar
Desconto
Fim
Figura 4.6 - Fluxograma do Algoritmo Calcula Desconto 2
NÃO
88
Programação com Pascal
4.3 CASE
Embora o aninhamento de IF seja comum quando a condição possui múltiplos
caminhos alternativos, normalmente ela é usada com condições que necessitam de
avaliação de um valor lógico – verdadeiro ou falso.
Em algumas situações, contudo, a condição pode ser avaliada para um conjunto de
valores discretos, sendo estes inteiros ou caracteres. Por exemplo, imagine um sistema
que automatiza uma URA (Unidade de Reconhecimento Audível), comum em
atendimento telefônico pelo sistema 0800. Comumente são oferecidas opções entre 0 e
9. Cada opção leva a uma ação diferente. Por exemplo, vamos analisar o problema URA
01 a seguir.
Uma solução de URA (URA 01) deve oferecer as seguintes opções e ações:
1 – Saldo;
2 – Extrato Parcial;
3 – Extrato da Última Conta;
8 – Falar com atendente;
9 – Menu anterior.
Uma especificação em Linguagem Natural para a URA 01 pode ser a seguinte, que
chamaremos de Algoritmo URA 01 IF:
1. Início do Algoritmo URA 01 IF;
a. Informar ao usuário quais as opções do menu;
b. Solicitar ao usuário qual a opção desejada;
c. Se a opção for 1, apresentar o saldo;
d. Senão:
i. Se a opção for 2, então apresentar o Extrato Parcial;
ii. Senão:
1. Se a opção for 3, então apresentar o Extrato da
Última Conta;
2. Senão:
a. Se a opção for 8, então transferir a
ligação para a atendente;
b. Senão:
i. Se a opção for 9, então desviar
para o menu anterior;
ii. Senão, informar opção inválida.
2. Fim do algoritmo URA 01 IF.
Com esta especificação teremos um fluxograma muito semelhante ao da Figura 4.5.
Todavia, existe a opção de reescrever o algoritmo usando Seleção com Múltiplas Vias
ao invés de Aninhamento de Seleções de Duas Vias. Um exemplo é o seguinte
Algoritmo URA 01 CASE:
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
1. Início do Algoritmo URA 01 CASE;
a. Informar ao usuário quais as opções do menu;
b. Solicitar ao usuário qual a opção desejada;
c. Caso a opção seja:
i. 1 : apresentar o saldo;
ii. 2 : apresentar o Extrato Parcial;
iii. 3 : apresentar o Extrato da Última Conta;
iv. 8 : transferir a ligação para a atendente;
v. 9 : desviar para o menu anterior;
vi. Outra, informar opção inválida.
2. Fim do algoritmo URA 01 CASE.
A Figura 4.7 apresenta o fluxograma do algoritmo URA 01 CASE. Como pode ser
notado, testa-se uma condição em busca de um valor específico (discreto) e desvia-se a
execução para cada caso especificado.
Início
Exibir as
opções
opção
opção
0, 4, 5, 6 ou 7
1
9
2
8
3
Desvia para o
Menu Anterior
Saldo
Extrato Parcial
Transfere ligação
para Atendente
Extrato Última
Conta
Opção Inválida
Fim
Figura 4.7 - Fluxograma do algoritmo URA 01 CASE
A implementação do algoritmo URA 01 CASE deve ser feito com o comando CASE,
cuja sintaxe é descrita a seguir:
89
90
Programação com Pascal
{Sintaxe:}
CASE variável OF
Valor1 : Bloco de Comandos 1;
Valor2 : Bloco de Comandos 2;
Valor3 : Bloco de Comandos 3;
...
ELSE
Bloco de Comandos n
END;
Observações:
1. A variável do CASE deve ser inteira ou caracter (integer ou char) apenas.
2. O ELSE é usado para tratar uma possível exceção de valor da variável
A Listagem 4.5 exibe o programa que implementa o algoritmo URA 01 CASE.
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
program URA01Case;
{importação da biblioteca CRT}
uses crt;
var
{Definição das variável opção como inteira}
opcao : integer;
begin
{limpa a tela}
clrscr;
{Informar opções ao usuário.}
writeln('Tecle 1 para Saldo');
writeln('Tecle 2 para Extrato Parcial');
writeln('Tecle 3 para Extrato da Ultima Conta');
writeln('Tecle 8 para Transferir ligação para a Atendente');
writeln('Tecle 9 para Retornar ao Menu anterior');
readln(opcao);
case opcao of
1: begin
{código para apresentar saldo}
end;
2: begin
{código para apresentar o Extrato Parcial}
end;
3: begin
{código para apresentar o Extrato da última Conta}
end;
8: {transferir a ligação para a atendente};
9: {desviar para o menu anterior};
else
writeln('Opcao Invalida');
end; {end case}
readkey;
end.
Listagem 4.5 – Algoritmo URA 01 Case
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
Na Listagem 4.5, a linha 6 define a variável opção como inteira. As linhas 12 a 17
exibem as opções da URA e a linha 17 lê a opção escolhida pelo usuário. A tomada de
decisão do que fazer após a seleção da opção está entre as linhas 19 e 33.
O CASE da Listagem 4.5 baseia-se no valor da variável opção. Para cada caso, um
bloco de ações é sugerido. No caso, apenas fez-se a indicação de onde e como o bloco
de comandos deve ser inserido – linhas 20 a 22, por exemplo.
Na linha 31 o ELSE captura qualquer valor de opção que não seja 1, 2, 3, 8 ou 9.
91
92
Programação com Pascal
4.4 EXERCÍCIOS
4.4.1 Escrever um algoritmo em Linguagem Natural, seu fluxograma e seu código em Pascal
que, lendo três lados de um triângulo, determine se o mesmo é equilátero, isósceles ou
escaleno.
Opção 1 de solução em Linguagem Natural:
1. Início do Algoritmo Triângulos
a. Obter os lados a, b e c
b. Se os três lados são iguais, então imprima que é Equilátero.
c. Senão:
i. Se dois lados são iguais, então imprima que é Isósceles.
ii. Senão, imprima que é Escaleno.
2. Fim do Algoritmo Triângulos
Opção 2 de solução em Linguagem Natural:
1. Início do Algoritmo Triângulos
a. Obter os lados a, b e c
b. Se a = b e b = c, então imprima que é Equilátero.
c. Senão:
i. Se a = b ou b = c ou a = c, então imprima que é Isósceles.
ii. Senão, imprima que é Escaleno.
2. Fim do Algoritmo Triângulos
O Fluxograma para o Algoritmo Triângulos é apresentado na Figura 4.8.
Início
a=beb=c
Triângulo
Equilátero
V
F
a, b, c
a=b
ou a = c
ou b = c
V
Triângulo
Isósceles
F
Triângulo
Escaleno
Fim
Figura 4.8 - Fluxograma do algoritmo Triângulos
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISÃO
O Código do Algoritmo Triângulos é apresentado na Listagem 4.6.
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
program Triangulos;
uses crt;
var
lado1, lado2, lado3 : integer;
begin
writeln('Digite o lado 1');
readln(lado1);
writeln('Digite o lado 2');
readln(lado2);
writeln('Digite o lado 3');
readln(lado3);
if (lado1 = lado2) and (lado2 = lado3) then
writeln('Triangulo Equilatero')
else
if ((lado1 = lado2) or (lado1 = lado3) or (lado2 = lado3) ) then
writeln('Triangulo Isosceles')
else
writeln('Triangulo Escaleno');
readkey;
end.
Listagem 4.6 – Programa Triângulos.
4.4.2 Escrever um algoritmo em Linguagem Natural, seu fluxograma e seu código em Pascal
que, lendo um inteiro, determine se o mesmo é par ou ímpar.
Opção 1 de solução em Linguagem Natural:
1. Início do Algoritmo Paridade
a. Obter o valor do inteiro n
b. Se n é divisível por 2 (o resto da divisão de n por 2 é 0), então
imprima que n é PAR.
c. Senão:
i. Imprima que n é ÍMPAR.
2. Fim do Algoritmo Paridade
O problema da Opção 1 é como determinar em linguagem de programação que n é par. Isso
pode ser feito em Pascal usando o operador de inteiros MOD. Assim, temos a opção 2 de
solução em Linguagem Natural:
1. Início do Algoritmo Paridade
a. Obter o valor do inteiro n
b. Se n MOD 2 = 0, então imprima que n é PAR.
c. Senão:
i. Imprima que n é ÍMPAR.
2. Fim do Algoritmo Paridade
93
94
Programação com Pascal
O Fluxograma que atente ao Algoritmo Paridade é apresentado na Figura
Início
n
V
n MOD 2 = 0
F
ÍMPAR
PAR
Fim
Figura 4.9 - Fluxograma do algoritmo Paridade
O Código do Algoritmo Paridade é apresentado na Listagem 4.7.
1 {O programa deve ler 1 variavel inteira e determinar se a
mesma eh par ou impar.}
2
3 program Paridade;
4 uses crt;
5 var
6
n : integer;
7
8 begin
9
writeln('Digite o valor: ');
10
readln(n);
11
12
if (n mod 2 = 0) then
13
writeln(n, ' e PAR')
14
else
15
writeln(n, ' e IMPAR');
16
17
readkey;
18 end.
Listagem 4.7 – Programa Paridade.
Edeyson Andrade Gomes
www.edeyson.com.br
5
5
ESTRUTURAS DE REPETIÇÃO
Um método recomendado à construção de algoritmos remete à busca de pequenos
passos, simples, que possam ser resolvidos manualmente por um ser humano. A
decomposição de um problema em um conjunto de passos simples é a melhor forma de
construir um algoritmo, por mais complexo que este seja.
Em muitas situações, um conjunto de passos simples é repetido por diversas vezes. Por
exemplo, suponha um problema onde se deseja ler uma coleção de 100 notas e, para
cada uma, determinar se o aluno foi aprovado (nota maior ou igual a seis) ou reprovado
(nota menor que seis).
Os passos que devem ser repetidos são facilmente identificados:
a. Ler a nota;
b. Determinar se o aluno foi aprovado ou não.
O uso de seleção com duas vias pode resolver este problema, contudo, necessita-se
testar uma coleção de 100 notas. Uma solução possível, porém muito pouco eficiente
pela repetição de código, seria assim descrito:
1. Início do Algoritmo Le100Notas;
a. Declarar uma variável nota do tipo real;
b. Solicitar um valor para a nota 1;
c. Se a nota 1 for maior ou igual a 6.0, então imprimir: Aluno
aprovado.
d. Senão, imprimir: Aluno reprovado.
e. Solicitar um valor para a nota 2;
f. Se a nota 2 for maior ou igual a 6.0, então imprimir: Aluno
aprovado.
g. Senão, imprimir: Aluno reprovado.
h. ...
i. Solicitar um valor para a nota 100;
j. Se a nota 100 for maior ou igual a 6.0, então imprimir: Aluno
aprovado.
k. Senão, imprimir: Aluno reprovado.
2. Terminar Algoritmo Le100Notas.
Analisando-se o algoritmo Le100Notas, observa-se que um conjunto de passos (ler a
nota, testá-la e tomar uma decisão em duas vias) se repetirá 100 vezes. Imagine repetir o
trecho de código entre a leitura da nota e sua análise 100 vezes. Isso é viável? E se a
coleção fosse muito maior?
Em situações com essas, onde é necessária a repetição de um determinado trecho de
código (ou bloco de código), usam-se estruturas de repetição, também chamadas de
laços.
95
96
Programação com Pascal
Estruturas de repetição de blocos de comandos também são chamadas de Laços. Os
laços dividem-se em dois grupos:
 Laços Finitos: o número de repetições do laço é conhecido;
 Laços Infinitos (indeterminados): o número de repetições do laço é
desconhecido previamente.
5.1 FOR
O comando FOR permite a repetição de um comando, ou bloco de comandos, um
número finito de vezes. Esse número é determinado por uma variável denominada de
contador do FOR. Sua sintaxe é:
{Sintaxe 1:}
for contador := início to fim do
Comando;
{Sintaxe 2:}
for contador := início to fim do
begin
Bloco de Comandos;
end;
Caso o laço contenha um único comando, usa-se a sintaxe 1 ou a 2. Caso seja um bloco
de comandos, usa-se a sintaxe 2, obrigatoriamente.
O fluxo de execução do comando FOR é o seguinte:
1. O FOR inicia o contador com um valor de início.
2. O FOR inicia um laço de execução:
a. O FOR testa se o contador é <= fim (condição de controle);
b. Se sim:
i. executa o Bloco de Comandos;
ii. o FOR incremente automaticamente o contador em um;
iii. volta ao laço (passo 2.a).
c. Senão:
i. Para e termina o laço.
Embora o fluxo de execução do comando FOR indique no passo 2.b.ii que o FOR
incrementa automaticamente o contador, no fluxograma temos de explicitar isso, como
ilustra a Figura 5.1 que apresenta a estrutura genérica do FOR.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
FOR
contador = início
contador <= fim
F
Fim
V
Bloco de Comandos
contador = contador + 1
Figura 5.1 – Fluxograma FOR
Uma forma mais apropriada de escrever o algoritmo Le100Notas, que chamaremos de
RepeteTesteNotas, é o seguinte:
1. Início do Algoritmo RepeteTesteNotas;
a. Declarar uma variável nota do tipo real;
b. Repetir 100 vezes:
i. Solicitar um valor para a nota;
ii. Se a nota for maior ou igual a 6.0, então imprimir:
Aluno aprovado.
iii. Senão, imprimir: Aluno reprovado.
2. Terminar Algoritmo RepeteTesteNotas.
3.
O fluxograma correspondente ao algoritmo RepeteTesteNotas encontra-se na Figura
5.2. Nota-se o uso de teste antecipado do contador de vezes que uma nota foi lida e
testada.
97
98
Programação com Pascal
Início
conta = 0
Fim
F
conta < 100
V
Bloco de Comandos
nota
Aluno
reprovado
F
Nota >= 6
V
Aluno
aprovado
conta = conta + 1
Figura 5.2 – Fluxograma RepeteTesteNotas
No fluxograma da Figura 5.2 inicia-se a variável conta com zero e testa-se se ela é
menor que 100. A variável conta é usada como um contador de vezes que o bloco de
comandos será executado.
Um dos passos do algoritmo no fluxograma é incrementar o valor de conta para indicar
que um passo foi executado. Sem isso, nunca se chegaria ao fim do algoritmo.
Usando o comando FOR, a implementação do algoritmo RepeteTesteNotas fica como
apresentado na Listagem 5.1.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
1
2
3
4
5
6
7
program RepeteTesteNotas;
{Importa a biblioteca CRT para usar ReadKey}
uses crt;
{Declara as variáveis}
var nota : real;
conta: integer; {Variável que ajudará a contar número de
repetições}
8
9 {Inicia o programa principal}
10 begin
11
for conta := 1 to 100 do
12
begin
13
write('Digite a nota do aluno entre 0 e 10: ');
14
readln(nota);
15
16
if (nota >= 6) then
17
writeln('Aluno aprovado')
18
else
19
writeln('Aluno reprovado');
20
end;
21 end.
Listagem 5.1 – Uso de For para repetir 100 teste de notas.
A linha 11 inicia um laço de repetição de 100 vezes. Ela pode ser lida assim: faça conta
variar de 1 até 100 e, para cada valor de conta neste intervalo faça o que está entre o
bloco de comandos delimitado entre (begin..end;). Ressalta-se que o end só termina
com ponto (end.) ao fim do programa.
Tudo que está entre o begin (linha 12) e o end (linha 20), que compõe um bloco de
comandos, será repetido 100 vezes. Isso é garantido se o programador não mudar
explicitamente o valor de conta (que é incrementado automaticamente pelo FOR).
As linhas 13 e 14 solicitam a digitação de uma nota entre 0 e 10. A linha 16 teste se a
nota digitada é maior ou igual a seis. Em caso verdadeiro, escreve Aluno aprovado
(linha 17). Senão (linha 18), escreve Aluno reprovado (linha 19).
A Listagem 5.2 apresenta outro exemplo do FOR. Veja que a variável contador pode
ter qualquer nome (neste exemplo, n) e é inteira. O programa imprimirá 8 vezes ‘linha’
seguido do número do contador. A linha 11 determina o laço de repetição.
As linhas 11 e 12 podem ser lidas como: faça o n variar entre 1 e 8 e para cada valor
neste intervalo imprima: ‘linha: ‘ concatenado a n.
Neste caso, o FOR não usa o begin..end, pois será executando apenas um comando por
vez (sintaxe 1).
99
Programação com Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program ForSimples;
uses crt;
var
n : integer;
begin
clrscr;
for n := 1 to 8 do
writeln('linha: ', n);
readkey;
end.
Listagem 5.2 – For Simples com 8 passos.
A descrição do algoritmo da Listagem 5.2 é o seguinte:
1. Início do Algoritmo ForSimples;
a. Para cada valor de n entre 1 e 8 faça:
i. Imprimir: ‘linha: ‘ concatenado com o valor de n.
2. Terminar Algoritmo ForSimples.
O Fluxograma do ForSimples está na Figura 5.3. Veja que o For é implementado como
uma repetição com teste antecipado.
Início
n=1
Fim
F
n <= 8
V
Bloco de Comandos
100
'linha: ', n
n=n+1
Figura 5.3 – Fluxograma do ForSimples
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
O resultado da execução do programa ForSimples é o seguinte:
linha: 1
linha: 2
linha: 3
linha: 4
linha: 5
linha: 6
linha: 7
linha: 8
Para entender melhor tal resultado, deve-se seguir o Fluxo de Execução para o FOR da
linha 11:
1. Inicie o n com o valor 1.
2. Inicie o Laço (execução do Comando).
a. Teste se o n é <= 8;
b. Se sim:
i. execute o comando: writeln('linha: ', n);;
ii. incremente o n;
iii. Volte ao laço (passo 2.a).
c. Senão:
i. Pare.
O Passo a Passo de execução da Listagem 5.2 é o seguinte:








1: n = 1
2.a: n <= 8?
2.b: sim
o 2.b.i escreva linha: 1
o 2.b.ii n = 2
o 2.b.iii Voltar a 2.a
2.a: n <= 8?
2.b: sim
o 2.b.i escreva linha: 2
o 2.b.ii n = 3
o 2.b.iii Voltar a 2.a
2.a: n <= 8?
2.b: sim
o 2.b.i escreva linha: 3
...
Uma dúvida comum ao entendimento do fluxograma da Figura 5.3 é o que significa
n := n + 1.
101
102
Programação com Pascal
Em programação (assim como na matemática) toda atribuição se inicia da direita para a
esquerda. Quando se escreve: x = 10 + 5, soma-se 10 com 5 e atribui-se o resultado a x.
Logo, x resultará em 15.
E quando se escreve x = x + 5? Qual o resultado? O que isso significa é: compute o
valor atual de x acrescido de 5 e atribua o resultado à mesma variável x.
Logo, se x era 15, passará a ser 20. Escrever x = x + y significa acumular o valor y ao
de x. O novo valor de x será igual a seu valor antigo acrescido de y.
O FOR se vale disso para fazer o incremento da variável de controle.
1
2
3
4
for conta := 1 to 2 do
begin
writeln('valor de i: ', i);
end;
Listagem 5.3 – Exemplo do FOR com 2 passos.
No trecho de código da Listagem 5.3, o Bloco de Comandos (linhas 2, 3 e 4) vai ser
executado 2 vezes, com conta assumindo os valores 1 e 2. Quando conta for 3, o teste
2.a, do fluxo de execução do FOR, que testa se conta <= 2, informa que o FOR acabou.
O fluxo de execução do FOR para a execução da Listagem 5.3 é o seguinte:








1: conta = 1
2.a: conta <= 2?
2.b: sim
o 2.b.i escreve valor de conta: 1
o 2.b.ii conta = 2
o 2.b.iii Voltar a 2.a
2.a: conta <= 2?
2.b: sim
o 2.b.i escreve valor de conta: 2
o 2.b.ii conta = 3
o 2.b.iii Voltar a 2.a
2.a: conta <= 2?
2.b:não
Termina o Laço.
Observações:
1. Note que se a variável usada como contador for alterada entre 2.a e 2.b.iii, o número de
repetições pode mudar.
Vejamos uma alteração intencional do contador com a mudança do fluxo de repetições:
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
1
2
3
4
5
for i := 3 to 10 do
begin
writeln('valor de i: ', i);
i := i + 5;
end;
Listagem 5.4 – Exemplo de FOR com alteração do contador.
Note que o contador (no caso, a variável i) pode iniciar em qualquer valor. Neste trecho
de código da Listagem 5.4 (linha 1) ele inicia em 3. O que este trecho de código fará?
Qual será seu resultado?
Veja que neste exemplo o contador i é incrementado no bloco (linha 4) e também
pelo FOR (linha 1) automaticamente.
Neste caso, o Bloco de Comandos (linhas 3 e 4) vai ser executado 2 vezes:
1. Na primeira execução:
a. i foi iniciado com 3;
b. Após a linha 4, i terá valor 8, mas o FOR incrementa o contador
sempre que chega ao end;
c. i sai do primeiro laço com valor 9.
2. Na segunda execução
a. i inicia com 9;
b. Após a linha 4, i terá valor 14, mas o FOR incrementa o contador
sempre que chega ao end;
c. i sai do primeiro laço com valor 15.
O comando FOR apresentado até agora suporta o incremento automático da variável
denominada de contador, o que é chamado de FOR Crescente. Existe, ainda, o FOR
Decrescente, com a única diferença que este decrementa o contador.
{Sintaxe 1:}
for contador := fim downto início do
Comando;
{Sintaxe 2:}
for contador := fim downto início do
begin
Bloco de Comandos;
end;
O raciocínio de uso é o mesmo, a principal diferença é a inversão do início e fim e o
decremento do contador.
103
Programação com Pascal
5.1.1 Exemplos de Uso do FOR
1. Escrever um algoritmo em Linguagem Natural, seu fluxograma e seu código em
Pascal que, lendo um número inteiro positivo, determine todos os seus divisores.
2. Início do Algoritmo Divisores de N
a. Obter o valor do inteiro n
b. Se n > 0, então:
i. Faça divisor variar de 1 até n
ii. Para cada valor de divisor, faça:
1. Se n MOD divisor = 0, então imprima o valor de divisor.
c. Senão
i. Imprima: ‘o número deve ser positivo’.
3. Fim do Algoritmo Divisores de N
O Fluxograma do Algoritmo Divisores de N é apresentado na Figura 5.4 e seu código na
Listagem 5.5.
Teste se n é
positivo
Início
n>0
n
F
V
FOR
divisor = 1
divisor <= n
F
Fim
V
n MOD divisor = 0
Bloco de Comandos
104
V
divisor
F
divisor =
divisor + 1
Figura 5.4 – Fluxograma Divisores de N
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
1 program DivisoresDeN;
2
3 uses crt;
4
5 var
6
n, divisor : integer;
7
8 begin
9
clrscr;
10
11
write('Digite um valor inteiro positivo para n: ');
12
readln(n);
13
14
if (n > 0) then
15
for divisor := 1 to n do
16
begin
17
if (n mod divisor = 0) then
18
writeln('Divisor: ', divisor);
19
end;
20
readkey;
21 end.
Listagem 5.5 – Divisores de N.
Observações:
1. Matematicamente, o algoritmo pode ser bastante melhorado. Fica como desafio
aperfeiçoar a solução apresentada, diminuindo o número de passos do FOR.
2. Escrever um algoritmo em Linguagem Natural, seu fluxograma e seu código em
Pascal que, lendo um número inteiro positivo, determine todos os seus divisores e
quantos são estes.
A solução a este problema é uma extensão do bloco de comandos do algoritmo anterior
para contar os divisores. Necessitaremos de uma nova variável, que chamaremos de
contaDivisores, inteira, inicialmente com valor 0, pois não se sabe a princípio quantos
divisores o número possui.
Dado que o teste do algoritmo já informa quem é divisor de N, alteraremos tal teste para
também contar os divisores. Assim, teremos um novo algoritmo.
105
Programação com Pascal
1. Início do Algoritmo Contador Divisores de N
a. Obter o valor do inteiro n
b. Iniciar contaDivisores com 0
c. Se n > 0, então:
i. Faça divisor variar de 1 até n
ii. Para cada valor de divisor, faça:
1. Se n MOD divisor = 0, então:
a. imprima o valor de divisor.
b. Incremente contaDivisores.
d. Senão
i. Imprima: ‘o número deve ser positivo’.
e. Imprima: ‘o número’ + n + ‘possui’ + contaDivisores + ‘divisores’
2. Fim do Algoritmo Contador Divisores de N
O Fluxograma do Algoritmo Contador Divisores de N é apresentado na Figura 5.5 e
seu código na Listagem 5.6.
Teste se n é
positivo
Início
n
contaDivisores = 0
n>0
F
FOR
V
divisor = 1
F
divisor <= n
Fim
V
n MOD divisor = 0
V
Bloco de Comandos
106
divisor
F
contaDivisores =
contaDivisores + 1
divisor =
divisor + 1
Figura 5.5 – Fluxograma Contadores de Divisores de N.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
Observações:
1. A linha e do algoritmo apresenta uma operação + entre string e inteiro, o que
resultará na concatenação das strings com o literal que representa contaDivisores.
1 program ContaDivisoresDeN;
2
3 uses crt;
4
5 var
6
n, divisor, contaDivisores : integer;
7
8 begin
9
clrscr;
10
11
write('Digite um valor inteiro positivo para n: ');
12
readln(n);
13
contaDivisores := 0;
14
15
if (n > 0) then
16
begin
17
for divisor := 1 to n do
18
begin
19
if (n mod divisor = 0) then
20
begin
21
writeln('Divisor: ', divisor);
22
contaDivisores := contaDivisores + 1;
23
end;
24
end;
25
writeln('O numero ', n, ' possui ', contaDivisores, '
divisores');
26
end;
27
readkey;
Listagem 5.6 – Conta Divisores de N.
3. Escrever um algoritmo em Linguagem Natural, seu fluxograma e seu código em
Pascal que, para um conjunto de números inteiros entre 1 e 20, determine todos os
seus divisores e quantos são estes.
A solução a este problema é uma modificação simples do anterior, pois não mais
leremos um valor para n. Todavia, necessitaremos de 2 laços:
1. Um laço para obter os números entre 1 e 20;
2. O laço existente que determina e conta os divisores do número do laço
anterior.
107
Programação com Pascal
1. Início do Algoritmo Contador Divisores de 1 a 20
a. Faça n variar de 1 a 20
b. Iniciar contaDivisores com 0
c. Para cada valor de n, faça:
i. Faça divisor variar de 1 até n
ii. Para cada valor de divisor, faça:
1. Se n MOD divisor = 0, então:
a. imprima o valor de divisor.
b. Incremente contaDivisores.
iii. Imprima: ‘o número’ + n + ‘possui’ + contaDivisores + ‘divisores’
2. Fim do Algoritmo Contador Divisores de 1 a 20
A estrutura desta solução será a seguinte:
Início
n=1
FOR
n <= 20
Bloco de Comandos
108
F
FOR
V
Fim
n=n+1
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
5.2 WHILE .. DO
O comando WHILE .. DO permite a repetição de um comando, ou bloco de comandos,
um número finito ou indeterminado de vezes. O número de repetições é determinado
por uma condição de controle que deve ser testada antes da execução do comando (ou
bloco de comandos).
{Sintaxe 1:}
while condição do
Comando;
{Sintaxe 2:}
while condição do
begin
Bloco de Comandos;
end;
Note que o comando, ou bloco de comandos, só será executado se a condição for
avaliada como verdadeira. Pode-se ler o comando como: ENQUANTO a condição for
verdadeira, FAÇA: executar comando (ou bloco de comandos).
A principal característica do WHILE é efetuar um teste lógico no início de um loop
(laço), verificando se é permitido executar o trecho de instruções abaixo dela. Desta
forma, poderá executar um determinado conjunto de instruções enquanto a condição
verificada permanecer verdadeira. No momento em que a condição se torna falsa, o
processamento da rotina é desviado para fora do laço.
Sendo a condição falsa logo no início do laço, as instruções contidas nele são ignoradas.
Usando o comando WHILE .. DO, vamos elaborar um programa para imprimir todos os
números entre 1 e 10. Para isto, a condição será os números serem maiores que 0 e
menores ou iguais a 10.
Usando o FOR, o programa seria como a Listagem 5.5
1
2
3
4
for i := 1 to 10 do
begin
writeln('valor de i: ', i);
end;
Listagem 5.5 – Listagem de números de 1 a 10
Note que o FOR controla implicitamente a condição, fazendo o i (controle) variar entre
1 e 10. Para fazer o mesmo com o WHILE, necessitamos de um código similar. Vamos
iniciar uma variável de controle com 1 e fazê-la variar explicitamente de 1 em 1, até
chegar a 10. Por exemplo, vejamos a Listagem 5.6
109
110
Programação com Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
program whileSimples;
uses crt;
var i : integer;
begin
i := 1;
while (i <= 10) do
begin
writeln('valor de i: ', i);
i := i + 1;
end;
readkey;
end.
Listagem 5.6 – Listagem de números de 1 a 10
A linha 6 inicia a variável i com 1, pois desejam-se os números entre 1 e 10. Logo, ela
tem de iniciar em 1.
Como o maior valor deve ser o 10, i terá de variar até 10. Isso deve ser garantido pela
condição do WHILE, o que é feito na linha 7.
Tem-se, então, um laço de repetição de 10 vezes. Porém, isso só é verdade se i for
incrementado de 1 em 1, como é feito na linha 10. Isso garante que i será um valor do
conjunto {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.
Se a linha 10 fosse i := i + 5, i passaria de 1 para 6, por exemplo, não atendendo o que
se deseja.
O código da Listagem 5.6 pode ser lido assim: inicie i em 1, faça i variar de 1 em 1 até
10 e, enquanto i for menor que 10, imprima seu valor.
Tudo que está entre o begin (linha 5) e o end (linha 13), que compõe um bloco de
comandos, será repetido 10 vezes. Isso é garantido se o programador incrementar o
valor de i de 1 em 1.
O fluxograma do programa da Listagem 5,6 é apresentado na Figura 5.AA
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
Início
i =1
i <= 10
NÃO
Fim
SIM
‘Valor de i: ‘
i
i =i +1
Figura 6.AA – While com Contador
Uma alteração interessante a este programa é o seguinte: imprimir todos os número
pares entre 1 e 10. Apresentaremos duas soluções possíveis a este problema.
Na solução 1, exibida na Listagem 5.7, vamos iniciar uma variável de controle com 1 e
fazê-la variar explicitamente de 1 em 1, até chegar a 10. Embora a solução seja similar a
anterior, o bloco de comandos deve filtrar os elementos a exibir.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program whilePares;
uses crt;
var i : integer;
begin
i := 1;
while (i <= 10) do
begin
if (i mod 2 = 0) then
writeln('valor de i: ', i);
i := i + 1;
end;
readkey;
end.
Listagem 5.7 – Listagem de números de 1 a 10
A principal alteração da Listagem 5.7 para a 5.6 está na adição da condicional na linha
9. Agora, um número só será impresso se ele for par, ou seja, o resto da divisão de i por
2 é zero (i mod 2 = 0), logo, i é divisível por 2.
O fluxograma desta solução é apresentado na Figura 5.BB
111
112
Programação com Pascal
Início
i =1
i <= 10
NÃO
Fim
SIM
i mod 2 = 0
SIM
‘Valor de i: ‘
Laço do While
NÃO
i
i =i +1
Figura 7.BB – Pares entre 1 e 10 com WHILE
Na solução 2, exibida na Listagem 5.8, vamos usar um pouco de matemática. Como se
desejam os números pares entre 1 e 10, sabe-se que o primeiro número válido é 2. Logo,
pode-se iniciar a variável de controle i com 2.
E, como se desejam apenas os pares, vamos variar explicitamente i de 2 em 2, até
chegar a 10. Assim, teremos {2, 4, 6, 8, 10}. Vejamos a solução
1
2
3
4
5
6
7
8
9
10
11
12
13
program whilePares;
uses crt;
var i : integer;
begin
i := 2;
while (i <= 10) do
begin
writeln('valor de i: ', i);
i := i + 2;
end;
readkey;
end.
Listagem 5.8 – Listagem de números de 1 a 10
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
A principal alteração da Listagem 5.7 para a 5.6 está no início da variável i e em seu
incremento, agora de 2 em 2 (linha 10). Como i inicia em 2, teremos os valores {2, 4, 6,
8, 10}.
O fluxograma desta solução é apresentado na Figura 5.CC
Início
i =2
i <= 10
NÃO
Fim
SIM
‘Valor de i: ‘
i
Laço do While
i =i +2
Figura 8.CC
Os exemplos apresentados até agora usaram o WHILE com laços finitos, pois havia
uma condição de parada. Todavia, no seguinte problema, teremos um laço infinito
(indeterminado):
Início do Algoritmo WhileQuadrado
1. Solicitar ao usuário para digitar um número.
2. Enquanto o número digitado não for zero, faça:
a. imprimir o quadrado do número;
b. solicitar ao usuário para digitar um número.
Fim do Algoritmo WhileQuadrado
Quando o algoritmo WhileQuadrado chegará ao fim? Isso é indeterminado, pois não se
sabe quando o usuário digitará o número 0.
O fluxograma deste algoritmo está na Figura 5.DD
113
114
Programação com Pascal
Início
i
i <> 0
NÃO
Fim
SIM
i*i
Laço do While
i
Figura 9.DD – While
O código deste algoritmo está na Listagem 5.9
1 program whileQuadrados;
2 uses crt;
3 var i : integer;
4
5 begin
6
writeln('Digite um valor. 0 para terminar.');
7
readln(i);
8
9
while (i <> 0) do
10
begin
11
writeln('O quadrado de : ', i, ' eh: ', i * i);
12
13
writeln(#10, #10, #13, 'Digite um valor. 0 para
terminar.');
14
readln(i);
15
end;
16
readkey;
17 end.
Listagem 5.9 – While
No código da Listagem 5.9, a linha 6 imprime uma mensagem e a 7 lê um valor para i.
A linha 9 inicia um laço que se repetirá enquanto i for diferente de 0 (i <> 0).
Se o usuário iniciar digitando 0, a condição da linha 9 faz com que o laço não seja
executado.
A linha 11 imprime o quadrado do número lido e a 13 solicita outro valor. Destaca-se o
uso de #10 (nova linha) e #13 (retorno de cursor) para criar duas linhas em branco e
posicionar o cursor na coluna da esquerda, na tela.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
A linha 14 lê um novo valor para i. Note que enquanto i for diferente de 0, o bloco de
comando entre as linhas 10 e 15 se repetirá. Isso é um laço infinito.
Desafios
1. Imprimir todos os múltiplos de 5 entre 1 e 100 usando WHILE e sem usar IF
ou Case.
2. Imprimir todos os múltiplos de 3 e 5 entre 1 e 100 usando WHILE e sem usar
IF ou Case.
3. Imprimir todos os múltiplos de 3 ou 5 entre 1 e 100 usando WHILE e sem usar
IF ou Case.
115
116
Programação com Pascal
5.3 REPEAT .. UNTIL
O comando REPEAT .. UNTIL permite a repetição de um comando, ou bloco de
comandos, um número finito ou indeterminado de vezes. O número de repetições é
determinado por uma condição de controle que deve ser testada após a execução do
comando (ou bloco de comandos).
Note que sua principal diferença para o WHILE..DO está onde o teste será feito. Como
o WHILE executa o teste da condição ANTES do comando, pode ser que este nunca
seja executado (no caso da condição ser falsa). O REPEAT testa a condição APÓS e
execução do comando, o que significa que, ao menos, este será executado uma vez.
{Sintaxe:}
repeat
Bloco de Comandos;
until (condição);
Note que o comando, ou bloco de comandos, será executado até que a condição seja
avaliada como verdadeira, outra diferença para o WHILE, que executa até a condição
ser falsa.
Pode-se ler o comando como: REPITA a execução do bloco de comandos ATÉ QUE a
condição seja falsa.
A principal característica do REPEAT..UNTIL é efetuar um teste lógico ao final de um
loop (laço), verificando se é permitido continuar a execução do trecho de instruções.
Desta forma, poderá executar um determinado conjunto de instruções enquanto a
condição verificada permanecer falsa. No momento em que a condição se torna
verdadeira, o processamento da rotina é desviado para fora do laço.
Usando o comando REPEAT..UNTIL, vamos elaborar um programa para imprimir
todos os números entre 1 e 10. Para isto, a condição será os números serem maiores que
0 e menores ou iguais a 10, tal qual com WHILE..DO.
O Fluxograma encontra-se na Figura 5.EE. Comparando-o com o mesmo fluxograma do
WHILE, Figura 5., nota-se que a única diferença está onde o teste da condição é feito.
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
Início
i =1
‘Valor de i: ‘
i
Laço do Repeat
i =i +1
i > 10
SIM
Fim
Figura 10.EE – Repeat Until de 1 a 10
O código está na Listagem 5.10.
1
2
3
4
5
6
7
8
9
10
11
12
program Repeat1a10;
uses crt;
var i : integer;
begin
i := 1;
repeat
writeln('valor de i: ', i);
i := i + 1;
until (i > 10);
readkey;
end.
Listagem 5.10 – Listagem de números de 1 a 10
A linha 6 inicia a variável i com 1, pois desejam-se os números entre 1 e 10. Logo, ela
tem de iniciar em 1.
Como o maior valor deve ser o 10, i terá de variar até 10. Isso deve ser garantido pela
condição do REPEAT, o que é feito na linha 10, que pode ser lida: execute os comandos
ATÉ QUE i seja maior que 10. Note que a condição é diferente da do WHILE. Aqui,
informamos quando o laço deve terminar.
Tem-se, então, um laço de repetição de 10 vezes. Porém, isso só é verdade se i for
incrementado de 1 em 1, como é feito na linha 9. Isso garante que i será um valor do
conjunto {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.
117
118
Programação com Pascal
O código da Listagem 5.10 pode ser lido assim: inicie i em 1 e repita: imprima i e
incremente-o de 1 em 1 até que seja maior que 10.
Observações:
1. O REPEAT..UNTIL já delimita por si só o bloco de comandos, tornando o uso de
BEGIN..END opcional.
2. Note que os comandos entre o REPEAT e o UNTIL compõem o bloco de comandos e
serão repetidos.
Na Listagem 5.11 apresentaremos a conversão do programa da Listagem 5.7 para o uso
de REPEAT..UNTIL.
Os passos para isto são os seguintes:
1. Onde se tem WHILE, substituir por REPEAT;
2. Eliminar, se houver, o begin do início do bloco de comandos e substituir o
end pelo UNTIL; Lembrar que o REPEAT..UNTIL delimita um bloco de
comandos.
3. Negar a condição do WHILE e movê-la para a condição do UNTIL;
a. Neste caso, a negação de (i <= 10) é (i > 10).
1
2
3
4
5
6
7
9
10
11
12
13
14
program repeatPares;
uses crt;
var i : integer;
begin
i := 1;
repeat
if (i mod 2 = 0) then
writeln('valor de i: ', i);
i := i + 1;
until (i > 10);
readkey;
end.
Listagem 5.11 – Listagem de números de 1 a 10
O fluxograma desta solução é apresentado na Figura 5.FF
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
Início
i =1
i mod 2 = 0
SIM
‘Valor de i: ‘
NÃO
Laço do Repeat
i
i =i +1
i > 10
SIM
Fim
Figura 11.FF
Desafios
4. Imprimir todos os múltiplos de 5 entre 1 e 100 usando REPEAT e sem usar IF
ou Case.
5. Imprimir todos os múltiplos de 3 e 5 entre 1 e 100 usando REPEAT e sem usar
IF ou Case.
6. Imprimir todos os múltiplos de 3 ou 5 entre 1 e 100 usando REPEAT e sem
usar IF ou Case.
119
120
Programação com Pascal
6. Arrays
Um Array, também chamado de vetor, quando unidimensional, ou matriz, quando
bidimensional, é uma estrutura simples de dados.
Arrays mantêm uma coleção de elementos, do mesmo tipo de dados. Elementos
individuais são acessados por sua posição no array, que é determinada por um índice.
{Sintaxe:}
nomeDoVetor : array [início..fim] of tipoDeDados;
Em Pascal, define-se um array informando-se qual o valor de seu primeiro e último
índice (início e fim, respectivamente). Por exemplo, analisemos o seguinte código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program TesteArray;
uses crt;
var
a : array[1..2] of integer;
i : integer;
begin
i := 10;
a[1] := -5; {Coloca -5 na posição 1 do vetor a}
a[2] := 2; {Coloca 2 na posição 2 do vetor a}
writeln('i: ', i);
writeln('a[1]: ', a[1]);
writeln('a[2]: ', a[2]);
readkey;
end.
Na linha 5 declara-se a variável a como sendo um array de inteiros e na linha 6 declarase i como um inteiro.
O que diferencia i de a é que i representa um único inteiro, ou seja, um único valor
inteiro. Pode-se atribuir um único valor inteiro para i e acessá-lo diretamente pelo nome
da variável. Imagine que para cada variável, o sistema reserva uma área de memória
com seu nome. Referenciar o nome i significa para o sistema acessar seu conteúdo,
como representa a Figura XYZ.
i
10
Figura 12.XYZ
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
A variável a, contudo, possui índices 1 e 2 (especificado por [1..2], sendo início = 1 e
fim = 2). Logo, a pode armazenar 2 valores distintos. A linha 10 atribui o valor -5 à
posição 1 do array a. A linha 11 atribui 2 à sua segunda posição.
Não se pode acessar a variável a pelo nome, pois ela exige um índice, como representa a
Figura ZZZ.
-5
2
a[1]
a[2]
Figura 13
Imagine que, para cada vetor, o sistema reserva uma área de memória com várias
posições. Logo, apenas o nome (a, por exemplo) não serve para identificar qual posição
se quer acessar. Por isso necessita-se do índice (a[1] e a[2]), que indica a posição correta
dentro da área reservada.
O seguinte problema ilustra o uso de vetores: desejam-se ler 5 valores e, após isso,
imprimir os pares separados dos ímpares. Uma solução está na Listagem 6.XX
121
122
Programação com Pascal
1 program paresImparesSemArray;
2 uses crt;
3 var v1, v2, v3, v4, v5 : integer;
4
5 begin
6
writeln('Problema: ler 5 valores e, apos isso, imprimir os
pares separados dos ímpares');
7
write('Digite o valor 1: ');
read(v1);
8
write('Digite o valor 2: ');
read(v2);
9
write('Digite o valor 3: ');
read(v3);
10
write('Digite o valor 4: ');
read(v4);
11
write('Digite o valor 5: ');
read(v5);
12
13
writeln(#10, #10, #13, 'Imprimindo os Valores Pares');
14
if (v1 mod 2 = 0) then writeln(v1);
15
if (v2 mod 2 = 0) then writeln(v2);
16
if (v3 mod 2 = 0) then writeln(v3);
17
if (v4 mod 2 = 0) then writeln(v4);
18
if (v5 mod 2 = 0) then writeln(v5);
19
20
writeln(#10, #10, #13, 'Imprimindo os Valores Impares');
21
if (v1 mod 2 = 1) then writeln(v1);
22
if (v2 mod 2 = 1) then writeln(v2);
23
if (v3 mod 2 = 1) then writeln(v3);
24
if (v4 mod 2 = 1) then writeln(v4);
25
if (v5 mod 2 = 1) then writeln(v5);
26
27
readkey;
28 end.
Para minimizar a área da listagem, optou-se por usar comandos compostos numa mesma
linha, como é o caso das linhas 7 a 10, onde a solicitação de um número e sua leitura
estão numa mesma linha de código. Também, os comandos IF, por não conterem blocos
de comando, fazem a escrita logo após o THEN, numa mesma linha. Ressalta-se que
este não é o modelo preferencial de escrita de código, pois minimiza a legibilidade do
mesmo. Ele foi usado apenas para reduzir o espaço da listagem.
Analisando o código, a linha 3 declara 5 variáveis inteiras necessárias ao programa. As
linhas de 7 a 10 fazem a leitura dos 5 números inteiros, solicitando-os ao usuário. Em
seguida, linhas 13 a 18, apenas os números pares são impressos. Após isso, as linhas de
20 a 25 imprimem apenas os números ímpares.
Observações:
1. O uso de #10 (nova linha) e de #13 (retorno do cursor) é feito no WRITE(LN) para saltar
múltiplas linhas.
a. O comando writeln(#10, #10, #13, 'ABC') imprime 2 linhas em branco,
volta o cursos para a primeira coluna e depois imprime ABC.
Imagine a Listagem 6.XX caso o requisito fosse o de leitura de 30 números. Seriam
necessárias mais 75 linhas de código (25 para leitura, 25 para pares e 25 para ímpares).
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE REPETIÇÃO
Uma solução com vetores resolveria esse acréscimo de linha por todo o código. A
Listagem 6.YY demonatra isso.
1 program paresImparesComArray;
2 uses crt;
3
4 const tamanhoVetor = 5;
5 var
v : array [1..tamanhoVetor] of integer;
6
i : integer;
7
8 begin
9
writeln('Problema: ler 5 valores e, apos isso, imprimir os
pares separados dos impares');
10
for i := 1 to tamanhoVetor do
11
begin
12
write('Digite o valor ', i, ' : ');
13
read(v[i]);
14
end;
15
16
writeln(#10, #10, #13, 'Imprimindo os Valores Pares');
17
for i := 1 to tamanhoVetor do
18
if (v[i] mod 2 = 0) then
19
writeln(v[i]);
20
21
writeln(#10, #10, #13, 'Imprimindo os Valores Impares');
22
for i := 1 to tamanhoVetor do
23
if (v[i] mod 2 = 1) then
24
writeln(v[i]);
25
26
readkey;
27 end.
Na Listagem 6.YY, a linha 4 declara uma constante tamanhoVetor com valor 5. A linha
5 declara v como um vetor com 5 posições inteiras (valor de tamanhoVetor). A linha 6
declara i como um inteiro, que será o controlador do FOR.
As linhas 10-14 efetuam a leitura dos números. Como são 5 números, tem-se um laço
finito com 5 passos (linha 10: FOR com i variando entre 1 e 5). O bloco de comandos
deste laço é composto pelas linhas 11-14, onde é feita a solicitação de um valor e sua
leitura.
A linha 12 solicita um valor, identificando-o pelo controlador do FOR. O usuário sabe
que digitará o i-ésimo número da seqüência de 5.
A linha 13 efetua a leitura de um elemento do vetor, usando i como índice.
As linhas 17 a 19 formam um novo laço com 5 passos. Em cada passo testa-se se um
dos elementos do vetor é par (testa-se se v indexado por i e par: v[i] mod 2 = 0). Cada
elemento só é impresso se a condição for verdadeira. As linhas de 22 a 24 fazem algo
similar, mas para ímpares.
Note que o tamanho do código da Listagem 6.YY não mudará mesmo que a quantidade
de números a ler mude. Para isto, basta alterar a dimensão da constante tamanhoVetor.
123
124
Programação com Pascal
{Exercícios}
Algoritmo A4.1 (Fácil):
1. Declarar idade1 e idade2 como inteiro;
2. Declarar pessoa1 e pessoa2 como string;
3. Ler um valor para a variável idade1 e outro para idade2;
4. Ler um valor para a pessoa1 e outro para a pessoa2;
5. Se (idade1 for maior que a idade2)
a. imprima: pessoa1, ‘ eh mais velha que ‘, pessoa2
6. Se (idade2 for maior que a idade1)
a. imprima: pessoa2, ‘ eh mais velha que ‘, pessoa1
7. Se (idade1 for igual a idade2)
a. imprima: pessoa1, ‘ e ‘, pessoa2, ‘ tem a mesma idade’
Algoritmo A4.2 (Fácil):
1. Declarar idade1 e idade2 como inteiro;
2. Declarar pessoa1 e pessoa2 como string;
3. Ler um valor para a variável idade1 e outro para idade2;
4. Ler um valor para a pessoa1 e outro para a pessoa2;
5. Se (idade1 for maior que a idade2)
a. imprima: ‘pessoa1’ é mais velha que ‘pessoa2’
6. Senão
a. Se (idade2 for maior que a idade1)
i. imprima: ‘pessoa2’ é mais velha que ‘pessoa1’
b. Senão
i. imprima: ‘pessoa1’ e ‘pessoa2’ tem a mesma idade
Questões:
- Qual a diferença entre A4.1 e A4.2?
- Que linhas executam em A4.1 e não necessariamente executam em A4.2?
Justifique.
Edeyson Andrade Gomes
www.edeyson.com.br
125
Algoritmo A4.1 (Médio):
1. Declarar numeroDeLados como inteiro;
2. Declarar área, lado1, lado2, lado3 e lado4 como real;
3. Declarar numeroDeAngulosIguais como inteiro;
4. Imprimir: ‘Quantos lados tem a figura geométrica: <3> ou <4>?’
5. Ler um valor para a variável numeroDeLados;
6. Imprimir: ‘Quantos ângulos são iguais: <2>, <3> ou <4>?’
7. Ler um valor para a variável numeroDeAngulosIguais;
8. Ler área, lado1, lado2, lado3 e lado4 como real;
9. Se numeroDeLados for diferente de 3 ou 4
a. Imprima: ‘Numero de lados inválido’.
10. Senão
a. Se numeroDeLados for igual a 3
i. Imprima: ‘Triangulo’
ii. Se todos os lados são iguais
1. Imprima: “Isto eh um triangulo equilatero;
iii. Senão
1. Se dois lados forem iguais e numeroDeAngulosIguais for igual a 2
a. Imprima: “Isto eh um triangulo isosceles;
2. Senão
a. Imprima: “Isto eh um triangulo escaleno;
b.
Senão
i. Imprima ‘Retangulo ou Trapézio’
ii. Se todos os lados são iguais e numeroDeAngulosIguais igual a 4
1. Imprima: “Isto eh um quadrado’;
2. Faça área = lado1 * lado1;
3. Imprima a área do quadrado.
iii. Senão,
1. Se os lados são iguais dois a dois e numeroDeAngulosIguais igual a 2
a. Imprima: “Isto eh um retângulo’;
b. Faça área = lado1 (menor) * lado2 (maior);
c. Imprima: ‘A area do retângulo é’, area.
2. Senão
a. Imprima: Isso é um Trapezio.
126
Programação com Pascal
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice B – Exercícios
Apêndice B – Exercícios
Observações:
1. Todas as questões trabalham com intervalos fechados. Logo, “entre A e B” corresponde a
[A, B].
1. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Numa escola, decidiu-se fazer o censo de alunos. Criou-se uma base de dados
onde os registros são estruturados da seguinte forma:
Nome | Sexo
- O campo Nome informa o nome do aluno.
- O campo sexo, com valores ‘F’ ou ‘M’, corresponde a Feminino ou Masculino,
respectivamente.
Seu algoritmo deve ler múltiplos registros e informar:
1. Total de meninos;
2. Total de meninas;
3. Total de alunos.
Início de solução:
Início do Algoritmo
Iniciar as variáveis TotalMeninos, TotalMeninas e TotalAlunos com zero.
Enquanto houver registros, faça:
Leia Registro
Se sexo = ‘M’ então adicione 1 a TotalMeninos
Senão, adicione 1 a TotalMeninas
TotalAlunos = TotalMeninos + TotalMeninas
Imprima TotalMeninos, TotalMeninas, TotalAlunos
Fim do Algoritmo
2. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Numa escola, decidiu-se fazer o censo de alunos com Miopia. Criou-se uma
base de dados onde os registros são estruturados da seguinte forma:
Nome | Sexo | Miopia
- O campo Nome informa o nome do aluno.
- O campo sexo, com valores ‘F’ ou ‘M’, corresponde a Feminino ou Masculino,
respectivamente.
127
128
Programação com Pascal
- O campo Miopia indica o grau da disfunção. Grau zero indica não haver o
problema.
Seu algoritmo deve ler todos os registros da base de dados e informar:
1. Total de meninos;
2. Total de meninos com miopia;
3. Média de miopia entre os meninos;
4. Total de meninas;
5. Total de meninas com miopia;
6. Média de miopia entre as meninas;
7. Média geral de miopia.
3. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Numa escola, decidiu-se fazer o censo de alunos com Miopia e Hipermetropia.
Criou-se uma base de dados onde os registros são estruturados da seguinte
forma:
Nome | Sexo | Miopia | Hipermetropia
- O campo Nome informa o nome do aluno.
- O campo sexo, com valores ‘F’ ou ‘M’, corresponde a Feminino ou Masculino,
respectivamente.
- Os campos Miopia e Hipermetropia indicam o grau da disfunção. Grau zero
indica não haver o problema.
Seu algoritmo deve ler todos os registros da base de dados e informar:
1. Total de meninos;
2. Total de meninos com miopia;
3. Total de meninos com hipermetropia;
4. Média de miopia entre meninos;
5. Média de hipermetropia entre meninos;
6. Total de meninas;
7. Total de meninas com miopia;
8. Total de meninas com hipermetropia;
9. Média de miopia entre meninas;
10. Média de hipermetropia entre meninas.
11. Média geral de miopia.
12. Média geral de hipermetropia.
4. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os múltiplos de N entre A e B. Note que N, A e B devem ser fornecidos pelo
usuário.
5. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime o
Máximo Divisor Comum de dois números A e B, fornecidos pelo usuário.
Dica por http://www.somatematica.com.br/fundam/mdc.php:
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice B – Exercícios
Dois números naturais sempre têm divisores comuns.
Por exemplo: os divisores comuns de 12 e 18 são 1, 2, 3 e 6. Dentre eles, 6 é o maior.
Então chamamos o 6 de máximo divisor comum de 12 e 18 e indicamos m.d.c.(12,18)
= 6.
Alguns exemplos:
mdc (6,12) = 6
mdc (12,20) = 4
mdc (20,24) = 4
mdc (12,20,24) = 4
mdc (6,12,15) = 3
CÁLCULO DO M.D.C. PELO PROCESSO DAS DIVISÕES SUCESSIVAS
Nesse processo efetuamos várias divisões até chegar a uma divisão exata. O divisor
desta divisão é o m.d.c. Acompanhe o cálculo do m.d.c.(48,30).
Regra prática:
1º) dividimos o número maior pelo número menor;
48 / 30 = 1 (com resto 18)
2º) dividimos o divisor 30, que é divisor da divisão anterior, por 18, que é o resto da
divisão anterior, e assim sucessivamente;
30 / 18 = 1 (com resto 12)
18 / 12 = 1 (com resto 6)
12 / 6 = 2 (com resto zero - divisão exata)
3º) O divisor da divisão exata é 6. Então m.d.c.(48,30) = 6.
6. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime o
Mínimo Múltiplo Comum de dois números A e B, fornecidos pelo usuário.
Sugestões:
Início do Algoritmo
Leia A e B
Enquanto múltiplo de A menor que AxB faça
Se múltiplo de A for divisível por B então
Imprima: MMC é múltiplo de A
Calcule próximo múltiplo de A
Fim do Algoritmo
Início do Algoritmo
Leia A e B
Múltiplo = A
Enquanto Múltiplo menor ou igual a AxB faça
Se Múltiplo divisível por B então
Imprima: MMC é Múltiplo
Termine Algoritmo
Múltiplo = Múltiplo + A
Fim do Algoritmo
Dica:
129
130
Programação com Pascal
Dados dois números A e B, encontre os múltiplos de A.
Para cada múltiplo de A, teste se ele é divisível por B.
Se sim, ele é o MMC.
O ideal é achar os múltiplos do maior número entre A e B e testar com o
menor.
Dica em http://www.somatematica.com.br/fundam/mmc.php:
7. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que lê os lados de
um retângulo, calcula e imprime sua área.
8. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que lê o raio de
um círculo, calcula e imprime sua área.
9. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que:
a. Lê o número de lados de um polígono regular. Se o número de lados é
diferente de 3, 4 ou 6, termine o algoritmo.
b. Lê o tamanho do lado.
c. Calcula e imprime a área do polígono e seu nome (triângulo, quadrado ou
hexágono).
Dica: http://www.mundoeducacao.com.br/matematica/area-hexagono-regular.htm
Início do Algoritmo
Leia o número de lados do polígono.
Se o número de lados lido for diferente de 3, 4 ou 6, termine o algoritmo.
Senão, Leia o tamanho do lado.
Se número de lados é igual a 3, então área = (fórmula a ser lida). Imprima área
calculada e “triângulo”.
Senão,
Se número de lados é igual a 4, então área = lado2. Imprima área
calculada e “quadrado”.
Senão, área = (fórmula a ser lida). Imprima área calculada e
“hexágono”.
Fim do Algoritmo
10. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia um
conjunto de números naturais e determine qual o menor e o maior. A leitura do conjunto
deve ser feita até que um número negativo seja encontrado.
11. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia um
número inteiro que representa uma quantidade de segundos, e determine quantas horas,
minutos e segundos estão contidos neste número.
Por exemplo: 3600 segundos correspondem a 1 hora : 00 minutos : 00 segundos
12. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia o sexo
de uma pessoa (H ou M) e sua altura e a partir dele calcule seu peso ideal:
a) Para homens (H): (72.7 * altura) - 58
b) Para mulheres (M): (62.1 * altura) – 44.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice B – Exercícios
13. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia os
valores de X e Y e calcule XY usando apenas a operação de multiplicação.
14. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia os
valores de X e Y e calcule X * Y usando apenas a operação de soma.
Início do Algoritmo
Leia X e Y
Resultado = 0
Faça Y vezes
Resultado = Resultado + X
Imprima Resultado
Fim do Algoritmo
15. O fatorial de um número natural n, representado por n!, é o produto de todos os
inteiros positivos menores ou iguais a n. Usando Linguagem Natural e Fluxograma,
descreva um algoritmo leia n e imprima seu fatorial.
16. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números primos entre A e B. Note que A e B devem ser fornecidos pelo
usuário.
17. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os divisores de N entre A e B. Note que N, A e B devem ser fornecidos pelo
usuário. Se A for menor que 1 ou se A for maior que B ou se B for maior que N,
termine o algoritmo.
18. Usando Linguagem Natural e Fluxograma, descreva um algoritmo que leia os
valores de X e Y e calcule X / Y usando apenas a operação de subtração.
19. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os múltiplos de N entre A e B. Note que N, A e B devem ser fornecidos pelo
usuário.
20. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que usando
variáveis que armazenam apenas 1 dígito [0..9] escreve todos os número entre 0 e 999.
Dica: serão necessárias 3 variáveis.
21. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia algo do
teclado. Enquanto o que for lido for diferente de espaço em branco, imprima o que foi
lido.
22. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprima o
número 20 vinte vezes, o número 19 dezenove vezes, o número 18 dezoito vezes, e
assim sucessivamente, até o número 1 uma vez.
23. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia um
número N e imprima o número N ene vezes, o número (N-1) ene menos uma vezes, e
assim sucessivamente, até o número 1 uma vez.
131
132
Programação com Pascal
Por exemplo: Se N for 3 deve imprimir: 3 3 3 2 2 1
24. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia um
número N e um número F e imprima o número N ene vezes, o número (N-1) ene menos
uma vezes, e assim sucessivamente, até o número F efe vezes. Se F for maior que N,
encerre o algoritmo
Por exemplo: Se N for 5 e F for 3 deve imprimir: 5 5 5 5 5 4 4 4 4 3 3 3
Sugestão:
Início do Algoritmo
Leia N, F
Enquanto N >= F faça
Cont = N
Faça Cont Vezes
Imprima N
N=N-1
Fim do Algoritmo
25. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia dois
números, A e B e determine o valor da menor e da maior razão entre eles. Ou seja,
determine se A/B é maior que B/A e imprima-os.
26. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia H
(altura) e g (gravidade) e determine a velocidade de um corpo a cada metro percorrido
após ser largado de uma altura H.
Dica: H = gt2/2, onde t é o tempo. Logo, t = √2H/g (raiz quadrada)
V = V0 + at2/2, onde a é a aceleração. Neste caso, a = g.
27. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia g
(gravidade) e t (tempo) e determine a altura H percorrida por um corpo em queda.
Dica: H = gt2/2, onde t é o tempo. Logo, t = √2H/g (raiz quadrada)
V = V0 + at2/2, onde a é a aceleração. Neste caso, a = g.
28. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia H
(altura) e g (gravidade) e determine o tempo de queda de um corpo após ser largado de
uma altura H.
Dica: H = gt2/2, onde t é o tempo. Logo, t = √2H/g (raiz quadrada)
V = V0 + at2/2, onde a é a aceleração. Neste caso, a = g.
29. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia V
(velocidade final), a (aceleração) e t (tempo) e determine a velocidade inicial de um
corpo em movimento.
Dica: V = V0 + at2/2, onde a é a aceleração. Neste caso, a = g.
30. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia um
valor N. Se N for maior ou igual a zero, imprimir N e ler outro valor. Se N for menor
que zero, termine o algoritmo.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice B – Exercícios
31. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia dois
números A e B, sendo B maior que A, e imprima todos os divisores de todos os
números entre A e B.
32. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Numa empresa, decidiu-se fazer o levantamento de consumo de telefone.
Criou-se uma base de dados onde os registros são estruturados da seguinte
forma:
Ramal | Numero Discado | Tempo Ligação
Seu algoritmo deve ler todos os registros da base de dados e informar quais os 5
ramais com maior tempo total de ligação. Existem, na empresa, 10 ramais.
33. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Uma empresa aérea decidiu imprimir uma relação de funcionários nordestinos.
Sabe-se que ela possui uma base de dados onde os registros são estruturados da
seguinte forma:
Nome | DataNascimento | CidadeNascimento |UF
Seu algoritmo deve ler todos os registros da base de dados e gerar tal relação.
UF possui valores como BA, SE, PB, etc.
34. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia um
valor N e imprima todos os número pares entre 1 e N.
35. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia um
número inteiro de até 4 dígitos N e imprima todos os seus dígitos.
Dica: 13 DIV 10 resulta em 1
13 MOD 10 resulta em 3
36. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números de Armstrong entre 1 e 1000. Um número N é dito de Armstrong se a
soma dos cubos de seus dígitos é igual a N.
37. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números simétricos entre 1 e 10000. Um número N é dito simétrico se ele é
lido igualmente da direita para a esquerda e da esquerda para a direita: Exemplo: 232,
1221, etc.
38. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números simétricos e pares entre 1 e 10000.
39. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números simétricos e primos entre 1 e 10000.
133
134
Programação com Pascal
40. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que imprime
todos os números simétricos entre 1 e 10000 e também todos os seus divisores.
41. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que determina
todas as possíveis combinações de números consecutivos para os números entre 1 e 100.
Para isto, tem-se que pegar um número N e descobrir somas de números consecutivos
que resultem neste número N.
Por exemplo: se o número N é15, o número de combinações consecutivas será:
1 2 3 4 5, pois 1 + 2 + 3 + 4 + 5 = 15
4 5 6, pois 4 + 5 + 6 = 15
7 8, pois 7 + 8 = 15
42. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que determina os
8 primeiros números naturais curiosos. Para isso, dado um número N, deve-se encontrar
seu número de dígitos (nd). Eleve N ao quadrado e pegue os nd dígitos da direita. Se o
número original N é igual ao número formado pelos nd dígitos da direita de N2, N é um
número curioso.
Por exemplo: 25 é um número curioso. Note que nd = 2 (dois dígits em 25). 252= 625.
Os dois dígitos da direita são 25.
43. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que dado um
número real escreva-o por extenso e em Real (moeda).
Por exemplo: dado 1.325,17 escreva: Mil, trezentos e vinte e cinco reais e dezessete
centavos.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
Apêndice C – Exemplos de Código
C1 - Tipos, Variáveis e Constantes
C.1.1 - Este programa demonstra o uso de variáveis e constantes no Pascal. Seu objetivo
é determinar um valor para o Raio de um círculo e Calcular sua área = πr2.
Como π é uma constante matemática, ela foi definida na linha 12.
Área e Raio são variáveis, pois círculos diferentes têm valores diferentes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
program VariaveisConstantes;
{Este programa demonstra o uso de variáveis e constantes no Pascal.
Seu objetivo é determinar um valor para o Raio de um círculo e
Calcular sua área.}
uses crt;
var
{Declara area e raio como variáveis REAIS}
area, raio : real;
const
{Declara pi como uma constante}
pi = 3.1415926536;
begin
{Atribuições de valores às variáves}
{Determina o raio do círculo explicitamente.}
raio := 10;
{Calcula a área do círculo = pi * raio ao quadrado}
area := pi * raio * raio;
writeln('A area do circulo de raio ', raio:3:2, ' eh: ', area:3:4);
readkey;
end.
135
136
Programação com Pascal
C.1.2 - Este programa vai demonstrar os tipos de variáveis do Pascal, como lhes atribuir
valores e imprimi-las. Para isto são definidas variáveis inteiras, reais, lógicas, caracter e
texto.
1 program TiposDeVariaveis;
2 {Este programa vai demonstrar os tipos de variáveis do Pascal,
3 como lhes atribuir valores e imprimi-las.}
4
5 uses crt;
6
7 {Tudo que vem após VAR é variável
8 sintaxe:
9
nomeDaVariável : tipo;
10 }
11 var
12
{Declara ai, bi e ci como variáveis INTEIRAS}
13
ai, bi, ci : integer;
14
{Declara ar e br como varáveis REAIS}
15
ar, br : real;
16
{Variáveis lógicas - podem ser TRUE ou FALSE}
17
al, bl : boolean;
18
{Declara bs como String - uma cadeia de caracteres}
19
bs : string;
20
{O uso de [] na declaração de string delimita o número de
caracteres.
21
Neste caso, a variável nome pode ter 10 caracteres no máximo.}
22
nome : string[10];
23
{Char representa um único caracter}
24
caracter : char;
25
26 const
27
pi = 3.1415926536;
28
29 begin
30
{Atribuições de valores às variáveis}
31
ai := 10;
32
bi := ai * 2;
33
ci := 2 * 23;
34
35
caracter := 'A';
36
writeln('A letra eh: ', caracter);
37
caracter := 'B';
38
writeln('A letra eh: ', caracter);
39
{Atribui a letra pelo valor da Tabela AscII}
40
caracter := #69;
41
writeln('A letra eh: ', caracter);
42
43
{Teste se 2 é maior que 1 e atribui o resultado para al}
44
al := 2 > 1;
45
writeln('AL: ', al);
46
47
bs := ' Isto eh uma string longa. Pode ser uma frase.';
48
nome := 'Edeyson';
49
writeln(nome, bs);
50
51
readkey;
52 end.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
C.1.3 - Segunda lei de movimento de Newton ou Princípio da Proporcionalidade ou Lei
de Força: Um ponto material sujeito à ação de uma força F adquire aceleração a, de
mesma direção e sentido que a força e módulo |a| proporcional à intensidade de F; o
coeficiente de proporcionalidade é um escalar essencialmente positivo que 'mede' a
inércia do ponto - sua massa. Assim, calcula-se Força = massa * aceleração.
1 program InteirosEmPascal;
2 {Este programa vai demonstrar o uso de Inteiros em Pascal
3
calculando a Força que incide num ponto material de massa e
aceleração conhecidas.}
4
5 uses crt;
6
7 var
8
forca, massa, aceleracao : integer;
9
10 begin
11
writeln('Qual a massa do ponto material?');
12
readln(massa);
13
14
writeln('Qual a aceleracao do ponto material?');
15
readln(aceleracao);
16
17
forca:= massa * aceleracao;
18
writeln('A Forca aplicada ao ponto material eh: ', forca);
19
readkey;
20 end.
C.1.4 - Segunda lei de movimento de Newton ou Princípio da Proporcionalidade ou Lei
de Força: Cálculo da Massa.
1 program ReaisEmPascal;
2 {Este programa vai demonstrar o uso do tipo Real em Pascal calculando a
massa de um ponto material conhecendo-se a força nele aplicada e sua
aceleração.}
4
5 uses crt;
6
7 var
8
forca, massa, aceleracao : real;
9
10 begin
11
writeln('Qual a forca do ponto material?');
12
readln(forca);
13
14
writeln('Qual a aceleracao do ponto material?');
15
readln(aceleracao);
16
17
massa := forca / aceleracao;
18
writeln('A massa eh: ', massa:3:2);
19
readkey;
20 end.
137
138
Programação com Pascal
C.1.5 – Uso de String e Char em Pascal.
1 program StringChar;
2 uses crt;
3 var
4
endereco, nome : string; {endereço e nome são cadeias com 0 a 255
caracteres.}
5
CPF : string[11];
{O uso de [] delimita o número de caracteres.
Neste caso CPF tem 11 caracteres.}
6
sexo : char;
{char representa um único caracter. Neste caso
sexo pode ser 'M' ou 'F'}
7
8 begin
9
{Atribuições de valores às variáves}
10
endereco := 'Rua dos Alferes, 1234, Ap. 1001, Barra, Salvador, Bahia
- CEP: 40.130.280';
11
nome:= 'Jose da Silva Santos';
12
CPF := '12345678901';
13
sexo := 'M';
14
15
writeln('Endereco: ', endereco);
16
writeln('Cliente: ', nome);
17
writeln('CPF: ', cpf);
18
writeln('Sexo: ', sexo);
19
readkey;
20 end.
C.1.6 – Uso de String e Char em Pascal.
1 program StringsEmPascal;
2 {Este programa vai demonstrar o uso de String em Pascal.}
3
4 uses crt;
5
6 var
7
endereco : string; {endereço é uma cadeia com 0 a 255 caracteres.}
8
nome : string[30];
9
CPF : string[11];
{O uso de [] delimita o número de caracteres.
Neste caso CPF tem 11 caracteres.}
10
11 begin
12
endereco := 'Rua dos Alferes, 1234, Ap. 1001, Barra, Salvador, Bahia
- CEP: 40.130.280';
13
nome:= 'Jose da Silva Santos';
14
CPF := '12345678901';
15
writeln('Endereco: ', endereco, ' Cliente: ', nome, ' CPF: ', cpf);
16
readkey;
17 end.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
C.1.7 – Uso de Boolean em Pascal.
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
program BooleanEmPascal;
{Este programa vai demonstrar o tipo boolean do Pascal}
uses crt;
var
aprovado : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
maior, menor, igual : boolean;
begin
{Atribuições de valores às variáves}
{Atribui TRUE a aprovado}
aprovado := true;
{Atribui o resultado do teste: 2 > 1? a maior}
maior := 2 > 1;
{Atribui o resultado do teste: 2 > 1? a igual}
igual := 2 = 1;
{Atribui o resultado do teste: 2 > 1? a menor}
menor := 2 < 1;
writeln('Aprovado: ', aprovado);
writeln('2 > 1? eh: ', maior);
writeln('2 = 1 eh: ', menor);
writeln('2 = 1 eh: ', igual);
readkey;
end.
C.1.8 – Uso de Char em Pascal.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program CharEmPascal;
{Este programa vai demonstrar o tipo chardo Pascal}
uses crt;
var
letraAMinuscula, letraAMaiuscula : char;
letraBMinuscula, letraBMaiuscula : char;
{char representa um único caracter.}
sexo : char;
begin
{Atribuições de valores às variáves}
sexo := 'M';
letraAMinuscula := 'a';
letraAMaiuscula := #65;
letraBMinuscula := #98;
letraBMaiuscula := 'B';
writeln('Sexo: ', sexo);
writeln('Letras Maiusculas: ', letraAMaiuscula, letraBMaiuscula);
writeln('Letras Minusculas: ', letraAMinuscula, letraBMinuscula);
readkey;
end.
139
140
Programação com Pascal
C2 - Operadores
C.2.1 - Este programa demonstra o uso de operadores de concatenação de Strings.
1 program ConcatenacaoDeStrings;
2 {Este programa vai demonstrar a Concatenação de Strings em Pascal.}
3 uses crt;
4 var
5
nome
: string[20];
{Definição de variáveis}
6
sobrenome
: string[20];
7
nomeCompleto : string[40];
8
9 begin
10
nome := 'Edeyson';
{Atribui Edeyson aa var.
nome}
11
sobrenome:= 'Gomes';
{Atribui Gomes aa var.
sobrenome}
12
nomeCompleto := nome + ' ' + sobrenome;
{Concatena nome e
sobrenome}
13
writeln('Nome Completo: ', nomeCompleto); {Exibe o nome completo}
14
15
readkey;
16 end.
C.2.2 - Este programa demonstra o uso de operadores lógicos.
1 program OperadoresLogicos;
2 {Este programa vai demonstrar Operadores Lógicos do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
6
x, inicio, fim : integer;
7
8 begin
9
{Atribuições de valores às variáves}
10
inicio := 0;
11
fim := 10;
12
x := 5;
13
14
valorLogico := (x > inicio) and (x > fim);
15
writeln('Teste se ', x, ' eh > que ', inicio , ' E ', x, ' eh > que
', fim, ' : ', valorLogico);
16
17
valorLogico := (x > inicio) and (x < fim);
18
writeln('Teste se ', x, ' eh > que ', inicio , ' E ', x, ' eh < que
', fim, ' : ', valorLogico);
19
20
valorLogico := (x > inicio) or (x > fim);
21
writeln('Teste se ', x, ' eh > que ', inicio , ' OU ', x, ' eh >
que ', fim, ' : ', valorLogico);
22
23
valorLogico := ((x >= 1) and (x <= 5)) AND ((x >= 4) and (x <= 6));
24
writeln('Teste se ', x, ' esta entre 1 e 5 e se ', x, ' esta entre
4 e 6 simultaneamente : ', valorLogico);
25
26
readkey;
27 end.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
C.2.3 - Este programa demonstra o uso de operadores relacionais com Strings.
1 program OperadoresRelacionaisComString;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou
FALSE}
6
string1, string2 : string;
7
8 begin
9
{Atribuições de valores às variáves}
10
string1 := 'abc';
11
string2 := 'def';
12
13
valorLogico := string1 = string2;
14
writeln('Teste se ', string1, ' eh = a ', string2, ' : ',
valorLogico);
15
16
valorLogico := string1 > string2;
17
writeln('Teste se ', string1, ' eh > que ', string2, ' : ',
valorLogico);
18
19
valorLogico := string1 < string2;
20
writeln('Teste se ', string1, ' eh < que ', string2, ' : ',
valorLogico);
21
22
readkey;
23 end.
C.2.4 - Este programa demonstra o uso de operadores relacionais com Inteiros.
141
142
Programação com Pascal
1 program OperadoresRelacionaisComInteger;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
{Variáveis lógicas - podem ser TRUE ou FALSE}
6
valorLogico : boolean;
7
inteiro1, inteiro2 : integer;
8
9 begin
10
{Atribuições de valores às variáves}
11
inteiro1 := 10;
12
inteiro2 := 20;
13
14
valorLogico := inteiro1 = inteiro2;
15
writeln('Teste se ', inteiro1, ' eh = a ', inteiro2, ' : ',
valorLogico);
16
17
valorLogico := inteiro1 < inteiro2;
18
writeln('Teste se ', inteiro1, ' eh < que ', inteiro2, ' : ',
valorLogico);
19
20
valorLogico := inteiro1 > inteiro2;
21
writeln('Teste se ', inteiro1, ' eh > que ', inteiro2, ' : ',
valorLogico);
22
23
readkey;
24 end.
C.2.5 - Este programa demonstra o uso de operadores relacionais com Reais.
1 program OperadoresRelacionaisComReal;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variáveis lógicas - podem ser TRUE ou FALSE}
6
real1, real2 : real;
7
8 begin
9
{Atribuições de valores às variáves}
10
real1 := 8/6;
11
real2 := 4/3;
12
13
valorLogico := real1 > real2;
14
writeln('Teste se ', real1:3:4, ' eh > que ', real2:3:4, ' : ',
valorLogico);
15
16
valorLogico := real1 = real2;
17
writeln('Teste se ', real1:3:4, ' eh = a ', real2:3:4, ' : ',
valorLogico);
18
19
valorLogico := real1 < real2;
20
writeln('Teste se ', real1:3:4, ' eh < que ', real2:3:4, ' : ',
valorLogico);
21
22
readkey;
23 end.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
C.2.6 - Este programa demonstra o uso de operadores lógicos e Tabela Verdade.
No programa são definidas duas proposições simples: p e q. Atribuem-se valores
lógicos a p e q nas linhas 7, 12, 17 e 22. As outras linhas imprimem os resultados da
conjunção e disjunção entre p e q. Vale lembrara que TRUE é Verdade e FALSE é
Falso.
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
program TabelaVerdade;
uses crt;
var
p, q : boolean;
begin
p := true; q:= true;
writeln('p:', p, ' e q:', q, ' = ', p and q);
writeln('p:', p, ' ou q:', q, ' = ', p or q);
writeln;
p := true; q:= false;
writeln('p:', p, ' e q:', q, ' = ', p and q);
writeln('p:', p, ' ou q:', q, ' = ', p or q);
writeln;
p := false; q:= true;
writeln('p:', p, ' e q:', q, ' = ', p and q);
writeln('p:', p, ' ou q:', q, ' = ', p or q);
writeln;
p := false; q:= false;
writeln('p:', p, ' e q:', q, ' = ', p and q);
writeln('p:', p, ' ou q:', q, ' = ', p or q);
readkey;
end.
143
144
Programação com Pascal
C3 - Condicionais
C.3.1 - Este programa visa ler uma nota (variável real) e testá-la. Se a nota estiver no
intervalo [0, 3) deve imprimir ‘Sem Rendimento’. Senão, se estiver no intervalo [3, 6)
deve imprimir ‘Medio’. Senão, deve imprimir ‘Superior’.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program Condicioal01;
uses crt;
var
nota : real;
begin
writeln('Digite uma nota');
readln(nota);
if (nota >= 0) and (nota < 3) then
writeln('Sem Rendimento')
else
if (nota >= 3) and (nota <= 6) then
writeln('Medio')
else
writeln ('Superior');
readkey;
end.
C.3.2 - Este programa deve ler uma variável inteira e determinar se a mesma é par ou
ímpar. Uma variável valor é par quando é divisível por 2, ou seja, se (valor mod 2 = 0).
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
program Paridade;
uses crt;
var
valor : integer;
begin
writeln('Digite o valor: ');
readln(valor);
if (valor mod 2 = 0) then
writeln(valor, ' eh PAR')
else
writeln(valor, ' eh IMPAR');
readkey;
end.
C.3.3 - Este programa deve:
1. Solicitar que o usuário digite o sexo da pessoa.
2. Ler o sexo da pessoa.
3. Solicitar a altura da pessoa em centímetros.
4. Ler a altura da pessoa.
5. Calcular o peso ideal da pessoa.
a) Para homens (H): (72.7 * altura) - 58
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
b) Para mulheres (M): (62.1 * altura) – 44.
8 program pesoIdeal;
9
10 {importação da biblioteca CRT}
11 uses crt;
12
13 var
14
{criação da variável sexo do tipo caracter - ou F ou M}
15
sexo : char;
16
17
{criação da variável altura (em cm) do tipo inteiro}
18
altura : integer;
19
20
{criação da variável peso do tipo real (ponto flutuante)}
21
peso : real;
22
23 begin
24
{limpa a tela}
25
clrscr;
26
27
{escreve no prompt de comando}
28
writeln('Escolha o sexo: (F)eminino ou (M)asculino');
29
30
{esperando que o usuário pressione alguma tecla e atribuindo o
caractere a variável sexo}
31
sexo := readkey;
32
33
{tornando maiúscula(caixa alta), pois o usuário pode digitar em
minúsculas}
34
sexo := upcase(sexo);
35
36
{escreve no prompt do comando}
37
write('Digite a altura em CM: ');
38
39
{esperando queo usuário digite algo e atribua a variável altura}
40
readln(altura);
41
42
{se sexo contiver M faça}
43
if(sexo = 'M') then
44
{realize o cálculo do peso ideal}
45
peso := ((72.7 * altura)/100) - 58
46
{do contrário, se sexo contiver F faça}
47
else
48
if(sexo='F') then
49
{realize o cálculo do peso ideal}
50
peso := ((62.7 * altura)/100) - 48
51
else
52
writeln('Oh, Zeh, não sabe o que eh sexo???');
53
54
{escreva no prompt do comando + o valor da variável com 3 casas
decimais e 2 após o ponto}
55
writeln('Seu peso ideal: ', peso:3:2);
56
57
{espera que algo seja teclado para finalizar o programa}
58
readkey;
59 end.
145
146
Programação com Pascal
C4 - For
C.4.1 - Este programa deve ilustrar o funcionamento do For, imprimindo números de 1
a 10.
1
2
3
4
5
6
7
8
9
10
11
12
13
program ForSimples;
uses crt;
var
i : integer;
begin
for i := 1 to 10 do
begin
writeln('Valor de i: ', i);
end;
readkey;
end.
C.4.2 – Desafio: o que este programa faz?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program ForSimples;
uses crt;
var
i : integer;
begin
for i := 1 to 10 do
begin
writeln('Valor de i: ', i);
i := i + 5;
end;
readkey;
end.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
1.1.5 Determinar se um número natural N é primo
A principal diferença deste algoritmo para o anterior (1.1.4) é que não serão impressos
os divisores de um número, e sim, contados (precisamos de uma variável para isso).
Vale lembrar que um número primo tem apenas dois divisores.
Início do Algoritmo
a. Definir a variável contaDivisores com valor inicial 0
b. Ler N
c. Faça a variável Divisor variar entre todos os valores no intervalo [1 e
N]
i. Para cada valor de Divisor faça:
1. Atribua à variável Resto o resto da divisão de N por
Divisor.
2. Se Resto = 0, então some 1 a contaDivisores
d. Se contaDivisores > 2, então o número não é primo.
e. Senão, ele é primo.
Fim do Algoritmo
Note que a letra d do Algoritmo só será executada após o laço da letra c ser
concluído (testar todos os divisores no intervalo [1, N].
Vejamos isso no Fluxograma ilustrado na Figura 1.6.
147
148
Programação com Pascal
Início
contaDivisores = 0
N
Divisor = 1
F
Divisor <= N
contaDivisores > 2
V
N não é
primo
V
Resto = resto da divisão
de N por Divisor
Resto = 0
V
F
N é primo
contaDivisores =
contaDivisores + 1
Fim
F
Divisor =
Divisor + 1
Figura 1.6 – Fluxograma: Determinar se N é primo
1.1.6 Imprimir todos os múltiplos de 3 compreendidos entre 1 e N (naturais).
Início do Algoritmo
a. Ler N
b. Faça a variável Múltiplo variar entre todos os valores no intervalo [1 e
N]
i.
Atribua à variável Resto o resto da divisão de Múltiplo por 3.
ii.
Se Resto = 0, então imprima o valor de Múltiplo.
Fim do Algoritmo
Teste do Algoritmo:
Ler N – suponha que N seja 10
Faça a variável Múltiplo variar entre todos os valores no intervalo [1 e 10]
Serão impressos os valores 3, 6, 9
Vejamos isso no Fluxograma ilustrado na Figura 1.7.
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
Início
N
Múltiplo = 1
F
Múltiplo <= N
Fim
V
Resto = resto da divisão
de Múltiplo por 3
Resto = 0
V
Múltiplo
F
Múltiplo =
Múltiplo + 1
Figura 1.7 – Fluxograma: Múltiplos de 3 entre 1 e N
1.3.7 Imprimir todos os múltiplos de 3 e 5 (simultaneamente) compreendidos entre 1 e
N (naturais).
Início do Algoritmo
c. Ler N
d. Faça a variável Múltiplo variar entre todos os valores no intervalo [1 e
N]
iii. Atribua à variável Resto3 o resto da divisão de Múltiplo por 3.
iv.
Atribua à variável Resto5 o resto da divisão de Múltiplo por 5.
v.
Se Resto3 = 0 e Resto5 = 0, então imprima o valor de Múltiplo.
Fim do Algoritmo
Teste do Algoritmo:
Ler N – suponha que N seja 30
Faça a variável Múltiplo variar entre todos os valores no intervalo [1 e 30]
Serão impressos os valores 15, 30
Vejamos isso no Fluxograma ilustrado na Figura 1.8.
149
150
Programação com Pascal
Início
N
Múltiplo = 1
Múltiplo <= N
F
Fim
V
Resto3 = resto da divisão de
Múltiplo por 3
Resto5 = resto da divisão de
Múltiplo por 5
Resto3 = 0
e
Resto5 = 0
V
Múltiplo
F
Múltiplo =
Múltiplo + 1
Figura 1.8 – Fluxograma: múltiplos de 3 e 5 entre 1 e N
1.3.8 Dado um registro com o seguinte leiaute:
Nome
Nota1
Nota2
Nota3
Escreva um algoritmo que leia um arquivo com N registros no leiaute acima e imprima
um relatório com alunos aprovados e outro com alunos reprovados.
Um aluno está aprovado apenas de tiver média (aritmética) das notas maior ou igual a
7,0. Considere em sua solução que só existe uma impressora na execução do algoritmo.
Início do Algoritmo
1. Criar uma coleção de alunos aprovados e outra de reprovados
2. Enquanto houver registros no arquivo faça:
a. Ler registro
b. Fazer media = (nota1 + nota2 + nota3) / 3
c. Se média maior ou igual a 7.0, inclua o aluno na coleção de
aprovados, senão coloque-o na coleção dos reprovados
3. Enquanto houver registros na coleção Aprovados faça:
a. Imprima registro
4. Enquanto houver registros na coleção Reprovados faça:
a. Imprima registro
Fim do Algoritmo
Edeyson Andrade Gomes
www.edeyson.com.br
Apêndice C – Exemplos de Código
Problemas:
Robô carteiro
Classificar/guardar candidatos por provas objetivas
Escrever um número por extenso
Cálculo do IRPF
Xadrez / Matrizes / Tabuleiro
Endentar IF / FOR
151

Documentos relacionados