Ir ao conteúdo
  • Cadastre-se

Casas decimais


viniciusbmatos

Posts recomendados

Em um programa que estou criando (Pascal), quero criar uma function que dê a quantidade de casas decimais de um número real dado. Exemplos:


[I](*
CasasDecimais(7)=0;
CasasDecimais(7.6)=1;
CasasDecimais(7.62)=2;
CasasDecimais(7.628)=3;
CasasDecimais(7.6284)=4;
...
*)
// Observação: CasasDecimais(4.0000000)=0;
// CasasDecimais(9.53100)=3;[/I]

O que já tentei:

[I]// funcao contar casas decimais[/I]
function CasasDecimais(z1:real):integer;
begin
CasasDecimais:=0;
while frac(z1*exp(ln(10)*CasasDecimais))<>0 do [I]//enquanto z1 * (10^ CasasDecimais) nao for inteiro[/I]
begin
CasasDecimais:=CasasDecimais+1;
end;
end;


[I]// funcao contar casas decimais[/I]
function CasasDecimais(z1:real):integer;
var z2:real;
begin
CasasDecimais:=CasasDecimais+1;
z2:=z1;
while frac(z2)<>0 do [I]// enquanto z2 nao for inteiro[/I]
begin
z2:=z2*10;
CasasDecimais:=CasasDecimais+1;
end;
end;

Mas em ambos os casos não funciona corretamente, embora teoricamente eu não tenha percebido nenhum erro. {Sem esta função os demais procedimentos do programa não funcionam.}

Onde está o erro? Alguém tem alguma sugestão? :conf:

Agradeço desde já.

Link para o comentário
Compartilhar em outros sites

Tenta algo como isto:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function CasasDecimais( Value: Extended ): Integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox( application.Handle, PAnsiChar( Format( 'o numero possui: %d casa(s) decimais', [ CasasDecimais( 7.61 ) ] ) ), 'Mensagem', 0 );
end;

function TForm1.CasasDecimais( Value: Extended ): Integer;
Var
x: String;
begin
x := FloatToStr( Value - Trunc( Value ) );
Result := Length( Copy( x, Pos( ',', x ) +1, Length( x ) ) );
end;


end.

Link para o comentário
Compartilhar em outros sites

Não. Parece bom, mas ele não diferencia os zeros úteis dos inúteis. Exemplo: ele exibe que o número 0.0005 tem apenas uma casa decimal, e deveria ser quatro.

Tenta algo como isto:



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function CasasDecimais( Value: Extended ): Integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
MessageBox( application.Handle, PAnsiChar( Format( 'o numero possui: %d casa(s) decimais', [ CasasDecimais( 7.61 ) ] ) ), 'Mensagem', 0 );
end;

function TForm1.CasasDecimais( Value: Extended ): Integer;
Var
x: String;
begin
x := FloatToStr( Value - Trunc( Value ) );
Result := Length( Copy( x, Pos( ',', x ) +1, Length( x ) ) );
end;
unit Unit1;

end.

Talvez servisse, mas estou usando apenas Pascal, não o Delphi.

Alguém tem mais alguma ideia? Parece fácil, mas até agora não pensei em algo que funcione.

Obrigado.

Link para o comentário
Compartilhar em outros sites

Caso resolvido! :jump:


// converter decimal em fracao
procedure DecimalEmFracao (z1:real; var p,q:integer);
var p2:integer;
begin
p:=trunc(z1*exp(ln(10)*CasasDecimais(z1)));
q:=trunc(exp(ln(10)*CasasDecimais(z1)));
// o trunc nao vai mudar nada, apenas mudar para tipo integer
// tem-se: z1 = p/q
// simplificar
p2:=p; //guardar o valor de p em p2
p:=p div MDC(p,q); //simplificar o numerador
q:=q div MDC(p2,q); //simplificar o denominador
{ writeln(z1,' = ',p,' / ',q); }
// z1 = p / q
// simplificado
end;

Obrigado a todos. :aplausos:

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Caso resolvido!

:jump:


// converter decimal em fracao
procedure DecimalEmFracao (z1:real; var p,q:integer);
var p2:integer;
begin
p:=trunc(z1*exp(ln(10)*CasasDecimais(z1)));
q:=trunc(exp(ln(10)*CasasDecimais(z1)));
// o trunc nao vai mudar nada, apenas mudar para tipo integer
// tem-se: z1 = p/q
// simplificar
p2:=p; //guardar o valor de p em p2
p:=p div MDC(p,q); //simplificar o numerador
q:=q div MDC(p2,q); //simplificar o denominador
{ writeln(z1,' = ',p,' / ',q); }
// z1 = p / q
// simplificado
end;

Obrigado a todos. :aplausos:

Olá,

viniciusbmatos, tem como você explicar melhor essa fórmula?

Por exemplo:

- Quem seria "p" e "q" ?

- O que cada linha abaixo está fazendo?

  p:=trunc(z1*exp(ln(10)*CasasDecimais(z1)));
q:=trunc(exp(ln(10)*CasasDecimais(z1)));

- MDC não é nativo do meu compilador (Turbo Pascal), mas é reconhecido em outros. Eu tentei pesquisar, mas não encontrei nenhuma referência a esse comando... O que seria esse MDC? Seria o Máximo Divisor Comum ?:rolleyes:

Se puder fornecer a fórmula completa eu agradeceria: (com CasasDecimais() por exemplo)

No aguardo!

Link para o comentário
Compartilhar em outros sites

Olá, EstilingueAtomico.

Desculpe-me. Postei o trecho errado. (pressa)

O correto:

// funcao contar casas decimais
function CasasDecimais(z1:real):integer;
const
precisao=15;
var
EmString:string;
passo:shortint;
begin
str(z1:1:precisao,EmString); //converte para string com 'precisao' (20) casas decimais
delete(EmString,1,Pos('.',EmString)); //apaga tudo ate o ponto
passo:=precisao;
while EmString[passo]='0' do //apaga os zeros do final
begin
delete(EmString,passo,1);
passo:=passo-1;
end;
CasasDecimais:=length(EmString); //conta as casas
end;

O que eu havia colocado é depois desse. Veja o código completo em:

[Pascal] Projeto UNIT de utilidades

MDC: sim, é o máximo divisor comum.

Desculpem-me pelo engano. As linhas citadas convertem o número decimal para uma fração não-reduzida cujo denominador é uma potência de 10. Exemplo: dado o número 3.14, p=314 e q=100. Na sequência, divido p e q pelo MDC entre os dois (para simplificar), então nesse exemplo p=157 e p=50.

Obrigado.

Link para o comentário
Compartilhar em outros sites

A função do "viniciusbmatos" funciona.

Também já tinha dado a volta à questão. Aqui fica a minha versão, um pouco mais extensa.


program CasasDecimais;
uses crt;


var op: char;
n: word;
s: string;

procedure decimais;
var sai: boolean;
i,j, k: word;
w: string;
begin
clrscr;
writeln('Calculo de casa decimais');
writeln;
k:= 0;
sai:= false;
write('Digite uma string do tipo "0.0230360": ');
readln(s);
n:= length(s);
writeln('A string '+S+' tem ',n,' carateres');
readln;
i:= n;
j:= 0;
while (i > 0) and (sai=false) do
begin
w:= copy(s,i,1);
if w='.' then sai:= true
else
begin
if (w='0') and (k<>0) then j:= j+1
else if (w <> '0') and (k<>0) then j:= j+1
else if (w <> '0') and (k=0) then
begin
j:= j+1;
k:= 1;
end;
end;
i:= i-1;
end;
if j>0 then writeln('A Parte decimal tem ',j,' casas decimais significativas')
else writeln('A Parte decimal Nao tem numeros significativos');
readln;
end;

begin
repeat
clrscr;
writeln('Calculo de casa decimais');
writeln;
write('Deseja continuar (S/N) ?');
op:= readkey;
if upcase(op) <> 'N' then decimais;
until upcase(op) = 'N';
end.

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!