Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Programa para converter números romanos em decimal


Posts recomendados

Olá pessoal. Tenho que fazer um exercício como descrito no título, que converta números romanos em decimal, usando a linguagem Pascal.

Assuntos que já vi: Manipulando Strings, REPEAT, FOR, WHILE, CASE e IF.

Sei que o maior número possível a ser formado será 3999 (MMMCMXCIX), que tem 9 caracteres.

Creio que a chave do programa está em conseguir definir quando terei que subtrair ou somar tal valor. Ex: IV = 4 e VI = 6, XC = 90 e CX = 110.

A posição e a quantidade de caracteres é o que define, pelo que entendi.

Dúvidas:

1) Lógica: será isso mesmo de verificar o tamanho do algarismo, e fazer:

 
IF length(algarismo) = 1 then WRITELN('O algarismo é...) ~ continuação ~~
ELSE
 Begin
        IF length(algarismo) = 2 then
                  Begin
                        IF algarismo[2] > algarismo[1] then algarismo := algarismo[2] - algarismo[1] ELSE algarismo := algarismo [1] - algarismo [2]

...

(no caso, será apenas 1, 5, 10, 50, 100, 500, 1000 os valores possíveis, já que são os únicos de 1 algarismo.)

O "algarismo[1]" seleciona a primeira letra da variável algarismo, que foi definida como uma string. Da mesma forma o [2].

2)

 
  Begin
 	writeln('Digite o número em algarismos romanos:');
 	readln(alg);

 	M := 1000;
 	D := 500;
 	I := 1;
	V := 5;
	X := 10;
	L := 50;
	C := 100;

 	IF length(alg) = 1 then writeln('O número em decimal é ',alg,'.'); 
  readln;		
 End. 

No código acima, o valor continua sendo exibido em romano (ou seja, ele exibe o mesmo valor que eu digitei.) Como faço para passar a valer o valor em decimal? Ex: Digitei X, é para mostrar 10, porém programa ainda mostra X.

3) Há alguma lógica que funcione melhor para este programa, com os assuntos que eu aprendi?

Desculpem-me pelo grande número de perguntas, porém não achei nenhum tópico com dúvidas parecidas.

Desde já, agradeço.

___

Tabela com alguns números, para consulta:

roman_numerals_complete.jpg

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 6 anos depois...

Fiz um bem simples em Pascal. Não testei totalmente, mas esta funcionando. Se precisar que eu coloque os comentários do que faz cada variável, avisa.

 

program romanos;


var
   romano: array[0..7] of char;
   valor: array[0..7] of integer;
   algromano: string;
   i, j, ant, soma, n: integer;
   letras: char;
   

begin
     ant:=0;
     soma:=0;
     algromano:=' ';
     letras:=' ';

       romano[0] := ' ';
       romano[1] := 'I';
       romano[2] := 'V';
       romano[3] := 'X';
       romano[4] := 'L';
       romano[5] := 'C';
       romano[6] := 'D';
     romano[7] := 'M';
    
       valor[0] := 0;
       valor[1] := 1;
       valor[2] := 5;
       valor[3] := 10;
       valor[4] := 50;
       valor[5] := 100;
       valor[6] := 500;
       valor[7] := 1000;
     begin     
         writeln ('Digite o algorismo romano:');
         read (algromano);
     end;
    
    for i:=1 to length(algromano) do
      begin
          letras:= algromano[i];
            for j:=0 to 7 do  
                    begin
                if letras = romano[j] then
                               begin
                       soma := soma + (valor[j]);
                       if ant < (valor[j]) then
                       soma := soma - ant*2;
                       ant:= (valor[j]);
                   end;  
         
                    end;
     end;
      write ('O resultado é:',soma);
end.

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Leilson Frantchelino.

 

 

Sobre:

 

Em 16/07/2019 às 11:19, Leilson Frantchelino disse:

     begin     
         writeln ('Digite o algorismo romano:');
         read (algromano);
     end;

 

Nesse trecho 2 pontos:

  1. esse begin e end; são desnecessários (não estão vinculados a algo). Basta removê-los;
  2. no Pascal, para "contextos padrões", usam-se apenas readln(). Apenas inserir "ln" aí. (não use read(), pois pode causar comportamentos indesejados)

 

Além desses pontos, acho que só faltou "validar" se é um número romano, por exemplo. Se eu inserir XM vai retornar 990, que obviamente está errado.

 

Assim como se eu inserir BBMP ("Bora Bahia Minha *****") vai retornar 1000... idem!

 

Outra ponto que faz parte da validação seria a questão de letras minúsculas. Pode ou não pode? o que fazer quando alguém inserir?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...
Em 19/07/2019 às 10:32, Simon Viegas disse:

Olá @Leilson Frantchelino.

 

 

Sobre:

 

 

Nesse trecho 2 pontos:

  1. esse begin e end; são desnecessários (não estão vinculados a algo). Basta removê-los;
  2. no Pascal, para "contextos padrões", usam-se apenas readln(). Apenas inserir "ln" aí. (não use read(), pois pode causar comportamentos indesejados)

 

Além desses pontos, acho que só faltou "validar" se é um número romano, por exemplo. Se eu inserir XM vai retornar 990, que obviamente está errado.

 

Assim como se eu inserir BBMP ("Bora Bahia Minha *****") vai retornar 1000... idem!

 

Outra ponto que faz parte da validação seria a questão de letras minúsculas. Pode ou não pode? o que fazer quando alguém inserir?

program romanos1;


var
   romano: array[0..7] of char;
   valor: array[0..7] of integer;
   algromano: string;
   i, j, ant, soma: integer;
   letras: char;
   roma:string;
   valorsoma: integer;
   opcao: char;
   
 

begin
     

	   romano[0] := ' ';  
	   romano[1] := 'I';
	   romano[2] := 'V';
	   romano[3] := 'X';  
	   romano[4] := 'L';
	   romano[5] := 'C';
	   romano[6] := 'D';
     romano[7] := 'M';
	
	   valor[0] := 0; 
	   valor[1] := 1;
	   valor[2] := 5;
	   valor[3] := 10;
	   valor[4] := 50;
	   valor[5] := 100;
	   valor[6] := 500;
	   valor[7] := 1000;
	 
	 opcao:='s';
	   while (opcao='s') do
	   begin
	   ant:=0;
     soma:=0;
     algromano:='';
     letras:=' ';
     roma:='';
     valorsoma:=0;
	   
	 //aqui verifica se o algarismo romano digitado é válido     
	     writeln ('Digite o algorismo romano:');
	     readln (algromano);
	      algromano:=upcase(algromano);
	     	for i:=1 to length(algromano) do 
	      begin
	      clrscr;
	              letras:= (algromano[i]);	  	                          			                                                                                                              
	                  if ((letras<>romano[1]) and (letras<>romano[2]) and (letras<>romano[3]) and (letras<>romano[4]) and (letras<>romano[5]) and (letras<>romano[6]) and (letras<>romano[7])) then begin
	                        writeln('Algarismo romano inválido, digite novamente.');
	                        readln (algromano);
	                        algromano:=upcase(algromano);
													letras:=' ';
													i:=0;                
	                  end;             
	                  
	      end;
	 
	 //aqui converte o algarismo romano em decimal
	for i:=1 to length(algromano) do 
	  begin
	      letras:= upcase(algromano[i]);
	  	  for j:=0 to 7 do  
				    begin
                if letras = romano[j] then 
						       begin
                       soma := soma + (valor[j]);
                       if ant < (valor[j]) then begin
                       soma := soma - ant*2;
                       ant:= (valor[j]);
                   end else begin  
                   ant:= (valor[j]);
	            end; 
				    end;
	           	  
          end;        
      	  
	 end; 
	     // aqui valida o algarismo romano
			  valorsoma:=soma;
			  while (valorsoma>=1000) do
			    begin
			        roma:= roma+'M';
			        valorsoma:=valorsoma-1000;
			    end; 
					while (valorsoma>=900) do
			    begin
			        roma:= roma+'CM';
			        valorsoma:=valorsoma-900;
			    end;
					while (valorsoma>=500) do
			    begin
			        roma:= roma+'D';
			        valorsoma:=valorsoma-500;
			    end;
					while (valorsoma>=400) do
			    begin
			        roma:= roma+'CD';
			        valorsoma:=valorsoma-400;
			    end;
					while (valorsoma>=100) do
			    begin
			        roma:= roma+'C';
			        valorsoma:=valorsoma-100;
			    end;
					while (valorsoma>=90) do
			    begin
			        roma:= roma+'XC';
			        valorsoma:=valorsoma-90;
			    end;
					while (valorsoma>=50) do
			    begin
			        roma:= roma+'L';
			        valorsoma:=valorsoma-50;
			    end;
					while (valorsoma>=40) do
			    begin
			        roma:= roma+'XL';
			        valorsoma:=valorsoma-40;
			    end;
					while (valorsoma>=10) do
			    begin
			        roma:= roma+'X';
			        valorsoma:=valorsoma-10;
			    end;
					while (valorsoma>=9) do
			    begin
			        roma:= roma+'IX';
			        valorsoma:=valorsoma-9;
			    end;
					while (valorsoma>=5) do
			    begin
			        roma:= roma+'V';
			        valorsoma:=valorsoma-5;
			    end;
					while (valorsoma>=4) do
			    begin
			        roma:= roma+'IV';
			        valorsoma:=valorsoma-4;
			    end;
					while (valorsoma>=1) do
			    begin
			        roma:= roma+'I';
			        valorsoma:=valorsoma-1;
			    end;
					   
          if (roma=algromano) then
          writeln('O valor decimal do algarismo romano ',algromano,' é: ',soma) else
          writeln('O algarismo romano ',algromano,' não é válido, o valor correto para ',soma,' é ',roma);  
					writeln(''); 
          writeln('Deseja fazer a conversão novamente? s/n');
          readln(opcao);
          clrscr;
   end; 
	 clrscr;      
      writeln('Sistema encerrado.');    
end.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!