Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
viniciusbmatos

[Resolvido] Casas decimais

Recommended Posts

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á.

Editado por viniciusbmatos

Compartilhar este post


Link para o post
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.

Editado por Mog.Lucas
Utilize tags [code]. Leia mais aqui: http://forum.clubedohardware.com.br/tags-code-como/709848

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Editado por viniciusbmatos

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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:

    Editado por viniciusbmatos

    Compartilhar este post


    Link para o post
    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:

    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!

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×