Ir para conteúdo

POWERED BY:

Arquivado

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

jose augusto pereira

Conversão de números!

Recommended Posts

boa tarde pessoal!

 

Sou novo aqui no forúm, e tenho otimas recomendações daqui. Por isto estou necessitando do auxilio de vocês, presciso desenvolver uma aplicação que converta números arabicos (artiméticos) em romano e vice-versa, mas nem tenho ideia de como iniciar essa aplicação. Me sugeriram pegar o número e dividir por 1000,100,50... dai saberia quantas casas eu teria pra fazer a converção, minha aplicação deve abranger de 0 a 3999. Alguém teria alguam dica?

 

Abraços e bom final de semana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A idéia de solução do seu problema é fazer uma rotina que trabalhe com os restos das divisões para saber quantas unidades de milhar, centena, dezenas você tem no seu valor que vai converter... considere que precisa escrever o número 1264 em romanos... se você dividir isto por 1000, pegar o resto e dividir por 100, pegar o resto da segunda divisão e dividir por 50, depois pegar o resto da divisão e dividir por 10, você terá o seguinte:

 

1264 / 1000 = 1 + 264 de resto = 1 unidade de milhar

264 / 100 = 2 + 64 de resto = 2 unidades de centena

64 / 50 = 1 + 14 de resto = 1 x 50

 

14 / 10 = 1 + 4 de resto = 1 unidade de dezena

 

4 resto final...

 

Agora, se você guardou cada resultado de divisão em uma variável, fica fácil montar seu número romano... basta você codificar para por as unidades correspondentes, sacou?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Amigo pela ajuda!

 

Mas como pegarei esse resto? Estava tentando usar mod, dessa forma conseguia casa o número fosse exato, ele me retornava por exemplo caso o número seja 1.000 que tem 1 algarismo de milhar, mas se fosse 1700 por exemplo ele já retornava um número quebrado. Como posso tb juntar e montar e no final mostrar esse números?

 

Muito obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê uma lida neste tópico.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Chrnos,

 

Gostaria de agradecer a você e parabeniza-ló mais uma vez, me ajudou muito, com base nesse código eu consegui resolver a questão do arábico para romano. Porém estou tendo um pouco de dificuldade na hora de fazer de romano para arábico. Estou fazendo da seguinte forma:

 

var
    i:integer;
    romano,resp:string;
begin
    convromano := ed_numero.Text;
    resp:= '';
    i := 1;
    while i <= length(convromano) do
    begin
    if convromano[i] = 'I' then
    resp:= resp + '1'
    else
    resp:= resp + convromano[i];
    i := i + 1;
    end;
    begin
    if convromano[i] = 'V' then
    resp:= resp + '5'
    else
    resp:= resp + convromano[i];
    i := i + 1;
    end;
    lbl_resp.Caption := resp;

end;

Só que tem um porém se eu coloco III por exemplo ele me mostra 111 e no segundo while ele me mostra apenas o V e não 5. Como posso resolver isso.

 

Mais uma vez obrigado e um ótimo final de semana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está na forma como você conta os valores provavelmente... para ler números romanos e transformá-los no arábico, há algumas coisas que deve observar.... o 'I' por exemplo, pode lhe indicar um valor como 1, mas também pode ser usado para formar o 9 (IX), o 4 (IV) e o 6 (VI) ... então, você terá que no mínimo montar um algoritmo que leia valor a valor, mas usar pares de valores nas comparações que fizer... agora estou meio corrido aqui pra pensar no algoritmo corretamente, mas poderia se tentar algo assim.....

 

 

var i : integer;
     convromano : string;
     sValorAtual,
     sProximoValor : string;
     resp : string;
     iArabico: int;
begin
      i:= 1;
      sValorAtual := convromano[i];
      iArabico := 0;
      resp:= EmptyStr;
      while i <= length(convromano) do 
      begin 
           inc(i);
           sProximoValor := convromano[i];        
           if sValorAtual = 'I' then
           begin
                if (sProximoValor = 'I')
                   or (sProximoValor not in ('I','V','X')) then
                begin
                     inc(iArabico);  //Se entrar aqui, provavelmente o valor é entre 1 e 3
                     sValorAtual := sProximoValor;
                end
                else if sProximoValor = 'V' then
                        begin
                              iArabico := iArabico + 4; //Se entrar aqui, o valor deve ser 4
                              inc(i);
                              sValorAtual := convromano[i]; //o valor atual deve ser o próximo dado após o 'V'
                        end
                        else if sProximoValor = 'X' then
                                begin
                                     iArabico := iArabico + 9;
                                     inc(i);
                                     sValorAtual := convromano[i];
                                end;
                end;
      end;
      resp := IntToStr(iArabico);
      lbl_resp.Caption := resp;
end;

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.