Professional Documents
Culture Documents
com Pascal
Teoria e Prtica
Este livro visa ensinar a programao com Pascal
atravs de exemplos prticos.
Edeyson Andrade Gomes
IFBA 2011
2 Edio Reviso 08.12.2011
SUMRIO
............................................................................................................................................... 8
............................................................................................................................................. 51
LISTAGENS
www.edeyson.com.br
www.edeyson.com.br
TABELAS
FIGURAS
INTRODUO PROGRAMAO
Um dos maiores desafios para um professor de programao fazer com que seus
alunos consigam descrever detalhadamente uma soluo para um problema. Faz-los
entender um problema no o mais difcil, todavia, faz-los organizar uma linha de
raciocnio para uma soluo que seja coerente, efetiva e eficaz no trivial.
As principais dificuldades apresentadas esto na abstrao da soluo, como verbalizar
o entendimento desta e como garantir que ela seja completa. Comumente encontramos
solues de alunos que omitem passos que so considerados bvios.
Este livro tem como objetivo ajudar o aluno a desenvolver a habilidade de descrever
solues computacionais coerentes, sem ambigidades e completas. Para isto, foca-se o
desenvolvimento do raciocnio lgico baseando-se num universo de problemas da
matemtica e fsica do ensino mdio.
Alunos do ensino mdio so confrontados com problemas como a extrao de razes de
uma equao do segundo grau. Para a soluo, aprendem um conjunto ordenado de
passos. So estes que compem um algoritmo.
Um algoritmo descreve detalhadamente uma seqncia finita e ordenada de passos
necessrios soluo de um determinado problema ou uma classe de problemas. uma
forma de descrever possveis solues a problemas do mundo real, objetivando sua
implementao no mundo computacional.
Por exemplo, toda equao do segundo grau pode ser resolvida (ter suas razes
extradas) por uma soluo que se espera possuir a 5 caractersticas importantes de um
algoritmo:
1. Finitude: Todo algoritmo deve sempre terminar aps um nmero finito
de passos.
2. Definio: Cada passo de um algoritmo deve ser definido de forma clara.
a. As aes devem ser definidas rigorosamente e sem ambigidades
para que no sejam cometidos erros durante a resoluo do
problema.
3. Entradas: Um algoritmo deve ter zero ou mais entradas.
a. Por exemplo, uma equao do segundo grau precisa informar os
valores de a, b e c, pois sua forma ax2 + bx + c.
4. Sadas: Um algoritmo deve ter uma ou mais sadas.
a. Por exemplo, uma equao de segundo grau tem duas razes.
5. Efetividade: Um algoritmo deve ser efetivo.
a. Todas as operaes devem ser suficientemente bsicas de modo
que possam ser executadas com preciso em um tempo finito por
um humano usando papel e lpis.
Edeyson Andrade Gomes
www.edeyson.com.br
Introduo Programao
10
Para evitar esse possvel problema, algoritmos costumam ser representados de trs
formas, como seguem:
1. Linguagem Natural: Os algoritmos so descritos detalhadamente em
linguagem natural. Por exemplo, em portugus estruturado.
2. Fluxograma: Os algoritmos so representados graficamente.
a. Usam-se formas geomtricas padronizadas para descrever aes e
decises na resoluo do problema.
3. Pseudo-linguagem: Os algoritmos so descritos atravs de uma
linguagem intermediria entre a linguagem natural e uma linguagem de
programao.
Um exemplo de uso de Linguagem Natural est na especificao de como criar um
XBurger. Uma possvel soluo est a seguir:
1. Incio do Algoritmo XBurger.
a. Pegar um po;
b. Abrir o po ao meio;
c. Passar manteiga no po;
d. Colocar queijo no po;
e. Colocar presunto no po;
f. Colocar ovo frito no po;
g. Fechar o po.
2. Fim do Algoritmo XBurger.
Algumas perguntas que podem surgir ao leitor so:
1. Onde estavam a manteiga, o queijo e o presunto?
2. Quem fritou o ovo? Isso faz parte do algoritmo?
a. Podemos definir um algoritmo fritar ovo e reus-lo?
A especificao de um algoritmo deve ser to detalhada quanto possvel para evitar
dvidas ou ambigidades. Tais perguntas deveriam ser respondidas numa especificao
mais clara e detalhada do Algoritmo XBurger. Por exemplo, pode-se definir que o
algoritmo tem como entrada um po, um ovo frito (no faz parte do algoritmo fritar o
ovo), manteiga, queijo e presunto. Como dado de sada tem-se o sanduche.
Outro exemplo em Linguagem Natural como extrair as razes de uma equao do
segundo grau na forma ax2 + bx + c.
Sabe-se que:
a. = b2 - 4ac
b. x1 = (-b + ) / 2a
c. x2 = (-b - ) / 2a
d. a deve ser diferente de 0
e. deve ser maior que zero para ter razes reais
Edeyson Andrade Gomes
www.edeyson.com.br
Introduo Programao
11
12
1.1 Exemplos
Os exemplos a seguir e apresentam problemas e suas respectivas possveis solues
usando linguagem natural e seu fluxograma.
1.1.1 Ler 3 valores distintos e determinar qual o maior, o menor e o mediano.
Antes de resolver o problema, vamos ilustr-lo com algumas situaes:
a. Nmeros [3, 5, 8]
Ao ler 3, maior = 3.
Ao ler 5, maior = 5 e mediano = 3
Note que o mediano assumiu o valor antigo do maior (mediano =
maior) e maior ficou igual a n (maior = n).
Ao ler 8, maior = 8, mediano = 5, menor = 3
Note que o menor assumiu o valor antigo do mediano (menor =
mediano), mediano assumiu o valor antigo do maior (mediano =
maior) e maior ficou igual a n (maior = n).
b. Nmeros [8, 5, 3]
Ao ler 8, maior = 8.
Ao ler 5, maior = 8 e mediano = 5
Ao ler 3, maior = 8, mediano = 5, menor = 3
c. Nmeros [3, 8, 5]
Ao ler 3, maior = 3.
Ao ler 8, maior = 8 e mediano = 3
Note que o mediano assumiu o valor antigo do maior (mediano =
maior) e maior ficou igual a n (maior = n).
Ao ler 5, maior = 8, mediano = 5, menor = 3
Note que o menor assumiu o valor antigo do mediano (menor =
mediano), mediano assumiu o valor de n (mediano = n).
Quais os passos do Algoritmo que se deseja? Vejamos:
www.edeyson.com.br
Introduo Programao
1. Como foi lido um primeiro valor, podemos presumir que ele o maior, pois
s existe ele.
a. Pense em trs alunos chegando numa sala: ao chegar o primeiro
aluno, quem o mais velho da sala? Por isso maior igual a n no
incio.
2. Outro valor lido para n. Notem que o segundo valor.
3. Se o segundo valor lido maior que o maior valor conhecido (n > maior),
ento ele deve ser o maior conhecido (maior = n). Neste caso, o mediano
assume o valor do antigo maior conhecido.
a. Em caso contrrio (o segundo valor lido menor que o maior
conhecido), como o segundo valor, ele passa a ser o mediano. Note
que ainda no sabemos quem o menor.
4. Outro valor lido para n. Notem que o terceiro valor.
5. Se o terceiro valor lido o maior conhecido, ento o menor assume o valor
do mediano, o mediano assume o valor do maior anterior e o maior assume o
valor de n. Em caso contrrio, se o terceiro valor lido maior que o mediano,
o menor assume o valor do mediano anterior e n passa a ser o mediano.
Seno, ele o menor conhecido (menor = n).
6. Imprime os valores.
13
14
maior = n
n > maior
mediano = maior
maior = n
mediano = n
n > maior
menor = mediano
mediano = maior
maior = n
n > mediano
menor = mediano
mediano = n
menor = n
menor,
mediano,
maior
Fim
www.edeyson.com.br
Introduo Programao
15
16
Incio
Conta a
varivel de
controle
Este teste controla
quantas vezes o
lao ser executado
Conta = 1
Conta <= 10
Fim
Conta = Conta
+1
O incremento em 1
garante
que Conta mude de
valor
www.edeyson.com.br
Introduo Programao
Teste do Algoritmo:
Ler N suponha que N seja 5
Faa a varivel valor variar entre todos os valores no intervalo [1 e 5] logo,
valor assumir os seguintes valores {1, 2, 3, 4, 5}
Sero impressos os valores 1, 2, 3, 4, 5
Vejamos isso no Fluxograma ilustrado na Figura 1.4.
Incio
valor = 1
valor <= n
Fim
valor = valor + 1
valor
17
18
Teste do Algoritmo:
Ler N suponha que N seja 8
Faa a varivel Divisor variar entre todos os valores no intervalo [1 e 8]
logo, Divisor assumir os seguintes valores {1, 2, 3, 4, 5, 6, 7, 8}
Para cada valor de Divisor faa:
1. Atribua varivel Resto o resto da diviso de N por Divisor (8/1).
Logo, Resto = 0. Imprime 1.
2. Atribua varivel Resto o resto da diviso de N por Divisor (8/2).
Logo, Resto = 0. Imprime 2.
3. Atribua varivel Resto o resto da diviso de N por Divisor (8/3).
Logo, Resto = 2. No Imprime.
Edeyson Andrade Gomes
www.edeyson.com.br
Introduo Programao
Divisor = 1
Divisor <= N
Fim
V
Resto = resto da diviso
de N por Divisor
Resto = 0
Divisor
F
Divisor =
Divisor + 1
Note que o passo b do algoritmo (Faa a varivel Divisor variar entre todos os valores
no intervalo [1 e N]) destacado no fluxograma.
19
20
www.edeyson.com.br
Introduo Programao
Incio
contaDivisores = 0
Divisor = 1
Divisor <= N
contaDivisores > 2
N no
primo
V
Resto = resto da diviso
de N por Divisor
Resto = 0
N primo
contaDivisores =
contaDivisores + 1
Fim
F
Divisor =
Divisor + 1
Teste do Algoritmo:
Ler N suponha que N seja 10
Faa a varivel Mltiplo variar entre todos os valores no intervalo [1 e 10]
Sero impressos os valores 3, 6, 9
Vejamos isso no Fluxograma ilustrado na Figura 1.7.
21
22
Incio
Mltiplo = 1
Mltiplo <= N
Fim
V
Resto = resto da diviso
de Mltiplo por 3
Resto = 0
Mltiplo
F
Mltiplo =
Mltiplo + 1
Teste do Algoritmo:
Ler N suponha que N seja 30
Faa a varivel Mltiplo variar entre todos os valores no intervalo [1 e 30]
Sero impressos os valores 15, 30
Vejamos isso no Fluxograma ilustrado na Figura 1.8.
www.edeyson.com.br
Introduo Programao
Incio
Mltiplo = 1
Mltiplo <= N
Fim
V
Resto3 = resto da diviso de
Mltiplo por 3
Resto5 = resto da diviso de
Mltiplo por 5
Resto3 = 0
e
Resto5 = 0
Mltiplo
Mltiplo =
Mltiplo + 1
Nota1
Nota2
Nota3
Escreva um algoritmo que leia um arquivo com N registros no leiaute acima e imprima
um relatrio com alunos aprovados e outro com alunos reprovados.
Um aluno est aprovado apenas de tiver mdia (aritmtica) das notas maior ou igual a
7,0. Considere em sua soluo que s existe uma impressora na execuo do algoritmo.
Incio do Algoritmo
1. Criar uma coleo de alunos aprovados e outra de reprovados
2. Enquanto houver registros no arquivo faa:
a. Ler registro
b. Fazer media = (nota1 + nota2 + nota3) / 3
c. Se mdia maior ou igual a 7.0, inclua o aluno na coleo de
aprovados, seno coloque-o na coleo dos reprovados
3. Enquanto houver registros na coleo Aprovados faa:
a. Imprima registro
4. Enquanto houver registros na coleo Reprovados faa:
a. Imprima registro
Fim do Algoritmo
23
24
A LINGUAGEM PASCAL
A linguagem Pascal foi desenvolvida no incio da dcada de 1970 por Nicklaus Wirth,
na Universidade Tcnica de Zurique, Sua. O primeiro compilador para a linguagem
foi disponibilizado em 1970.
O objetivo do Pascal ser uma linguagem de programao de alto nvel voltada ao
ensino da programao estruturada. Por ser simples, ideal para a introduo
programao.
2.2 Estrutura de um Programa Pascal
Todo programa em Pascal dividido em trs reas distintas: cabealho, rea de
declaraes e corpo.
cabealho
rea de declaraes
corpo
2.2.1 Cabealho
O cabealho uma rea utilizada para que se possa identificar um programa atravs de
um nome (instruo program).
{Sintaxe:}
program nomeDoPrograma;
Exemplo:
program adicionaNumeros;
rea de declaraes
corpo
www.edeyson.com.br
A LINGUAGEM PASCAL
Observaes:
1. O nome de um programa um identificador e deve ser nico neste.
Observaes:
1. Nossos programas sempre aparecero em caixas como a da Listagem 1.1.
2. O uso de { } serve para definir comentrios: descries ou informaes, em texto livre,
que auxiliem no entendimento do cdigo.
25
26
Declarao de Variveis
Nos problemas comuns da matemtica e fsica nos deparamos com variveis. Por
exemplo, uma equao do segundo grau2 possui a forma: ax2 + bx + c. Logo, so
exemplos de equao do segundo grau: x2 + 2x + 1 e 2x2 + 3x + 4.
Cabe-nos observar que as equaes do 2 grau variam, entre si, sempre num aspecto: os
valores de a, b e c. Para a matemtica, a, b e c so constantes (coeficientes), pois a
equao 2x2 + 3x + 4 j tem tais valores definidos.
2
www.edeyson.com.br
A LINGUAGEM PASCAL
Observaes:
1. Aps o nome de cada varivel deve ser utilizado o smbolo dois-pontos ( : ) seguido pelo
tipo de dado que a varivel ir receber, seguido de ponto-e-vrgula.
2. Caso as variveis sejam de mesmo tipo, estas podero ser relacionadas separadas por
vrgula. Por exemplo: var a, b, c : integer; Isso define as variveis a, b e c como sendo do
tipo integer (inteira).
Note que na Listagem 1.3 a linha 8 apresenta a instruo var iniciando uma rea de
declarao de variveis. A linha 9 define duas variveis inteiras chamadas a e b e a
linha 10 define uma varivel do tipo inteira (integer) chamada soma.
2.2.3 Corpo do Programa
27
28
Um programa em Pascal est escrito numa rea denominada corpo do programa que tem
incio com a instruo begin e finalizada pela instruo end, seguida do smbolo
ponto ( . ). O uso destas instrues caracteriza o que chamado de bloco de comandos,
como indicado abaixo:
{Sintaxe:}
begin
instrues do programa;
end.
Observaes:
1. O corpo do programa pode conter vrios blocos.
22
23
25
26
27
29
{para o programa at que alguma tecla seja pressionada}
30
readkey;
31 end.
www.edeyson.com.br
A LINGUAGEM PASCAL
1.
2.
3.
4.
Observaes:
1. Os comandos read e readln so responsveis por entrada de dados, como leitura pelo
teclado.
a. ReadLn(var) l um valor do teclado e atribui varivel var.
b. O programa fica parado at que a tecla ENTER seja pressionada. Tudo o que
for digitado antes de ENTER ser colocado na varivel (var).
2. Os comandos write e writeln so responsveis por sada de dados, como impresso na
tela.
a. WriteLn(var) imprime o valor da varivel (var) na tela.
3. O uso de LN (acrnimo para New Line Nova Linha) indica que uma nova linha deve ser
usada aps o comando.
Vamos a outro exemplo comentado que serve para calcular a mdia aritmtica de 3
valores. Ele deve ler trs variveis numricas (a, b e c) e calcular a mdia aritmtica
destas, apresentando o resultado obtido.
Algoritmo usado em Linguagem Natural:
1. Incio do Algoritmo Mdia de 3 Nmeros
a. Solicitar ao usurio para digitar o valor da varivel a;
b. Ler um valor para a varivel a;
29
30
19
20
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.
www.edeyson.com.br
A LINGUAGEM PASCAL
Observaes:
1. A varivel media precisa ser real, pois a diviso de inteiros nem sempre um inteiro. Por
exemplo, 7/3.
2. O uso de media:3:2 na impresso significa que o resultado ser formatado com 3 dgitos
antes da vrgula e 2 dgitos depois.
Variveis e Constantes
Em Pascal, variveis, constantes, tipos definidos pelo usurio, procedimentos e funes
precisam de um nome que fornea uma identificao nica e isso feito atravs de
identificadores.
Nomes (identificadores) em Pascal devem seguir as seguintes regras de construo:
1. Iniciar sempre por uma letra (a - z, A - Z) ou um underline (_);
2. O restante do identificador deve conter apenas letras, underlines ou dgitos (09). No pode conter outros caracteres; e
3. Pode ter qualquer tamanho, desde que os primeiros 63 caracteres sejam
significativos.
No existe distino entre letras maisculas e minsculas no nome de um
identificador. Por exemplo, os nomes ALPHA, alpha e Alpha so equivalentes para o
Pascal.
Observaes:
1. CamelCase a denominao em ingls para a prtica de escrever palavras compostas,
ou frases, onde cada palavra iniciada com Maisculas e unidas sem espaos.
a. um padro largamente utilizado em diversas linguagens de programao,
como Java, Ruby e Python.
b. Exemplos: NomeDoCliente, TipoDePea, MediaPonderada, MediaDe3Numeros.
Palavras Reservadas
Pascal reconhece certo grupo de palavras como sendo reservadas. Elas tm significado
especial e no podem ser usadas como identificadores em um programa para objetos
criados pelo programador.
So 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.
31
32
Comentrios
Comentrios so textos escritos dentro do cdigo-fonte para explicar ou descrever
alguns aspectos relativos ao mesmo ou para esclarecer detalhes de programao que
podem no ficar claros.
Seu principal objetivo adicionar informao textual ao cdigo, facilitando seu
entendimento por leitores.
A sintaxe requerida aos comentrios permite o uso de chaves como em: {
comentrio } ou de parntesis e asteriscos, como em: (* comentrio *).
2.1 Variveis
Uma varivel uma regio da memria, identificada atravs de um nome, cujo valor
pode mudar durante a execuo do programa. Como Pascal uma linguagem fortemente
tipada, cada varivel precisa obrigatoriamente de um tipo de dados predeterminado.
{Sintaxe:}
var
varivel : tipo de dado;
varivel1, varivel2 : tipo de dado2;
Nesta especificao de sintaxe, varivel tem seu tipo definido por tipo de dado. Note
que varivel1 e varivel2 so definidas juntas, separadas por vrgulas e atribuindo-se um
nico tipo de dados. Isso pode ser feito para qualquer nmero de variveis que
compartilhem um mesmo tipo de dados.
2.2 Constantes
Uma constante uma regio rotulada da memria atravs de um nome cujo valor no
pode mudar durante a execuo do programa. Um exemplo de constante o PI na
matemtica.
{Sintaxe:}
const
nomeDaConstante = expresso;
www.edeyson.com.br
A LINGUAGEM PASCAL
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
33
34
Reais
O tipo de dado real permite trabalhar com nmeros fracionrios, tanto positivos como
negativos, sendo sua capacidade de armazenamento maior que dos nmeros 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
Dgitos
Signific.
7-8
15-16
19-20
19-20
Tamanho
em Bytes
4 ou 8
4
8
10
8
www.edeyson.com.br
A LINGUAGEM PASCAL
Observaes:
1. Write e WriteLn permitem que sejam definidos formatos aos nmeros.
a. Estes formatos so teis na impresso de nmeros reais para evitar a forma
com exponenciao.
b. O formato : numero:tamanho:preciso
i. numero o nmero que se quer imprimir.
ii. tamanho informa a largura da sada.
iii. preciso informa com quantos dgitos o numero ser impresso.
Caracteres
String
Tipos de Dados Caracteres em Pascal so seqncias contendo letras, nmeros e
smbolos especiais e devem ser representadas entre apstrofos (). Este tipo de dado
referenciado pelo identificador string, podendo armazenar de 1 at 255 caracteres.
Para definir uma varivel cujo contedo pode ter at 255 caracteres, usa-se a seguinte
sintaxe:
{Sintaxe:}
varivel : string;
35
36
{Sintaxe:}
varivel : string[tamanho];
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);
Listagem 2.3 Exemplo com Strings
16
readkey;
17 end.
Observaes:
1. Write e WriteLn permitem imprimir mltiplos valores separando-os por vrgulas.
a. A impresso de constantes string feita colocando-as entre apstrofos.
b. O comando writeln('Endereco: ', endereco); imprimir Endereco: seguido pelo
valor da varivel endereco.
www.edeyson.com.br
A LINGUAGEM PASCAL
Char
Pascal suporta o tipo Char, que ocupa exatamente 1 byte e contm um caractere ASCII
(American Standard Code for Information Interchange).
Para definir uma varivel do tipo char usa-se a seguinte sintaxe:
{Sintaxe:}
varivel : char;
37
38
Tipos Lgicos
Pascal suporta o tipo Boolean, com dois possveis valores predefinidos: true e false.
Qualquer expresso que resulte em um valor booleano (verdadeiro ou falso) tambm
pode ser atribuda a um tipo booleano.
Para definir uma varivel do tipo boolean usa-se a seguinte sintaxe:
{Sintaxe:}
varivel : char;
program BooleanEmPascal;
{Este programa vai demonstrar o tipo boolean do Pascal}
uses crt;
var
aprovado : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
maior, menor, igual : boolean;
begin
{Atribuies de valores s varives}
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;
Listagem 2.5 Exemplo com Boolean
end.
www.edeyson.com.br
A LINGUAGEM 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 VariaveisEConstantes;
{Este programa vai demonstrar variveis e constantes no Pascal}
uses crt;
var
area, raio : real;
const
pi = 3.1415926536;
begin
{Atribuies de valores s varives}
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.
39
40
EXPRESSES
PRECEDNCIA
CATEGORIA
Not, @
Primeira
Unria
Segunda
Multiplicao
Terceira
Adio
ltima
Relacional
www.edeyson.com.br
EXPRESSES
Exemplos de atribuies:
1 program VariaveisPascal;
2
3 var
4
a, b, c : integer; {Declara a, b e c como variveis inteiras}
5
media : real;
{Declara media do tipo real}
6
aprovado : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
7
endereco : string; {endereo uma cadeia com 0 a 255 caracteres.}
8
CPF : string[11];
{O uso de [] delimita o nmero de caracteres.}
9
sexo : char;
{char representa um nico caracter.}
10
11 begin
12
{Atribuies de valores s varives}
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.
Das linhas 13 a 21, exceto a linha 16, temos atribuies de valores a variveis de
diversos tipos. Note que o que est aps o := uma expresso.
Operadores Aritmticos
Os operadores aritmticos so utilizados para efetuar operaes aritmticas com
nmeros inteiros e reais. So eles: Subtrao (-), Adio (+) e Multiplicao (*).
41
42
www.edeyson.com.br
EXPRESSES
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;
{Operaes sobre Inteiros: +, -, *, DIV e MOD}
begin {inicia o programa}
{Atribuies de valores s varives}
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}
43
44
Operador de Concatenao
O operador de concatenao efetua a juno de duas variveis 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? Strings
suportam a operao de soma (+) que funciona com a concatenao (juno).
A Listagem 13 exibe um exemplo de concatenao de strings.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program ConcatenacaoDeStrings;
{Este programa vai demonstrar a Concatenao de Strings em Pascal.}
uses crt;
var
nome
: string[20];
sobrenome
: string[20];
nomeCompleto : string[40];
{Definio de variveis}
begin
nome := 'Edeyson';
{Atribui Edeyson para a var. nome}
sobrenome:= 'Gomes';
{Atribui Gomes para a var. sobrenome}
nomeCompleto := nome + ' ' + sobrenome;
{Concatena nome,
espao em branco e sobrenome}
15
writeln('Nome Completo: ', nomeCompleto); {Exibe o nome completo}
16
17
readkey;
18 end.
www.edeyson.com.br
EXPRESSES
Operadores Relacionais
Os operadores relacionais so utilizados para efetuar a comparao entre dados de
mesmo tipo, por exemplo, se um nmero inteiro maior que outro, se um nmero real
menor ou igual a outro, se duas strings so iguais, etc.
Tabela 3.2 Operadores Relacionais
OPERADOR
SMBOLO
Maior que
>
Menor que
<
Igual
=
Maior Igual
>=
Menor Igual
<=
Diferente
<>
1 program OperadoresRelacionaisComInteger;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
6
inteiro1, inteiro2 : integer;
7
8 begin
9
{Atribuies de valores s varives}
10
inteiro1 := 10;
11
inteiro2 := 20;
12
13
valorLogico := inteiro1 = inteiro2;
14
writeln('Teste se ', inteiro1, ' eh = a ', inteiro2, ' : ',
valorLogico);
15
16
valorLogico := inteiro1 < inteiro2;
17
writeln('Teste se ', inteiro1, ' eh < que ', inteiro2, ' : ',
valorLogico);
18
19
valorLogico := inteiro1 > inteiro2;
20
writeln('Teste se ', inteiro1, ' eh > que ', inteiro2, ' : ',
valorLogico);
21
22
readkey;
23 end.
Na Listagem 14 a linha 5 define uma varivel valorLogico do tipo boolean, ou seja, ela
s armazena Verdade (TRUE) ou Falso (FALSE). A linha 6 define duas variveis
inteiras que so inicializadas nas linhas 10 e 11, respectivamente.
A linha 13, valorLogico := inteiro1 = inteiro2, precisa de destaque aos :=, que o
smbolo de atribuio do Pascal. Este atribui ao smbolo da esquerda do :=, no caso
valorLogico, o valor lgico ou absoluto do que est direita do smbolo.
45
46
A linha 13 lida assim: o valor do inteiro1 igual ao valor do inteiro2? Se sim, atribua
TRUE para valorLogico; se no, atribua FALSE.
A linha 14 imprime o resultado do teste lgico. Note que as linhas 16/17 e 19/20 fazem
algo similar s linhas 13/14, apenas mudando o operador relacional.
O resultado da execuo do programa da Listagem 14 :
Teste se 10 eh = a 20 : FALSE
Teste se 10 eh < que 20 : TRUE
Teste se 10 eh > que 20 : FALSE
1 program OperadoresRelacionaisComString;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
6
string1, string2 : string;
7
8 begin
9
{Atribuies de valores s varives}
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.
Na Listagem 15, similar a Listagem 14, a linha 5 define uma varivel valorLogico do
tipo boolean, ou seja, ela s armazena Verdade (TRUE) ou Falso (FALSE). A linha 6
define duas variveis do tipo string (cadeias de caracter) que so 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 no, atribua FALSE.
A linha 14 imprime o resultado do teste lgico. 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 execuo do programa da
Listagem 15 :
Edeyson Andrade Gomes
www.edeyson.com.br
EXPRESSES
1 program OperadoresRelacionaisComReal;
2 {Este programa vai demonstrar Operadores Relacionais do Pascal}
3 uses crt;
4 var
5
valorLogico : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
6
real1, real2 : real;
7
8 begin
9
{Atribuies de valores s varives}
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.
Operadores Lgicos
O Pascal dispe dos seguintes operadores lgicos: AND (E), OR (OU) e NOT (NO,
NEGAO). Para compreend-los, vamos fazer uma breve introduo Lgica.
A lgica a cincia que estuda a correo do pensamento, do raciocnio. Quando
elaboramos frases como: a) A Lua maior que a Terra; b) A gua do mar salgada e c)
2 (dois) o nico nmero primo que par, podemos determinar a elas um valor lgico
verdadeiro ou falso. Logo, a falso, b e c so verdade.
Tais frases so chamadas de proposies, pois afirmam fatos, exprimem juzos.
47
48
R ; a x b }.
B}
A B, ento ((x >= 1) AND (x <= 5)) AND ((x >= 4) AND (x <= 6))
www.edeyson.com.br
EXPRESSES
49
50
Diferente do AND, uma proposio composta com OR verdade se pelo menos uma
das proposies 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 varivel valorLogico o resultado do teste (valorLogico := ( (x >= 1) and
(x <= 5) ) AND ( (x >= 4) and (x <= 6) )), ou seja, se x deve estar no conjunto [1, 5] [4,6].
Note que o AND em maisculas s foi usado para destacar os conjuntos na expresso.
Em Pascal no h distino de maisculas e minsculas.
Como x tem o valor 5, o valorLogico TRUE na linha 24.
Ainda pela teoria bsica de conjuntos, define-se A U B por:
A U B = { x / x A or x
B}
Exerccios
1. Elabore um programa que deve:
a. Declarar a varivel x como inteira.
b. Solicitar ao usurio 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)
www.edeyson.com.br
ESTRUTURAS DE DECISO
Ao 1
Ao 2
Sada
Quando uma ou mais aes dependem de uma ou mais condies para sua execuo,
necessitam-se de estruturas de deciso que controlam o fluxo de execuo do programa
efetuando tomadas de deciso e desvios de operaes.
Em Linguagem Natural podem-se descrever tais estruturas de deciso das seguintes
formas:
1. Seleo com uma via: Se a condio verdadeira ento execute a ao 1.
2. Seleo com duas vias: Se a condio verdadeira ento execute a ao 1.
Seno, execute a ao 2.
Em ambas as formas a ao 1 s ser executada se e somente se a condio for
verdadeira.
Na forma 1, seleo com uma via, caso a condio seja verdadeira adiciona-se uma ao
ao fluxo normal do programa. Na forma 2, escolhe-se um caminho a seguir, executando
a ao1 ou a ao 2.
Observaes:
1. Uma ao, como descrita no texto, no consiste apenas numa instruo. Ela pode
ser executada por um bloco de comandos bloco de programa com demarcao de
incio e fim (usando-se BEGIN e END) que contm uma ou vrias instrues.
2. A instruo Pascal end pode ser finalizado com um ponto-e-vrgula ( ; ) e no
apenas com um ponto. O uso de ponto ao final de um end ocorre somente na
finalizao de um programa.
4.1 IF .. THEN
A instruo do Pascal IF condio THEN ao pode ser lida assim: SE a condio
verdadeira ENTO execute a ao.
51
52
IF .. THEN tem por finalidade testar uma condio e tomar uma deciso e uma
seleo com uma via. Se a condio verdadeira, um bloco de comandos executado.
Em caso contrrio, esse bloco saltado.
{Sintaxe:}
IF condio THEN
bloco de comandos
A listagem 20 apresenta um cdigo com seleo com uma via atravs de IF .. THEN.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program testaNota;
uses crt;
{Declarar uma varivel 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, ento imprimir: Aluno
aprovado.}
if (nota >= 6.0) then
writeln('Aluno aprovado.');
{Parar o programa at que algo seja pressionado}
readkey;
end.
www.edeyson.com.br
ESTRUTURAS DE DECISO
Incio
nota
SIM
Aluno
aprovado
Fim
53
54
1
2
3
4
5
6
7
8
9
program testaNota;
uses crt;
{Declarar uma varivel 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, ento 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.
Note que o que diferencia as Listagens 20 e 21 que nesta a linha 10 testa se a nota lida
maior ou igual a 6 e, caso seja, e apenas com esta condio, escreve-se Aluno
aprovado. Em caso contrrio - teste da linha 12 - escreve-se se Aluno reprovado
linha 13.
Incio
nota
NO
Aluno
reprovado
SIM
Aluno
aprovado
Fim
www.edeyson.com.br
ESTRUTURAS DE DECISO
somente se, a nota for maior ou igual a seis e que Aluno aprovado ser apresentada em
caso contrrio. Estas so as duas vias.
Outro exemplo do uso de IF..THEN..ELSE est no programa da Listagem 22, que
simula um dbito numa conta corrente. O dbito s possvel se h saldo e/ou limite
disponveis para isso. O programa assim descrito:
1. Incio do Algoritmo;
a. Definir as variveis saldo, limite e valorADebitar como real;
b. Atribuir valores a saldo e limite;
c. Solicitar ao usurio o valor a debitar;
d. Se o saldo somado ao limite for maior que o valor a debitar, ento:
i. subtraia valorADebitar do saldo;
ii. Imprima 'Debito efetuado com sucesso'.
e. Seno:
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 22 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;
{importao da biblioteca CRT}
uses crt;
var
{Definio das variveis 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.
55
56
Neste cdigo testa-se na linha 21 se a varivel saldo somada varivel limite tem valor
maior que a varivel valorADebitar. Se isto verdade, a linha 23 subtrai do saldo o
valorADebitar e a linha 24 imprime o sucesso do dbito.
Note que as linhas 22 a 25 e 28 a 30 compem blocos de comandos delimitados por
BEGIN .. END.
Incio
saldo = 200
limite = 500
valorADebitar
NO
SIM
saldo = saldo - valorADebitar
Saldo Insuficiente
Debito efetuado
com sucesso
Fim da transacao.
Pressione Alguma
Tecla
Fim
www.edeyson.com.br
ESTRUTURAS DE DECISO
57
58
Incio
idade
Desconto = 0%
idade >= 20 e
idade <= 25
NO
idade >= 26 e
idade <= 30
NO
idade >= 31 e
idade <= 45
SIM
SIM
SIM
Desconto = 3%
Desconto = 5%
Desconto = 8%
NO
idade > 45
SIM
Desconto = 10%
Informar
Desconto
Fim
program CalculaDesconto1;
{importao da biblioteca CRT}
uses crt;
var
{Definio das variveis idade e desconto como inteiras}
idade, desconto : integer;
begin
{limpa a tela}
clrscr;
{Solicitar ao usurio o valor da idade.}
writeln('Qual sua idade?');
readln(idade);
{Atribuio de valor inicial ao desconto}
desconto := 0;
{Selee 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.
www.edeyson.com.br
ESTRUTURAS DE DECISO
Na Listagem 23, na linha 6 definem-se as variveis inteiras idade e desconto. Nas linhas
12 e 13 solicita-se o valor da idade. Na linha 16 inicia-se o desconto com 0.
A linha 19 testa se a idade est no limite [20, 25]. Se sim, atribui 3 ao desconto. Seno,
inicia um novo teste aninhado na linha 22 verificando se a idade est no limite [26, 30].
Note que o aninhamento de IF fica mais legvel graas endentao do cdigo. O
processo da aninhamento e endentao continua para os demais limites de idade.
A Figura 7 apresenta o fluxograma do algoritmo Calcula Desconto 2. Como pode ser
notado, mesmo com uma condio sendo atendida (SIM), o algoritmo continua a testar
desnecessariamente as demais condies para determinar o novo desconto, informandoo e terminando.
Embora o Algoritmo Calcula Desconto 1 seja mais eficiente que o 2, h um problema.
Imagine um conjunto com 20 condies. Com ficaria o fluxograma da Figura 6? Para
eliminar o problema que surgiria que existe a seleo com mltiplas vias (vide
Apndice A, e que implementado com a instruo CASE.
Incio
idade
Desconto = 0%
idade >= 20 e
idade <= 25
SIM
NO
idade >= 26 e
idade <= 30
NO
Desconto = 3%
idade >= 31 e
idade <= 45
SIM
NO
Desconto = 5%
SIM
idade > 45
Desconto = 8%
SIM
Desconto = 10%
Informar
Desconto
Fim
NO
59
60
Exemplos de Cdigo
www.edeyson.com.br
ESTRUTURAS DE DECISO
4.3 CASE
Embora o aninhamento de IF seja comum quando a condio possui mltiplos
caminhos alternativos, normalmente ela usada com condies que necessitam de
avaliao de um valor lgico verdadeiro ou falso.
Em algumas situaes, contudo, a condio 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 Audvel), comum em
atendimento telefnico pelo sistema 0800. Comumente so oferecidas opes entre 0 e
9. Cada opo leva a uma ao diferente. Por exemplo, vamos analisar o problema URA
01 a seguir.
Uma soluo de URA (URA 01) deve oferecer as seguintes opes e aes:
1 Saldo;
2 Extrato Parcial;
3 Extrato da ltima Conta;
8 Falar com atendente;
9 Menu anterior.
Uma especificao em Linguagem Natural para a URA 01 pode ser a seguinte, que
chamaremos de Algoritmo URA 01 IF:
1. Incio do Algoritmo URA 01 IF;
a. Informar ao usurio quais as opes do menu;
b. Solicitar ao usurio qual a opo desejada;
c. Se a opo for 1, apresentar o saldo;
d. Seno, Se a opo for 2, apresentar o Extrato Parcial;
e. Seno, Se a opo for 3, apresentar o Extrato da ltima Conta;
f. Seno, Se a opo for 8, transferir a ligao para a atendente;
g. Seno, Se a opo for 9, desviar para o menu anterior;
h. Seno, informar opo invlida.
2. Fim do algoritmo URA 01 IF.
Com esta especificao teremos um fluxograma muito semelhante ao da Figura 6.
Todavia, existe a opo de reescrever o algoritmo usando Seleo com Mltiplas Vias
ao invs de Aninhamento de Selees de Duas Vias. Um exemplo o seguinte
Algoritmo URA 01 CASE:
1. Incio do Algoritmo URA 01 CASE;
a. Informar ao usurio quais as opes do menu;
b. Solicitar ao usurio qual a opo desejada;
c. Caso a opo seja:
i. 1 : apresentar o saldo;
ii. 2 : apresentar o Extrato Parcial;
iii. 3 : apresentar o Extrato da ltima Conta;
iv. 8 : transferir a ligao para a atendente;
v. 9 : desviar para o menu anterior;
61
62
Exibir as
opes
opo
opo
8
2
Saldo
Extrato Parcial
Extrato ltima
Conta
0, 4, 5, 6 ou 7
9
Transfere ligao
para Atendente
Desvia para o
Menu Anterior
Opo Invlida
Fim
A implementao do algoritmo URA 01 CASE deve ser feito com o comando CASE,
cuja sintaxe descrita a seguir:
{Sintaxe:}
CASE varivel OF
Valor1 : Bloco de Comandos 1;
Valor2 : Bloco de Comandos 2;
Valor3 : Bloco de Comandos 3;
...
ELSE
Bloco de Comandos n
END;
Observaes:
1. A varivel do CASE deve ser inteira ou caracter (integer ou char) apenas.
2. O ELSE usado para tratar uma possvel exceo de valor da varivel
www.edeyson.com.br
ESTRUTURAS DE DECISO
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;
{importao da biblioteca CRT}
uses crt;
var
{Definio das varivel opo como inteira}
opcao : integer;
begin
{limpa a tela}
clrscr;
{Informar opes ao usurio.}
writeln('Tecle 1 para Saldo');
writeln('Tecle 2 para Extrato Parcial');
writeln('Tecle 3 para Extrato da Ultima Conta');
writeln('Tecle 8 para Transferir ligao para a Atendente');
writeln('Tecle 9 para Retornar ao Menu anterior');
readln(opcao);
case opcao of
1: begin
{cdigo para apresentar saldo}
end;
2: begin
{cdigo para apresentar o Extrato Parcial}
end;
3: begin
{cdigo para apresentar o Extrato da ltima Conta}
end;
8: {transferir a ligao para a atendente};
9: {desviar para o menu anterior};
else
writeln('Opcao Invalida');
end; {end case}
readkey;
end.
63
64
4.4 EXERCCIOS
4.4.1 Dado o programa TesteCondicional, escreva seu algoritmo em Linguagem Natural, seu
fluxograma e reescreva-o usando CASE..ELSE.
1 program TesteCondicional;
2 {importao da biblioteca CRT}
3 uses crt;
4 var
5
condicao: integer;
6
7 begin
8
{limpa a tela}
9
clrscr;
10
{escreve no prompt de comando}
11
writeln('Digite o valor da condicao: ');
12
{esperando que o usurio digite algo e atribua aa varivel
condicao}
13
readln(condicao);
14
15
if (condicao = 1) then
16
writeln('A condicao eh 1')
17
else
18
if (condicao = 2) then
19
begin
20
writeln('A condicao eh 2');
21
writeln('E dois eh par e primo');
22
end
23
else
24
writeln('A condicao eh: ', condicao);
25
readkey;
26 end.
4.4.2 Escrever um algoritmo em Linguagem Natural, fluxograma e em Pascal que, lendo trs
lados de um tringulo, determine se o mesmo eqiltero, issceles ou escaleno.
Opo 1 de soluo em Linguagem Natural:
1. Incio do Algoritmo Tringulos
a. Obter os lados a, b e c
b. Se os trs lados so iguais, imprima que Equiltero
c. Seno, se dois lados so iguais, imprima que Issceles
d. Seno, imprima que Escaleno
2. Fim do Algoritmo Tringulos
Opo 2 de soluo em Linguagem Natural:
1. Incio do Algoritmo Tringulos
a. Obter os lados a, b e c
b. Se a = b e b = c, imprima que Equiltero
Edeyson Andrade Gomes
www.edeyson.com.br
ESTRUTURAS DE DECISO
Fluxograma:
Incio
a=beb=c
Tringulo
Equiltero
F
a, b, c
a=b
ou a = c
ou b = c
Tringulo
Issceles
Tringulo
Escaleno
Fim
Cdigo:
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.7 -
65
66
ESTRUTURAS DE REPETIO
www.edeyson.com.br
ESTRUTURAS DE REPETIO
i=0
Fim
NO
i < 40
SIM
nota
NO
Aluno
reprovado
SIM
Aluno
aprovado
i=i+1
Note que o fluxograma inicia i com zero e testa se i menor que 40. A varivel i
usada como um contador de vezes que o algoritmo executa a leitura e o teste das notas.
Assim, enquanto i for menor que 40 no se chega ao fim da repetio. Um dos passos
do algoritmo no fluxograma incrementar o valor de i para indicar que um passo foi
executado. Sem isso, nunca se chegaria ao fim.
estrutura de volta a um ponto do algoritmo para que este seja repetido chama-se de
Lao. Os laos dividem-se em dois grupos:
Laos Finitos: o nmero de repeties do lao conhecido;
Laos Infinitos (indeterminados): o nmero de repeties do lao
desconhecido previamente.
67
68
5.1 FOR
O comando FOR permite a repetio de um comando, ou bloco de comandos, um
nmero finito de vezes. Esse nmero determinado por uma varivel denominada de
contador do FOR. Sua sintaxe :
{Sintaxe 1:}
for contador := incio to fim do
Comando;
{Sintaxe 2:}
for contador := incio to fim do
begin
Bloco de Comandos;
end;
Caso o lao 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 ponto central para o entendimento do FOR o entendimento de seu fluxo de
execuo. Por exemplo, com a sintaxe 2 tem-se o seguinte:
{Sintaxe 1:}
for contador := incio to fim do
begin
Bloco de Comandos;
end;
O Fluxo de Execuo para o FOR com a sintaxe 1 altera apenas o Bloco de Comandos
(subitem 2.b.i) para um Comando Simples (que no necessita ser delimitado por
begin..end).
Usando o comando FOR, a implementao do algoritmo RepeteTesteNotas fica como
apresentado na Listagem 5.1.
www.edeyson.com.br
ESTRUTURAS DE REPETIO
1
2
3
4
5
6
7
program RepeteTesteNotas;
{Importa a biblioteca CRT para usar ReadKey}
uses crt;
{Declara as variveis}
var nota : real;
i : integer; {Varivel que ajudar a contar nmero de
repeties}
8
9 {Inicia o programa principal}
10 begin
11
for i := 1 to 40 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 teste de notas
A linha 11 inicia um lao de repetio de 40 vezes. Ela pode ser lida assim: faa i variar
de 1 at 40 e, para cada valor de i neste intervalo (incluindo 1 e 40) faa o que est entre
o begin..end.
Tudo que est entre o begin (linha 12) e o end (linha 20), que compe um bloco de
comandos, ser repetido 40 vezes. Isso garantido se o programador no mudar o valor
de i (que incrementado automaticamente pelo FOR).
As linhas 13 e 14 solicitam a digitao 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). Seno (linha 18), escreve Aluno reprovado (linha 19).
Na Listagem 5.2 temos outro exemplo do FOR. Veja que a varivel contador pode ter
qualquer nome (neste exemplo, numeroDaLinha) e inteira. O programa imprimir 8
vezes linha seguido do nmero do contador.
Na Listagem 5.2 a linha 11 determina o lao de repetio. As linhas 11 e 12 podem ser
lidas como: faa o numeroDaLinha variar entre 1 e 8 e para cada valor neste intervalo
imprima: linha: concatenado ao numeroDaLinha.
Neste caso, o FOR no usa o begin..end, pois ser executando apenas um comando por
vez (sintaxe 1).
69
70
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program ForSimples;
uses crt;
var
numeroDaLinha : integer;
begin
clrscr;
for numeroDaLinha := 1 to 8 do
writeln('linha: ', numeroDaLinha);
readkey;
end.
Listagem 5.2 For Simples
valor
de
Incio
numeroDaLinha = 1
numeroDaLinha <= 8
NO
Fim
SIM
Nota : i
numeroDaLinha =
numeroDaLinha + 1
www.edeyson.com.br
ESTRUTURAS DE REPETIO
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 Execuo para o FOR da
linha 11:
1. Inicie o numeroDaLinha com o valor 1.
2. Inicie o Lao (execuo do Comando).
a. Teste se o numeroDaLinha <= 8;
b. Se sim:
i. execute o comando: writeln('linha: ', numeroDaLinha);;
ii. incremente o numeroDaLinha; {Isso feito automaticamente
pelo FOR}
iii. Volte ao lao (passo 2.a).
c. Seno:
i. Pare.
O Passo a Passo de execuo da Listagem 5.2 o seguinte:
1: numeroDaLinha = 1
2.a: numeroDaLinha menor que 8?
2.b: sim
o 2.b.i escreva linha: 1
o 2.b.ii numeroDaLinha = 2
o 2.b.iii Voltar a 2.a
2.a: numeroDaLinha menor que 8?
2.b: sim
o 2.b.i escreva linha: 2
o 2.b.ii numeroDaLinha = 3
o 2.b.iii Voltar a 2.a
2.a: numeroDaLinha menor que 8?
2.b: sim
o 2.b.i escreva linha: 3
...
71
72
for i := 1 to 2 do
begin
writeln('valor de i: ', i);
end;
Listagem 5.3 uso do FOR
www.edeyson.com.br
ESTRUTURAS DE REPETIO
for i := 3 to 10 do
begin
writeln('valor de i: ', i);
i := i + 5;
end;
Listagem 5.4 Exemplo de FOR
Note que o contador (no caso, a varivel i) pode iniciar em qualquer valor. Neste trecho
de cdigo da Listagem 5.4 (linha 1) ele inicia em 3. O que este trecho de cdigo far?
Veja que neste exemplo o contador i incrementado no bloco (linha 4) e tambm pelo
FOR (linha 1) automaticamente.
73
74
Neste caso, o Bloco de comandos (linhas 3 e 4) vai ser executado 2 vezes, com i
assumindo os valores 3 e 9. Quando i for 15, o teste (i <= 10) informa que o FOR
acabou. Vamos seguir o Fluxo de Execuo na Figura 5.4.
www.edeyson.com.br
ESTRUTURAS DE REPETIO
5.2 WHILE .. DO
O comando WHILE .. DO permite a repetio de um comando, ou bloco de comandos,
um nmero finito ou indeterminado de vezes. O nmero de repeties determinado
por uma condio de controle que deve ser testada antes da execuo do comando (ou
bloco de comandos).
{Sintaxe 1:}
while condio do
Comando;
{Sintaxe 2:}
while condio do
begin
Bloco de Comandos;
end;
75
76
for i := 1 to 10 do
begin
writeln('valor de i: ', i);
end;
Listagem 5.5 Listagem de nmeros de 1 a 10
Note que o FOR controla implicitamente a condio, fazendo o i (controle) variar entre
1 e 10. Para fazer o mesmo com o WHILE, necessitamos de um cdigo similar. Vamos
iniciar uma varivel de controle com 1 e faz-la variar explicitamente de 1 em 1, at
chegar a 10. Por exemplo, vejamos a Listagem 5.6
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 nmeros de 1 a 10
A linha 6 inicia a varivel i com 1, pois desejam-se os nmeros 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
condio do WHILE, o que feito na linha 7.
www.edeyson.com.br
ESTRUTURAS DE REPETIO
i =1
i <= 10
NO
Fim
SIM
Valor de i:
i =i +1
77
78
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 nmeros de 1 a 10
A principal alterao da Listagem 5.7 para a 5.6 est na adio da condicional na linha
9. Agora, um nmero s ser impresso se ele for par, ou seja, o resto da diviso de i por
2 zero (i mod 2 = 0), logo, i divisvel por 2.
O fluxograma desta soluo apresentado na Figura 5.BB
Incio
i =1
i <= 10
NO
Fim
SIM
i mod 2 = 0
SIM
Valor de i:
Lao do While
NO
i =i +1
www.edeyson.com.br
ESTRUTURAS DE REPETIO
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.
A principal alterao da Listagem 5.7 para a 5.6 est no incio da varivel 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 soluo apresentado na Figura 5.CC
Incio
i =2
i <= 10
NO
Fim
SIM
Valor de i:
Lao do While
i =i +2
Figura 5.CC
Os exemplos apresentados at agora usaram o WHILE com laos finitos, pois havia
uma condio de parada. Todavia, no seguinte problema, teremos um lao infinito
(indeterminado):
79
80
i <> 0
NO
Fim
SIM
i*i
Lao do While
i
www.edeyson.com.br
ESTRUTURAS DE REPETIO
Desafios
1. Imprimir todos os mltiplos de 5 entre 1 e 100 usando WHILE e sem usar IF
ou Case.
2. Imprimir todos os mltiplos de 3 e 5 entre 1 e 100 usando WHILE e sem usar
IF ou Case.
3. Imprimir todos os mltiplos de 3 ou 5 entre 1 e 100 usando WHILE e sem usar
IF ou Case.
81
82
{Sintaxe:}
repeat
Bloco de Comandos;
until (condio);
Note que o comando, ou bloco de comandos, ser executado at que a condio seja
avaliada como verdadeira, outra diferena para o WHILE, que executa at a condio
ser falsa.
Pode-se ler o comando como: REPITA a execuo do bloco de comandos AT QUE a
condio seja falsa.
A principal caracterstica do REPEAT..UNTIL efetuar um teste lgico ao final de um
loop (lao), verificando se permitido continuar a execuo do trecho de instrues.
Desta forma, poder executar um determinado conjunto de instrues enquanto a
condio verificada permanecer falsa. No momento em que a condio se torna
verdadeira, o processamento da rotina desviado para fora do lao.
Usando o comando REPEAT..UNTIL, vamos elaborar um programa para imprimir
todos os nmeros entre 1 e 10. Para isto, a condio ser os nmeros 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 diferena est onde o teste da condio feito.
www.edeyson.com.br
ESTRUTURAS DE REPETIO
Incio
i =1
Valor de i:
i
Lao do Repeat
i =i +1
i > 10
SIM
Fim
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 nmeros de 1 a 10
A linha 6 inicia a varivel i com 1, pois desejam-se os nmeros 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
condio 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 condio diferente da do WHILE. Aqui,
informamos quando o lao deve terminar.
Tem-se, ento, um lao de repetio de 10 vezes. Porm, 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}.
83
84
O cdigo 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.
Observaes:
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 compem o bloco de comandos e
sero repetidos.
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 nmeros de 1 a 10
www.edeyson.com.br
ESTRUTURAS DE REPETIO
Incio
i =1
i mod 2 = 0
SIM
Valor de i:
NO
Lao do Repeat
i =i +1
i > 10
SIM
Fim
Figura 5.FF
Desafios
4. Imprimir todos os mltiplos de 5 entre 1 e 100 usando REPEAT e sem usar IF
ou Case.
5. Imprimir todos os mltiplos de 3 e 5 entre 1 e 100 usando REPEAT e sem usar
IF ou Case.
6. Imprimir todos os mltiplos de 3 ou 5 entre 1 e 100 usando REPEAT e sem
usar IF ou Case.
85
86
6. Arrays
Um Array, tambm chamado de vetor, quando unidimensional, ou matriz, quando
bidimensional, uma estrutura simples de dados.
Arrays mantm uma coleo de elementos, do mesmo tipo de dados. Elementos
individuais so acessados por sua posio no array, que determinada por um ndice.
{Sintaxe:}
nomeDoVetor : array [incio..fim] of tipoDeDados;
program TesteArray;
uses crt;
var
a : array[1..2] of integer;
i : integer;
begin
i := 10;
a[1] := -5; {Coloca -5 na posio 1 do vetor a}
a[2] := 2; {Coloca 2 na posio 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 varivel 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 varivel. Imagine que para cada varivel, o sistema reserva uma rea de memria
com seu nome. Referenciar o nome i significa para o sistema acessar seu contedo,
como representa a Figura XYZ.
Figura 6.XYZ
www.edeyson.com.br
ESTRUTURAS DE REPETIO
No se pode acessar a varivel a pelo nome, pois ela exige um ndice, como representa a
Figura ZZZ.
Figura 7
Imagine que, para cada vetor, o sistema reserva uma rea de memria com vrias
posies. Logo, apenas o nome (a, por exemplo) no serve para identificar qual posio
se quer acessar. Por isso necessita-se do ndice (a[1] e a[2]), que indica a posio correta
dentro da rea reservada.
O seguinte problema ilustra o uso de vetores: desejam-se ler 5 valores e, aps isso,
imprimir os pares separados dos mpares. Uma soluo est na Listagem 6.XX
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 solicitao de um nmero e sua leitura
87
88
esto numa mesma linha de cdigo. Tambm, os comandos IF, por no conterem blocos
de comando, fazem a escrita logo aps o THEN, numa mesma linha. Ressalta-se que
este no o modelo preferencial de escrita de cdigo, pois minimiza a legibilidade do
mesmo. Ele foi usado apenas para reduzir o espao da listagem.
Analisando o cdigo, a linha 3 declara 5 variveis inteiras necessrias ao programa. As
linhas de 7 a 10 fazem a leitura dos 5 nmeros inteiros, solicitando-os ao usurio. Em
seguida, linhas 13 a 18, apenas os nmeros pares so impressos. Aps isso, as linhas de
20 a 25 imprimem apenas os nmeros mpares.
Observaes:
1. O uso de #10 (nova linha) e de #13 (retorno do cursor) feito no WRITE(LN) para saltar
mltiplas linhas.
a. O comando writeln(#10, #10, #13, 'ABC') imprime 2 linhas em branco,
www.edeyson.com.br
ESTRUTURAS DE REPETIO
Na Listagem 6.YY, a linha 4 declara uma constante tamanhoVetor com valor 5. A linha
5 declara v como um vetor com 5 posies 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 nmeros. Como so 5 nmeros, tem-se um lao
finito com 5 passos (linha 10: FOR com i variando entre 1 e 5). O bloco de comandos
deste lao composto pelas linhas 11-14, onde feita a solicitao de um valor e sua
leitura.
A linha 12 solicita um valor, identificando-o pelo controlador do FOR. O usurio sabe
que digitar o i-simo nmero da seqncia 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 lao 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 condio for verdadeira. As linhas de 22 a 24 fazem algo
similar, mas para mpares.
Note que o tamanho do cdigo da Listagem 6.YY no mudar mesmo que a quantidade
de nmeros a ler mude. Para isto, basta alterar a dimenso da constante tamanhoVetor.
89
90
{Exerccios}
Algoritmo A4.1 (Fcil):
1. Declarar idade1 e idade2 como inteiro;
2. Declarar pessoa1 e pessoa2 como string;
3. Ler um valor para a varivel 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
Questes:
- Qual a diferena entre A4.1 e A4.2?
- Que linhas executam em A4.1 e no necessariamente executam em A4.2?
Justifique.
www.edeyson.com.br
ESTRUTURAS DE REPETIO
91
92
Apndice A Fluxogramas
Um Fluxograma um diagrama que representa o esquema de soluo de um problema.
Ele apresenta a linha de raciocnio lgico independente de linguagem de programao e
inteligvel por humanos e computadores.
Sua representao grfica feita por smbolos como:
Seqncia
Uma Seqncia representa a execuo de um conjunto de aes em srie. No
existe a possibilidade de alterao da ordem de processamento das aes. Por exemplo:
Entrada
Ao 1
Ao 2
Sada
www.edeyson.com.br
Apndice A Fluxogramas
Entrada
Deciso
Verdade
Ao 1
Falso
Sada
Deciso
Verdade
Falso
Ao 1
Ao 2
Sada
93
94
Por exemplo, na Figura 5, uma das aes ser executada em funo do valor da
Condio avaliada. As condies so mutuamente exclusivas.
Entrada
Avalia
Condio
Caso 1
Ao 1
Caso 2
Caso 3
Ao 2
Caso N
Ao 3
...
Ao N
Sada
Deciso
Verdade
Ao 1
Falso
Sada
www.edeyson.com.br
Apndice A Fluxogramas
Ao
Verdade
Condio
Falso
Sada
Exemplos
Exemplo 1: Como calcular as razes de uma equao do primeiro grau?
Sabe-se que a forma da equao de 1 grau : y = ax + b
A descrio da soluo em linguagem natural pode ser:
1. Incio do Algoritmo Razes
a. Obter o coeficiente a
b. Se a igual a zero, informar que no h razes para a equao
e terminar o algoritmo.
c. Obter o coeficiente b
d. Calcular o valor de x quando y zero: x = -b / a
i. Fornecer como resultado o valor de x
e. Terminar o algoritmo.
2. Fim do Algoritmo Razes
95
96
Incio
a=0
Ler a
NO
SIM
Obter b
x = -b/a
No h raiz
para a
equao
Exibe x
Fim
www.edeyson.com.br
Apndice A Fluxogramas
Incio
a=beb=c
Tringulo
Equiltero
F
a, b, c
a=b
ou a = c
ou b = c
Tringulo
Issceles
Tringulo
Escaleno
Fim
97
98
Apndice B Exerccios
Observaes:
1. Todas as questes trabalham com intervalos fechados. Logo, entre A e B corresponde a
[A, B].
www.edeyson.com.br
Apndice B Exerccios
99
100
Dica:
Edeyson Andrade Gomes
www.edeyson.com.br
Apndice B Exerccios
101
102
www.edeyson.com.br
Apndice B Exerccios
25. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia dois
nmeros, A e B e determine o valor da menor e da maior razo 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
aps 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 acelerao. 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 acelerao. 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 aps 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 acelerao. Neste caso, a = g.
29. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia V
(velocidade final), a (acelerao) e t (tempo) e determine a velocidade inicial de um
corpo em movimento.
Dica: V = V0 + at2/2, onde a a acelerao. 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.
103
104
31. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que leia dois
nmeros A e B, sendo B maior que A, e imprima todos os divisores de todos os
nmeros 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 so estruturados da seguinte
forma:
Ramal | Numero Discado | Tempo Ligao
Seu algoritmo deve ler todos os registros da base de dados e informar quais os 5
ramais com maior tempo total de ligao. Existem, na empresa, 10 ramais.
33. Usando Linguagem Natural e Fluxograma, descreva o algoritmo que resolve o
seguinte problema:
- Uma empresa area decidiu imprimir uma relao de funcionrios nordestinos.
Sabe-se que ela possui uma base de dados onde os registros so estruturados da
seguinte forma:
Nome | DataNascimento | CidadeNascimento |UF
Seu algoritmo deve ler todos os registros da base de dados e gerar tal relao.
UF possui valores como BA, SE, PB, etc.
www.edeyson.com.br
Apndice B Exerccios
105
106
program VariaveisConstantes;
{Este programa demonstra o uso de variveis e constantes no Pascal.
Seu objetivo determinar um valor para o Raio de um crculo e
Calcular sua rea.}
uses crt;
var
{Declara area e raio como variveis REAIS}
area, raio : real;
const
{Declara pi como uma constante}
pi = 3.1415926536;
begin
{Atribuies de valores s varives}
{Determina o raio do crculo explicitamente.}
raio := 10;
{Calcula a rea do crculo = pi * raio ao quadrado}
area := pi * raio * raio;
writeln('A area do circulo de raio ', raio:3:2, ' eh: ', area:3:4);
readkey;
end.
www.edeyson.com.br
C.1.2 - Este programa vai demonstrar os tipos de variveis do Pascal, como lhes atribuir
valores e imprimi-las. Para isto so definidas variveis inteiras, reais, lgicas, caracter e
texto.
1 program TiposDeVariaveis;
2 {Este programa vai demonstrar os tipos de variveis do Pascal,
3 como lhes atribuir valores e imprimi-las.}
4
5 uses crt;
6
7 {Tudo que vem aps VAR varivel
8 sintaxe:
9
nomeDaVarivel : tipo;
10 }
11 var
12
{Declara ai, bi e ci como variveis INTEIRAS}
13
ai, bi, ci : integer;
14
{Declara ar e br como varveis REAIS}
15
ar, br : real;
16
{Variveis lgicas - 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 declarao de string delimita o nmero de
caracteres.
21
Neste caso, a varivel nome pode ter 10 caracteres no mximo.}
22
nome : string[10];
23
{Char representa um nico caracter}
24
caracter : char;
25
26 const
27
pi = 3.1415926536;
28
29 begin
30
{Atribuies de valores s variveis}
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.
107
108
www.edeyson.com.br
109
110
program BooleanEmPascal;
{Este programa vai demonstrar o tipo boolean do Pascal}
uses crt;
var
aprovado : boolean; {Variveis lgicas - podem ser TRUE ou FALSE}
maior, menor, igual : boolean;
begin
{Atribuies de valores s varives}
{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.
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
{Atribuies de valores s varives}
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.
www.edeyson.com.br
C2 - Operadores
C.2.1 - Este programa demonstra o uso de operadores de concatenao de Strings.
1 program ConcatenacaoDeStrings;
2 {Este programa vai demonstrar a Concatenao de
3 uses crt;
4 var
5
nome
: string[20];
6
sobrenome
: string[20];
7
nomeCompleto : string[40];
8
9 begin
10
nome := 'Edeyson';
nome}
11
sobrenome:= 'Gomes';
sobrenome}
12
nomeCompleto := nome + ' ' + sobrenome;
sobrenome}
13
writeln('Nome Completo: ', nomeCompleto);
14
15
readkey;
16 end.
Strings em Pascal.}
{Definio de variveis}
111
112
www.edeyson.com.br
113
114
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.
www.edeyson.com.br
C3 - Condicionais
C.3.1 - Este programa visa ler uma nota (varivel real) e test-la. Se a nota estiver no
intervalo [0, 3) deve imprimir Sem Rendimento. Seno, se estiver no intervalo [3, 6)
deve imprimir Medio. Seno, 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 varivel inteira e determinar se a mesma par ou
mpar. Uma varivel valor par quando divisvel 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.
115
116
8 program pesoIdeal;
9
10 {importao da biblioteca CRT}
11 uses crt;
12
13 var
14
{criao da varivel sexo do tipo caracter - ou F ou M}
15
sexo : char;
16
17
{criao da varivel altura (em cm) do tipo inteiro}
18
altura : integer;
19
20
{criao da varivel 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 usurio pressione alguma tecla e atribuindo o
caractere a varivel sexo}
31
sexo := readkey;
32
33
{tornando maiscula(caixa alta), pois o usurio pode digitar em
minsculas}
34
sexo := upcase(sexo);
35
36
{escreve no prompt do comando}
37
write('Digite a altura em CM: ');
38
39
{esperando queo usurio digite algo e atribua a varivel altura}
40
readln(altura);
41
42
{se sexo contiver M faa}
43
if(sexo = 'M') then
44
{realize o clculo do peso ideal}
45
peso := ((72.7 * altura)/100) - 58
46
{do contrrio, se sexo contiver F faa}
47
else
48
if(sexo='F') then
49
{realize o clculo do peso ideal}
50
peso := ((62.7 * altura)/100) - 48
51
else
52
writeln('Oh, Zeh, no sabe o que eh sexo???');
53
54
{escreva no prompt do comando + o valor da varivel com 3 casas
decimais e 2 aps 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.
www.edeyson.com.br
C4 - For
C.4.1 - Este programa deve ilustrar o funcionamento do For, imprimindo nmeros 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.
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.
117