Jump to content

Archived

This topic is now archived and is closed to further replies.

infolivee

[Resolvido] Transformacao

Recommended Posts

O que você já fez? Qual são suas dúvidas? Já há um tópico semelhante ao seu com a idéia de solução neste fórum mesmo, dê uma pesquisada.

 

[]'s

Share this post


Link to post
Share on other sites

O que você já fez? Qual são suas dúvidas? Já há um tópico semelhante ao seu com a idéia de solução neste fórum mesmo, dê uma pesquisada.

 

[]'s

 

 

 

Ja pesquisei, mas so tem falando da conta matematica.

Quero que me ajudem a passar esse ai pra condicoes ifs pois ainda nao aprendi funcoes e nem arrays.

Share this post


Link to post
Share on other sites

Mas o que você já fez ou tentou fazer? Se o que espera é o código pronto, então devo mover seu tópico para a área de serviços.... lá é a área indicada para contratar alguém pra desenvolver sistemas.

 

[]'s

Share this post


Link to post
Share on other sites

Mas o que você já fez ou tentou fazer? Se o que espera é o código pronto, então devo mover seu tópico para a área de serviços.... lá é a área indicada para contratar alguém pra desenvolver sistemas.

 

[]'s

 

 

voce olhou o codigo postado acima ?

Share this post


Link to post
Share on other sites

voce olhou o codigo postado acima ?

 

 

Infelizmente, eu como muitos colegas que acessam o fórum, trabalho em uma empresa com uma política que restringe o acesso a certos tipos de sites, de modo que em horário comercial é impossível acessar sites para downloads de códigos e afins. Logo, quando pergunto o que já fez é devido a isto... ou seja, não há como eu visualizar o conteúdo do link acima.

 

[]'s

Share this post


Link to post
Share on other sites

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := DecimalToRomano(StrToInt(Edit1.Text))
end;

function TForm1.DecimalToRomano(Decimal: Longint): string;
const
  Numeros: array[1..13] of Integer =
    (1, 4, 5, 9, 10, 40, 50, 90, 100,
    400, 500, 900, 1000);
  Romanos: array[1..13] of string =
    ('I', 'IV', 'V', 'IX', 'X', 'XL',
    'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
  i: Integer;
begin
  for i := 13 downto 1 do
    while (Decimal >= Numeros[i]) do
    begin
      Decimal := Decimal - Numeros[i];
      Result  := Result + Romanos[i];
    end;
end;

 

tenho esse esquema ai com a funcao e com o vetor...

 

mas nao me lembro como posso passar isso pra if , como comecar ?

Share this post


Link to post
Share on other sites

Você pode trabalhar com comandos como DIV e MOD para pegar os valores e jogar isto em variáveis.... por exemplo...

 

1450 DIV 1000 = 1

1450 MOD 1000 = 450

 

Os valores que for calculando, você pode jogar em variáveis auxiliares... no seu código, você tem dois arrays que contém os valores em decimal e romano que vai precisar para montar seu resultado final... vou por um começo aqui para você analisar....

 

var iControleLaco,
      iValorInicial,
      iResto, 
      iQtde : Integer;
      sRomano : String;
begin
      iValorInicial := 1450;
      sRomano := EmptyStr;
      iQtde  := iValorInicial DIV 1000;
      iResto := iValorInicial MOD 1000;
      if iQtde > 0 then
      begin
           iControleLaco := 0;
           while iControleLaco < Qtde do
           begin
                sRomano := sRomano + 'M';
                inc(iControleLaco);
           end;
      end;
      
      if iResto = 900 then
          sRomano := sRomano + 'CM'
      else if iResto = 500 then
                sRomano := sRomano + 'D'
      else
            ....
end;

Essa seria uma das formas... eu usaria provavelmente o case para o controle e um outro laço de repetição, mas estou pondo da forma mais simples aqui pra ajudar...

 

[]'s

Share this post


Link to post
Share on other sites

Amigo, ai é questão de adaptar as suas necessidades... pra pegar o dado do edit, você poderia substituir esta linha.

 

iValorInicial := 1450; 

Por esta.

 

iValorInicial := StrToInt(Edit1.text); 

E o retorno estaria na variável sRomanos... era só por o label.caption:= sRomanos no fim do processo... note que o código está incompleto, cabe a você tentar montar o resto dele.

 

[]'s

Share this post


Link to post
Share on other sites

seguinte, estava editando o codigo aqui, e fiz o seguinte.

 

peguei essa parte da condicao if e fui fazendo...

Fiz com o os valores 400,100,90,50,40,10,5,4,1...

 

Esses numeros estao certos, mostrando corretamente...

Mas como vou fazer pra quando o cara digitar 15 ? ele concatenar as letras ?

Share this post


Link to post
Share on other sites

Poste o código que montou que fica mais fácil ajudar.

 

[]'s

Share this post


Link to post
Share on other sites


 

procedure TForm1.Button1Click(Sender: TObject);

var icontrolelaco, ivalorinicial, iresto, iqtde : integer;

sRomano : String;

begin

iValorInicial := strtoint(ed_numero.Text);

sromano := EmptyStr;

iqtde := ivalorinicial div 1000;

iresto := ivalorinicial mod 1000;

if iqtde > 0 then

begin

icontrolelaco := 0;

while icontrolelaco < iqtde do

begin

sromano := sromano + 'M';

inc(icontrolelaco);

end;

end;

 

if iresto = 900 then

sromano := sromano + 'CM'

else if iresto = 500 then

sromano := sromano + 'D'

else if iresto = 400 then

sromano := sromano + 'CD'

else if iresto = 100 then

sromano := sromano + 'C'

else if iresto = 90 then

sromano := sromano + 'XC'

else if iresto = 50 then

sromano := sromano + 'L'

else if iresto = 40 then

sromano := sromano + 'XL'

else if iresto = 10 then

sromano := sromano + 'X'

else if iresto = 5 then

sromano := sromano + 'V'

else if iresto = 4 then

sromano := sromano + 'IV'

else if iresto = 1 then

sromano := sromano + 'I';

 

 

lbl_resp.Caption := sRomano;

end;

Share this post


Link to post
Share on other sites

Vejo que você ainda não entendeu direito a idéia que tentei passar de como funciona a rotina... pelo menos o começo que eu postei...

 

No começo da aplicação, eu fiz pra você o código para pegar quantas unidades de milhar você tem no valor lido, usando um laço de repetição para jogar o valor certo?

 

      iValorInicial := strtoint(ed_numero.Text); 
      sromano := EmptyStr; 
      iqtde  := ivalorinicial div 1000; 
      iresto := ivalorinicial mod 1000; 
      if iqtde > 0 then 
      begin 
           icontrolelaco := 0; 
           while icontrolelaco < iqtde do 
           begin 
                sromano := sromano + 'M'; 
                inc(icontrolelaco); 
           end; 
      end; 

Partindo disto, imaginei que você fosse aplicar o mesmo conceito para o resto do código... no segundo if, eu tinha posto valores fixos só pra dar idéia de como você poderia montar alguns retornos, mas não quer dizer que você não vá ter que efetuar outras operações de divisão como fiz no primeiro if em alguns momentos... vou postar como seria +/- a solução até retornar as centenas para você entender... teste com um valor como 1800 por exemplo de entrada.

 

procedure TForm1.Button1Click(Sender: TObject); 
var icontrolelaco, ivalorinicial, iresto, iqtde : integer; 
      sRomano : String; 
begin 
      iValorInicial := strtoint(ed_numero.Text); 
      sromano := EmptyStr; 
      iqtde  := ivalorinicial div 1000; 
      iresto := ivalorinicial mod 1000; 
      if iqtde > 0 then 
      begin 
           icontrolelaco := 0; 
           while icontrolelaco < iqtde do 
           begin 
                sromano := sromano + 'M'; 
                inc(icontrolelaco); 
           end; 
      end; 
      if iresto > 0 then
      begin
         if iresto >= 900 then
         begin
              sromano := sromano + 'CM';
              iresto := iresto - 900;
        end;
        if iresto >= 500 then
        begin
             sRomano := sRomano + 'D';
             iresto := iresto - 500; //Desconta 500
        end;
        if (iresto >= 400) and (iresto <500) then
        begin
             sRomano := sRomano + 'CD';
             iresto := iresto - 400; //Desconta 400
        end;
    
        if (iresto >= 100) and (iresto < 400) then
        begin
             iqtde  := iresto div 100; 
             iresto := iresto mod 100; 
             if iqtde > 0 then 
             begin 
                   icontrolelaco := 0; 
                   while icontrolelaco < iqtde do 
                   begin 
                         sromano := sromano + 'C'; 
                         inc(icontrolelaco); 
                   end; 
             end; 
        end;
     
       <continuam os testes com os valores menores>
    
      end;    
      lbl_resp.Caption := sRomano; 
end;

[]'s

Share this post


Link to post
Share on other sites

posso trocar:

inc(icontrolelaco);

por

icontrolelaco:=controlelaco+1
???

 

 

esse EmptyStr eh um tipo de conversao ?

sromano := EmptyStr;

Amigo, dica prática pra pesquisar comandos no delphi: selecione o comando e dê F1 rsrsrsrs....

 

Mas sobre os dois códigos que questionou, segue as respostas...

 

O comando inc faz o mesmo que por um contador := contador + 1.... ele dá um incremento de 1 na variável.

 

O EmptyStr joga numa string um valor vazio (Empty).

 

[]'s

Share this post


Link to post
Share on other sites

Amigo, dica prática pra pesquisar comandos no delphi: selecione o comando e dê F1 rsrsrsrs....

 

Mas sobre os dois códigos que questionou, segue as respostas...

 

O comando inc faz o mesmo que por um contador := contador + 1.... ele dá um incremento de 1 na variável.

 

O EmptyStr joga numa string um valor vazio (Empty).

 

[]'s

 

 

Ok, muito obrigado pela dica.

 

Agora vou tentar a conversao de ROMANO para ARABICO.

 

So fazer o inverso ne ?

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.