Potenciação - PASCAL
Boa noite galera.
A história é a mesma de todos. Trabalho de faculdade.
O professor solicitou que fizéssemos uma calculadora com diversas operações e dentre elas a exponenciação/potenciação.
Todas as operações já estão prontas, mas a potenciação exige uma certa cautela. O professor fica de olho nos tratamentos dos erros.
Na avaliação passada, por exemplo, ferrou todo mundo porque ninguém preparou a operação de divisão para tratar uma divisão por zero. Na hora da execução dos programas todos fechavam com um erro porque é matematicamente impossível. :(
Como só a potência está embaçada, vou postar aqui o meu código de potência apenas, mas já explico o problema na sequência.
program teste_potencia;
uses crt;
var n1, n2, n3 : real;
begin
clrscr;
repeat
writeln;
writeln ('Operação: Potenciação!');
write ('Digite a base: ');
readln ( n1 );
writeln;
write ('Digite a potência: ');
readln ( n2 );
writeln;
if n1 = 0 then
begin
if n2 <= 0 then
write (n1:0:5, ' elevado a ', n2:0:5, ' resulta em uma operação ilegal!')
else
begin
n3 := 0;
write (n1:0:5, ' elevado a ', n2:0:5, ' = ', n3:0:5);
end;
end
else if n1 > 0 then
write (n1:0:5, ' elevado a ', n2:0:5, ' = ', exp(n2*ln(n1)):0:5)
// Início da treta
else // Quando a base for negativa
begin
n1 := n1*-1;
n3 := exp(n2*ln(n1));
if n2 < 0 then
n3 := n3*-1;
n1 := n1*-1;
write (n1:0:5, ' elevado a ', n2:0:5, ' = ', n3:0:5)
end;
writeln;
writeln;
write ('esperando uma tecla');
readln;
until n1 = 111;
end.
Se testarem o programa, verão que ele calcula praticamente todas as potências, porém, ao colocarmos uma base negativa, começa a aparecer uma falha.
Pesquisando na internet, descobri que infelizmente o pascal não possui uma função interna para a potência, então, usa-se comumente 2 funções interligadas para chegar-se ao resultado.
EXP() e LN().
Considerando B = número base, e P = valor da potência, a utilização das funções acima ficaria assim num programa:
exp(P * ln(B))
Funciona direitinho até alguém colocar uma base negativa. Aí o ln (Logaritmo Neperiano) da base dá erro e a coisa mela toda.
No meu código de potência eu trato diversos erros comuns, mas quando chega nessa parte eu travo.
Eu fiz o seguinte. Coloquei uma condição para que quando a base for negativa, ele a multiplica por -1, aí calcula normalmente a potência e no fim ele deveria multiplicar o resultado por -1 novamente se a potência for ímpar, mas se for par mantém o resultado.
Entretanto, não consigo identificar se a potência é par ou impar porque a maneira que o pascal possui de fazer isso obriga que a variável que guarda o valor da potência seja do tipo INTEGER, mas eu preciso que ela seja do tipo REAL.
Será que isso tem solução?
[]'s
Discussão (12)
Carregando comentários...