A maior rede de estudos do Brasil

Grátis
146 pág.
Programando com PASCAL - Jaime Evaristo

Pré-visualização | Página 15 de 50

de uma unidade. Assim, no programa anterior o comando
Roundx := Trunc(2*x) - Trunc(x);
poderia ser substituído por
Roundx := Trunc(x + 0.5);
Além destas duas soluções, no próximo capítulo apresentaremos uma solução que utiliza diretamente o 
conceito de arredondamento. 
3. Ainda na linha do exemplo anterior, o programa abaixo utiliza as funções Chr e Ord para 
“implementar” a função UpCase. Para compreendê-lo, precisamos saber que Ord('A') = 65, Ord('a') = 97 e 
que os valores de Ord para as demais letras são seqüenciais em relação à ordem alfabética.
program UpCase;
var Maiuscula, Minuscula : char;
begin 
writeln('Digite uma letra minúscula');
readln(Minuscula);
Maiuscula := Chr(Ord(Minuscula) - 32);
writeln('UpCase(' , Minuscula , ') = ', Maiuscula);
end.
Observe que Ord(Minuscula) - 32 (32 vem de 97 - 65) determina o valor da função Ord para a 
maiúscula correspondente à minúscula dada e Chr determina então a maiúscula procurada. Uma questão que 
se põe é: e se o caractere digitado para o comando readln(Minuscula) não for uma letra minúscula? A 
resposta a esta questão será dada no capítulo seguinte.
4. Para exemplificar a situação de um programador que está utilizando um sistema que não possui uma 
função que ele necessita, podemos discutir o exemplo de uma função que os compiladores Pascal não 
oferecem. Trata-se de uma função "inversa" da função UpCase, que converta uma letra maiúscula numa 
minúscula. Para o leitor ter uma idéia, os compiladores da linguagem C disponibilizam a função tolower() 
que executa esta ação. No nosso caso, tendo entendido o programa acima, o programa abaixo se torna de 
fácil entendimento. 
program LowCase;
var Maiuscula, Minuscula : char;
begin 
writeln('Digite uma letra maiúscula');
readln(Maiuscula);
Minuscula := Chr(Ord(Maiuscula) + 32);
writeln('LowCase(' , Maiuscula , ') = ', Minuscula);
end.
Naturalmente, a questão levantada no exemplo anterior persiste de forma semelhante: e se a letra digitada 
não for uma letra maiúscula?
 6. O exemplo a seguir, além de pretender motivar o próximo capítulo, objetiva também ressaltar algo 
mais ou menos óbvio, mas que deve ser destacado: um programador só é capaz de escrever um programa que 
resolva um determinado problema se ele souber resolver o tal problema "na mão", ou seja, com a utilização 
apenas de lápis e papel. Trata-se de um programa que calcule a área de um triângulo, dados os comprimentos 
dos seus lados. Naturalmente, só é capaz de escrever este programa aquele que conhecer a fórmula abaixo, 
que dá a área do triângulo cujos lados têm comprimentos x, y e z.
S p p x p y p z= − − −. ( ) . ( ) . ( )
onde p
x y z
=
+ +
2
 é o semiperímetro do triângulo. O programa abaixo utiliza uma variável SemiPer para 
calcular o semiperímetro do triângulo facilitando a forma da expressão do cálculo da área. O armazenamento 
do valor do semiperímetro em uma variável também seria útil se esse dado fosse necessário em outro trecho 
do programa. 
{Programa que determina a área de um triângulo de lados de comprimentos dados}
program AreaTriangulo;
var a, b, c, SemiPer, Area : real; 
begin
writeln('Digite os lados do triângulo')
readln(a, b, c);
SemiPer := (a + b + c)/2;
Area := SqrT(SemiPer*(SemiPer - a)*(SemiPer - b)*(SemiPer - c)); 
writeln('Área do triângulo = ', Area);
end.
Se este programa for executado com entrada 3, 4 e 5, temos SemiPer = 6 e
Area = − − − = =6 6 3 6 4 6 5 36 6. ( ) . ( ) . ( )
e, como era de se esperar, a área do triângulo cujos lados têm comprimento 3, 4 e 5 unidades de 
comprimento é igual a 6 unidades de área.
Agora, se este programa fosse executado para entrada 1, 2 e 5, teríamos SemiPer = 4 e
Area = − − − = −4 4 1 4 2 4 5 24. ( ) . ( ) . ( )
e ocorreria erro de execução, pois o sistema, como era de se esperar, não calcula raiz quadrada de número 
negativo.
O que acontece é que nem sempre três números podem ser comprimentos dos lados de um triângulo (a 
matemática prova que isto só acontece se cada um deles for menor do que a soma dos outros dois). Assim, o 
comando que calcula a Area só deveria ser executado se os valores digitados para x, y, e z pudessem ser 
comprimentos dos lados de um triângulo.
2.13 Exercícios propostos
1. Avalie cada uma das expressões abaixo.
a) (-(-9) + SqrT((-9)*(-9) - 4*3*6))/(2*3).
b) ((Round(6,78) = 7) and Odd(78)) or (4 mod 8 = 4).
2. Escreva programas para
a) Converter uma temperatura dada em graus Fahrenheit para graus Celsius.
b) Gerar o invertido de um número com três algarismos (exemplo: o invertido de 498 é 894).
c) Somar duas frações ordinárias, fornecendo o resultado em forma de fração.
d) Determinar o menor múltiplo de um inteiro dado maior do que um outro inteiro dado (exemplo: o 
menor múltiplo de 7 maior que 50 é 56).
e) Determinar o perímetro de um polígono regular inscrito numa circunferência, dados o número de 
lados do polígono e o raio da circunferência.
3. Escreva um programa que permute o conteúdo de duas variáveis sem utilizar uma variável auxiliar 
(ver exemplo 5 da seção 2.9).
4. Uma loja vende seus produtos no sistema entrada mais duas prestações, sendo a entrada maior do que 
ou igual às duas prestações, as quais devem ser iguais, inteiras e as maiores possíveis. Por exemplo, se o 
valor da mercadoria for R$ 270,00, a entrada e as duas prestações são iguais a R$ 90,00; se o valor da 
mercadoria for R$ 302,75, a entrada é de R$ 102,75 e as duas prestações são a iguais a 
R$ 100,00. Escreva um programa que receba o valor da mercadoria e forneça o valor da entrada e das duas 
prestações, de acordo com as regras acima. Observe que uma justificativa para a adoção desta regra é que ela 
facilita a confecção e o conseqüente pagamento dos boletos das duas prestações.
5. Um intervalo de tempo pode ser dado em dias, horas, minutos, segundos ou seqüências "decrescentes" 
destas unidades (em dias e horas; em horas e minutos; em horas, minutos e segundos), de acordo com o 
interesse de quem o está manipulando. Escreva um programa que converta um intervalo de tempo dado em 
segundos, em horas, minutos e segundos. Por exemplo, se o tempo dado for 3 850 segundos, o programa 
deve fornecer 1 h 4 min 10 s.
6. Escreva um programa que converta um intervalo de tempo dado em minutos, em horas, minutos e 
segundos. Por exemplo, se o tempo dado for 145,87 min, o programa deve fornecer 2 h 25 min 52,2 s.
7. Um programa para gerenciar os saques de um caixa eletrônico deve possuir algum mecanismo para 
decidir o número de notas de cada valor que deve ser disponibilizado para o cliente que realizou o saque. Um 
possível critério seria o da "distribuição ótima" no sentido de que as notas de menor valor fossem 
distribuídas em número mínimo possível. Por exemplo, se a quantia solicitada fosse R$ 87,00, o programa 
deveria indicar uma nota de R$ 50,00, três notas de R$ 10,00, uma nota de R$ 5,00 e duas notas de R$ 1,00. 
Escreva um programa que receba o valor da quantia solicitada e retorne a distribuição das notas de acordo 
com o critério da distribuição ótima.
8. Os sistemas que implementam a linguagem Pascal não possuem função predefinida para calcular 
potências com expoentes maiores que dois. Utilize o fato de que ax = exLn(a) para escrever um programa 
que determine o valor de uma potência ay, a e y reais dados, com a positivo.
9. De acordo com a Matemática Financeira, o cálculo das prestações para amortização de um 
financiamento de valor F em n prestações e a uma taxa de juros i é dada pela fórmula P = F/an¬i, onde 
an¬i = ((1 + i)n – 1)/(i . (1 + i)n). Escreva um programa que determine o valor das prestações para amortização 
de um financiamento, dados o valor do financiamento, o número de prestações para