Professional Documents
Culture Documents
/###### | ### /### | ###| ### | ######_/ | ###__/ | ### | ### |/__/
/### /##### /### ### /###__/### /###_/ ### | #### \/_/ | ### | ### \ / #### | ######### \ / #### | ###__/### /###\ ### | ### | ### |/ ##### / |/__/ |/__/ \ /____/
/##### /### / ###__/## /### ### | ### |/_/ /###_/ ### | ### | ### | ### | ### | ######### |/ ### /## | ###__/### \ ##### / | ### | ### \/____/ |/__/ |/__/
SEMESTRE 2008/1
1.2
O QUE SO ALGORITMOS ?.................................................................. 1.1.1 POR QUE PRECISAMOS DE ALGORITMOS ?.................................... 1.1.2 MTODO PARA CONSTRUIR UM ALGORITMO ................................ 1.1.3 EXERCCIOS ............................................................................. TIPOS DE INFORMAO ...................................................................... 1.2.1 TIPOS INTEIROS (NUMRICOS) .................................................... 1.2.2 TIPOS REAIS (NUMRICOS) ......................................................... 1.2.3 TIPOS CARACTERES .................................................................. 1.2.4 TIPOS LGICOS ......................................................................... VARIVEIS ........................................................................................ 1.3.1 ARMAZENAMENTO DE DADOS NA MEMRIA ................................. 1.3.2 CONCEITO E UTILIDADE DE VARIVEIS ........................................ INSTRUES PRIMITIVAS .................................................................... REPRESENTAO DE ALGORITMOS ATRAVS DE FLUXOGRAMAS............. 1.5.1 EXERCCIOS ............................................................................. INTRODUO A LINGUAGEM PASCAL ................................................... 1.6.1 PROGRAMAS FONTE, OBJETO E EXECUTVEL .............................. 1.6.2 NOMES DOS ARQUIVOS EM DISCO................................................ ESTRUTURA DE UM PROGRAMA EM PASCAL ......................................... 2.1.1 IDENTIFICADORES .................................................................... 2.1.2 TIPOS DEFINIDOS DO PASCAL ..................................................... 2.1.2.1 TIPO INTEIRO ................................................................ 2.1.2.2 TIPO BOOLEAN .............................................................. 2.1.2.3 TIPO CHAR.................................................................... 2.1.2.4 TIPO REAL .................................................................... 2.1.2.5 TIPO STRING ................................................................. 2.1.3 DECLARAO DE VARIVEIS ...................................................... 2.1.4 DECLARAO DE CONSTANTES .................................................. 2.1.5 COMANDO DE ATRIBUIO ........................................................ 2.1.6 COMENTRIOS .......................................................................... 2.1.7 EXPRESSES ARITMTICAS ........................................................ 2.1.8 FUNES MATEMTICAS PR-DEFINIDAS ..................................... 2.1.9 EXPRESSES LGICAS ............................................................... EXERCCIOS ...................................................................................... COMANDOS DE ENTRADA ................................................................... COMANDOS DE SADA......................................................................... FORMATAO ................................................................................... O COMANDO CLRSCR ......................................................................... 3.4.1 EXERCCIOS ............................................................................. EXERCCIOS AVANADOS ....................................................................
1 2 2 3 3 3 3 4 4 4 4 4 5 6 6 7 8 9
11 12 13 14 14 14 14 14 15 15 16 17 17 18 19 20
4.2.1 EXERCCIOS DE FIXAO ........................................................... 4.2.2 EXERCCIOS ............................................................................. 4.2.3 EXERCCIOS OPCIONAIS ............................................................. A ESTRUTURA DE DECISO CASE......................................................... EXERCCIOS ...................................................................................... A ESTRUTURA DE REPETIO FOR ...................................................... 5.1.1 EXERCCIOS ............................................................................. 5.1.2 EXERCCIOS OPCIONAIS ............................................................. A ESTRUTURA DE REPETIO WHILE .................................................. 5.2.1 EXERCCIOS ............................................................................. 5.2.2 EXERCCIOS OPCIONAIS ............................................................. A ESTRUTURA DE REPETIO REPEAT-UNTIL ....................................... 5.3.1 EXERCCIOS .............................................................................
41 43 45 46 49 51 60 61 62 64 65 66 72
73 73 85 86 86 89 93
DECLARAO DE TIPOS ..................................................................... 97 VETORES .......................................................................................... 97 7.2.1 EXERCCIOS ............................................................................. 99 MATRIZES ......................................................................................... 100 7.3.1 EXERCCIOS ............................................................................. 102
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:
Algoritmos um conjunto de regras, bem denidas, para a soluo de um problema em um tempo nito e com um nmero nto de passos.
Algoritmo pode ser denido tambm como um conjunto de valores como entrada e produz algum valor ou conjunto de valores como sada. Um algoritmo deve sempre possuir pelo menos um resultado, normalmente chamado de sada, e satisfazer a propriedade da efetividade, isto , todas as operaes especicadas no algoritmo devem ser sucientemente bsicas para que possam ser executadas de maneira exata e num tempo nito.
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. Que se tenha um nmero nito de passos; ii. Que cada passo esteja precisamente denido, sem possveis ambigidades; iii. Que existam zero ou mais entradas tomadas de conjuntos bem denidos; iv. Que existam uma ou mais sadas; v. Que exista uma condio de m sempre atingida para quaisquer entradas e num tempo nito.
Para que um computador possa desempenhar uma tarefa necessrio que esta seja detalhada passo a passo, numa forma compreensvel pela mquina, utilizando aquilo que se chama de programa. Neste sentido, um programa de computador nada mais que um algoritmo escrito numa forma compreensvel pelo computador.
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). 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.
iii. Retirar do enunciado as informaes de sada Atravs do enunciado podemos descobrir quais so
1.1.3 EXERCCIOS
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.
1a Questo) Elabore um algoritmo que mova 3 discos de uma torre de Hani, que consiste em
As instrues, que comandam o funcionamento da mquina e determinam a maneira como devem ser tratados os dados. Os dados propriamente ditos, que correspondem poro das informaes a serem processadas pelo computador.
A classicao apresentada a seguir no se aplica a nenhuma linguagem de programao especca; pelo contrrio, ela sintetiza os padres utilizados na maioria das linguagens.
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.
i. um nome de varivel deve necessariamente comear com uma letra; ii. um nome de varivel no deve conter nenhum smbolo especial, exceto a sublinha ( _ ) e
nenhum espao em branco;
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.
Dispositivo de entrada o meio pelo qual as informaes (mais especicamente os dados) so transferidos pelo usurio ou pelos nveis secundrios de memria ao computador. Os exemplos mais comuns so o teclado, o mouse, leitora tica, leitora de cdigo de barras, as tas e discos magnticos.
Dispositivo de sada o meio pelo qual as informaes (geralmente os resultados da execuo de um programa) so transferidos pelo computador ao usurio ou aos nveis secundrios de memria. Os exemplos mais comuns so o monitor de vdeo, impressora, tas e discos magnticos. Sintaxe a forma como os comandos devem ser escritos, a m de que possam ser entendidos pelo tradutor de programas. A violao das regras sintticas considerada um erro sujeito pena do no reconhecimento por parte do tradutor; Semntica o signicado, ou seja, o conjunto de aes que sero exercidas pelo computador durante a execuo do referido comando. Daqui em diante, todos os comando novos sero apresentados por meio de sua sintaxe e sua semntica, isto , a forma como devem ser escritos e a(s) ao(es) que executam.
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 4a Questo) Um algoritmo no pode conter um comando como Escreva todos os nmeros 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
encher uma bacia com gua; trocar uma lmpada no teto de sua casa; trocar o pneu de um carro; calcular a sua idade daqui a 20 anos; calcular a mdia de um aluno com 3 notas.
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:
Programa fonte em Pascal Programa fonte em BASIC Programa fonte em C Programa fonte em FORTRAN Programa fonte em PROLOG Programa fonte em Assembly Arquivo cpia (back up) de outro Arquivo de lote (batch) Programa executvel
10
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
(1) X := A + B + C; (3) x := a + b + c;
C;
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:
X, a1,
Nota, NomeDoAluno,
O comprimento do nome de um identicador no tem efeito negativo sobre o desempenho de um programa. Assim, o usurio est livre para criar nomes longos para variveis, funes, etc. sem o risco de tornar o programa lento. De preferncia, os nomes dos identicadores devem sugerir alguma relao com o que estiver sendo identicado. Alguns identicadores especiais s podem ser usados pela linguagem com um signicado j pr-xado. Esses identicadores so chamados palavras reservadas ou palavras chave e so os seguintes:
13
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
2.1.2.1
TIPO INTEIRO
O tipo inteiro formado pelo subconjunto de inteiros, de acordo com a seguinte tabela:
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
O tipo string uma seqncia de caracteres de comprimento variando de 0 a 255. Escrevendo string[N], estamos denindo N como tamanho mximo da seqncia (neste caso N deve ser menor ou igual a 255). As constantes do tipo string devem estar entre apstrofos.
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
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
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:
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 *).
VAR mat, nota, cod: string; VAR mat, nota, cod: { 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:
i. Primeiramente, so efetuadas as multiplicaes e divises (/, DIV e MOD); ii. por ltimo, so efetuadas as adies e subtraes. Temos ento dois nveis de prioridades.
Dentro de um mesmo nvel, so efetuadas as operaes da esquerda para a direita. Exemplo: Na expresso 5 - 2/3*7 + 1 as operaoes so efetuadas na seguinte ordem: diviso, multiplicao, subtrao e adio. Se uma expresso contiver parnteses, ento ser executado primeiramente o que estiver entre parnteses. Exemplo:
18
Expresso Valor -----------------------5 + 2*4 13 (5 + 2)*4 28 7 DIV 2*3 9 7 DIV (2*3) 1 -----------------------Observaes:
i. No existe operador pr-denido para a potenciao. ii. O sinal de multiplicao nunca poder ser omitido. iii. A diviso / sempre fornece um resultado real, mesmo que os operandos sejam inteiros. iv. Se todos os operandos forem inteiros e as operaes envolvidas forem +, -, *, MOD ou DIV,
ento o resultado ser inteiro.
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
Exemplo: A derivada do arco-seno de x, ou seja, 1 sobre a raiz quadrada da diferena entre 1 e o quadrado de x, se escreve como 1/SQRT(1 - SQR(x)). Exemplo: O cubo de x pode ser codicado como x*x*x, ou como EXP(3*LN(x)). Em geral, x elevado a y pode ser codicado como EXP(y*LN(x)). Exemplo: A funo booleana ODD testa se um inteiro n e impar ou no. ODD(n) fornece um valor TRUE se n for mpar e FALSE em caso contrrio. Desse modo, ODD(5) = TRUE e ODD(4) = FALSE. Exemplo:
As funes INT e TRUNC so numericamente equivalentes. A diferena entre elas est apenas no tipo do valor retornado.
i. X AND Y TRUE somente quando X e Y forem ambas TRUE. ii. X OR Y FALSE somente quando X e Y forem ambas FALSE. iii. NOT X TRUE quando X for FALSE e FALSE quando X for TRUE.
Uma relao uma comparao realizada entre valores do mesmo tipo, cujo resultado TRUE ou FALSE. A comparao indicada por um dos operadores relacionais a seguir:
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
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
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|
a a a z z
:= := := := :=
m MOD 2 + n DIV (m + p); TRUNC(x)*ROUND(SQRT(2)) SQR(p + 1) MOD (m MOD ABS(p)); SQRT(2*m + p)/ROUND(EXP(1)); INT(11/7) - FRAC(1/(1 + n + 2*p));
a) b) c) d)
Odd(a) OR Odd(b) AND Odd(c); NOT (b <> (a + c) DIV 2) AND NOT (a = 0) (a = b + c) XOR (b = c + a) (c >= a) AND (NOT (a = 5*b - 3*c) OR (c <= a + b))
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)
:= := := :=
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.
dados Var1,
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
WRITELN(v1, v2, ...); ---> Mostra na tela os valores de v1, v2, ... e posiciona o cursor no incio da prxima linha na tela.
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
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.
Estamos atribuindo o nome SomaDeDoisInteiros ao programa. Observe que os comandos do programa (WRITE..., READLN..., ...) devem car na seo principal do programa delimitados pelas palavras BEGIN e END. No pode ser omitido o ponto aps o END. O bloco VAR de declarao de variveis deve vir antes da seo principal. comum se deslocar para a direita as linhas de comandos compreendidas entre um BEGIN e um END. Esse tipo de deslocamento chamado endentao. Uma vez digitado este programa, pressione simultaneamente as teclas CTRL e F9 para que ele seja executado.No caso deste programa, voc ver em uma parte da tela algo parecido com:
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.
Observe a diferena na posio nal do cursor. Observao: sem parmetros, ou seja, s o nome do comando seguido imediatamente de um ponto e vrgula. Um WRITELN sem parmetros causa a impresso de uma linha em branco. Por exemplo:
27
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
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
O smbolo na tabela acima assinala os espaos em branco. Em um comando WRITE ou WRITELN, a impresso de n espaos em branco pode ser feita acrescentando-se lista de valores a serem impressos uma expresso da forma ' ':n, como no ltimo exemplo da tabela acima. O tamanho do campo de impresso pode ser uma expresso aritmtica. Por exemplo, WRITE(dado:5) o mesmo que WRITE(dado:(11 - 9 + 3)). Para se formatar a impresso de um valor real, devem ser fornecidos dois inteiros que correspondem ao tamanho do campo de impresso e quantidade de casas decimais a serem impressas.
WRITE(x:M:N) ou WRITELN(x:M:N) ---> Imprime o valor de x em um campo de largura M, com N casas decimais.
Se o valor de M for maior do que a quantidade necessria para a impresso do valor de x, ento a largura do campo ser completada com espaos em branco adicionados esquerda. O ponto decimal ou o sinal negativo ocupam um espao do campo de impresso. O tamanho do campo de impresso e a quantidade de casas decimais podem ser fornecidos em forma de expresso aritmtica. Valores reais sem formatao so impressos em forma de potncias de 10. Exemplo: Consideremos Pi e X constantes reais com valores respectivamente iguais a 3.1415926535 e -1991. A tabela a seguir mostra as diversas sadas geradas pelo respectivo comando WRITE. Denotamos os espaos em branco por .
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.
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
imprima a mdia dos valores lidos. tela.
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 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 5a Questo)Apresente o seguinte algoritmo:
deles.
31
ii. Efetuar a soma das variveis A e B colocado seu resultado na varivel X; iii. Apresentar o valor da varivel X aps a soma dos dois valores indicados.
equivalente em milmetros (25,4 mm = 1 polegada). hipotenusa.
6a Questo)Elabore um programa que leia a quantidade de chuva em polegadas e imprima a 7a Questo)Dados dois lados de um tringulo retngulo, faa um programa para calcular a 8a Questo) Leia 2 variveis A e B, que correspondem a 2 notas de um aluno. A seguir, calcule 9a Questo) Leia 3 variveis A e B e C, que so as notas de um aluno. A seguir, calcule a mdia 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
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. A e B pelo produto de C e D (A*B-C*D).
a percentagem do distribuidor e dos impostos (aplicados ao custo de fbrica). Supondo que a percentagem do distribuidor seja de 12% e os impostos 45%, preparar um programa para ler o custo de fbrica do carro e imprimir o custo ao consumidor. graus fahrenheit.
12a Questo) Escreva um programa que leia uma temperatura em graus Celsius e converta para
C=
5(F 32) 9
13a Questo) Escrever um algoritmo para calcular o volume de uma esfera sendo fornecido o
V olume = 4 ..R3 3
Onde e uma constante que vale 3.1415 e R o raio da esfera. e B pelo produto de C e D (A*B-C*D).
14a Questo)Leia 4 variveis A,B,C e D. A seguir, calcule e mostre a diferena do produto de A 15a Questo)Entrar com dois nmeros inteiros e exibir a seguinte sada:
Dividendo: Divisor: Quociente: Resto:
16a Questo)Entrar com um ngulo em graus e exibi-lo em radianos. 17a Questo) Entrar com um ngulo em graus e exibir o valor do seno, co-seno e tangente. 18a Questo)Faa um programa que entre com o saldo e aplique um percentual de 10%. Mostre 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
Onde:
(1+i)2 1 i
1a Questo) Preparar um programa para ler os comprimentos dos trs lados de um tringulo
Area = 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.
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 | +----------+ +----------+ | | +--->---+---<----+ |
O comando1 ou comando2 acima podem ser comandos compostos ou outras estruturas de deciso. Exemplo: Consideremos a seguinte estrutura de deciso:
OBSERVAO IMPORTANTE:
IF (x > -1) AND (x < 1) THEN BEGIN Writeln('X tem modulo menor do que 1');
35
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:
Ler os valores dos coecientes a, b, c; Vericar se a = 0. Se for, rejeitar os valores fornecidos. Neste caso, usaremos o comando HALT para encerrar a execuo do programa; Calcular o valor do discriminante = b2 4 a c; Se o Delta for maior ou igual a zero, calcular as razes x1 e x2 usando a conhecidssima frmula; Se o Delta for negativo, calcular as razes complexas. x1 = x2 =
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
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.
linguagem de programao o IF encaixado (tambm chamado de IF aninhado). O problema consiste na diculdade de se indenticar que ELSE est relacionado com qual IF. Nestes casos uma boa endentao pode ajudar. Observe o seguinte IF:
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".
4.2.1 EXERCCIOS DE FIXAO 1a Questo) Escreva o programa referente ao uxograma da gura 4.1.
2a Questo) Para os valores (a=5) (b=7) e (c=9), assinale com X a seqncia de execuo dos
a) SE a = 5 E b = 7 Entao c: c + 1 seno c := c - 1; fim-se
( ( ( ( (
) ) ) ) )
42
( ( ( ( ( ( ( ( (
) ) ) ) ) ) ) ) )
Figura 4.2: Fluxograma B 4a Questo) Para as sadas, considere os seguintes valores: A=2, B=3, C=5, D=9 e E=6.
a) Resposta: _______ Se no D > 5 entao X := (A + B) * D; senao X := (A - B) / C fim-se Escrever X b) Resposta: _______ Se (A > 2) E (B < 7) entao X := (A + 2) * (B - 2); senao
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
e retorne o quociente da diviso entre A e B. O programa deve vericar, previamente diviso, se o valor de B diferente de zero.
1a Questo) Faa um programa que leia dois nmeros inteiros A e B da entrada padro (teclado) 2a Questo) Leia um valor inteiro X e diga se ele par ou mpar. 3a Questo) Escreva um algoritmo para receber o sexo e a idade de uma pessoa. Se a pessoa for 4a Questo)Faa um programa que leia dois nmeros inteiros A e B da entrada padro (teclado) 5a Questo)Escreva um algoritmo para receber a sigla e o Estado de uma pessoa e imprimir
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). e imprima o maior deles. D um tratamento caso estes nmeros forem iguais. uma das seguintes mensagens:
44
6a Questo)Faa um programa que leia dois inteiros A e B e imprima a soma destes valores se 7a Questo)Leia trs lados de um tringulo e diga que:
i. O tringulo equiltero se todos os lados forem iguais; ii. O tringulo escaleno se todos os lados forem diferentes; iii. O tringulo isceles se apenas dois lados forem iguais. 8a Questo) Escreva um algoritmo para o calcula das razes de uma equao do segundo grau. 9a Questo)Escreva um algoritmo que leia o cdigo de um aluno e suas trs notas. Calcule a
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. este nmero par ou mpar, e se positivo ou negativo.
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
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).
13a Questo) Elaborar um algoritmo que l 3 valores a,b,c e verica se eles formam ou no um
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. determinado evento em uma fbrica e informe-o expresso no formato horas:minutos:segundos.
14a Questo) O departamento que controla o ndice de poluio do meio ambiente mantm 3
45
anos, meses e dias. Suponha que 1 ano possua 365 dias e um ms possua 30 dias.
16a Questo) Escrever um algoritmo que leia a idade de uma pessoa em dias e informe-a em 17a Questo)Faa um algoritmos para ler um nmero e imprimir se ele igual a 5, 200 ou 400. 18a Questo)Faa um algoritmo que leia o percurso em quilmetros, o tipo de carro e informe 19a Questo) 19a Questo) Um endocrinologista deseja controlar a sade de seus pacientes e,
Se no vericar se o mesmo est no intervalo entre 500 e 1000 inclusive , ou se est fora do escopo especicado.
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.
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:
2a Questo) Escrever um algoritmo que l um valor em reais e calcula qual o menor nmero 3a Questo) Ler trs nmeros do teclado e imprimi-los em ordem crescente. 4a Questo)Escrever um algoritmo que l um conjunto de 4 valores i, a, b, c, onde i um valor
i. Se i=1 escrever os trs valores a, b, c em ordem crescente. ii. Se i=2 escrever os trs valores a, b, c em ordem decrescente. iii. Se i=3 escrever os trs valores a, b, c de forma que o maior entre a, b, c que dentre os dois.
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.
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
Em seguida, efetue e mostre o resultado da operao determinada pela opo escolhida. 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. de maturidade de acordo com a tabela abaixo:
4a Questo) Faa um programa em Pascal que leia um nmero que represente um ms do ano. 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
abaixo, elabore um programa que mostre na tela o valor do imposto, quando o usurio fornecer o valor do salrio (inteiro).
6a Questo) Supondo que a cobrana de imposto de renda na fonte seja feita com base na tabela
+------------------------+----------+-------------------+ | 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
A repetio a essncia de muitas aplicaes em computadores. Uma estrutura de repetio uma estrutura que comanda os processos de repetio, por mais complexos e complicados que sejam. Uma tarefa essencial no projeto de qualquer estrutura de repetio (tambm chamada de "loop"ou "lao") como decidir quando as repeties (ou iteraes) devem terminar. O Pascal oferece trs estruturas de repetio diferentes, cada uma com um esquema prprio para o controle do processo de repetio: os comandos FOR, WHILE e REPEAT.
ou
FOR Varivel := ValorInicial TO ValorFinal DO BEGIN comando; END; FOR Varivel := ValorInicial DOWNTO ValorFinal DO BEGIN comando; END;
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
FOR-TO) ou o valor anterior (no caso do FOR-DOWNTO) do intervalo ValorInicial..ValorFinal (ou ValorFinal..ValorInicial).
ii. A varivel i passa a ter o valor seguinte ao anterior, ou seja, i passa a valer 2 e o comando 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. Quando esse FOR for completamente executado, teremos os valores 1, 4, 9, 16 e 25 mostrados na tela, um em cada linha. Exemplo: FOR i := 5 DOWNTO 1 DO Writeln(Sqr(i)); Este exemplo funciona de forma semelhante ao anterior mas com uma diferena: os valores de i vo variar de 5 at 1, diminuindo de 1 em 1. mostrado na tela os valores 25, 16, 9, 4 e 1, nessa ordem, um em cada linha. Exemplo: Seja x uma varivel do tipo char. O FOR a seguir mostra na tela todas as letras maisculas ABC...XYZ.
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.
CHR(n) ---> n-simo caracter do tipo char; ORD(x) ---> Ordinal do caracter x.
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:
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 1 1 termos gerais so n e n2 . 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:
= = = = = = = = =
= = = = = = = =
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.
57
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 :=
) ) ) )
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.
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:
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
caracteres do seu nome.
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 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 6a Questo) Leia 2 valores: X e Y. A seguir, calcule e mostre a soma dos nmeros pares entre 7a Questo) Foi feita uma pesquisa entre os habitantes de uma regio. Foram coletados os dados
mdia e situao de cada aluno, ou seja >= 7,0 aprovado, entre 7,0 e 4,0 Prova Final e menor que 4 Reprovado. dividido por 11 do resto igual a 5.
eles.
eles.
i. a mdia de salrio do grupo; ii. maior e menor idade do grupo; iii. quantidade de mulheres com salrio at R$100,00.
entre 0 e 50.
8a Questo)Faa um programa que mostre na sada padro (vdeo) o nmeros mltiplos de 3 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
aritmtica), a1 ( o primeiro termo da progresso) e r (a razo da progresso) e escreva os n termos desta progresso, bem como a soma dos elementos.
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 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
S =1+
1 2 1 + 1 + 4 + .... + 3 1 n
entre 13 e 73.
soma:
17a Questo) Escrever um algoritmo que diz se um nmero X fornecido pelo usurio ou no 18a Questo) Escreva um algoritmo que leia 10 valores, um de cada vez. Mostre ento o maior 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 21a Questo) Faa um algoritmo que calcule a seguinte soma:
H = 10 + 10 + 10 + ... + 10
valor lido.
O algoritmo deve ler um nmero n (inteiro e positivo) e mostrar o resultado nal de H. A soma deve ser calculada apenas uma vez. quantos divisores ele possui.
22a Questo) Escrever um algoritmo/programa em Pascal que l um nmero e calcula e escreve 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
2a Questo) Escrever um algoritmo que l um valor N inteiro e positivo e que calcula e escreve
62
E =1+
1 1!
1 2!
1 3!
1 4!
+ .... +
1 n!
respectivamente 0 e 1. A partir deles, os demais termos so construdos pela seguinte regra: tn = tn1 + tn2 . Escrever um algoritmo/programa em Pascal que gera os 10 primeiros termos da Srie de Fibonacci e calcula e escreve a soma destes termos.
3a Questo) A srie de Fibonacci tem como dados os 2 primeiros termos da srie que so
... 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. ento executado mais uma vez e x passa a valer 22 + 11 = 33.
ii. A expresso x < 1992 reavaliada com x = 22 e novamente verdadeira. O comando composto iii. A seqncia AVALIAR EXPRESSO -> EXECUTAR COMANDO -> AVALIAR
EXPRESSO -> EXECUTAR COMANDO -> ... se repete vrias vezes at que x assuma um valor maior do que ou igual a 1992 e a expresso passe a ser falsa. para o comando seguinte ao WHILE.
iv. Quando a expresso for falsa, o lao WHILE se encerrar e o controle do programa passar
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.
<-->
64
comando;
5.2.1 EXERCCIOS
e cresce 3 centmetros por ano. Construa um algoritmo que calcule e imprima quantos anos sero necessrios para que Z seja maior que Chico. positivos, lidos externamente. O nal da leitura acontecer quando for lido um valor negativo.
1a Questo) Chico tem 1,50 metro e cresce 2 centmetros por ano, enquanto Z tem 1,10 metro 2a Questo) Construir um algoritmo que calcule a mdia aritmtica de vrios valores inteiros 3a Questo)Faa um programa que mostre um menu com as opes:
1. 2. 3. 4. 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. 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:
4a Questo) Escreva um algoritmo que calcule a mdia dos nmeros digitados pelo usurio, se 5a Questo) Em uma eleio presidencial existem quatro candidatos. Os votos so informados
i. total de votos para cada candidato; ii. total de votos nulos; iii. total de votos em branco;
Como nalizador do conjunto de votos, tem-se o valor 0. dos nmeros pares. O m da leitura ser indicado pelo nmero 0. deve nalizar quando for digitado o valor 0. ser quando a palavra FIM for digitada.
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).
i. residencial, preo em reais por Kwh = 0,3; ii. comercial, preo em reais por Kwh = 0,5; iii. industrial, preo em reais por Kwh = 0,7.
Os dados devem ser lidos at que o consumidor nmero 0 (zero) seja informado. Para cada consumidor informar: o custo total, o total de consumo para os trs tipos de consumidores e a mdia de consumo para os consumidores do tipo 1 e 2.
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. 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. (Considerar a palavra destista escrita de seguinte forma: DESTISTA, dentista, Dentista). deve ser nalizado quando o usurio digitar 0 (zero).
12a Questo) Escrever um algoritmo que leia um nmero m de valores e calcule a mdia 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).
1a Questo) Escreva um programa que onde o computador gere um nmero entre 0 e 100 e faa
66
Pensei em nmero tente advinha-lo? 14 Errado !!! O nmero que pensei est entre 14 e 100. Tente Adivinh-lo? 12 Nmero fora da faixa. O nmero que pensei est entre 14 e 100. Tente Adivinh-lo? 34 Muito bem !!! voc acertou em 3 tentativas.
<--->
67
Uma diferena signicativa entre o REPEAT-UNTIL e o WHILE que no REPEAT-UNTIL o comando sempre executado pelo menos uma vez e no WHILE, o comando pode nem ser executado, dependendo da avaliao inicial da expresso. Exemplo: Nosso primeiro programa-exemplo com o REPEAT-UNTIL espera que o usurio digite vrios nomes. O aviso do usurio para que o programa encerre a solicitao de nomes ser a senha (ag) FIM ou m. O programa ainda tem a "sosticao"de contar quantos nomes foram digitados. Temos ento uma situao que se repetir (o programa pedir nomes) at que outra (o usurio digitar FIM ou m) acontea, um caso tpico de REPEAT-UNTIL.
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.
(* versao REPEAT-UNTIL *)
68
cont := 0; (* Quantidade inicial de nmeros digitados *) soma := 0; (* Soma inicial dos nmeros digitados *) REPEAT Readln(x); if x >= 0 then begin cont := cont + 1; soma := soma + x; end; UNTIL x < 0; media := soma/cont; Writeln('Media aritmetica dos numeros digitados = ', media:8:4); END. (* fim do programa *) PROGRAM MediaAritmetica; (* versao WHILE *) VAR x, soma, media: real; cont: integer; BEGIN cont := 0; (* Quantidade inicial de nmeros digitados *) soma := 0; (* Soma inicial dos nmeros digitados *) x := 0; (* Valor inicial de x. No WHILE recomen- *) (* dado se inicializar as variveis. *) WHILE x >= 0 DO (* a condio do WHILE a negao da *) BEGIN (* condio do REPEAT-UNTIL *) Readln(x); if x >= 0 then begin cont := cont + 1; soma := soma + x; end; END; media := soma/cont; Writeln('Media aritmetica dos numeros digitados = ', media:8:4); END. (* fim do programa *)
Exemplo: No presente exemplo, queremos que o computador gere aleatoriamente um nmero de 0 a 10000. O usurio dever tentar advinhar o nmero chutado pelo computador. A cada tentativa do usurio, o programa dever informar se o chute do usurio foi maior ou menor que o nmero chutado no incio do programa. O progama tambm deve contar a quantitade de tentativas do usurio.
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
converge para ( 3 )/32.
1 33
1 53
1 73
1 93
+ ....
Neste exemplo, vamos elaborar um programa que some todos os termos dessa srie que, em mdulo, so maiores ou iguais a 10 10. O resultado dessa soma, pode ser usado para se calcular Pi com 10 decimais exatas. Como no sabemos quantos termos devemos somar, temos um caso de REPEAT-UNTIL ou, equivalentemente, de WHILE. Usaremos um comando da unidade CRT chamado GOTOXY cuja funo posicionar o cursor em determinada coluna e determinada linha da tela. Sua sintaxe :
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.
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
Exemplo: Neste ltimo exemplo deste captulo, vamos usar 3 comandos da unidade CRT para gerar sons com determinadas freqncia e durao. So eles:
SOUND(n) ---> Emite continuamente um som de n MHz NOSOUND ---> Encerra a emisso do som DELAY(t) ---> Pausa de t milisegundos
A execuo de uma determinada nota musical feita da seguinte forma:
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;
ii. Usamos o DELAY para determinar a durao da nota; iii. Encerramos a emisso do som com o NOSOUND.
Usaremos o READKEY para vericar qual tecla foi pressionada no teclado e um CASE para emitir um som que corresponda nota desejada. Vamos convencionar que o "Q"emite um d, o "W"um r, ... . As teclas que no constarem dos alvos do CASE no emitiro sons. Precisamos tambm de um REPEAT-UNTIL para repetir o processo de "pressionar tecla e emitir som"at que READKEY retorne o caracter #27, que corresponde tecla ESC.
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
'U', 'u; : Sound(494); 'I', 'i' : Sound(524); 'O', 'o' : Sound(558); 'P', 'p' : Sound(660); '[', '{' : Sound(700); ']', '}' : Sound(784); END; DELAY(50); NOSOUND; (* UNTIL (ch = TeclaESC) (* (* END.
{ { { { { {
si } d } r } mi } f } sol }
5.3.1 EXERCCIOS
pelo usurio. Verique se o nmero positivo. OBS: Utilize o Repeat. deve nalizar quando for digitado o valor 0. OBS: Utilize o Repeat.
1a Questo) Faa um algoritmo para calcular o fatorial de um nmero x, dado como entrada 2a Questo)Faa um algoritmo que leia n nmeros e imprima somente os pares. O algoritmo 3a Questo) Faa um algoritmo que leia n nmeros e calcule a soma dos nmeros pares. O 4a Questo) Faa um algoritmo que leia n nmeros e calcule o produto dos nmeros mpares. 5a Questo) Escrever um algoritmo que leia um nmero m de valores e calcule a mdia aritmtica 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 8a Questo) Escreva um programa Pascal que apresente o menu de opes abaixo:
OPES: 1 - SAUDAO 2 - BRONCA 3 - FELICITAO 0 - FIM
algoritmo deve nalizar quando for digitado o valor 0. OBS: Utilize o Repeat.
O algoritmo deve nalizar quando for digitado o valor 1. OBS: Utilize o Repeat.
dos valores lidos, a quantidade de valores positivos, a quantidade de valores negativos e o percentual de valores negativos e positivos. Mostre os resultados. ser nalizado quando o usurio digitar 0 (zero). ser nalizado quando o usurio digitar 0 (zero).
O programa deve ler a opo do usurio e exibir, para cada opo, a respectiva mensagem:
1 2 3 0
Ol. Como vai ? Vamos estudar mais. Meus Parabns ! Fim de servio.
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:
FUNCTION Log10(x: real): real; { versao 2 } BEGIN if (x < 0) then begin Writeln('Parametro invalido'); Halt; { encerra a execuo do programa } end else begin Log10 := Ln(x)/Ln(10);
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
END; (* fim da definio de MAX *) FUNCTION Min(x, y: real): real; (* Funo MIN ---> retorna o menor valor entre x e y *) BEGIN if (x <= y) then begin Min := x; end else begin Min := y; end; END; (* fim da definio de MIN *) BEGIN (* inicio do programa principal *) Write('Forneca dois numeros : '); Readln(a, b); Writeln('O maior dos dois ' ', Max(a, b):6:2); Writeln('e o menor ' ', Min(a, b):6:2) END. (* fim do programa *)
OBSERVAO IMPORTANTE: As variveis denidas em uma funo, chamadas variveis locais, ou as que so denidas como parmetros, no tm nenhuma relao com as variveis de outras funes ou do programa principal, mesmo que elas tenham o mesmo nome. O programa principal no tem conhecimento das variveis locais declaradas em uma funo. Exemplo: O comando EXIT, quando usado em uma funo, faz o controle do programa abandonar a funo e voltar ao ponto na qual a funo foi chamada. til para se interromper a execuo de uma funo que foi chamada com algum argumento com valor invlido. A seguir, denimos uma funo fatorial. Se ela for chamada com argumentos invlidos (negativos ou grandes), ento o comando EXIT faz o controle do programa abandonar a funo e voltar ao ponto de chamada.
FUNCTION Fat(n: integer): integer; VAR (* declarao das variveis locais *) i, prod_aux: integer; BEGIN if (n < 0) or (n > 12) then begin Writeln('Argumento n invalido na chamada de FAT.'); EXIT; (* abandona a execuo da funo *) end else begin if n <= 1 then begin Fat := 1; end else begin prod_aux := 1;
77
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.
Curso(n: integer): string; OF Curso Curso Curso Curso Curso Curso Curso Curso Curso := := := := := := := := := '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:
:= := := := :=
'' '' + 'x' = 'x' 'x' + 'x' = 'xx' 'xx' + 'x' = 'xxx' 'xxx' + 'x' = 'xxxx' ... ...
(n (n (n (n
= = = =
1) 2) 3) 4)
FUNCTION Repete(n: byte; x: char): string; VAR i: integer; Str_aux: string; BEGIN Str_aux := ''; for i := 1 to n do begin Str_aux := Str_aux + x; end; Repete := Str_aux; END;
Para uso futuro, grave no disco esta funo sob o nome de REPETE.PAS. Por exemplo, REPETE(6, '*') = '******', REPETE(10, '%') = '%%%%%%%%%%', REPETE(0, 'A') = , etc. Um exemplo de uso dessa funo :
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
function Cotg(x: real): real; { Cotangente } begin if Sin(x) = 0 then begin Halt; { parametro invalido } end; Cotg := Cos(x)/Sin(x) end; { -------------------------------------------------------function Sec(x: real): real; { Secante } begin if Cos(x) = 0 then begin Halt; end; Sec := 1/Cos(x) end; { -------------------------------------------------------function Cossec(x: real): real; { Cossecante } begin if Sin(x) = 0 then begin Halt; end; Cossec := 1/Sin(x) end; { -------------------------------------------------------function ArcSen(x: real): real; { Arco-seno } begin if (Abs(x) > 1) then begin Halt; { parametro invalido } end; else begin if (x = 1) then begin ArcSen := Pi/2; end; else begin if (x = -1) then begin ArcSen := -Pi/2; end; else begin ArcSen := ArcTan(x/Sqrt(1 - Sqr(x))); end; end; end; { --------------------------------------------------------
81
function ArcCos(x: real): real; { Arco-cosseno } begin if (Abs(x) > 1) then begin Halt; { parametro invalido } end else if (x = 0) then begin ArcCos := Pi/2; end; else begin if (x > 0) then begin ArcCos := ArcTan(Sqrt(1 - Sqr(x))/x); end; else begin ArcCos := Pi + ArcTan(Sqrt(1 - Sqr(x))/x); end; end; end; { -------------------------------------------------------- } { ======================================================== } { FUNCOES HIPERBOLICAS } { ======================================================== } function Senh(x: real): real; { Seno hiperbolico } begin Senh := (Exp(x) - Exp(-x))/2 end; { -------------------------------------------------------- } function Cosh(x: real): real; { Cosseno hiperbolico } begin Cosh := (Exp(x) + Exp(-x))/2 end; { -------------------------------------------------------- } function Tgh(x: real): real; { Tangente hiperbolica } begin Tgh := (Exp(x) - Exp(-x))/(Exp(x) + Exp(-x)) end; { -------------------------------------------------------- } function ArcSenh(x: real): real; { Arco-seno hiperbolico } begin ArcSenh := Ln(x + Sqrt(Sqr(x) + 1)) end; { -------------------------------------------------------- } function ArcCosh(x: real): real; { Arco-cosseno hiperbolico} begin if (x < 1) then begin
82
Halt; { parametro invalido } end; ArcCosh := Ln(x + Sqrt(Sqr(x) - 1)) end; { -------------------------------------------------------- } function ArcTgh(x: real): real; { Arco-tangente hiperbolica} begin if (x >= 1) or (x <= -1) then begin Halt; { parametro invalido } end; ArcTgh := Ln((1 + x)/(1 - x))/2 end; { -------------------------------------------------------- }
Exemplo: Deniremos neste exemplo uma funo booleana chamada PRIMO(n) que ser TRUE se n for primo e FALSE em caso contrrio.
FUNCTION Primo(n: integer): boolean; (* Testa se um inteiro n primo *) VAR i: integer; raiz: real; BEGIN Primo := TRUE; (* suposio inicial de que n primo *) if (n < 0) then begin n := -n; end; if (n = 2) then begin Exit; end; if (n = 1) or (n mod 2 = 0) then (* caso em que n 1 *) begin (* ou par > 2 *) Primo := FALSE; Exit; end; raiz := Sqrt(n); (* Caso geral: Se n for divis- *) i := 3; (* vel por um mpar maior ou *) while (i <= raiz) do (* igual a 3 e menor ou igual *) begin (* raiz quadrada de n, ento n *) if (n mod i = 0) then (* no primo. Caso contrrio, *) begin (* n primo. *) Primo := false; Exit; end; i := i + 2 end
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 .
FUNCTION Pot(x, y: real): real; CONST epsilon = 1E-10; BEGIN if (Abs(x) < epsilon) and (Abs(y) < epsilon) then begin (* Caso em que x = 0 e y = 0 *) Writeln('ERRO: Forma indeterminada 0 elevado a 0.'); Halt; end else begin if (Abs(x) < epsilon) then begin (* Caso em que x = 0 *) if (y > 0) then begin Pot := 0; end; else begin Writeln('ERRO: Base nula e expoente negativo.'); Halt; end; end else begin if (Abs(y) < epsilon) then (* Caso em que y = 0 *) begin Pot := 1; end else begin if (x > 0) then (* Caso geral com x > 0 *)
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
FUNCTION PotenciaDeDois(n: integer): boolean; VAR m: integer; BEGIN repeat m := n; n := n div 2; until n*2 <> m; if (m = 1) then begin PotenciaDeDois := true; end; else begin PotenciaDeDois := false; end; END;
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.
FUNCTION FSerie(x: real; n: byte): real; (* Sen(2x) Sen(nx) FSerie(x, n) = Sen(x) + --------- + ... + --------2 n *) var aux: real; k: integer;
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.
FUNCTION ExpAprox(x: real): real; (* 2 3 x x ExpAprox(x) = 1 + x + ----- + ----2! 3! *) var i: integer; aux: real; BEGIN aux := 0; for i := 0 to 10 do begin aux := aux + Pot(x, i)/Fat(i); end; ExpAprox := aux END;
10 x ... ----10!
PROCEDURE NomeDoProcedimento (parmetro1, parmetro2, ...); (* declaraes de tipos, variveis, constantes, ... *) BEGIN comando1;
87
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
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
BEGIN (* inicio do programa principal *) LerNumeros; CalcularSoma; MostrarResultado END. (* fim do programa *)
Neste exemplo, as variveis X, Y, SOMA so do conhecimento de todo o programa pois elas foram denidas fora de qualquer procedimento ou funo. Dizemos que variveis assim so globais. O uso de variveis globais deve globais ser evitado, pois pode levar a erros difceis de serem detectados. O uso de parmetros evita o uso abusivo de variveis globais. O programa cou grande, mas ca mais fcil de se ler uma vez que cada parte do programa executa uma tarefa especca. Podemos estar interessado apenas na sada dos resultados, e a, bastaramos olhar o procedimento MOSTRARRESULTADO e ignorar os demais. O programa ca tambm mais fcil de se consertar ou de se fazer mudanas.
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.
PROCEDURE Troca(VAR x, y: real); VAR aux: real; (* variavel local ao procedimento *) BEGIN aux := x; x := y; y := aux END.
Se tivermos, por exemplo, x = 1 e y = 2, aps o comando
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:
FUNCTION f(x: real): real; <---> PROCEDURE F(x: real, VAR y: real); ... ... y := f(x); <---> F(x, y);
A recproca tambm verdadeira, mas no parece ser muito natural. Neste exemplo, calculamos o fatorial de n atravs de um procedimento. No estamos, no momento, preocupados em fazer um programinha breve e pequeno.
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
"N"e retorne TRUE caso um nmero seja par, FALSE caso contrrio
1a Questo) Escreva um programa que tenha uma rotina que receba como parmetro um valor 2a Questo) Escreva um programa que tenha uma rotina que receba como parmetro um valor 3a Questo) Dado um vetor com n elementos numricos, faa um programa que tenha uma 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
"N"e retorne TRUE caso um nmero seja mpar, FALSE caso contrrio.
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. esquerdade uma STRING qualquer.
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
Y =
X2 2!
2X 3 3!
3X 4 4!
4X 5 5!
+ ... +
nX (n+1) (n+1)!
informe se o caracteres nesse vetor formam uma palavra que polndrome. at o n-simo. (N deve ser passado com parmetro).
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
i=1
1 n!
14a Questo) Escreva um programa que tenha uma rotina para calcular:
50
i=
1 2n
inteiro e informe se um nmero ou no primo. O valor a ser retornado ser um booleano. parmetro e escreva um string que corresponde a concatenao das duas strings. seu nome.
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 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
valor inteiro positivo N e exiba o string S por N vezes seguidas na tela. do tipo real e retorne a potncia elevado a 3 do mesmo.
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. n e retorne a quantidade de divisores que ele possui.
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. 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:
24a Questo) Escreva um programa que tenha uma rotina chamada MEDIA que retorne a
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.
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:
25a Questo) Escreva um programa Pascal que leia as 3 notas e o nmero de faltas de um
i. utilize uma funo para calcular a mdia e um procedimento para determinar e exibir a situao
do aluno;
26a Questo) Escreva um programa em Pascal que calcule o valor do coseno de X atravs de
1
Observaes:
x2 2!
x4 4!
x6 6!
x8 8!
+ ....
i. O valor de x ser lido; ii. Deve ser implementado em funes independentes o clculo do fatorial e o clculo das potncias.
em Horas, Minutos e Segundos e retornar esta medida convertida apenas para segundos.
27a Questo) Escreva uma funo chamada SEG para receber uma medida de tempo expressa 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.
1 a 12) e retorne um string contendo o nome do ms correspondente a N. Faa um programa que leia uma data (no formato dia, ms e ano) e, usando a funo NOME_MES, exiba a data lida no formato abaixo:
29a Questo) Escreva uma funo chamada NOME_MES que receba um valor inteiro N (de
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
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.
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
if maximo < V[i] then begin maximo := V[i]; end; end; VMax := maximo END;
Neste exemplo, o vetor V s ca bem denido fornecen- do-se os valores de V e de n.
7.2.1 EXERCCIOS
imprima o contedo de um vetor de nmeros reais chamado Y com 10 posies.
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 3a Questo) Implemente um programa que tenha duas subrotinas: uma que leia um vetor de 4a Questo) Implemente um programa que tenha duas subrotinas: uma que leia um vetor de 5a Questo) Escreva um programa que tenha trs subrotinas: uma que leia dois vetores
tamanho 10 e outra que imprima somente o contedo dos vetores que receberam valores maiores que 4. tamanho 15 e outra que imprima somente o contedo dos vetores que receberam valores negativos. tamanho 10 e outra imprima somente o contedo dos vetores que receberam valores pares.
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. soma dos elementos de X.
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 8a Questo) Faa um procedimento que gera os 10 primeiros primos acima de 100 e retorna-os 9a Questo) Faa um procedimento que recebe 2 vetores A e B de tamanho 10 de inteiros, por 10a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 10 elementos 11a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 10 elementos 12a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 20 elementos 13a Questo) Faa um procedimento que recebe, por parmetro, 2 vetores de 15 elementos 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
substitui todos os valores negativos de A por zero. O vetor A deve retornar alterado. em um vetor X(10), por parmetro.
parmetro. O procedimento deve retornar um vetor C, por parmetro, que contm os elementos de A e B em ordem decrescente. inteiros e que calcule e retorne, tambm por parmetro, o vetor interseco dos dois primeiros. inteiros e que calcule e retorne, tambm por parmetro, o vetor diferena dos dois primeiros. inteiros e que calcule e retorne, tambm por parmetro, o vetor soma dos dois primeiros.
inteiros e que calcule e retorne, tambm por parmetro, o vetor produto dos dois primeiros. tambm por parmetro, um vetor P contendo apenas os valores primos de K.
100
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.
16a Questo) Faa um procedimento que receba, por parmetro um vetor B(50) de reais e
7.3 MATRIZES
Uma matriz pode ser considerada como um vetor de vetores:
(* 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:
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
a_ij = 2i^3 - j^2 + 1 TYPE matriz5x6 = ARRAY [1..5, 1..6] OF integer; VAR i, j: integer; A: matriz5x6; BEGIN for i := 1 to 5 do begin for j := 1 to 6 do begin A[i, j] := 2*i*i*i - j*j + 1; end; end; END.
Observaes: Podemos ter variveis indexadas de dimenses maiores que 2. Por exemplo, o TYPE a seguir dene variveis de dimenses 3 e 4:
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.
102
.... 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 7a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4)
dos elementos da sua diagonal principal e da sua diagonal secundria. dos elementos da linha 5 e da coluna 3. elemento da sua diagonal secundria.
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. e retorna uma matriz C, tambm por parmetro, que seja o produto matricial de M por N.
103
e retorna uma matriz C, tambm por parmetro, que seja a soma de M com N.
8a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4) 9a Questo) Faa um procedimento que receba, por parmetro, duas matrizes A(4,6) e B(6,4) 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
e retorna uma matriz C, tambm por parmetro, que seja a diferena de M com N.
A . O procedimento deve multiplicar cada elemento de M por A e armazenar em um vetor V(36). O vetor V deve retornar por parmetro. as seguintes trocas:
a linha 2 com a linha 8; a coluna 4 com a coluna 10; a diagonal principal com a secundria; a linha 5 com a coluna 10;
O procedimento deve retornar a matriz alterada. a soma dos elementos das linhas pares de B.
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, 14a Questo) Faa um procedimento que receba, por parmetro, uma matriz A(6,6) e multiplica 15a Questo) Na teoria dos sistemas, dene-se como elemento minimax de uma matriz o menor 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
tambm por parmetro, um vetor com a soma de cada uma das linhas de A .
cada linha pelo elemento da diagonal principal daquela linha. O procedimento deve retornar a matriz alterada.
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.
procedimento deve somar individualmente as colunas da matriz e armazenar o resultado na 61a linha da matriz. O procedimento deve retornar a matriz alterada. mdia aritmtica dos elementos abaixo da diagonal principal. soma dos elementos acima da diagonal principal.
valor dos elementos abaixo da diagonal secundria. valor dos elementos acima da diagonal secundria.
mdia aritmtica dos elementos abaixo da diagonal principal e da diagonal secundria. produto dos elementos acima da diagonal principal e da diagonal secundria.