infolivee 0 Denunciar post Postado Setembro 29, 2009 Ola pessoal, estou com um programa pra converter de decimal pra numero romano, mas preciso transforma-lo em IF'S, e nao posso usar funções e nem array's .. alguem pode me ajudar ? http://www.mediafire.com/?eijinzddj1z Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 29, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 29, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 29, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 29, 2009 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 29, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 29, 2009 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 29, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 29, 2009 mas onde que vai aparecer a resposta no LABEL e onde que vai pegar o TEXT do edit ? Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 29, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 29, 2009 Ok . Sim sim, agora acho que ficou mais facil pra entender mais como mudaria pra ir. Muito obrigado mesmo cara. Valeu e desculpa qualquer coisa. Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 30, 2009 Poste o código que montou que fica mais fácil ajudar. []'s Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 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; Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 30, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 ahh sim, entao alem das condicoes ifs, eu tinha que ter repetido o mesmo com os lacos... humm , vo testa aqui pra ver... Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 FUNCIONOUUU ! posso trocar: inc(icontrolelaco); por icontrolelaco:=controlelaco+1 ??? esse EmptyStr eh um tipo de conversao ? sromano := EmptyStr; Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Setembro 30, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 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 ? Compartilhar este post Link para o post Compartilhar em outros sites
infolivee 0 Denunciar post Postado Setembro 30, 2009 so tem um problema no codigo. quando digito o 9, ele pega e faz isso: VIV . rs Compartilhar este post Link para o post Compartilhar em outros sites