Professional Documents
Culture Documents
/######
| ### /###
| ###| ###
| ######_/
| ###__/
| ###
| ###
|/__/
/###
/#####
/### ###
/###__/###
/###_/ ### | #### \/_/
| ### | ### \ / ####
| #########
\ / ####
| ###__/### /###\ ###
| ### | ### |/ ##### /
|/__/ |/__/
\ /____/
/#####
/###
/ ###__/##
/### ###
| ### |/_/
/###_/ ###
| ###
| ### | ###
| ###
| #########
|/ ### /## | ###__/###
\ ##### / | ### | ###
\/____/
|/__/ |/__/
SEMESTRE
2008/1
/###
| ###
| ###
| ###
| ###
| ###
| #######
|/______/
SUMRIO
1 - FUNDAMENTOS DE PROGRAMAO ............................................
1.1
1.2
1.3
1.4
1.5
1.6
1
2
2
3
3
3
3
4
4
4
4
4
5
6
6
7
8
9
2.2
11
12
13
14
14
14
14
14
15
15
16
17
17
18
19
20
23
24
27
29
30
32
4.3
4.4
41
43
45
46
49
51
60
61
62
64
65
66
72
FUNES ..........................................................................................
6.1.1 ESTRUTURA DE UMA FUNO ....................................................
6.1.2 FUNES DEFINIDAS POR SOMATRIOS .......................................
PROCEDIMENTOS...............................................................................
6.2.1 DEFINIO, PROCEDIMENTOS SEM PARMETROS .........................
6.2.2 PROCEDIMENTOS COM PARMETROS ..........................................
6.2.3 EXERCCIOS .............................................................................
73
73
85
86
86
89
93
1 FUNDAMENTOS DE PROGRAMAO
especicao da seqncia ordenada de passos que deve ser seguida para a realizao de uma
tarefa, garantindo a sua repetibilidade, d-se o nome de algoritmo. Embora esta denio de algoritmo
seja correta, podemos denir algoritmo, de maneira informal e completa como:
Na prtica no importante ter-se apenas um algoritmo, mas sim, um bom algoritmo. O mais
importante de um algoritmo a sua correo, isto , se ele resolve realmente o problema proposto e
o faz exatamente.
Para se ter um algoritmo, necessrio:
i. Ler atentamente o enunciado: Deve-se reler o enunciado de um exerccio quantas vezes for
necessrio, at compreend-lo completamente. A maior parte da resoluo de um exerccio
consiste na compreenso completa do enunciado.
ii. Retirar a relao das entradas de dados do enunciado Atravs do enunciado, descobrimos
quais so os dados que devem ser fornecidos ao programa, via teclado, a partir dos quais
so desenvolvidos os clculos. Obs. Pode haver algum algoritmo que no necessite da entrada
de dados (pouco comum).
iii. Retirar do enunciado as informaes de sada Atravs do enunciado podemos descobrir quais so
as informaes que devem ser mostradas para compor o resultado nal, objetivo do algoritmo.
4. Determinar o que deve ser feito para transformar as entradas em sadas Nessa fase que
teremos a construo do Algoritmo propriamente dito. Devemos determinar qual sequncia de
passos ou aes capaz de transformar um conjunto de dados nas informaes de resultado.
Para isso, utilizamos os fatores descritos anteriormente, tais como legibilidade, portabilidade,
mtodo cartesiano e planejamento reverso, e nalmente podemos construir o algoritmo.
1.1.3 EXERCCIOS
1a Questo) Elabore um algoritmo que mova 3 discos de uma torre de Hani, que consiste em
3 hastes (a-b-c), uma das quais serve de suporte para os trs discos de tamanhos diferentes (1-2-3),
os menores sobre os maiores. Pode-se mover um disco de cada vez para qualquer haste, sendo que
nunca deve ser colocado um disco maior sobre um menor. O objetivo transferir os trs discos da
haste A para haste C.
1.3 VARIVEIS
Na programao, uma varivel um objeto (uma posio, freqentemente localizada na memria)
capaz de reter e representar um valor ou expresso. Enquanto as variveis s existem em
tempo de execuo, elas so associadas a nomes, chamados identicadores, durante o tempo de
desenvolvimento.
iii. Um nome de varivel no poder ser uma palavra reservada a uma instruo de programa.
Salario - correto
1ANO - errado (no comeou uma letra)
ANO1 - correto
SAL/HORA - errado (contm o caractere /)
SAL_HORA - correto
_DESCONTO - errado (no comeou com uma letra)
Obviamente interessante adotar nomes de variveis relacionados s funes que sero exercidas
pela mesmas dentro de um programa. Outro atributo caracterstico de uma varivel o tipo de dado
que ela pode armazenar. Este atributo dene a natureza das informaes contidas na varivel. Por
ltimo h o atributo informao, que nada mais do que a informao til contida na varivel.
Uma vez denidos, os atributos nome e tipo de dado de uma varivel no podem ser alterados
e assim permanecem durante toda a sua existncia, desde que o programa que a utiliza no seja
modicado. Por outro lado, o atributo informao est constantemente sujeito a mudanas de acordo
com o uxo de execuo do programa. Em resumo, o conceito de varivel foi criado para facilitar a
vida dos programadores, permitindo acessar informaes na memria dos computadores por meio de
um nome, em vez do endereo de uma clula de memria.
Exemplo: Suponha que fosse atribudo os seguintes valores s seguintes variveis: A = mesa, B
= 0, C = 2, D = -5.4, E = Joo e E = 5.656.
A gura 1.2 mostra como estas variveis cam armazendas na memria.
1.5.1 EXERCCIOS
1a Questo) Dena, com suas palavras, o que algoritmo.
2a Questo) Cite alguns algoritmos que podemos encontrar na vida quotidiana.
3a Questo)De acordo com seu entendimento, qual a caracterstica mais importante em um
5a Questo) Suponha que temos um rob a nossa disposio. Esse rob chama-se MANNY
e precisa ser ensinado a fazer determinadas tarefas. Para ensinar o MANNY, vamos fazer uso do
aprendi e nunca usei na prtica ... no vejo necessidade.... Discuta esse tipo de armativa.
executar os comandos bsicos da linguagem. Por exemplo, voc pode usar uma funo trigonomtrica
no seu programa fonte, e na hora dela ser executada, o computador saber como calcul-la. Quem
que ensina ao computador a calcular valor de funo trigonomtrica? A resposta a essa pergunta
simples: toda linguagem de programao possui um conjunto de instrues bsicas pronto para
ser adicionado a qualquer programa objeto. Esse conjunto de instrues a biblioteca padro da
linguagem. O ato de ligar (link) o programa objeto biblioteca padro chamado ligao (que
algumas pessoas chamam de "linkagem", talvez pelo hbito de usar neologismos). O programa objeto
aps a ligao com a biblioteca padro torna-se um programa executvel.
+------------+
+------------+
| Programa | COMPILAO | Programa |
| fonte
|----------->| objeto
|
+------------+
+------------+
+-------------+
|----------->| Programa |
+-------------+
| executvel |
| Biblioteca |
+-------------+
| padro
|
+-------------+
) -
_ $
! @
\ /
<
>
comum um programa fonte em Pascal ter extenso PAS. Se voc no mencionar a extenso
de um arquivo, o Pascal incluir automaticamente a extenso PAS, sempre que for feito algum uso
do mesmo. Neste caso, dizemos que PAS a extenso "default"( = omisso, falta) do Pascal. A
extenso, geralmente, classica o tipo do arquivo. Algumas extenses bastante comuns so:
PAS
BAS
C
FOR
PRO
ASM
BAK
BAT
EXE
--->
--->
--->
--->
--->
--->
--->
--->
--->
10
COM
OBJ
SYS
DOC
TXT
TPU
--->
--->
--->
--->
--->
--->
Programa executvel
Programa objeto
Arquivo usado pelo sistema operacional
Texto
Texto
Unidade do Turbo Pascal
Por exemplo, para um programa que trate da resoluo de sistemas lineares, um nome natural
poderia ser SISTEMA.PAS. No entanto, o usurio poderia cham-lo de @##!.)$$ se quisesse. Ambos
so nomes vlidos para o Pascal, alis, para o DOS. Se no disco aparecer tambm um SISTEMA.BAK
e um SISTEMA.EXE, ento muito provvel que o SISTEMA.BAK seja apenas uma cpia do
SISTEMA.PAS e o SISTEMA.EXE seja sua verso executvel. Outras verses de Pascal, bem como
outras linguagens de programao, costumam criar arquivos OBJ no disco, correspondentes aos
programas objeto, mas no esse o caso do Turbo Pascal. Logo, o programa objeto correspondente
a SISTEMA.PAS ser mantido apenas na memria e voc no ter em disco um SISTEMA.OBJ.
11
Cabealho;
Especicao das unidades usadas pelo programa;
Declaraes de tipos, constantes, variveis, rtulos, funes e procedimentos;
Seo principal.
O cabealho usado para dar nome ao programa e possui a forma:
PROGRAM Nome_do_programa;
O cabealho identicado pela palavra chave PROGRAM, seguida de um nome que identicar
o programa, e encerra-se com um ponto-e-vrgula. Ele serve apenas para orientao do usurio.
Exemplo:
PROGRAM Teste;
Uma linha como essa, atribui o nome Teste a um programa. A especicao das unidades
usadas feita com um comando USES, seguido dos nomes das unidades a serem usadas separadas
por vrgula, com um ponto-e-vrgula no nal da linha:
12
BEGIN
comando1;
comando2;
... ...
END.
A seo principal a nica parte obrigatria de um programa em Pascal. No entanto, em todo
programa, tudo que vier a ser usado dever ter sido declarado antecipadamente de forma adequada.
A execuo de todo programa inicia-se pela seo principal.
No sero diferenciadas letras minsculas de maisculas e sero ignorados os espaos em branco.
O nal de um comando ou declarao sinalizado por um ponto-e-vrgula. As quatro expresses a
seguir sero consideradas idnticas:
(1) X := A + B + C;
(2) x:=a+b +
(3) x := a +
b +
c;
(4) X :=
C;
a + B
2.1.1 IDENTIFICADORES
Um identicador um conjunto de caracteres usado para dar nome a um programa, unidade,
rtulo, varivel, tipo, constante, funo ou procedimento. Todo identicador deve iniciar-se com uma
letra e pode ser seguido por qualquer quantidade de outras letras, algarismos ou o sinal de sublinhado
( _ ). Somente os 63 primeiros caracteres sero considerados signicativos. Exemplo:
Identificadores permitidos:
Valor_Maximo_de_F, MIN2P3.
X, a1,
Nota, NomeDoAluno,
ABSOLUTE
AND
ARRAY
BEGIN
CASE
CONST
GOTO
IF
IMPLEMENTATION
IN
INLINE
INTERFACE
RECORD
REPEAT
SET
SHL
SHR
STRING
13
DIV
DO
DOWNTO
ELSE
END
EXTERNAL
FILE
FOR
FORWARD
FUNCTION
INTERRUPT
LABEL
MOD
NIL
NOT
OF
OR
PACKED
PROCEDURE
PROGRAM
THEN
TO
TYPE
UNIT
UNTIL
USES
VAR
WHILE
WITH
XOR
Existem, ainda, alguns identicadores que, apesar de terem um signicado pr-denido para o
Pascal, no so palavras reservadas, como por exemplo: REAL, INTEGER, READ, WRITE, PI,
SIN, COS. O signicado ou a funo desses identicadores podem ser redenidos e alterados pelo
usurio.
+---------------------+
| TIPOS PR-DEFINIDOS |
+---------------------+
|
+-------------------------+
|
|
+-----------+
+--------------+
| SIMPLES |
| ESTRUTURADOS |
+-----------+
+--------------+
|
|
|
+---+
|
|
|
Array
+-----------------------+
|
|
|
string ordinal
real
|
|
+---------------+
+------------+
|
|
|
|
boolean char inteiro
+-----+
|
|
|
real
+----+
|
integer
Vale ressaltar que a linguagem no possui apenas os tipos abaixo, mas estes que aparecero em
99% dos problemas. Em resumo vamos trabalhar com o seguintes tipos:
14
- Integer
- String
- Boolean (Lgico)
2.1.2.1
- Real
- Char
- Array
TIPO INTEIRO
O tipo inteiro formado pelo subconjunto de inteiros, de acordo com a seguinte tabela:
Tipo
Domnio
Tamanho
-------------------------------------------------integer
[-32768, 32767]
2 bytes
--------------------------------------------------
2.1.2.2
TIPO BOOLEAN
O tipo boolean formado pelas constantes TRUE (verdadeiro) e FALSE (falso) e usado para
se avaliar expresses lgicas. um dos tipos mais usados do Pascal.
2.1.2.3
TIPO CHAR
O tipo caracter (char) formado pelo conjunto dos 256 caracteres ASCII (letras, algarismos e
smbolos especiais como +, =, %, $, #, <, etc.). As constantes deste tipo so escritas entre apstrofos:
'A', 'B', '3', etc.
2.1.2.4
TIPO REAL
Tipo
Domnio
Dgitos
Tamanho
-------------------------------------------------------real
[2.9E-39, 1.7E38]
11-12
6 bytes
-------------------------------------------------------Em Pascal, as potncias de 10 so indicadas com um E. Por exemplo, 2E07 o mesmo que 2
vezes 10 elevado a 7; 3.28E-11 o mesmo que 3,28 multiplicado por 10 -11.
Os domnios anteriores referem-se aos valores absolutos das constantes. Com isso, temos que
o tipo real da tabela acima corresponde aos nmeros que esto na unio dos intervalos [2.9E-39,
1.7E38] e [-1.7E38, -2.9E-39]. Est sendo indicada tambm a quantidade de dgitos signicativos de
cada tipo.
2.1.2.5
TIPO STRING
Exemplo: TYPE
Nome = string[40];
15
Neste exemplo est sendo declarado o tipo Nome que uma seqncia de at 40 caracteres.
Podem ser consideradas deste tipo as constantes 'Turbo Pascal 5.0', '1991/1992' e 'UFPB - CCEN Dep. de Matematic.
Falaremos dos tipos restantes em captulos posteriores.
VAR
Identificador, ..., Identificador: Tipo1;
Identificador, ..., Identificador: Tipo2;
...
...
Seguem alguns exemplos de declarao de variveis na linguagem Pascal:
VAR
x, y, z: real;
i, j, k: integer;
Inicio, Fim: boolean;
Tamanho: integer
Nome_do_arquivo: string[15];
Neste bloco VAR esto sendo declaradas as variveis x, y, z como sendo do tipo real, uma varivel
Tamanho do tipo integer, alm de outras variveis (i, j, ...). Os tipos das variveis no podem ser
mudados durante a execuo do programa e os valores que elas podem assumir devem ser compatveis
com o seu tipo declarado. Por exemplo, a varivel i acima pode assumir o valor 2309, mas no pode
assumir um valor fracionrio como 0.71.
CONST
Identificador = Expresso;
Identificador = Expresso;
...
...
Identificador: tipo = Valor;
Identificador: tipo = Valor;
...
...
Seguem alguns exemplos de declarao de constantes:
CONST
16
Pi = 3.1415926;
NumeroMaximoDeLinhas = 1024 + 253 + 5;
Mensagem: string[20] = 'Hello world!';
X: integer = 7;
As constantes que so declaradas sem a especicao de tipo no podem ser alteradas durante
a execuo do programa. Aquelas cujas declaraes contiverem o tipo base, chamadas constantes
tipadas, desempenham um papel parecido com o das variveis e podem ser alteradas durante a
execuo do programa. A diferena entre uma varivel e uma constante tipada que a varivel no
pode ter nenhum "valor inicial"na sua declarao.
Identificador := expresso;
Neste tipo de operao, a expresso e o identicador devem ser do mesmo tipo, exceto no caso em
que o identicador for do tipo real e a expresso do tipo inteiro (pois, neste caso, o valor inteiro da
expresso ser automaticamente transformado em real). Exemplo: Considere a seguinte declaraco
de variveis:
VAR
a, b, c: integer;
x, y: real;
teste: boolean;
data: string;
a := -17;
x := y + 3.14;
teste := false;
data := '5/12/1991'
teste := a + b + 1;
c := 6.02E23;
Em caso de vrias atribuies a um mesmo identicador, ser considerada apenas a ltima
atribuio efetuada.
17
2.1.6 COMENTRIOS
Comentrios so usados para aumentar a clareza de um programa. Todos os comentrios so
desprezados na hora da compilao, logo, eles no tm inuncia no desempenho e nem no tamanho
do programa objeto. Um comentrio colocado entre chaves ou entre (* e *).
{ matrcula
}
{ nota final
}
{ codigo do curso }
string;
+ Adio
/ Diviso
DIV Quociente da diviso
inteira
9/2 = 4.5
9 DIV 2 = 4
10 DIV 2 = 5
- Subtrao
* Multiplicao
MOD Resto da diviso
inteira
-3*7 = -21
9 MOD 2 = 1
10 MOD 2 = 0
Estas operaes podem ser utilizadas com operandos reais ou inteiros, exceto DIV e MOD que
exigem operandos inteiros. A prioridade entre as operaes a mesma da Matemtica:
18
Expresso
Valor
-----------------------5 + 2*4
13
(5 + 2)*4
28
7 DIV 2*3
9
7 DIV (2*3)
1
-----------------------Observaes:
Entre as muitas funes pr-denidas do Pascal, as que esto relacionadas com valores numricos
Funo
Descrio
Tipo do resultado
------------------------ -----------------------------LN
Logaritmo natural
real
EXP
Exponencial de base e
real
ABS
Valor absoluto
real ou inteiro
SQR
Quadrado
real ou inteiro
SQRT
Raiz quadrada
real
SIN
Seno
real
COS
Cosseno
real
ARCTAN
Arco-tangente
real
ROUND
Arredondamento
inteiro
TRUNC
Parte inteira
inteiro
INT
Parte inteira
real
FRAC
Parte fracionria
real
ODD
Testa se mpar
booleano
------------------------------------------------------Em todas elas deve-se acrescentar um argumento entre parnteses frente do nome da funo,
como em COS(x) ou SQRT(y). O Pascal no tem pr-denidas funes como tangente, secante,
arco-seno, ... . Em breve ser mostrado como o usurio poder denir essas funes, bem como
outras com domnio e contradomnio mais complexos.
Exemplo: O modulo do seno do quadrado de x e codicado como ABS(SIN(SQR(x))). Neste tipo
de expresso, obrigatrio que a quantidade de parnteses abertos seja a mesma de fechados.
Exemplo: O quociente entre x2 + 3x e x2 + 5 se escreve como (SQR(x) + 3*x)/(SQR(x) + 5) ou
como (x*x + 3*x)/(x*x + 5). Nestes casos, o uso dos parnteses fundamental.
19
TRUNC(1.35) = 1 (inteiro)
INT(1.35) = 1 (real)
ROUND(1.35) = 1
FRAC(1.35) = 0.35
TRUNC(1.97) = 1 (inteiro)
INT(1.97) = 1 (real)
ROUND(1.97) = 2
FRAC(1.97) = 0.97
As funes INT e TRUNC so numericamente equivalentes. A diferena entre elas est apenas
no tipo do valor retornado.
= igual
< menor
<= menor ou igual
<> diferente
>
maior
>= maior ou igual
No caso de variveis do tipo CHAR ou STRING, ser usada a ordem alfabtica para comparar
duas constantes ou variveis.
Exemplo: Sejam a, b, c, d variaveis booleanas cujos valores so:
a
b
c
d
:=
:=
:=
:=
1
3
a
a
< 2;
>= 5;
OR b;
AND b;
Como 1 < 2 uma relao verdadeira, temos que a tem valor TRUE; 3 >= 5 falso, logo, b tem
valor FALSE. Sendo a TRUE e b FALSE temos que c TRUE, pois a OR b s seria FALSE se a e
b fossem ambas FALSE. O valor de d FALSE, uma vez que b FALSE.
Exemplo: Consideremos as variaveis x, y, z, nome1, nome2 e teste declaradas abaixo:
20
VAR
x, y, z: byte;
nome1, nome2: string;
teste: boolean;
Considere tambm as seguintes atribuies:
x := 3;
y := 10;
z := 4;
nome1 := 'Guizinha';
nome2 := 'Olezinho';
teste := false;
Temos ento:
Expresso
Valor
-------------------------------------------x <= y
TRUE
(x = z) OR (x + z >= y)
FALSE
nome1 < nome2
TRUE
(nome1 <> nome2) AND (NOT teste)
TRUE
(nome1 = nome2) AND (x = y)
FALSE
(NOT (x > z)) OR teste OR (y <> z) TRUE
Odd(x) AND (NOT Odd(y))
TRUE
Odd(x) XOR Odd(y + 1)
FALSE
(x mod 3 = 0) AND (y div 3 <> 1)
FALSE
Sqr(Sin(x)) + Sqr(Cos(x)) = 1
TRUE
--------------------------------------------
A prioridade das operaes aritmticas, lgicas e relacionais est denida na seguinte tabela:
Prioridade
Operadores
------------------------------------1 (alta)
NOT
2
*. /, DIV, MOD, AND
3
+, -, OR, XOR
4 (baixa)
=, <=, >=, <, >, <>
-------------------------------------
2.2 EXERCCIOS
1a Questo) Escreva as seguintes expresses de acordo com a sintaxe do Pascal:
a) sen(2x) = 2.sen(x).cos(x)
3
2
b) x + 5x - 2x + 4
21
1
c) ------------------Ln(x + Ln(x)) + 1
d) e
arctg(x) + |x|
i)
ii)
iii)
iv)
v)
a
a
a
z
z
:=
:=
:=
:=
:=
i) a := 1 + 3*y;
ii) a := ((n - 1)/2) MOD 3;
iii) z := SIN(1 - COS(ARCTAN(2));
iv) z + 5 := x - y;
a)
b)
c)
d)
booleana com valor FALSE em determinado momento. Determine o valor que est sendo atribudo
varivel booleana TESTE em cada um dos casos:
22
a)
b)
c)
d)
TESTE
TESTE
TESTE
TESTE
:=
:=
:=
:=
X > Y;
NOT (Abs(X*Y) >= 5e20);
(X > 0) OR (Y > 10*Abs(X)) OR Classifica;
(X + Y > 1) AND (Sqrt(Y) < 1.2E-9);
23
Os comandos de entrada ou sada fazem a comunicao entre o programa que est sendo executado
e os perifricos de entrada (teclado, disco) ou os de sada (vdeo, disco, impressora). A entrada ou
sada de dados para um disco ser tratada em captulo posterior.
---> Transfere
variveis
dados
Var1,
para
as
Var2, ...
dados
para as
Var1, Var2,
...
leitura dos dados,
o cursor no incio
linha da tela.
Cada comando de leitura deve ser encerrado pressionando-se a tecla ENTER. Caso haja mais
de um dado a ser lido por um comando de leitura, deve-se separ-los por pelo menos um espao em
branco.
Exemplo: Suponhamos que A e B sejam duas variaveis reais de um programa. Quando a execuo
do programa chegar em um comando como
Read(A, B);
Ento o computador car esperando que sejam digitados dois nmeros reais para que sejam
atribudos s variveis A e B. Por exemplo, digitando-se uma linha como
3.05
-5.17
Pressionando-se ENTER ao nal da digitao dos nmeros, sero atribudos os valores 3.05 a A
e -5.17 a B. como se o programa contivesse as atribuies:
A := 3.05; B := -5.17;
24
Onde v1, v2, ... acima podem ser expresses envolvendo variveis ou constantes do tipo inteiro,
real, string, booleano ou char.
Exemplo: Suponhamos que X seja uma variavel inteira de um programa, com valor 15 no momento
em que for executado o comando:
Depois posicionar o cursor no incio da linha seguinte a essa na tela. Observe que a mensagem
"O valor encontrado foi " uma constante do tipo string. Portanto, neste exemplo, o comando de
sada mostra os valores de uma constante e de uma varivel.
Exemplo: Suponhamos que X, Y, Z, A, B e C sejam variaveis com valores respectivamente iguais
a ' Antonio ', ' Jose ', ' Maria ', 60, 75 e 90. Ento, o comando:
WRITELN(x, a, y, b, z, c);
A seqncia de comandos:
25
Antonio
60
Jose
75
Maria
90
Enquanto que
Exibir:
READ(Num1, Num2);
Ou como:
READLN(Num1, Num2);
No entanto, quando o computador executar esse tipo de comando, em momento nenhum ele lhe
indicar se ele est esperando um, dois, trs ou mais nmeros. Tampouco indicar o tipo de dado
que est sendo esperado, se um dado numrico ou no. Devido a isso, recomendado que antes de
qualquer comando READ ou READLN, o programa contenha uma linha anterior com um WRITE
ou WRITELN para mostrar alguma mensagem que oriente o usurio.
Neste caso, colocaremos um comando WRITE para mostrar a mensagem Forneca dois numeros
inteiros : .
Uma vez introduzidos os valores de Num1 e Num2, para som- los e mostrar o resultado da soma
na tela, basta colocar a expresso Num1 + Num2 em um comando de sada:
26
Observe que neste WRITELN temos uma constante do tipo string 'Soma = ' e uma expresso
aritmtica Num1 + Num2.
Nosso programa ca, ento, com o seguinte aspecto:
PROGRAM SomaDeDoisInteiros;
VAR
Num1, Num2: integer;
BEGIN
WRITE('Forneca dois numeros inteiros : ');
READLN(Num1, Num2);
WRITELN('Soma = ', Num1 + Num2);
END.
27
O caracter de sublinhado _ acima representa a posio do cursor na tela. Qualquer outra sada
de dado posterior execuo do programa seria feita a partir dessa posio. Se a seo principal
deste programa fosse:
BEGIN
WRITELN('Forneca dois numeros inteiros : ');
READLN(Num1, Num2);
WRITE('Soma = ', Num1 + Num2);
END.
27
...
...
WRITE('Para continuar, pressione [ENTER]');
READLN;
...
...
3.3 FORMATAO
A impresso dos valores a serem impressos por um WRITE ou WRITELN pode ser formatada
atravs da especicao da largura do campo de impresso ou do nmero de casas decimais.
Para valores do tipo inteiro, booleano, string ou char, basta colocar o tamanho do campo de
impresso direita do valor a ser impresso. Neste caso, o valor e o tamanho do campo devem estar
separados por dois pontos (:).
WRITE(V:n)
ou
Se o valor de n for maior do que a quantidade necessria para a impresso do valor de V, ento
a largura do campo ser completada com espaos em branco adicionados esquerda.
Exemplo: Consideremos x1, x2, s1, s2 variaveis com valores denidos pelas atribuies
x1 := 8; s1 := 'A';
x2 := 19; s2 := '*';
Para cada comando WRITE abaixo, temos as seguintes sadas mostradas na tela:
Comando
Sada
--------------------------------------------------WRITE(x1)
8
WRITE(x1:2)
^8
WRITE(x1:10)
^^^^^^^^^8
WRITE(x1, s1, x2, s2)
8A19*
WRITE(x1, ' ', s1, ' ', x2, ' ', s2) 8^19^*
WRITE(x1, s1:2, x2:5, s2:3)
8^^^19^^*
WRITE(x1:6, x2:2)
^^^^^819
WRITE(x1, ' ':5, x2)
8^^^^^19
---------------------------------------------------
28
Comando
Sada
------------------------------------WRITE(X:9:3)
-1991.000
WRITE(X:15:2)
^^^^^^^-1991.00
WRITE(X:10:2)
^^-1991.00
WRITE(X)
-1.9910000000E+03
WRITE(Pi)
3.1415926535E+00
WRITE(Pi:4:2)
3.14
WRITE(Pi:7:2)
^^^3.14
WRITE(Pi:10:3) ^^^^^3.141
WRITE(Pi:10:6) ^^3.141592
WRITE(Pi:10:8) 3.14159265
WRITE(Pi:5:0)
^^^^3
------------------------------------Exemplo: Vamos construir agora um programa que solicita ao usurio a medida de um ngulo
em graus (um nmero inteiro) e mostra na tela o seno, o cosseno e a tangente do ngulo fornecido.
As funes trigonomtricas pr-denidas SIN(x) e COS(x) operam com um ngulo x em radianos.
Logo, o programa deve ser esperto o suciente para transformar o ngulo em graus, fornecido pelo
usurio, para um valor equivalente em radianos. Isto feito atravs de uma multiplicao por Pi/180.
O Pascal tem o valor de Pi pr-denido com 19 casas decimais. Vamos usar trs variveis reais "seno",
"cosseno"e "tangente"para guardar os valores desejados. Vamos exigir que a impresso dos valores
seja em um campo com 8 espaos e 4 casas decimais.
PROGRAM Sen_Cos_Tg;
{ Calculo do seno,
VAR
cosseno
tangente de um angulo }
29
AnguloEmGraus: INTEGER;
seno, cosseno, tangente, AnguloEmRadianos: REAL;
BEGIN { inicio da secao principal }
WRITE('Forneca a medida de um angulo (em graus) : ');
READLN(AnguloEmGraus);
WRITELN; { gera uma linha em branco }
AnguloEmRadianos := AnguloEmGraus*Pi/180;
{ transforma
graus em radianos }
seno := SIN(AnguloEmRadianos);
{ Calculo dos valores }
cosseno := COS(AnguloEmRadianos); { desejados. Lembre- }
{ se que o Pascal nao }
tangente := seno/cosseno;
{ tem funcao tangente }
{ pr-definida
}
{ Saida dos resultados }
WRITELN('Seno de ', AnguloEmGraus, ' = ', seno:8:4);
WRITELN('Cosseno de ', AnguloEmGraus, ' = ', cosseno:8:4);
WRITELN('Tangente de ',AnguloEmGraus,' = ', tangente:8:4);
END. { fim da secao principal }
Executando-se esse programa (aps a digitao correta deve-se pressionar CTRL-F9 e ALT-F5),
vemos na tela algo parecido com:
<----------+
Seno de 50 = 0.7660
|
Cosseno de 50 = 0.6428
|
Tangente de 50 = 1.1918
|
|
Linha em branco gerada pelo WRITELN; -----------------+
30
PROGRAM AreaDoTriangulo;
{
Dados os nmeros reais a, b, fornecida o valor
da rea do tringulo cujos lados tm essas medidas.
}
USES CRT; { Permite o uso de comandos da unidade CRT, como
o CLRSCR. Deve ser colocado nesta posio, logo
abaixo do cabealho }
VAR
a, b, c, p, area: REAL;
BEGIN
CLRSCR; { Limpa a tela }
{ Leitura dos valores de a, b e c }
WRITE('Valor de a: '); READLN(a);
WRITE('Valor de b: '); READLN(b);
WRITE('Valor de c: '); READLN(c);
{ Calculo da area }
p := (a + b + c)/2;
area := SQRT(p*(p - a)*(p - b)*(p - c));
{ Impressao dos resultados na tela }
WRITELN;
WRITELN('A area do triangulo cujos lados medem');
WRITELN(a:7:3, ',', b:7:3, ' e ',c:7:3,' ' ', area:7:3);
END.
A impresso de um apstrofo obtida colocando-se dois apstrofos consecutivos como parte da
constante string. Assim, WRITELN(' e ') tem como sada na tela um "", que no chega a ser
um "e"acentuado, mas ajuda na leitura. No lugar dos trs READLN acima, poderamos ter colocado
apenas um READLN(a, b, c). Este programinha no inteligente o suciente para rejeitar na entrada
valores negativos ou valores invlidos como a = 3, b = 5, c = 11. Aps sua execuo com os valores
a = 5, b = 7 e c = 8,4, temos as seguintes mensagens na tela:
Valor de a: 5
Valor de b: 7
Valor de c: 8.4
A area do triangulo cujos lados medem
5.000, 7.000 e 8.400 17.479
3.4.1 EXERCCIOS
1a Questo) Escreva um programa em Pascal que leia duas variveis A e B e depois calcule e
2a Questo) Crie um programa que leia quatro nmeros do teclado e imprima a mdia deles na
tela.
3a Questo)Elabore um programa que leia cinco nmeros do teclado e imprima o produto deles.
4a Questo)Escreva um programa que leia seis nmeros inteiros do teclado e imprima a soma
deles.
31
hipotenusa.
a mdia do aluno, sabendo que a nota A tem peso 3 e a nota B tem peso 7.
do aluno, sabendo que a nota A tem peso 2, a nota B tem peso 3 e a nota C tem peso 5.
10a Questo) Leia 4 variveis A,B,C e D. A seguir, calcule e mostre a diferena do produto de
11a Questo) O custo ao consumidor de um carro novo a soma do custo de fbrica com
12a Questo) Escreva um programa que leia uma temperatura em graus Celsius e converta para
graus fahrenheit.
C=
5(F 32)
9
13a Questo) Escrever um algoritmo para calcular o volume de uma esfera sendo fornecido o
V olume = 43 ..R3
Onde e uma constante que vale 3.1415 e R o raio da esfera.
19a Questo) Leia um nmero com trs dgitos e imprima-o na ordem inversa, ou seja, se o
20a Questo) Uma pessoa resolveu fazer uma aplicao em uma poupana programada. Para
calcular rendimento, ela dever fornecer o valor constante da aplicao mensal, a taxa e o nmero de
meses. Sabendo-se que a frmula usada nesse clculo e:
32
V alorCalculado = P
(1+i)2 1
i
Onde:
i. i = Taxa;
ii. P = Aplicao Mensal
iii. n = nmero de meses
Faa um algoritmo que calcule o valor da aplicao.
Area =
p
T (T S1)(T S2)(T S3)
Onde,
T =
S1+S2+S3
2
33
4 ESTRUTURAS DE DECISO
Para resolver problemas complexos, um programa deve ser capaz de tomar decises e escolher
uma entre vrias possibilidades. Nestes casos, so necessrias avaliaes bem sucedidas de condies
lgicas. O Pascal dispe de duas estruturas que podem determinar uma direo especca para um
programa: o comando IF-THEN-ELSE e o comando CASE.
BEGIN
ClrScr;
Write('Valor de x? ');
Readln(x)
END
Todo ponto-e-vrgula escrito antes de um END opcional. por isso que omitimos o
ponto-e-vrgula do Readln(x) acima. Tambm comum se acrescentar alguns espaoes em branco
nas linhas de comandos entre o BEGIN e o END (esse acrscimo de espaos em branco costuma ser
chamado endentao ou indentao). Onde a sintaxe do Pascal permitir uma instruo simples,
tambm permitir um comando composto.
ou
IF condio THEN
BEGIN
comando1;
END
ELSE
BEGIN
comando2;
END;
IF condio THEN
BEGIN
comando1;
34
END;
onde condio uma expresso booleana. Se a condio for verdadeira, isto , for avaliada
em TRUE, ento ser executado o comando1; se a condio for falsa (FALSE), ser executado o
comando2. Na sua segunda forma (sem o ELSE), o IF no executar nenhuma ao se a condio
for falsa.
IF
|
/\
TRUE / \ FALSE
+-----<cond>-----+
|
\ /
|
|
\/
|
v
v
+----------+ +----------+
| comando1 | | comando2 |
+----------+ +----------+
|
|
+--->---+---<----+
|
IF
|
/\
TRUE / \ FALSE
+-----<cond>-----+
|
\ /
|
|
\/
|
v
|
+----------+
|
| comando1 |
|
+----------+
|
|
|
+-------<--------+
|
O comando1 ou comando2 acima podem ser comandos compostos ou outras estruturas de deciso.
Exemplo: Consideremos a seguinte estrutura de deciso:
IF (x > 0) THEN
BEGIN
WRITE(Sqrt(x));
END
ELSE
BEGIN
x := 1;
END;
Neste caso, se x for um valor numrico positivo, ento ser mostrado o valor da sua raiz quadrada.
Em caso contrrio, ser atribudo a x o valor constante 1. A condio neste caso a expresso lgica
x > 0, o comando1 o WRITE(Sqrt(x)) e o comando2 a atribuio x := 1. A condio lgica deste
exemplo no precisaria estar entre parnteses.
OBSERVAO IMPORTANTE:
Exemplo: Suponhamos que x seja uma varivel real de um programa e consideremos o seguinte
35
END
ELSE
BEGIN
Writeln('X tem modulo >= 1');
END;
Se x em determinado momento valer 2, ento a expresso booleana (x > -1) AND (x < 1)
ser falsa e, assim, ser mostrada na tela a mensagem X tem modulo >= 1. Os parnteses dessa
expresso booleana so essenciais. Sem eles, teramos
...
Write('Continua? (s/n) '); Readln(resposta);
Continuar := (resposta = 'S') OR (resposta = 's');
(* CONTINUAR ser TRUE somente quando RESPOSTA
for um S, maisculo ou minsculo *)
IF Continuar THEN
BEGIN
(* Inicio do comando composto 1 *)
Write('Forneca o valor de A : ');
Readln(A);
Write('Forneca o valor de B : ');
Readln(B);
END
(* Fim do comando composto 1. Nao pode ter
ponto-e-vrgula aqui *)
ELSE
BEGIN
(* Inicio do comando composto 2 *)
Writeln;
Writeln('Pressione ENTER para encerrar');
Readln;
END; (* Fim do comando composto 2 e fim do IF *)
...
No IF acima, se CONTINUAR for verdadeira, ento sero solicitados valores para A e B. Em
caso contrrio, o programa esperar ser pressionado a tecla ENTER para encerrar. Nas constantes
do tipo char ou string, feita distino entre letras minsculas e maisculas. Logo, 'S' considerado
diferente de 's'.
Exemplo: Queremos, neste exemplo, elaborar um programa que solicite do usurio um nmero
real qualquer x e que seja mostrado na tela a sua raiz quadrada. Se, por exemplo, x for igual a 4,
queremos ver na tela uma mensagem como:
A raiz quadrada de
4.000
2.000
36
3.000 i
A funo pr-denida SQRT(x) calcula a raiz quadrada de x, se x for maior do que ou igual
a 0. Portanto, se x for negativo, deveremos calcular a raiz de -x e acrescentar um "i" direita do
resultado. Temos assim uma situao em que o programa deve decidir se calcula SQRT(x) ou se
calcula SQRT(-x), um caso tpico de uma estrutura de deciso IF:
PROGRAM RaizQuadrada;
VAR
x: real;
BEGIN
Write('Valor de x? '); Readln(x);
IF (x >= 0) THEN
BEGIN
Writeln('A raiz quadrada de ', x:7:3, ' e'' ',SQRT(x):7:3);
END
ELSE
BEGIN
Writeln('A raiz quadrada de ', x:7:3, ' e'' ',SQRT(-x):7:3, ' );
END;
END.
Exemplo: A ordem denida no conjunto das constantes do tipo string ou char uma extenso
da ordem alfabtica. As letras maisculas so diferenciadas das minsculas e ocupam uma posio
anterior s mesmas. Assim, a ordem nesses conjuntos satisfaz a:
'A' < 'B' < 'C' < ... < 'Z' < ... < 'a' < 'b' < ... < 'z'
Devido a isso, temos que 'X' < 'b', 'JOAO PESSOA' < 'joao', 'Matematica' < 'logica'.
No fragmento a seguir, nome1, nome2 e aux so duas variveis do tipo string. Queremos comparar
nome1 com nome2, e se nome1 for maior do que nome2, queremos trocar os valores de nome1
por nome2 entre si. Toda troca de valores de variveis s possvel com a ajuda de uma varivel
intermediria, que neste caso ser aux.
...
IF (nome1 > nome2) THEN
BEGIN
aux := nome1;
(* Troca nome1 *)
nome1 := nome2;
(* por nome2 *)
nome2 := aux;
END;
Se tivssemos, por exemplo, nome1 = 'Joa e nome2 = 'An, aps a execuo do IF anterior
passaramos a ter nome1 = 'An e nome2 = 'Joa. Observe que um fragmento como
37
...
IF (nome1 > nome2) THEN
BEGIN
nome1 := nome2;
nome2 := nome1;
END;
...
no faria a troca desejada. Neste caso, nome1 e nome2 cariam ambas iguais a 'Ana' e o valor 'Joao'
estaria perdido.
Exemplo: O programa a seguir, testa se trs nmeros reais fornecidos pelo usurio podem ser
usados como medidas dos lados de um tringulo retngulo. Exige-se que os valores sejam todos
positivos e fornecidos em ordem crescente. Uma vez fornecido os nmeros, o teste para saber se
eles formam um tringulo retngulo ou no ser testar se o quadrado do maior deles a soma dos
quadrados dos menores.
PROGRAM TrianguloRetangulo;
VAR
a, b, c: real;
teste: boolean;
BEGIN
Write('Forneca 3 nmeros positivos em ordem crescente: ');
Readln(a, b, c);
teste := (a > 0) and (b > 0) and (c > 0) and (a < b) and
(b < c);
(* TESTE ser TRUE somente quando as
condies desejadas forem satisfeitas *)
IF teste THEN
BEGIN
IF (Sqr(c) = Sqr(a) + Sqr(b)) THEN
BEGIN
Writeln(a:6:2, ',', b:6:2, ' e ', c:6:2, ' formam um',
' triangulo retangulo.');
END
ELSE
BEGIN
Writeln(a:6:2, ',', b:6:2, ' e ', c:6:2, ' nao ',
'formam um triangulo retangulo.');
END;
END;
ELSE
BEGIN
Writeln('Os valores fornecidos devem ser positivos e ',
'em ordem crescente.');
END;
END.
Observe que temos dois IF's encaixados. O IF mais interno (IF (Sqr(c)...) s ser executado
quando TESTE for TRUE.
Exemplo: Sendo fornecidos 3 nmeros reais, o programa a seguir mostra o maior entre eles.
38
PROGRAM MaiorDeTres;
VAR
x, y, z, maior: real;
BEGIN
Write('Digite tres numeros: '); Readln(x, y, z);
Writeln;
IF (x > y) THEN
BEGIN
IF (x > z) THEN
BEGIN
maior := x;
END;
ELSE
BEGIN
maior := z;
END
END
ELSE
BEGIN
IF (y > z) THEN
BEGIN
maior := y;
END
ELSE
BEGIN
maior := z;
END;
END;
Writeln('O maior dos tres ' ', maior:6:2)
END.
Observe a ausncia do ponto-e-vrgula em muitas das linhas acima.
Exemplo: Resolver uma equao do segundo grau, sendo fornecidos seus coecientes a, b e c.
Nosso roteiro na elaborao do programa ser o seguinte:
b+
2a
b
2a
Estamos colocando o mdulo na parte imaginria simplesmente porque queremos que x1 tenha
parte imaginria positiva e x2 a parte imaginria negativa, independentemente de a ser positivo ou
no.
39
Limpar a tela;
Mostrar a equacao;
Imprimir as razes.
Seguindo esse roteiro, temos o seguinte programa:
PROGRAM Eq_2o_Grau;
{ ======================================================== }
{
RESOLUCAO DE EQUACOES DO SEGUNDO GRAU
}
{ ======================================================== }
USES Crt;
VAR
a, b, delta, x1, x2, ReX, ImX: real;
BEGIN
Writeln('
2');
Writeln('RESOLUCAO DA EQUACAO ax + bx + c = 0');
Writeln;
Write('Forneca os coeficientes a, b, c : ');
Readln(a, b, c);
IF (a = 0) THEN
{ Encerra a execucao quando a = 0 }
BEGIN
Writeln('O valor de "a" nao deve ser nulo.');
HALT;
END;
{ Calculo do discriminante }
delta := Sqr(b) - 4*a*c;
IF (delta >= 0) THEN
{ Caso das raizes reais }
BEGIN
x1 := (-b + Sqrt(delta))/(2*a); { raiz 1 }
x2 := (-b - Sqrt(delta))/(2*a); { raiz 2 }
END
ELSE
{ Caso das raizes complexas }
BEGIN
ReX := (-b)/(2*a);
{ Parte real das raizes }
ImX := Abs(Sqrt(-delta)/(2*a)); { Parte imaginaria }
END;
ClrScr;
{ Limpa a tela }
Writeln(' ':19, '2');
Writeln('EQUACAO: (', a:7:2, ')x + (', b:7:2, ')x + (',
c:7:2, ') = 0');
Writeln;
IF (delta >= 0) THEN
BEGIN
Writeln('Raizes reais: ', x1:7:2, ' e ', x2:7:2);
END
ELSE
BEGIN
Writeln('Raizes complexas: ', ReX:7:2, ' + ',ImX:7:2, ' );
Writeln(' ':18, ReX:7:2, ' - ', ImX:7:2, ' );
END;
Readln;
{ pausa }
40
END.
Aps a execuo desse programa, temos na tela mensagens como:
2
EQUACAO: (
1.00)x + ( -2.00)x + (
3.00) = 0
Raizes complexas:
1.00 +
1.41 i
1.00 1.41 i
Deixamos aos usurios com uma disposio maior de trabalho o exerccio de melhorar a sada
desses resultados, fazendo-a mais prxima do usual. Por exemplo, no exemplo executado acima, seria
mais interessante (e mais trabalhoso) mostrar uma linha como
2
EQUACAO: x - 2 x + 3 = 0.
Observao: Um dos aspectos que mais causam confuso com relao ao IF em qualquer
IF condio1 THEN
BEGIN
IF condio2 THEN
BEGIN
comando1;
END;
END
ELSE
BEGIN
comando2;
END;
A qual dos dois IF's anteriores o ELSE se refere? A forma na qual os IF's foram escritos sugere
erroneamente que o ELSE est relacionado com o primeiro IF. No entanto, ele est relacionado com o
segundo IF. Em geral, o ELSE est ligado ao IF mais prximo. Assim, uma forma melhor de escrever
o fragmento acima :
IF condio1 THEN
BEGIN
IF condio2 THEN
BEGIN
comando1;
END
ELSE
BEGIN
comando2;
END;
END;
41
Se quisssemos realmente que o ELSE estivesse relacionado com o primeiro IF, ento a forma
correta de se escrever seria:
IF condio1 THEN
BEGIN
IF condio2 THEN
BEGIN
comando1;
END;
END
ELSE
BEGIN
comando2;
END;
Este tipo de erro lgico em um programa, em geral, difcil de se detectar. Ele costuma ser
chamado de "armadilha dos IF's encaixados".
Algoritmos abaixo:
a)
SE a = 5 E b = 7 Entao
c: c + 1
seno
c := c - 1;
fim-se
(
(
(
(
(
)
)
)
)
)
42
b)
se a = 5 e b < 7 entao
c := 1
senao
se c = 8 entao
c := 2
senao
c := 4
fim-se
fim-se
(
(
(
(
(
(
(
(
(
)
)
)
)
)
)
)
)
)
43
X := (A + B) / D * (C + D)
fim-se
Escrever X
c) Resposta: ______
Se (A > 2) E (B < 7) entao
X := (A + 2) * (B - 2)
senao
X := X := (A + B) * D / (C + D)
fim-se
Escrever X
d) Resposta: ______
Se (A >= 2) OU (C < 1) Entao
X := (A + D) / 2;
senao
X := D * C;
fim-se
Escrever X
e) Resposta: ______
Se nao (A > 2) ou nao (B < 7) entao
X := A + E;
senao
X := A / E;
fim-se
Escrever X
f) Resposta: ______
Se nao (A > 3) e nao (B < 5) entao
X := A + D;
senao
X := D / B
fim-se
Escrever X
4.2.2 EXERCCIOS
1a Questo) Faa um programa que leia dois nmeros inteiros A e B da entrada padro (teclado)
do sexo feminino e tiver menos de 25 anos, imprimir o nome e a mensagem: ACEITA. Caso contrrio,
imprimir o nome e a mensagem no aceita. (Considerar para o Sexo as letras F,f,M ou m).
4a Questo)Faa um programa que leia dois nmeros inteiros A e B da entrada padro (teclado)
44
Carioca;
Paulista;
mineiro;
Outros estados.
6a Questo)Faa um programa que leia dois inteiros A e B e imprima a soma destes valores se
eles forem iguais, seno, ou seja, se forem diferentes imprima o seu produto.
mdia ponderada do aluno, considerando que o peso para a maior nota seja 4 e para as duas restantes,
3. Mostre o cdigo do aluno, suas trs notas, a mdia calculada e uma mensagem APROVADO se
a mdia for maior ou igual a 5 e "REPROVADO"se a mdia for menor que 5.
10a Questo) Faa um algoritmo que leia um no inteiro e mostre uma mensagem indicando se
11a Questo) Tendo como dados de entrada a altura e o sexo de uma pessoa (M masculino e F
Feminino), construa um algoritmo que calcule seu peso ideal, utilizando as seguintes frmulas:
12a Questo)Um usurio deseja um algoritmo onde possa escolher que tipo de mdia deseja
calcular a partir de 3 notas. Faa um algoritmo que leia as notas, a opo escolhida pelo usurio e
calcule a mdia.
1 - aritmtica
2 - ponderada (3,3,4)
13a Questo) Elaborar um algoritmo que l 3 valores a,b,c e verica se eles formam ou no um
tringulo. Supor que os valores lidos so inteiros e positivos. Caso os valores formem um tringulo,
calcular e escrever a rea deste tringulo. Se no formam tringulo escrever os valores lidos. ( se a >
b + c no formam tringulo algum, se a o maior).
14a Questo) O departamento que controla o ndice de poluio do meio ambiente mantm 3
grupos de indstrias que so altamente poluentes do meio ambiente. O ndice de poluio aceitvel
varia de 0,05 at 0,25. Se o ndice sobe para 0,3 as indstrias do 1o grupo so intimadas a suspenderem
suas atividades, se o ndice cresce para 0,4 as do 1o e 2o grupo so intimadas a suspenderem suas
atividades e se o ndice atingir 0,5 todos os 3 grupos devem ser noticados a paralisarem suas
atividades. Escrever um algoritmo que l o ndice de poluio medido e emite a noticao adequada
aos diferentes grupos de empresas.
45
16a Questo) Escrever um algoritmo que leia a idade de uma pessoa em dias e informe-a em
anos, meses e dias. Suponha que 1 ano possua 365 dias e um ms possua 30 dias.
17a Questo)Faa um algoritmos para ler um nmero e imprimir se ele igual a 5, 200 ou 400.
Se no vericar se o mesmo est no intervalo entre 500 e 1000 inclusive , ou se est fora do escopo
especicado.
18a Questo)Faa um algoritmo que leia o percurso em quilmetros, o tipo de carro e informe
o consumo estimado de combustvel, sabendo-se que um carro do tipo C faz 12 Km com um litro de
gasolina, um do tipo B faz 9 Km e o do tipo A faz 8 Km por litro.
19a Questo) 19a Questo) Um endocrinologista deseja controlar a sade de seus pacientes e,
para isso se utiliza de um ndice de massa corporal (IMC). Sabendo-se que o IMC calculado atravs
da frmula abaixo:
IM C =
P eso
Altura2
Onde o Peso dado em Kg e a Altura dada em metros. Faa um algoritmo que apresente o nome
do paciente e sua faixa de risco, baseando-se na seguinte tabela 4.2.2:
ambas subdivididas em dois valores distintos : horas e minutos. Calcular e escrever a durao do
jogo, tambm em horas e minutos, considerando que o tempo mximo de durao de um jogo de
24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte.
2a Questo) Escrever um algoritmo que l um valor em reais e calcula qual o menor nmero
possvel de notas de 100, 50, 10, 5 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido
e a relao de notas necessrias.
46
CASE expresso OF
val_1 : comando1;
val_2 : comando2;
...
...
ELSE
comandoN;
END;
O valor da expresso ordinal avaliado e comparado com cada valor alvo val_1, val_2, ... .
Se existir algum valor alvo que coincida com o valor da expresso, ento ser executado apenas o
comando que estiver associado aquele valor. Se o valor da expresso no coincidir com nenhum valor
alvo, ento ser executado o comando que estiver associado ao ELSE, se esse comando existir. O
ELSE de um CASE opcional. Para encerrar o CASE deveremos ter um END, mas no temos um
BEGIN para iniciar.
CASE
|
+---+ val_1
+----------+
| e |--------->----| comando1 |---->----+
| x |
+----------+
|
| p | val_2
+----------+
|
| r |--------->----| comando2 |---->----+
| e |
+----------+
|
| s |
...
...
|
| s |
|
| | ELSE
+----------+
|
| o |--------->----| comandoN |---->----+
+---+
+----------+
|
v
Exemplo: Suponhamos que x seja uma varivel inteira. Ento o comando CASE abaixo executar
o comando1 quando tivermos x = 5, o comando2 quando x = 11, o comando3 quando x = -4 e o
comando4 quando x for diferente desses trs valores anteriores.
CASE x OF
5 : comando1;
11 : comando2;
-4 : comando3;
ELSE
comando4;
END;
47
Em um CASE, no lugar de um nico valor alvo, podemos ter um lista de valores alvo associados a
um mesmo comando. Nessa lista, os valores devem ser separados por vrgulas ou fornecidos em forma
de intervalo valor1..valor2, onde valor1 e valor2 so, respectivamente, os limites inferior e superior do
intervalo. Por exemplo, 1..1000 uma forma abreviada de se referir aos inteiros de 1 a 1000 e 'A'..'G'
o mesmo que 'A', 'B', 'C', 'D', 'E', 'F', 'G'.
Exemplo: Seja N inteiro que possa assumir em um programa valores de 0 a 100. Consideremos o
seguinte CASE:
CASE N OF
1, 3, 5,
7, 9 : Write('N impar, N <= 10');
2, 4, 6,
8, 10 : Write('N par, N <= 10');
11..20
: Write('11 <= N <= 20');
21..100
: Write('21 <= N <= 100');
END;
De acordo com o valor de N, ser mostrada apenas uma das mensagens "N impar, N <= 10",
"N par, N <= 10", "11 <= N <= 20"ou "21 <= N <= 100".
Exemplo: Consideremos no CASE abaixo, CH como uma varivel do tipo ordinal char.
CASE Ch OF
'A'..'Z', 'a'..'z' :
Writeln('E'' uma letr);
'0'..'9':
Writeln('E'' um algarism);
'+', '-', '/', '*':
Writeln('E'' uma operaca);
ELSE
Writeln('E'' um caracter especial');
END;
De acordo com o valor de CH, ser mostrada uma mensagem especca, dizendo se CH letra,
digito, operador ou smbolo especial ('<', ' ?', '[', '$', '%', ...)
Exemplo: O programa a seguir l dois nmeros reais A e B do teclado e mostra na tela um menu
onde o usurio poder selecionar uma das operaes A+B, A-B, A/B, A*B ou A elevado a B. Uma
vez feita a escolha da operao, seu resultado ser mostrado na tela. Para ler qual foi o nmero da
opo do menu, poderamos usar um READLN(opcao), mas no vamos us-lo. Vamos usar um outro
comando de entrada chamado READKEY. Sua sintaxe :
Varivel := READKEY;
O READKEY espera que seja digitado um caracter do teclado e o associa varivel do tipo
char escrita antes do smbolo de atribuio ( := ). Alm disso, READKEY no mostra o caracter
digitado na tela, nem espera ser pressionado ENTER. Os comandos CASE e READKEY so ideais
para serem usados em menus.
PROGRAM Menu;
48
USES Crt;
VAR a, b, resultado: real;
opcao, pausa: char;
BEGIN
Write('Forneca dois numeros: '); Readln(a, b);
Writeln;
ClrScr;
Writeln;
(* Impressao do menu na tela *)
Writeln('=================== M E N U ==================');
Writeln('|
|');
Writeln('|
A = ',a:9:3,'
|');
Writeln('|
B = ',b:9:3,'
|');
Writeln('|
|');
Writeln('+--------------------------------------------+');
Writeln('|
|');
Writeln('|
1. A + B
4. A/B
|');
Writeln('|
2. A - B
B
|');
Writeln('|
3. A*B
5. A
|');
Writeln('|
|');
Writeln('======== Selecione uma opcao de 1 a 5 ========');
Writeln;
opcao := READKEY; { Le um caracter do teclado
}
CASE opcao OF
{ Calcula o resultado desejado }
'1' : resultado := A + B;
'2' : resultado := A - B;
'3' : resultado := A*B;
'4' : IF (B <> 0) THEN
{ A/B nao ser calculado }
resultado := A/B
{ se B = 0
}
ELSE
BEGIN
Writeln('Opcao invalida neste caso.');
Halt
END;
'5' : IF (A > 0) THEN
{ B
}
resultado := Exp(B*Ln(A))
{ A
s
ser }
ELSE
{ calculado se }
BEGIN
{ A for positivo }
Writeln('Opcao invalida neste caso.');
Halt
END;
END; { fim do CASE }
{ Mostra o resultado na tela }
Writeln;
Writeln('Opcao = ', opcao, '
Resultado = ',
resultado:9:3);
Writeln;
Writeln('Pressione qualquer tecla para encerrar.');
pausa := READKEY
END.
49
4.4 EXERCCIOS
1a Questo) Em que situaes mais indicado o uso da estrutura CASE-OF ?
2a Questo) Em que situaes no podemos utilizar a estrutura CASE-OF ?
3a Questo)Desenvolva um programa que leias dois nmeros inteiros da entrada padro com os
a.
b.
c.
d.
A
A
A
A
+
*
/
B
B
B
B
4a Questo) Faa um programa em Pascal que leia um nmero que represente um ms do ano.
Aps a leitura, imprima o ms correspondente por extenso. Caso o nmero entrado no esteja na
faixa de 1 at 12, imprima uma mensagem informando ao usurio que o ms invlido.
5a Questo) Faa um programa em pascal que leia a idade de uma pessoa e informe o seu grau
Idade
0 at 3
4 at 10
11 at 18
Acima de 18
Classificao
Beb
Criana
Adolescente
Adulto
6a Questo) Supondo que a cobrana de imposto de renda na fonte seja feita com base na tabela
abaixo, elabore um programa que mostre na tela o valor do imposto, quando o usurio fornecer o
valor do salrio (inteiro).
+------------------------+----------+-------------------+
|
salario (em Cr$)
| alquota | parcela a deduzir |
+------------------------+----------+-------------------+
|
at 200000
|
---- |
----|
| de 200001 a 300000
|
5%
|
10000
|
| de 300001 a 400000
| 10%
|
25000
|
| de 400001 a 500000
| 15%
|
45000
|
| a partir de 500001
| 20%
|
70000
|
+------------------------+----------+-------------------+
Por exemplo, para um salrio de 350000, temos uma alquota de 10valor do imposto, segundo a
tabela, dever ser de
10000 cruzeiros.
7a Questo) Em cada caso abaixo, determine o valor do inteiro x aps a execuo do seguinte
50
a) y = 7;
b) y = -7;
c) y = 2;
d) y = -2;
e) y = 20
CASE y OF
-10..0 : x := 5;
2, 4 : x := y div 2 + Sqr(y - 1);
5..10 : BEGIN
IF Odd(y) THEN y := 12;
x := Round(Sqrt(y + 5))
END;
ELSE
IF y > 4 THEN x := 0 ELSE x := 1;
END;
51
5 ESTRUTURAS DE REPETIO
ou
Observe que:
VARIVEL a varivel de controle do FOR, que deve ser do tipo ordinal (integer).
VALORINICIAL o valor que a varivel de controle assumir na primeira iterao. Deve ser
do mesmo tipo da varivel de controle.
VALORFINAL o valor que a varivel de controle assumir na ltima iterao. Deve ser do
mesmo tipo da varivel de controle.
COMANDO o comando que ser executado em cada iterao. Pode ser uma seqncia
nita de outros comandos delimitada por BEGIN-END (comando composto). Se ValorInicial
<= ValorFinal, ento deve ser usado um FOR-TO. Caso contrrio, deve ser usado um
FOR-DOWNTO.
Um esboo da execuo do FOR o seguinte:
52
ii. Antes de cada iterao subseqente, a varivel de controle recebe o prximo valor (no caso do
ii. A varivel i passa a ter o valor seguinte ao anterior, ou seja, i passa a valer 2 e o comando
executado. mostrado, ento, o quadrado de 2 na tela.
iii. A varivel de controle i vai ser aumentada de uma em uma unidade e a cada acrscimo o
WRITELN executado. Esse processo acaba quando a varivel atingir o valor 5.
FOR i := 100 TO 50 DO
BEGIN
comando;
END;
FOR j := 1 DOWNTO 20 DO
BEGIN
comando;
END;
53
No FOR i... e no FOR j... acima, o comando escrito aps o DO no ser executado nenhuma vez.
Exemplo: A varivel de controle do FOR, quando for numrica, ter de ser do tipo inteiro e s
poder aumentar ou diminuir de 1 em 1. Podemos multiplicar ou dividir essa varivel todas as vezes
em que ela aparecer no comando, como forma de aumentar ou diminuir o valor do incremento em
cada iterao. Por exemplo,
lista todos os pares de 0 a 100, e FOR i := 200 DOWNTO 100 DO Writeln(ArcTan(i/100)) lista os
valores de ArcTan(2), ArcTan(1.99), ArcTan(1.98),... at ArcTan(1).
Exemplo: Os tipos pr-denidos byte e char ambos tm 256 valores. As funes que estabelem
uma bijeo entre esses valores so as funes ORD e CHR, inversas uma da outra.
Os valores que o n acima podem assumir so de 0 a 255 e o x desde o primeiro ao ltimo caracter
pr-denido do computador (de um total de 256).
CHR(n) tambm pode ser denotado como #n. Alguns valores particulares dessas funes so:
ORD('$')
ORD('+')
ORD('7')
ORD('A')
ORD('B')
ORD('C')
ORD('Z')
ORD('\')
ORD('a')
ORD('z')
= 36
= 43
= 55
= 65
= 66
= 67
= 90
= 92
= 97
= 122
CHR(36)
CHR(43)
CHR(55)
CHR(65)
CHR(66)
CHR(67)
CHR(90)
CHR(92)
CHR(97)
CHR(122)
=
=
=
=
=
=
=
=
=
=
'$'
'+'
'7'
'A'
'B'
'C'
'Z'
'\'
'a'
'z'
ou
ou
ou
ou
ou
ou
ou
ou
ou
ou
#36
#43
#55
#65
#66
#67
#90
#92
#97
#122
=
=
=
=
=
=
=
=
=
=
'$'
'+'
'7'
'A'
'B'
'C'
'Z'
'\'
'a'
'z'
As tabelas de valores de CHR ou ORD costumam ser chamadas de tabelas ASCII (American
Standard Code for Information Interchange). O programa a seguir, gera na tela uma tabela ASCII.
PROGRAM TabelaASCII;
{ ---------------------------------------- }
{
TABELA ASCII
}
{ ---------------------------------------- }
USES Crt;
VAR
i: byte;
BEGIN
ClrScr;
Writeln(' n Chr(n)');
Writeln('-----------');
FOR i := 0 TO 255 DO
BEGIN
54
Writeln(i:4, Chr(i):4);
IF (i MOD 10 = 0) AND (i > 0) THEN
BEGIN
Writeln;
Writeln('Pressione [ENTER] para continuar.');
Readln;
Writeln(' n Chr(n)');
Writeln('-----------');
END; { fim do IF }
END; { fim do FOR }
END. { fim do programa }
No programa acima, a varivel inteira i varia de 0 a 255. Devido ao IF (i MOD 10...) , sempre
que i for maior que 0 e mltiplo de 10 , o programa far uma pausa. Ao ser pressionado a tecla
ENTER, sero mostradas mais 10 linhas da tabela e assim o programa prossegue at chegar em i =
255. Alguns caracteres ASCII so smbolos que no podem ser impressos. Por exemplo, o #7 um
som de bip (beep).
Ao ser executado, ele gera na tela varios trechos como esse:
n Chr(n)
----------61 =
62 >
63 ?
64 @
65 A
66 B
67 C
68 D
69 E
70 F
Pressione [ENTER] para continuar.
Exemplo: Neste exemplo, vamos calcular o valor de um somatrio. Em particular, consideraremos
a soma dos 5 primeiros termos da srie cujo termo geral n21+1 Chamaremos a varivel que vai guardar
o valor do somatrio de S. Em todo clculo de somatrio, a varivel que ir guardar o valor da soma
dever ter um valor inicial nulo. A seguir, usamos um FOR com varivel de controle fazendo o papel
do ndice do termo geral do somatrio para atuar no comando S := S + Termo_Geral, o que neste
caso, S := S + 1/(n2 + 1). Ao nal da execuo do FOR, temos em S o valor da soma desejada.
PROGRAM Somatorio;
{ ------------------------------------------- }
{
CALCULO DE UM SOMATORIO
}
{ ------------------------------------------- }
VAR
S: real;
n: integer;
CONST
IndiceInicial = 1;
55
IndiceFinal = 5;
BEGIN
S := 0; { valor inicial de S }
FOR n := IndiceInicial TO IndiceFinal DO
BEGIN
S := S + 1/(Sqr(n) + 1);
END;
Writeln('Valor do somatorio = ', S:8:4);
END.
Neste exemplo, so feitas as seguintes atribuies de valores a S:
S
S
S
S
S
S
:=
:=
:=
:=
:=
:=
0;
0 + 1/2;
1/2 + 1/5;
(1/2 + 1/5) + 1/10;
(1/2 + 1/5 + 1/10) + 1/17;
(1/2 + 1/5 + 1/10 + 1/17) + 1/26;
(
(
(
(
(
n
n
n
n
n
=
=
=
=
=
1
2
3
4
5
)
)
)
)
)
Exemplo: Neste exemplo, queremos calcular a soma dos 10000 primeiros termos das sries cujos
termos gerais so n1 e n12 . No vamos nos contentar s com o resultado nal, queremos acompanhar o
valor do somatrio de 1000 em 1000 termos. A srie 1/n2 converge para ( 2 )/6; logo, a raiz quadrada
de 6 vezes o somatrio de 1/n2 fornece uma aproximao para o valor de .
Usaremos quatro caracteres ASCII especiais: o #227 que um pi minsculo, o #228 que
um sigma maisculo, o #253 que um expoente 2 e o #247 que usaremos como smbolo de
aproximadamente.
A unidade CRT dispe de dois comandos para alterar as cores de textos da tela. So eles o
TEXTCOLOR, para alterar a cor do texto, e TEXTBACKGROUND, para alterar a cor de fundo.
Suas sintaxes so:
TextColor(Nome_da_cor)
e
TextBackground(Nome_da_cor)
onde Nome_da_cor pode ser uma das seguintes constantes:
Black
Green
Red
Brown
DarkGray
LightGreen
LightRed
Yellow
Blink
=
=
=
=
=
=
=
=
=
0;
2;
4;
6;
8;
10;
12;
14;
128;
Blue
Cyan
Magenta
LightGray
LightBlue
LightCyan
LightMagenta
White
=
=
=
=
=
=
=
=
1;
3;
5;
7;
9;
11;
13;
15;
56
Em cada caso, pode ser usado o nome ou o nmero da cor. Deve-se somar blink ou 128 ao
nome ou nmero da cor do texto para se ter caracteres piscantes. Por exemplo, TextColor(Yellow)
o mesmo que TextColor(14) e ajusta a cor do texto para amarelo. Se somarmos 128 a 14, como em
TextColor(14 + 128) teremos um amarelo piscante.
Usaremos esses comandos para alterar a cor do cabealho do programa; queremos v-lo em vdeo
reverso (letras pretas em fundo branco).
PROGRAM DoisSomatorios;
{ =================================================== }
{
CALCULO SIMULTANEO DE DOIS SOMATORIOS
}
{ =================================================== }
USES
Crt;
VAR
n: integer;
Soma1, Soma2: real;
BEGIN
ClrScr;
Writeln;
TextColor(Black);
TextBackground(White);
Writeln('
', #228, ' 1/n
', #228,
' 1/n', #253, ' ');
TextColor(White);
TextBackground(Black);
Writeln;
Soma1 := 0;
Soma2 := 0;
(* valores iniciais dos somatorios *)
FOR n := 1 TO 10000 DO
BEGIN
Soma1 := Soma1 + 1/n;
Soma2 := Soma2 + 1/Sqr(n);
IF (n MOD 1000 = 0) THEN
(* Se n for multiplo *)
BEGIN
Writeln(Soma1:10:6, Soma2:10:6); (* de 1000, entao *)
END;
END;
(* mostrada o valor da soma parcial. *)
Writeln;
Writeln(' ', #227, ' ', #247, ' ', Sqrt(6*Soma2):8:6);
END.
Aps a execuo, vemos na tela a listagem a seguir. Onde escrevemos S, e =, aparecem
na tela, respectivamente, um sigma maisculo, um pi minsculo e um smbolo de aproximao.
S 1/n
S 1/n^2
7.485471
8.178368
8.583750
8.871390
1.643935
1.644434
1.644601
1.644684
57
9.094509
9.276814
9.430953
9.564475
9.682251
9.787606
1.644734
1.644767
1.644791
1.644809
1.644823
1.644834
Pi = 3.141497
Vemos na ltima linha da tabela acima que o valor das somas dos 10000 termos das sries
9.787606 e 1.644834.
Exemplo: Fornecido um inteiro n, vamos construir um programa que fornea o fatorial de n.
Vamos chamar a varivel que vai guardar o valor do produto de P. Inicialmente, deveremos
fazer P := 1. Alis, para calcularmos repetidamente uma determinada operao, deveremos fazer
inicialmente a varivel que vai guardar o resultado nal igual ao elemento nutro da operao. A
seguir, usamos um FOR com um comando do tipo P := P*Termo_Geral, o que, neste caso, P :=
P*n ("n" o termo geral do produto neste caso).
Temos ento o seguinte:
PROGRAM Fatorial;
VAR
i, n: integer;
P: real;
BEGIN
Write('Valor de N? ');
Readln(n);
P := 1;
FOR i := 2 TO n DO
BEGIN
P := P * i;
END;
Writeln;
Writeln(n, '! = ', P);
END.
Neste exemplo, sero executadas as seguintes atribuies:
P :=
P :=
P :=
P :=
...
P :=
1;
1*2;
( i = 2
(1*2)*3;
( i = 3
(1*2*3)*4;
( i = 4
...
...
(1*2*...*(n-1))*n; ( i = n
Valor de N? 3
)
)
)
)
58
3! =
6.00000000+E0000
Exemplo: Fornecido um inteiro N, queremos agora um programa que diga se N primo ou no.
Nosso algoritmo ser o seguinte: faremos uma varivel i variar de 2 at o inteiro mais prximo da raiz
quadrada de N. Usaremos um FOR i... para isso. Para cada valor de i, calculamos o resto da diviso
de N por i, ou seja, N MOD i. Se houver algum resto nulo, isto , se N MOD i = 0 para algum i, isto
signica que N divisvel por i e, portanto, N nesse caso no primo. Se no acontecer de N MOD
i = 0 com i variando de 2 at ROUND(SQRT(N)), ento N primo.
PROGRAM Primo;
VAR N, i: integer;
BEGIN
Write('Forneca um inteiro N : '); Readln(N);
IF (N < 0) THEN
BEGIN
N := -N; { se N for negativo, ento ele }
END;
{ ter seu sinal trocado
}
IF (N <= 1) THEN
{ casos particulares }
BEGIN
Writeln(N, ' nao e'' primo.');
{ N = 0 e N = 1
END
ELSE
BEGIN
{ caso geral }
FOR i := 2 TO Round(Sqrt(N)) DO
BEGIN
IF (N MOD i = 0) THEN
BEGIN
Writeln(N, ' nao e'' primo');
Halt; { encerra o programa }
END;
END;
{ No caso do FOR encerrar com N MOD i <> 0 para
todo i, temos que N e' primo: }
Writeln(N, ' e'' primo.');
END; { fim do IF }
END.
Forneca um inteiro N : 13
13 e' primo.
Exemplo: A varivel de controle de um FOR tambm pode ser do tipo booleano. Neste exemplo
faremos um programa que imprime uma tabela-verdade de uma determinada expresso lgica. Para
isso, usaremos dois FOR encaixados para gerar todas as "entradas"da tabela. A expresso lgica
deste exemplo (X OR Y) AND (NOT X OR NOT Y) que denotaremos por (X v Y) ( X v Y).
59
PROGRAM TabelaVerdade;
VAR
x, y, expressao: boolean;
BEGIN
Writeln;
Writeln('--------------------------------');
Writeln(' X
Y
(X v Y) ^ (~X v ~Y)');
Writeln('--------------------------------');
for x := FALSE to TRUE do
begin
for y := FALSE TO TRUE do
begin
if x then
begin
Write(' V ');
end
else
begin
Write(' F ');
end;
if y then
begin
Write(' V ');
end
else
begin
Write(' F ');
end;
expressao := (x OR y) AND (NOT x OR NOT y);
if expressao then
begin
Writeln('
V');
end;
else
begin
Writeln('
F');
end;
end; (* fim do FOR y ... *)
end; (* fim do FOR x *)
Writeln('--------------------------------')
END.
O nico comando do FOR x ... o FOR y ... . No caso de laos FOR encaixados, o FOR mais
interno varia mais rapidamente que o mais externo.
Executando-se esse programa, temos a seguinte tabela:
-------------------------------X
Y
(X v Y) ^ (~X v ~Y)
-------------------------------F
F
F
F
V
V
60
V
F
V
V
V
F
--------------------------------
Observando a tabela acima, podemos concluir que a expresso (x OR y) AND (NOT x OR NOT
y) equivalente ao ou exclusivo x XOR y.
5.1.1 EXERCCIOS
1a Questo) Faa um algoritmo que um nome e imprima-o quantas vezes for a quantidade de
2a Questo) Faa um Programa que leia a nota de PRI e PRII de 5 alunos. Calcule e exiba a
mdia e situao de cada aluno, ou seja >= 7,0 aprovado, entre 7,0 e 4,0 Prova Final e menor que 4
Reprovado.
3a Questo) Escreva um algoritmo que gere o nmeros de 1000 a 1999 e escreva aqueles que
4a Questo) Apresente o quadrado de cada um dos nmeros pares entre 1 e 1000, inclusive.
5a Questo) Leia 2 valores: X e Y. A seguir, calcule e mostre a soma dos nmeros impares entre
eles.
6a Questo) Leia 2 valores: X e Y. A seguir, calcule e mostre a soma dos nmeros pares entre
eles.
7a Questo) Foi feita uma pesquisa entre os habitantes de uma regio. Foram coletados os dados
entre 0 e 50.
9a Questo) Faa um algoritmo que leia 2 valores inteiros e positivos: X e Y. O algoritmo deve
10a Questo) Faa um algoritmo que leia 1 valores para uma N. A seguir, mostre a tabuada de
1 x N = N
2 x N = 2N
...
10 x N = 10N
61
1
1
1
1
1
2
2
2
2
2
3
3
3
3
3
4
4
4
4
4
5
5
5
5
5
6
6 7
6 7 8
6 7 8 9
12a Questo) Escreva um algoritmo que leia um nmero n (nmero de termos de uma progresso
13a Questo)Escrever um algoritmo que leia um nmero n e mostre o nmero lido e seu fatorial.
14a Questo) Escrever um algoritmo que calcule e mostre a mdia aritmtica dos nmeros lidos
entre 13 e 73.
15a Questo) Escrever um algoritmo que gera e escreve os nmeros mpares entre 100 e 200.
16a Questo) Escreva um algoritmo que l um valor n inteiro e positivo e que calcula a seguinte
soma:
S =1+
1
2
+ 13 + 41 + .... +
1
n
17a Questo) Escrever um algoritmo que diz se um nmero X fornecido pelo usurio ou no
primo.
18a Questo) Escreva um algoritmo que leia 10 valores, um de cada vez. Mostre ento o maior
valor lido.
19a Questo) Faa um algoritmo que gere e mostre os valores primos entre 1 e 1000. Mostre
20a Questo) Escreva um algoritmo que calcula e mostra a soma dos nmeros primos entre 92
e 1478.
23a Questo) Escrever um algoritmo/programa em Pascal que escreve os nmeros primos entre
24a Questo) Faa um algoritmo que leia oito nomes e infome a quantidade de letras de cada
um deles.
todos inteiros e positivos, um de cada vez. Se m for par, vericar quantos divisores possui e escrever
esta informao. Se m for impar e menor do que 10 calcular e escrever o fatorial de m. Se m for impar
e maior ou igual a 10 calcular e escrever a soma dos inteiros de 1 at m.
2a Questo) Escrever um algoritmo que l um valor N inteiro e positivo e que calcula e escreve
o valor de E.
62
E =1+
1
1!
1
2!
1
3!
1
4!
+ .... +
1
n!
3a Questo) A srie de Fibonacci tem como dados os 2 primeiros termos da srie que so
WHILE expresso DO
BEGIN
comando;
END;
onde expresso uma expresso booleana e comando uma instruo simples ou um comando
composto.
O WHILE funciona da seguinte maneira: enquanto a expresso booleana for verdadeira, o
comando aps o DO ser executado repetidamente. A expresso reavaliada aps cada execuo
do comando. O lao WHILE s se encerra quando a expresso for falsa. Se a expresso for falsa j
quando o WHILE se inicia, ento o comando no ser executado nenhuma vez. No comando, deve ter
alguma instruo que possa modicar o valor da expresso booleana, seno o WHILE ser executado
indenidamente.
WHILE
|
/\
FALSE / \
+--<--<cond>---<--+
|
\ /
|
|
\/
|
v
| TRUE
^
|
v
|
| +---------+ |
| | comando |->-+
| +---------+
v
Exemplo:
...
x := 11;
WHILE (x < 1992) DO
BEGIN
Write(x:5);
x := x + 11;
END;
...
63
i. Aps a atribuio inicial (que recomendada em todo WHILE) avaliada a expresso booleana
x < 1992. Sendo ela verdadeira (porque 11 < 1992), o comando composto entre o BEGIN e o
END executado. Desse modo, 11 mostrado na tela e a atribuio x := x + 11 executada
e x passa a valer 11 + 11 = 22.
ii. A expresso x < 1992 reavaliada com x = 22 e novamente verdadeira. O comando composto
ento executado mais uma vez e x passa a valer 22 + 11 = 33.
iv. Quando a expresso for falsa, o lao WHILE se encerrar e o controle do programa passar
para o comando seguinte ao WHILE.
Assim, o fragmento acima mostra na tela todos os mltiplos de 11 que so menores que 1992.
Assumimos, implicitamente, que x inteiro. No WHILE as variveis podem ser de qualquer tipo:
inteiro, real, string, ... .
Exemplo: O programa a seguir conta quantos termos do tipo 1/n com n inteiro e n >= 1 so
necessrios somar para se obter um resultado maior do que 15.
PROGRAM ContaParcelas;
(*
1
1
Determina a quantidade de termos de 1 + --- + --- + ...
2
3
que necessrio somar para se ter uma soma > 15. *)
VAR
n: integer;
soma: real;
BEGIN
soma := 0;
(* Valores iniciais das variveis *)
n := 0;
(* usadas no WHILE
*)
WHILE soma <= 15 DO
(*
"ENQUANTO a soma no for *)
BEGIN
(* maior que 15 ...
*)
n := n + 1;
soma := soma + 1/n; (* ... some termos da forma 1/n" *)
END;
Writeln('Deve-se somar ', n, ' parcelas.');
END.
Neste exemplo no h possibilidade de se usar um comando como o FOR porque no se sabe
a quantidade de vezes que o comando soma := soma + 1/n deve ser executado. A "resposta"do
programa acima que deve-se somar 1.835.421 termos do tipo 1/n para se ter uma soma maior do
que 15.
Observao: O comando FOR pode ser considerado como um caso particular de WHILE. o
que est exemplicado nos fragmentos abaixo, onde todas as variveis so inteiras.
<-->
i := LimInf;
WHILE i <= LimSup DO
64
comando;
BEGIN
comando;
i := i + 1;
END;
5.2.1 EXERCCIOS
1a Questo) Chico tem 1,50 metro e cresce 2 centmetros por ano, enquanto Z tem 1,10 metro
e cresce 3 centmetros por ano. Construa um algoritmo que calcule e imprima quantos anos sero
necessrios para que Z seja maior que Chico.
2a Questo) Construir um algoritmo que calcule a mdia aritmtica de vrios valores inteiros
positivos, lidos externamente. O nal da leitura acontecer quando for lido um valor negativo.
Cadastro
Consulta
Relatorio
Fim
O programa deve exibir o menu acima, mostrando a opo escolhida e, em seguida, repetindo a
exibio do mesmo at que o usurio escolha a opo 4.
4a Questo) Escreva um algoritmo que calcule a mdia dos nmeros digitados pelo usurio, se
eles forem pares. Termine a leitura se o usurio digitar zero (0). OBS: O valor (zero) no entra para
o clculo da Mdia.
atravs de cdigos. Os dados utilizados para a contagem dos votos obedecem seguinte codicao:
6a Questo) Faa um algoritmo que leia vrios nmeros inteiros e positivos e calcule o produtrio
7a Questo) Faa um algoritmos que leia n nmeros e imprima somente os pares. O algoritmo
8a Questo) Faa um algoritmo que leia vrios nomes e depois imprima-os na tela. O nal deve
9a Questo) Uma empresa de fornecimento de energia eltrica faz a leitura mensal dos medidores
65
Nmero do consumidor
Quantidade de Kwh consumidos durante o ms.
Tipo (cdigo do consumidor).
11a Questo) Escrever um algoritmo que leia um conjunto de pedidos de compra e calcule o
Nmero do pedido
Data do pedido (dia, ms, ano)
Preo unitrio
Quantidade.
O algoritmos dever processar os pedidos at que o pedidos de nmero 0 (zero) seja digitado pelo
usurio.
12a Questo) Escrever um algoritmo que leia um nmero m de valores e calcule a mdia
aritmtica dos valores lidos, a quantidade de valores positivos, a quantidade de valores negativos
e o percentual de valores negativos e positivos. Mostre os resultados.
13a Questo) Faa um algoritmo que leia vrias prosses e informar quantos so dentistas
14a Questo) Faa um algoritmo que leia N Nmeros e imprima o maior deles. O algoritmo
15a Questo) Escrever um algoritmo que leia um conjunto de vrios endereo IP de uma mquina
no formato xxx.xxx.xxx.xxx. Crie uma varivel para nmero do formato especicado. Logo aps
informe qual a classe dessa mquina: A, B, C ou D. O nal do do algoritmo deve ser quando o
usurio informar todos os valores sendo 0 (zero).
com que o usurio tente adivinhar o nmero escolhido. Um exemplo da sada do programa :
66
REPEAT
comando1;
comando2;
...
UNTIL expresso;
onde expresso uma expresso booleana e comando1, comando2, ... so instrues simples ou
comandos compostos. Neste caso os delimitadores BEGIN/END no so necessrios, pois as palavras
chave REPEAT e UNTIL funcionam como delimitadores. No REPEAT-UNTIL os comandos entre
o REPEAT e o UNTIL sero executados AT que a expresso booleana seja verdadeira. Como a
avaliao da expresso feita no nal do lao, os comandos sero executados pelo menos uma vez.
REPEAT
|
+---------+
| comando |--<--+
+---------+
|
|
|
UNTIL
^
/\
|
/ \ FALSE
|
<cond>---->----+
\ /
\/
| TRUE
v
Observao: Um REPEAT-UNTIL tem o mesmo efeito que um WHILE com a expresso booleana
que controla o lao negada:
REPEAT
comando;
UNTIL expresso;
<--->
67
PROGRAM Nomes;
(* Comentrio:
----------Este programa til porque ele mostra que computador
tambm sabe contar nomes digitados. *)
VAR
nome: string;
cont: integer;
BEGIN
cont := 0;
REPEAT
Write('Nome? ');
Readln(nome);
(* Cada vez que um nome for lido *)
cont := cont + 1; (* o contador de nomes CONT *)
(* incrementado
de 1 unidade *)
UNTIL (nome = 'FIM') OR (nome = 'fim');
Writeln('Foram digitados ', cont - 1, ' nomes.');
END.
A varivel CONT que conta os nomes digitados ao nal da execuo do REPEAT-UNTIL ter
contado a senha de parada (FIM ou m) como sendo mais um nome. Devido a isso, usamos CONT
- 1, e no CONT, no Writeln nal.
Exemplo: Neste exemplo, queremos digitar vrios nmeros maiores do que ou iguais a zero e
queremos que o programa nos d o valor de sua mdia aritmtica. A princpio, no temos uma
previso da quantidade de nmeros que ser digitada. No entanto, podemos convencionar que quando
se digitar um nmero negativo, signicar que nossa relao de nmeros acabou. O nmero negativo
que funciona como o aviso do m da relao, no deve ser considerado na mdia aritmtica.
medida que cada nmero positivo for fornecido, uma varivel dever ir sendo incrementada de
1 em 1 para se contar quantos nmeros foram digitados. Alm disso, vamos calculando o somatrio
dos valores, assim que cada nmero for digitado.
Temos aqui algo que ser executado VRIAS vezes. Como no temos previso inicial exata da
quantidade de iteraes temos um caso em que receitado um WHILE ou um REPEAT- UNTIL.
Resta apenas o usurio se decidir entre um dos dois. Neste caso, excepcionalmente, vamos dar duas
verses para este programa: a verso WHILE e a verso REPEAT-UNTIL.
PROGRAM MediaAritmetica;
VAR
x, soma, media: real;
cont: integer;
BEGIN
(* versao REPEAT-UNTIL *)
68
PROGRAM AdvinhacaoDeUmNumero;
(*
chutado um numero inteiro entre 0 e 10000 que o
usuario deve tentar advinhar.
*)
USES Crt;
VAR n, tentativa, numero: integer;
69
BEGIN
n := 0;
Randomize;
numero := Random(10001);
Writeln('Adivinhe o numero aleatorio gerado entre 0',
' e 10000!');
REPEAT
Write('> '); Readln(tentativa);
n := n + 1;
IF tentativa > numero THEN
BEGIN
Writeln('Chute muito alt);
END
ELSE
BEGIN
IF tentativa < numero THEN
BEGIN
Writeln('Chute muito baix);
END;
END;
UNTIL (tentativa = numero);
Writeln('Acertou! (apos ter tentado ', n, ' vezes)');
END.
Exemplo: A srie
S =1
1
33
1
53
1
73
1
93
+ ....
GOTOXY(coluna, linha);
Por exemplo, GOTOXY(5, 2) posiciona o cursor na quinta coluna e segunda linha da tela. Em
modo texto, a tela tem 25 linhas e 80 colunas.
PROGRAM Soma_Alternada_De_1_Sobre_O_Cubo_De_2n_Menos_1;
USES
Crt;
(*
--Calculo de S = \
n+1
-3
/
(-1) (2n - 1)
--*)
70
VAR
t, S: real;
n: integer;
BEGIN
S := 0;
(* Varivel que guardar a soma desejada *)
n := 0;
(* Contador de termos (ndice do termo *)
ClrScr;
(* geral)
*)
REPEAT
n := n + 1;
t := EXP(-3*LN(2*n - 1)); (* termo geral *)
IF Odd(n) THEN
BEGIN
S := S + t; (* Se n for mpar, ento soma-se *)
END
ELSE
(* t a S; caso contrrio, sub- *)
BEGIN
S := S - t; (* trai-se t de S.
*)
END;
GOTOXY(10, 10); (* Posiciona o cursor na 10a. coluna *)
(* e 10a. linha da tela
*)
Write('n = ', n, ' ', t:13:10); (* mostra o ndice *)
(* atual e o valor do termo geral *)
UNTIL t < 1E-10;
Writeln; Writeln;
Writeln('Soma = ', S:15:10);
Writeln('Foram somados ', n, ' termos');
END.
Exemplo: A funo booleana KEYPRESSED da unidade CRT pode ser usada para vericar se
em determinado momento foi pressionada alguma tecla. Ela TRUE quando for pressionada qualquer
tecla e FALSE em caso contrrio. O programinha a seguir, gera aleatoriamente cores e caracteres do
intervalo #50..#250 e ca mostrando-os na tela at ser pressionado qualquer tecla. Para isso, usamos
um RANDOM(16) para gerar um nmero de cor de 0 a 15, um RANDOM(201) + 50 para gerar um
nmero inteiro de 50 a 250 e um REPEAT ... UNTIL KEYPRESSED para repetir o processo at ser
pressionada alguma tecla. A cor do texto pode ser piscante ou no, dependendo de RANDOM(2) em
cor1 gerar um 0 ou um 1.
PROGRAM UsandoKeyPressed;
USES
Crt;
VAR
ch: char;
cor1, cor2: byte;
BEGIN
ClrScr;
Randomize;
repeat
cor1 := Random(16) + 128*Random(2);
cor2 := Random(16);
TextColor(cor1);
TextBackground(cor2);
71
ch := Chr(Random(201) + 50);
Write(ch);
until KEYPRESSED
END.
Exemplo: Neste ltimo exemplo deste captulo, vamos usar 3 comandos da unidade CRT para
gerar sons com determinadas freqncia e durao. So eles:
i. Usamos o SOUND para emitir um som cuja freqncia a da nota desejada. Para isso, devemos
consultar antes uma tabela de freqncia de sons;
PROGRAM Piano;
USES
Crt;
CONST
TeclaESC = #27;
VAR
ch: char;
BEGIN
ClrScr;
GoToXY(18, 10);
Writeln('Toque sua musica usando as teclas QWERTYUIOP[]');
GoToXY(18, 12);
Writeln('Exemplo: QQWQRE QQWQTRR YYIYREW UUYRTRR');
GoToXY(18, 14);
Writeln('Para encerrar, pressione a tecla ESC.');
REPEAT
ch := ReadKey;
CASE ch OF
'Q', 'q' : Sound(262); { d }
'W', 'w' : Sound(294); { r }
'E', 'e' : Sound(330); { mi }
'R', 'r' : Sound(350); { f }
'T', 't' : Sound(396); { sol }
'Y', 'y' : Sound(440); { l }
72
{
{
{
{
{
{
si }
d }
r }
mi }
f }
sol }
5.3.1 EXERCCIOS
1a Questo) Faa um algoritmo para calcular o fatorial de um nmero x, dado como entrada
3a Questo) Faa um algoritmo que leia n nmeros e calcule a soma dos nmeros pares. O
algoritmo deve nalizar quando for digitado o valor 0. OBS: Utilize o Repeat.
4a Questo) Faa um algoritmo que leia n nmeros e calcule o produto dos nmeros mpares.
O algoritmo deve nalizar quando for digitado o valor 1. OBS: Utilize o Repeat.
5a Questo) Escrever um algoritmo que leia um nmero m de valores e calcule a mdia aritmtica
dos valores lidos, a quantidade de valores positivos, a quantidade de valores negativos e o percentual
de valores negativos e positivos. Mostre os resultados.
6a Questo) Faa um algoritmo que leia N Nmeros e imprima o maior deles. O algoritmo deve
7a Questo) Faa um algoritmo que leia N Nmeros e imprima o maior deles. O algoritmo deve
1
2
3
0
Enquanto a opo for diferente de 0 (zero) deve-se continuar apresentando as opes. OBS: Use como
estrutura de repetio o comando REPEAT e como estrutura condicional o comando CASE.
73
6 FUNES E PROCEDIMENTOS
6.1 FUNES
O Pascal oferece muitas facilidades para a confeco de programas modularizados. A
modularizao consiste na diviso de um programa longo em vrias partes, chamadas subprogramas,
cada uma funcionando de forma independente das outras, cada uma realizando tarefas especcas
controladas por um ncleo comum, chamado programa principal.
+--------------------------+
| Programa principal
|
+--------------------------+
^
^
^
/
|
\
v
v
v
+------------+ +------------+ +------------+
| Subprogr_1 | | Subprogr_2 | | Subprogr_3 |
+------------+ +------------+ +------------+
^
|
v
+------------+
| Subprogr_4 |
+------------+
Cada subrotina funciona como se fosse um pequeno programa, com suas prprias variveis, suas
prprias denies de tipos, seus prprios subrotinas, etc. Cada vez que um subrotina chamado,
ele executado, e aps o trmino de sua execuo, o controle do programa volta ao comando que
vier depois do ponto de onde o subrotina foi chamado. Em Pascal podemos ter subrotinas de dois
tipos: as funes (FUNCTIONS) e os procedimentos (PROCEDURES).
i. Um cabealho (ou prottipo) identicado pela palavra chave FUNCTION, seguida do nome
da funo, da lista de parmetros e tipos entre parnteses e separados entre si por vrgulas, de
um sinal de dois pontos e do tipo do valor que ser retornado pela funo. Parmetros de tipos
diferentes devem ser separados por ponto-e-vrgula.
ii. Uma rea de declaraes de tipos, variveis, constantes, rtulos, funes ou procedimentos.
74
iii. A denio da funo delimitada pelas palavras chave BEGIN e END, com um ponto-e-vrgula
no nal. O valor de retorno da funo denida por uma atribuio do tipo:
Nome_da_funo := Valor;
O valor retornado por uma funo pode ser do tipo inteiro, real, boolean, string, char, entre
outros.
Exemplo: O cabealho de uma funo F com parmetro x inteiro e que retorne um valor inteiro
(ou seja, F : Z > Z) deve ser declarado como:
75
end;
END;
Todo programa que queira usar essa funo LOG10, dever t-la denida na sua rea de
declaraes:
PROGRAM LogaritmoDecimal;
VAR
num: real;
FUNCTION Log10(x: real): real;
BEGIN
Log10 := Ln(x)/Ln(10);
END; (* fim da definio da funo *)
BEGIN
Write('Forneca um numero real positivo: '); Readln(num);
Writeln('O logaritmo decimal de ', num, ' ' ',
Log10(num):8:4);
END. (* fim do programa *)
Exemplo: Se os parmetros da funo forem de tipos diferentes, ento a lista de parmetros deve
separar os tipos por ponto-e-vrgula. Por exemplo, uma funo TESTE que tenha os parmetros x, y
do tipo real e m, n do tipo integer e que retorne um valor do tipo integer dever ter como cabealho:
Exemplo: Neste exemplo vamos construir um programa que use duas funes: MAX(x, y) e
MIN(x, y).
PROGRAM MaxMin;
VAR
a, b: real;
FUNCTION Max(x, y: real): real;
(* Funo MAX ---> retorna o maior valor entre x e y *)
BEGIN
if (x >= y) then
begin
Max := x;
end
else
begin
Max := y;
end;
76
77
for i := 2 to n do
begin
prod_aux := prod_aux * i;
end;
Fat := prod_aux
end;
end;
END; (* fim da definio da funo *)
Precisamos de uma varivel auxiliar (prod_aux) para guardar o valor do fatorial, porque uma
atribuio como Fat := Fat * i no permitida (s seria possvel se Fat fosse uma varivel).
Um exemplo de um programa que use esta funo :
PROGRAM UsandoFat;
(* Lista os valores de n!, com 0 <= n <= 12 *)
VAR
i: integer; (* este "i" no tem nenhuma relao com o "i"
da funo FAT *)
(* Nesta rea, suponhamos que esteja escrita a FAT acima. *)
BEGIN
Writeln(' n
n!');
for i := 0 to 12 do
begin
Writeln(i:2, Fat(i):12);
end;
END.
Exemplo: Neste exemplo deniremos uma funo CURSO que associa a alguns nmeros inteiros,
nomes de cursos da UFPB.
FUNCTION
BEGIN
CASE n
8 :
11 :
22 :
23 :
24 :
25 :
30 :
32 :
44 :
else
END;
END;
:=
:=
:=
:=
:=
:=
:=
:=
:=
'Ciencias';
'Quim. Industrial';
'Eng. Civil';
'Eng. Alimentos';
'Eng. Mecanica';
'Bach. Quimica';
'Bach. Fisica';
'Bach. Matematica';
'Bach. Computacao';
Suponhamos que esta funo esteja denida em um arquivo do disco chamado CURSOS.PAS
(basta digit-la, pressionar F2, digitar CURSOS e pressionar ENTER). Para inclu-la em qualquer
programa em Pascal, basta usar uma diretiva de incluso, cuja sintaxe ,
78
{$I NomeDoArquivo.Extensao}
Todo programa que contiver uma diretiva como essa, na hora em que o programa for compilado,
o Pascal incluir no lugar da diretiva o referido arquivo. Para que uma diretiva de incluso no seja
confundida com um comentrio, no deve haver espaos em branco entre a chave e o $I.
PROGRAM CursosDaUFPB;
{$I CURSOS.PAS} (* inclui o arquivo CURSOS.PAS *)
VAR
n: integer;
BEGIN
Write('Forneca o numero do curso: ');
Readln(n);
Writeln('---> O curso ', n, ' e '' ', Curso(n))
END.
Exemplo: Neste exemplo, construiremos uma funo do tipo string que, dado um inteiro n e
um caracter x, ento o valor da funo no ponto (n, x) dever ser o caracter x repetido n vezes.
Chamaremos a funo de REPETE. Para as variveis do tipo string est denida uma operao
de soma, que na verdade uma concatenao. Se X, Y so strings, X + Y = string formado pela
juno de X com Y. Por exemplo, 'Para' + 'iba' = 'Paraiba', '19' + '92' = '1992', 'Jose' + 'Maria'
= 'JoseMaria', etc. Toda varivel char, pode ser considerada um string de comprimento 1. Assim,
temos tambm, ' + 'B' = 'AB', etc. Para repetir o caracter x por n vezes, faremos um somatrio
de strings:
Str_aux
Str_aux
Str_aux
Str_aux
Str_aux
...
:=
:=
:=
:=
:=
''
'' + 'x' = 'x'
'x' + 'x' = 'xx'
'xx' + 'x' = 'xxx'
'xxx' + 'x' = 'xxxx'
...
...
(n
(n
(n
(n
=
=
=
=
1)
2)
3)
4)
79
PROGRAM Testando_a_funcao_Repete;
VAR
i: integer;
ch: char;
{$I REPETE.PAS}
BEGIN
Write('Caracter a ser repetido? '); Readln(ch);
Write('Quantidade de vezes? ');
Readln(i);
Writeln;
Writeln('REPETE (', i, ', ', ch, ') = ', Repete(i, ch))
END.
Um outro exemplo, gera aleatoriamente os valores de i e ch e repete esse processo indenidamente
(at ser pressionado as teclas CTRL e BREAK).
PROGRAM Testando_a_funcao_Repete_2;
USES
Crt;
VAR
i: integer;
ch: char;
{$I REPETE.PAS}
BEGIN
Randomize;
repeat
i := Random(50); (* i um inteiro qualquer de 0 a 49 *)
ch := Chr(Random(255));
Writeln;
Writeln('REPETE (', i, ', ', ch, ') = ', Repete(i, ch));
Delay(1000); (* pausa de 1 segundo *)
until 1 > 2
END.
Exemplo: O conjunto de funes a seguir, complementa a "decincia"do Pascal com relao
s funes trigonomtricas e hiperblicas. Podem ser criados dois arquivos no disco TRIG.PAS e
HIPER.PAS para serem includos em qualquer programa pela diretiva de incluso $I TRIG.PAS ou
$I HIPER.PAS.
{ ========================================================
{
FUNCOES TRIGONOMETRICAS
{ ========================================================
function Tg(x: real): real;
{ Tangente
}
begin
if Cos(x) = 0 then
begin
Halt; { parametro invalido }
end;
Tg := Sin(x)/Cos(x)
end;
{ --------------------------------------------------------
}
}
}
80
81
82
Exemplo: Deniremos neste exemplo uma funo booleana chamada PRIMO(n) que ser TRUE
se n for primo e FALSE em caso contrrio.
83
END;
Gravando-se esta funo no disco sob o nome de PRIMO.PAS, podemos usar o seguinte programa
que lista todos os primos de 1 a 1000000:
PROGRAM ListagemDePrimos;
{$I PRIMO} (* ---> A extenso .PAS pode ser omitida *)
VAR
i: integer;
BEGIN
for i := 1 to 10000 do
if Primo(i) then Writeln(i:8, ' e'' primo.')
END.
Exemplo: Vamos construir agora nossa funo potncia POT(x, y) = x y. Para uso posterior,
vamos salv-la em disco sob o nome de POT.PAS. Identicaremos com 0 todo nmero que, em
mdulo, seja menor do que 1010 .
84
end;
END;
end;
end;
begin
Pot := Exp(y*Ln(x));
end
else
(* Caso geral com x < 0 *)
begin
if (Frac(y) > epsilon) and (1 - Frac(Abs(y)) > epsilon) then
begin
Writeln('ERRO: Base negativa e expoente ', 'fracionario.');
Halt;
end
else
begin
if Odd(Round(y)) then
(* y impar, x < 0 *)
begin
Pot := -Exp(y*Ln(-x));
end
else
(* y par, x < 0 *)
begin
Pot := Exp(y*Ln(-x));
end;
end;
end;
A funo POT assim denida no conveniente para o clculo de razes. Como exerccio,
desenvolva uma funo Raiz(n, x) = raiz n-sima de x. Como um programa-exemplo do uso de
POT, temos:
PROGRAM Potencias;
{$I POT.PAS}
VAR
x, y: real;
BEGIN
repeat
Write('x = '); Readln(x);
Write('y = '); Readln(y);
Writeln;
Writeln('x^y = ', Pot(x, y):8:3);
Writeln;
until 1 > 2
END.
Exemplo: Este ltimo exemplo desta seo, testa se um nmero inteiro positivo potncia de dois
ou no. Construmos a funo boolean POTENCIADEDOIS(n) que TRUE se n for uma potncia
de 2 e FALSE em caso contrrio. Grave no disco esta funo sob o nome de POT_2.PAS para ser
usada futuramente. O algoritmo usado foi o seguinte: so feitas sucessivas divises de n por 2 at se
encontrar um nmero mpar. Se o nmero mpar assim encontrado for 1, ento o n potncia de 2;
caso contrrio, n no potncia de 2.
85
Como exemplo de utilizao dessa funo, temos o programa abaixo que lista as potncias de 2
de 1 a 100000.
PROGRAM Potencia_de_2;
{$I POT_2}
VAR
x: integer;
BEGIN
for x := 1 to 100000 do
begin
if PotenciaDeDois(x) then
begin
Writeln(x, ' e'' potencia de dois');
end;
end;
END.
86
BEGIN
aux := 0;
for k := 1 to n do
begin
aux := aux + sin(k*x)/k;
end;
FSerie := aux
END;
Exemplo: A funo a seguir uma aproximao para a funo exponencial de base E. Trata-se
da funo denida pelos 11 primeiros termos da srie de Taylor de EXP(x).
Usamos na sua denio duas funes denidas anteriormente: FAT e POT.
10
x
... ----10!
6.2 PROCEDIMENTOS
6.2.1 DEFINIO, PROCEDIMENTOS SEM PARMETROS
Um procedimento (procedure) um trecho de programa que possui seus prprios objetos
(variveis, constantes, tipos, funes, outros procedimentos, ...) . Juntamente com as funes,
os procedimentos formam o que se chama genericamente de subrotinas (ou subprogramas). Os
procedimentos diferem das funes apenas pelo fato das funes retornarem sempre um nico valor,
enquanto que os procedimentos no retornam valor algum. A criao de um procedimento em Pascal
feita atravs de sua declarao na rea de declaraes do programa. Um procedimento possui um
cabealho, identicado pela palavra reservada PROCEDURE seguida do nome do procedimento e
uma lista opcional de parmetros. Segue-se ao cabealho um bloco de declaraes dos objetos locais
do procedimento, e um bloco de comandos delimitados pelas palavras chave BEGIN e END com um
ponto-e-vrgula no nal:
87
comando2;
...
END;
A chamada ou ativao de um procedimento feita referenciando-se o seu nome no local do
programa onde o mesmo deve ser ativado, ou seja, onde sua execuo deve ser iniciada. Ao nal
da execuo de um procedimento, o controle do programa retorna ao comando seguinte aquele
que provocou sua chamada. Assim, a execuo de um procedimento se constitui na transferncia
temporria da execuo do programa para o trecho do programa que corresponde ao procedimento.
Tudo que for declarado dentro de um procedimento, ser considerado um objeto local e ser conhecido
apenas pelo procedimento.
Exemplo: Um uso bastante comum de procedimentos para se evitar repetio de trechos
anlogos em um programa. Observe o esboo de programa a seguir:
PROGRAM Teste;
VAR x, y, z: real;
BEGIN
comando1;
comando2;
x := funo1;
y := funo2;
comando3;
comando1;
comando2;
x := funo1;
z := Cos(x);
comando4;
comando1;
comando2;
x := funo1;
comando5;
END.
Observe que o trecho
comando1;
comando2;
x := funo1;
se repete no programa. Neste caso, seria mais prtico se declarar esse trecho como sendo
um procedimento, digamos que com nome REPETE, e assim, toda vez que o trecho aparecesse,
simplesmente colocaramos a palavra REPETE no seu lugar:
PROGRAM Teste;
VAR x, y, z: real;
PROCEDURE REPETE;
BEGIN (* inicio do procedimento *)
comando1;
88
comando2;
x := funo1;
END; (* fim do procedimento *)
BEGIN (* inicio da seo principal *)
REPETE;
y := funo2;
comando3;
REPETE;
z := Cos(x);
comando4;
REPETE;
comando5;
END. (* fim do programa *)
Os dois esboos de programa anteriores so equivalentes.
Exemplo: Os procedimentos aumentam signicativamente a clareza dos programas. Voltemos
aquele nosso primeiro programa do Captulo 2, aquele que somava dois inteiros. Um programa desse
tipo feito basicamente em trs etapas:
i. Ler os inteiros;
ii. Calcular sua soma;
iii. Mostrar seu resultado.
Cada etapa na elaborao de um programa, sugere um procedimento prprio. Neste caso,
usaremos trs procedimentos LERNUMEROS, CALCULARSOMA e MOSTRARRESULTADO.
Com isso o programa principal se limitar a listar as etapas na execuo do programa:
PROGRAM SomaDeInteiros;
VAR
x, y, soma: integer;
PROCEDURE LerNumeros;
BEGIN
Writeln;
Write('Forneca o valor de x : '); Readln(x);
Write('Forneca o valor de y : '); Readln(y);
END; (* fim de LerNumeros *)
PROCEDURE CalcularSoma;
BEGIN
soma := x + y;
END; (* fim de CalcularSoma *)
PROCEDURE MostrarResultado;
BEGIN
Writeln;
Writeln('Soma = ', soma);
Writeln;
Write('Pressione ENTER para encerrar.');
Readln;
END; (* fim de MostrarResultado *)
89
90
No ltimo caso, a execuo do procedimento TESTEDOIS est sendo chamada com os parmetros
mat = 92101234 e nome = 'Antonio A Brag.
Exemplo: Uma chamada ao procedimento a seguir pode ser usada no lugar dos dois comandos
TEXTCOLOR e TEXTBACKGROUND que compem o procedimento.
IncrementaUm(a, b, c);
teremos a = 10, b = 12 e c = 12. Observe que apenas o valor de b alterado, pois o nico parmetro
precedido por um VAR no cabealho.
Se o cabealho fosse
91
IncrementaUm(a, b, c);
teramos a = 11, b = 12 e c = 13.
Observao: Se a declarao de um parmetro no cabealho de um procedimento possui a palavra
VAR, ento diz-se que a passagem do parmetro uma passagem por referncia (porque nesse caso
o Pascal informa ao procedimento a localizao na memria da varivel usada como parmetro).
Quando a declarao no tem a palavra VAR, ento temos uma passagem por valor do parmetro.
Exemplo: O procedimento a seguir troca os valores dos parmetros. Isso s pode ser feito com o
uso do VAR no cabealho, pois um caso em que os valores dos parmetros so alterados.
Troca(x, y);
teremos x = 2 e y = 1.
Se no houver o VAR no cabealho do procedimento, ento os valores de x e y no sero alterados
aps Troca(x, y).
Exemplo: Toda funo pode ser substituda por um procedimento:
PROGRAM CalculandoMaisUmaVezOFatorialDeN;
USES
Crt;
VAR
n: integer; (* variaveis *)
m: integer; (* globais *)
PROCEDURE Encerrar;
92
BEGIN
Writeln;
Writeln('Valor de n invalido.');
Writeln;
Halt;
END;
PROCEDURE LerN(VAR n: integer);
(*
Neste procedimento, fundamental o VAR acima. Sem ele,
o valor de N ficaria desconhecido do programa principal.
*)
BEGIN
ClrScr; Writeln;
Write('Forneca o valor do inteiro n: ');
Readln(n);
if (n < 0) or (n > 13) then
begin
Encerrar;
end;
(* Observe que
temos aqui a chamada a um procedimento de dentro de outro.
*)
END;
PROCEDURE CalcularFatorial(n: integer; VAR fat: integer);
VAR
i: integer; (* variavel local *)
BEGIN
fat := 1;
for i := 2 to n do
begin
fat := fat * i;
end;
END;
PROCEDURE MostrarResultado(n: integer; fat: integer);
VAR
pausa: char; (* variavel local *)
BEGIN
Writeln;
Writeln(n, '! = ', fat);
Writeln;
Write('Para encerrar, pressione qualquer tecla.');
pausa := ReadKey;
END;
BEGIN (* inicio do programa principal *)
LerN(n);
CalcularFatorial(n, m);
MostrarResultado(n, m)
END. (* fim do programa *)
93
Exemplo: Um procedimento pode chamar outro (como o caso do exemplo anterior, em que
LERN pode chamar ENCERRAR) e tambm pode ter suas prprias funes e procedimentos
internos:
PROCEDURE Externo;
PROCEDURE Interno1;
begin
...
end;
PROCEDURE Interno2;
begin
...
end;
FUNCTION f_interna(x: real): real;
begin
...
end;
VAR
(* variveis locais do procedimento EXTERNO *)
BEGIN (* incio do procedimento EXTERNO *)
...
(* comandos *)
...
END; (* fim do procedimento EXTERNO *)
Neste caso, toda parte do programa que seja exterior ao procedimento EXTERNO no tem
conhecimento da existncia dos procedimentos INTERNO1 e INTERNO2 e da funo F_INTERNA.
Esses procedimentos e funo internos podem fazer referncia entre si. Por exemplo, INTERNO2 pode
usar o INTERNO1.
6.2.3 EXERCCIOS
1a Questo) Escreva um programa que tenha uma rotina que receba como parmetro um valor
"N"e retorne TRUE caso um nmero seja par, FALSE caso contrrio
2a Questo) Escreva um programa que tenha uma rotina que receba como parmetro um valor
"N"e retorne TRUE caso um nmero seja mpar, FALSE caso contrrio.
3a Questo) Dado um vetor com n elementos numricos, faa um programa que tenha uma
rotina que receba como parmetro um nmero e verique se o valor existe neste vetor. A rotina deve
retornar TRUE se o elemento existir e FALSE caso contrrio.
4a Questo) Escreva um programa que tenha uma rotina para acrescentar N caracteres "$"a
5a Questo) Escreva um programa que tenha uma rotina para acrescentar N caracteres "$"em
6a Questo) Escreva um programa que tenha uma rotina que receba como parmetro o raio de
7a Questo) Escreva um programa que tenha uma rotina que receba como parmetro o raio de
8a Questo) Escreva um programa que tenha uma rotina que receba como parmetro dois
94
9a Questo) Escreva um programa que tenha uma rotina que receba como parmetro uma valor
10a Questo) Faa um PROGRAMA que tenha uma rotina para calcular a seguinte expresso
matemtica:
Y =
X2
2!
2X 3
3!
3X 4
4!
4X 5
5!
+ ... +
nX (n+1)
(n+1)!
11a Questo) Escreva um programa que tenha uma rotina que leia um vetor de caracteres e
12a Questo) Escreva um programa que tenha uma rotina para calcular a seguinte expresso
Y = X X 2 + X 3 X 4 + X 5 ......
13a Questo) Escreva um programa que tenha uma rotina para calcular:
10
X
1
n!
i=1
14a Questo) Escreva um programa que tenha uma rotina para calcular:
50
X
1
2n
i=
15a Questo) Escreva um programa que tenha uma rotina que receba como parmetro um
16a Questo) Escreva um programa que tenha uma rotina que receba duas string como
17a Questo) Escreva um programa que tenha uma rotina que limpe a tela do micro e exiba o
seu nome.
18a Questo) Escreva um programa que tenha uma rotina que receba um valor string S e um
19a Questo) Escreva um programa que tenha uma rotina chamada CUBO que receba um valor
20a Questo) 20a Questo) Escreva um programa que tenha uma rotina chamada TROCA que
21a Questo) Escreva um programa que tenha uma rotina chamado SINAL que receba como
parmetro um valor N inteiro e escreva a palavra POSITIVO se N for um nmero maior que zero,
NEGATIVO se N for menor que zero, ou ZERO se N for igual a zero. Escreva um programa que leia
um nmero inteiro e, usando o procedimento SINAL, mostre se ele maior, menor ou igual a zero.
22a Questo) Escreva um programa que tenha uma rotina que receba com parmetro um nmero
23a Questo) Escreva um programa que tenha uma rotina chamada METADE que divida um
95
Parte 2 - Escreva um programa que leia um vetor A de 30 elementos reais e, usando a rotina
METADE, divida todos seus elementos pela metade.
24a Questo) Escreva um programa que tenha uma rotina chamada MEDIA que retorne a
mdia de 3 valores reais (X, Y e Z) passados como parmetros. Escreva um programa que, para um
nmero indeterminado de alunos, faa para cada uma deles:
i. ler o nome e as 3 notas do aluno (a leitura do nome FIM indica o m dos dados - ag);
ii. calcule a mdia do aluno (usando a funo MEDIA);
iii. exiba o nome e a mdia do aluno.
25a Questo) Escreva um programa Pascal que leia as 3 notas e o nmero de faltas de um
aluno, calcule a sua mdia e determine e exiba a sua situao. Caso a aluno tenha mais de 10 faltas,
ele est REPROVADO POR FALTA. Caso contrrio, estar REPROVADO se sua mdia for menor
que 5.0 ou APROVADO se sua mdia for superior a 5.0. Observaes:
i. utilize uma funo para calcular a mdia e um procedimento para determinar e exibir a situao
do aluno;
x2
2!
x4
4!
x6
6!
x8
8!
+ ....
Observaes:
em Horas, Minutos e Segundos e retornar esta medida convertida apenas para segundos.
28a Questo) Escreva um procedimento chamado HMS para receber uma medida de tempo
expressa apenas em segundos em retornar esta medida convertida para horas, minutos e segundos.
Faa um programa que leia 2 medidas de tempo (expressas em horas, minutos e segundos) e, usando
a funo SEG e o procedimento HMS, calcule e exiba a diferena (tambm em horas, minutos e
segundos) entre elas.
29a Questo) Escreva uma funo chamada NOME_MES que receba um valor inteiro N (de
Entrada: 23 11 1998
Sada: 23 de novembro de 1998
96
Escreva uma funo chamada DIAS_ANO que receba 3 valores inteiros (DIA, MES, ANO) e
retorne o nmero de dias decorridos no ano at o dia/ms/ano fornecido.
Escreva um funo booleana chamada DATA_VALIDA que receba uma data (DIA, MS, ANO)
e verique se a data vlida (considerando os anos bissextos).
Faa um programa que leia 2 datas, no formato dia, ms e ano (as datas devem ter o mesmo
ano) vericando se as mesmas so vlidas (atravs da funo DATA_VALIDA), calcule e exiba a
diferena de dias entre elas (usando a funo DIAS_ANO).
97
7 VETORES E MATRIZES
TYPE
Identificador_de_tipo_1 = Tipo1;
Identificador_de_tipo_2 = Tipo2;
...
...
Pela a nomenclatura acima o Identicador_de_tipo_1, ... so identicadores e Tipo1, Tipo2, ...
so nomes de tipos pr-denidos.
Uma vez denido o tipo possvel declarar uma varivel desse tipo utlizando o VAR.
7.2 VETORES
Um vetor um conjunto formado por uma quantidade xa de dados de um mesmo tipo. Sua
declarao feita com a palavra reservada ARRAY, seguida de seus limites inferior e superior entre
colchetes e separados entre si por .., da palavra reservada OF e o tipo de cada componente do vetor.
Os limites inferior e superior devem ser do tipo ordinal.
TYPE
Vetor = ARRAY[LimInf..LimSup] of TipoBase;
Um vetor tambm costuma ser chamado de varivel indexada ou varivel composta homognea.
Para se ter acesso n-sima componente de um vetor V, deve-se fazer referncia a V[n]. A denio
de um vetor pode ser feita atribuindo-se valores a cada componente individualmente ou lendo-se cada
componente de um dispositivo de entrada. Nestes casos comum o uso de um FOR:
98
Exemplo: As declaraes a seguir denem os vetores i = (1, 0, 0), j = (0, 1, 0) e k = (0, 0, 1), a
base cannica do R3 .
TYPE
VetorDoR3 = ARRAY[1..3] OF
VAR
i, j, k: VetorDoR3;
...
i[1] := 1; i[2] := 0; i[3]
j[1] := 0; j[2] := 1; j[3]
k[1] := 0; k[2] := 0; k[3]
real;
:= 0;
:= 0;
:= 1;
Exemplo: Denir um vetor V do R10 , cuja n-sima componente seja igual ao quadrado de n.
TYPE
Vetor10 = ARRAY [1..10] OF real;
VAR
V: Vetor10;
n: byte;
...
for n := 1 to 10 do
begin
V[n] := Sqr(n);
end;
Exemplo: A nica desvantagem dos vetores do Pascal, que seu tamanho (dimenso) precisa ser
xado na sua declarao e o programa NO pode alterar esse tamanho. Para um programa manusear
vetores de diferentes tamanhos, um truque bastante comum se declarar o tipo vetor usando o maior
tamanho que ser necessrio. Desse modo o programa poder trabalhar com vetores de tamanhos
menores do que o tamanho mximo declarado, bastando para isso desperdiar algumas coordenadas,
o que corresponde a desperdiar memria do computador.
Neste exemplo, deniremos uma funo VMAX que calcula o maior elemento de um vetor real
de tamanho no mximo 100. A funo VMax deve ter dois parmetros: o vetor V e seu respectivo
tamanho n. Se o leitor cou pensando que amos dizer que a denio de uma funo VMIN seria
anloga, ele acertou.
TYPE
Vetor = ARRAY [1..100] OF real;
FUNCTION VMax(V: Vetor; n: byte): real;
(* Determina o maior dos n primeiros elementos do vetor V *)
VAR
i: integer;
maximo: real;
BEGIN
maximo := V[1]; (* Chutamos inicialmente que o maior *)
(* elemento de V o primeiro.
*)
(* Comparamos, MAXIMO com todos os elementos V[i] de V. *)
(* Sempre que MAXIMO < V[i], redefinimos MAXIMO := V[i] *)
for i := 1 to n do
begin
99
7.2.1 EXERCCIOS
1a Questo) Implemente um programa que tenha duas subrotinas: uma que leia e e outra que
2a Questo) Implemente um programa que tenha duas subrotinas: uma que leia um vetor de
tamanho 10 e outra que imprima somente o contedo dos vetores que receberam valores maiores que
4.
3a Questo) Implemente um programa que tenha duas subrotinas: uma que leia um vetor de
tamanho 15 e outra que imprima somente o contedo dos vetores que receberam valores negativos.
4a Questo) Implemente um programa que tenha duas subrotinas: uma que leia um vetor de
tamanho 10 e outra imprima somente o contedo dos vetores que receberam valores pares.
5a Questo) Escreva um programa que tenha trs subrotinas: uma que leia dois vetores
unidimensionais A e B, de dimenso 8, e outra que realize a troca dos elementos destes vetores;
ou seja, aps a execuo do programa o vetor B dever conteros valores fornecidos para o vetor A,
e vice-versa. E nalmente escreva a rotina que receba como parmetro um vetor unidimensional de
tamanho 8 e imprima o seu contedo na tela.
6a Questo) Faa uma funo que recebe um vetor X(20) de reais, por parmetro, e retorna a
7a Questo) Faa um procedimento que recebe, por parmetro, um vetor A(25) de inteiros e
substitui todos os valores negativos de A por zero. O vetor A deve retornar alterado.
8a Questo) Faa um procedimento que gera os 10 primeiros primos acima de 100 e retorna-os
parmetro. O procedimento deve retornar um vetor C, por parmetro, que contm os elementos de
A e B em ordem decrescente.
10a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 10 elementos
inteiros e que calcule e retorne, tambm por parmetro, o vetor interseco dos dois primeiros.
11a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 10 elementos
inteiros e que calcule e retorne, tambm por parmetro, o vetor diferena dos dois primeiros.
12a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 20 elementos
inteiros e que calcule e retorne, tambm por parmetro, o vetor soma dos dois primeiros.
13a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 15 elementos
inteiros e que calcule e retorne, tambm por parmetro, o vetor produto dos dois primeiros.
14a Questo) Faa um procedimento que receba, por parmetro, um vetor K(15) e retorna,
15a Questo) Faa um procedimento que receba um vetor A(100) de inteiros e retorna esse
100
16a Questo) Faa um procedimento que receba, por parmetro um vetor B(50) de reais e
calcula o maior valor do vetor. A seguir, o procedimento deve dividir todos os elementos de B pelo
maior encontrado. O vetor deve retornar alterado.
7.3 MATRIZES
Uma matriz pode ser considerada como um vetor de vetores:
TYPE
vetor = ARRAY [1..3] OF real;
matriz = ARRAY [1..3] OF vetor;
(* matriz 3 x 3 *)
No entanto, possvel se declarar os intervalo de variao dos ndices de uma s vez, bastando
para isso se separar cada intervalo do outro por uma vrgula:
TYPE
matriz3x3 = ARRAY [1..3, 1..3] of real;
matriz2x5 = ARRAY [1..2, 1..5] of real;
matriz4x6 = ARRAY [1..4, 1..6] of integer;
O elemento (i, j) de uma matriz M pode ser referenciado como M[i, j] ou como M[i][j].
Exemplo: Para se denir os elementos de uma matriz, so necessrias leituras ou atribuies para
cada elemento. Normalmente, essas atribuies so feitas com 2 laos FOR encaixados, um FOR para
cada ndice:
FOR i := 1 TO m DO
BEGIN
FOR j := 1 TO n DO
BEGIN
Readln([i, j]);
END;
END;
Se a matriz for pequena, o usurio pode preferir denir a matriz elemento por elemento (sem
usar laos FOR). Abaixo esto denidas 2 matrizes M e N 2 x 2, ambas iguais matriz identidade:
TYPE
matriz2x2 = ARRAY [1..2, 1..2] OF integer;
VAR
M: matriz2x2;
CONST
N: matriz2x2 = ((1, 0), (0, 1));
...
M[1, 1] := 1; M[1, 2] := 0;
M[2, 1] := 0; M[2, 2] := 1;
Exemplo: Neste exemplo, denimos uma matriz A 5 x 6 cujo elemento ai j dado por
101
TYPE
Paralepipedo = ARRAY [1..3, 1..4, 1..5] OF real;
Dimensao4 = ARRAY[1..3, 1..3, 1..3, 1..3] OF integer;
Nestes casos, para se ter acesso aos elementos das variveis desses tipos (X, Y, ...), deve-se fazer
referncias a elementos como X[i, j, k], Y[1, 2, 3, 1], etc.
Os elementos de uma matriz podem ser de quaisquer tipos: boolean, string, etc. Por exemplo, a
tipo MATRIZCHAR abaixo uma matriz de caracteres e o tipo MATRIZDEBLOCOS uma matriz
de matrizes:
TYPE
MatrizChar = ARRAY [1..4, 1..6] OF char;
MatrizDeBlocos = ARRAY [1..3, 1..3] OF
ARRAY [1..3, 1..3] OF real;
As variveis indexadas, como os vetores e as matrizes, podem ser declaradas sem o uso do bloco
TYPE. No entanto, acreditamos que esta no uma prtica muito vantajosa para o usurio.
VAR
i, j, k: ARRAY [1..3] OF integer;
Mat1, Mat2: ARRAY [1..2, 1..2] of real;
Os ndices de uma matriz podem ser de qualquer tipo ordinal, inclusive inteiros negativos.
TYPE
MatrizEstranha = ARRAY ['a'..'e', -4..-1] OF string;
102
TYPE
string = ARRAY [0..255] OF char;
7.3.1 EXERCCIOS
1a Questo) Dada as matraizes M e S da gura 7.1:
....
for I:= 1 to 4 do
begin
for J:=1 to 4 do
begin
R[J,I] := M[I,J];
end;
end;
AUX := R[1,1];
R[1,1] := R[4,4];
R[4,4] := AUX;
AUX := R[2,2];
R[2,2] := R[3,3];
R[3,3] := AUX;
....
2a Questo) Faa uma funo que recebe, por parmetro, uma matriz A(5,5) e retorna a soma
3a Questo) Faa uma funo que recebe, por parmetro, uma matriz A(6,6) e retorna a soma
4a Questo) Faa uma funo que recebe, por parmetro, uma matriz A(7,6) e retorna a soma
5a Questo) Faa uma funo que recebe, por parmetro, uma matriz A(6,6) e retorna o menor
6a Questo) Faa um procedimento que recebe, por parmetro, uma matriz A(8,8) e calcula o
maior elemento da sua diagonal principal. A seguir, o procedimento deve dividir todos os elementos
de A pelo maior encontrado. O procedimento deve retornar a matriz alterada.
7a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4)
e retorna uma matriz C, tambm por parmetro, que seja o produto matricial de M por N.
103
8a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4)
e retorna uma matriz C, tambm por parmetro, que seja a soma de M com N.
9a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4)
e retorna uma matriz C, tambm por parmetro, que seja a diferena de M com N.
10a Questo) Faa um procedimento que recebe, por parmetro, uma matriz M(6,6) e um valor
11a Questo) Faa um procedimento que receba uma matriz A(10,10), por parmetro, e realize
as seguintes trocas:
12a Questo) Faa uma funo que receba, por parmetro, uma matriz B(9,9) de reais e retorna
13a Questo) Faa um procedimento que receba, por parmetro, uma matriz A(12,12) e retorna,
tambm por parmetro, um vetor com a soma de cada uma das linhas de A .
14a Questo) Faa um procedimento que receba, por parmetro, uma matriz A(6,6) e multiplica
cada linha pelo elemento da diagonal principal daquela linha. O procedimento deve retornar a matriz
alterada.
15a Questo) Na teoria dos sistemas, dene-se como elemento minimax de uma matriz o menor
elemento de uma linha onde se encontra o maior elemento da matriz. Faa uma funo que recebe, por
parmetro, uma matriz A(10,10) e retorna o seu elemento minimax, juntamente com a sua posio.
16a Questo) Faa um procedimento que receba, por parmetro, uma matriz 61x10. O
17a Questo) Faa uma funo que receba, por parmetro, uma matriz A(12,12) e retorne a
18a Questo) Faa uma funo que receba, por parmetro, uma matriz A(10,10)e retorne a
19a Questo) Faa uma funo que receba, por parmetro, uma matriz A(7,7)e retorne o menor
20a Questo) Faa uma funo que receba, por parmetro, uma matriz A(8,8) e retorne o menor
21a Questo) Faa uma funo que receba, por parmetro, uma matriz A(12,12) e retorna a
22a Questo) Faa uma funo que receba, por parmetro, uma matriz A(12,12) e retorna o