Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ExeConversorNumeraçãoRomana
- {
- class Program
- {
- static void Main(string[] args)
- {
- //O programa com os comentários funciona, mas a versão simplificada/finalizada e com exceções está no final
- /*Antes de mais começamos por perceber qual a lógica de como números romanos são convertidos.
- As regras:
- * Um número maior à frente de um número menor significa subtração.
- * A adição é caracterizada por um número menor à frente de um número maior.
- Por exemplo, IV significa 4, VI significa 6.
- * Não se utiliza mais de um número menor antes de um número maior para subtrair.
- Por exemplo, IIV não corresponde a 3.
- * Devem separar-se, dezenas, centenas, e milhares como numerais separados.
- Isso significa que a 99 corresponde XCIX (90 + 9), nunca deve ser escrito como IC.
- I Corresponde ao numeral 1. II são dois, III são três, IV são 4 (ocasionalmente pode ver-se IIII como 4)
- V Corresponde ao numeral 5. IV são 4, VI são 6, VII são 7, VIII são 8.
- X Corresponde ao numeral 10. IX são 9, XI é 11, etc..
- L Corresponde ao numeral 50. XL é o 40.
- C Corresponde ao numeral 100.*/
- //Método converter numeros com 1 digito
- //Frase onde vamos guardar o resultado da nossa numeração romana
- string resultado = " ";
- //Pergunta ao utilizador para introduzir o número
- Console.WriteLine("Introduza um número singular (Só funciona 1 digito nesta parte do código): ");
- //Introdução, limpeza de espaços adjacentes e conversão para inteiro
- int recebe = int.Parse(Console.ReadLine().Trim());
- /*Dividimos o numero introduzido com 10 para usarmos o seu resto para gerar os números romanos,
- neste caso particular com 1 digito não era necessário pois o resto de qualquer numero com um digito dividido por 10
- é sempre o próprio número de acordo com a aritmética modular*/
- recebe = recebe % 10; /* 3 mod 10 é o mesmo que dizer que o resto da divisão 3 por 10 = 3 */
- /*Agora temos de definir o que é guardado na nossa variável de texto "resultado", em cima declarada, conforme
- a introdução que o utilizador faça*/
- if (recebe == 9)
- {
- /*Não podemos fazer a subtração de carateres de acordo com as regras acima descritas
- pois o número nove é muito especifico pois é quando está prestes a ocorrer a mudança
- para o X(numero 10) então definimos individualmente sendo uma das exceções*/
- resultado = "IX";
- }
- else if (recebe > 4)
- {
- /*Nesta exceção, se o valor recebido for superior a 4,
- a função "Substring" vai cortar a frase "VIII" conforme o número indicado pelo utilizador
- Vou indicar o procedimento para alguns dos casos..
- Se recebe = 5 -> Substring(0, 5-4) -> Substring(0, 1) Ou seja vai desde a posição 0 até à 1,
- ou seja vai cortar "III" ficando apenas "V"
- Se recebe = 6 -> Substring(0, 6-4) -> Substring(0, 2) Ou seja vai desde a posição 0 até à 2,
- ou seja vai cortar "II" ficando apenas "VI"
- * Trivial.
- */
- resultado = "VIII".Substring(0, recebe - 4);
- }
- else if (recebe == 4)
- {
- /*Exceção caso seja 4 pela mesma razão do 9 acima descrita*/
- resultado = "IV";
- }
- else /*Aqui podia ser acrescentado if(recebe == 1 || recebe == 2 || recebe == 3)
- Se o valor recebido fosse 1 ou 2 ou 3 o programa vem para esta parte do código,
- mas como já é subentendido pelo sistema não é necessário*/
- {
- /*Todos os outros casos que vão sobrar que são apenas 3, 1-2-3. Seguem a mesma lógica dos maior que 4
- mas não precisamos de subtrair 4 pois o valor que recebe é o valor que vai ser lido da frase "III" */
- resultado = "III".Substring(0, recebe);
- }
- //Divulgar então o que foi guardado na variavel texto "resultado"
- Console.WriteLine(resultado + "\n");
- /*A 2º Parte da explicação tem variáveis que podem não ser usadas,
- mas para explicação é mais visivel o procedimento desta forma. A versão final está simplificada.*/
- Console.WriteLine("2º Parte da explicação");
- //Método converter números com 2 digitos
- Console.WriteLine("Introduza um número com 2 digitos (Apenas funciona 1 ou 2 digitos): ");
- int recebe2 = int.Parse(Console.ReadLine().Trim());
- string resultado2 = " "; //Variável texto para guardar informação do primeiro Digito
- string resultado3 = " "; //Variável texto para guardar informação do segundo Digito
- int segundo_digito = recebe2 % 10; /*A ordem da declaração e inicialização das variáveis interessa pois 'recebe2'
- vai ser alterada na linha seguinte e precisamos desse valor para o cálculo do primeiro digito
- embora a númeração romana seja guardada em variáveis de texto diferentes*/
- /*Com a mesma lógica anterior mas como o número recebido tem 2 digitos a conta é feita da seguinte forma
- Imaginemos que o utilizador introduz 99, recebe2 = 99;
- recebe2 % 100 é o resto da divisão 99 por 100, que é 99.
- Esse valor calculado é dividido por 10, ou seja, 9,9.
- Como só nos interessa a parte inteira do número, usamos (int) antes do cálculo para obter o número '9' do primeiro
- digito.*/
- recebe2 = (int)((recebe2 % 100) / 10);
- if (recebe2 == 9) /*Como podem ver, introduzindo 99 e depois do cálculo feito sai a parte do primeiro digito '9'
- que é precisamente a exceção para a condição*/
- {
- resultado2 = "XC"; //90 em numeração romana
- }
- else if (recebe2 > 4)
- {
- resultado2 = "LXXX".Substring(0, recebe2 - 4);
- }
- else if (recebe2 == 4)
- {
- resultado2 = "XL";
- }
- else
- {
- resultado2 = "XXX".Substring(0, recebe2);
- }
- if (segundo_digito != 0) /* As condições para o segundo digito
- são iguais à primeira parte com a diferença desta linha que vai apenas entrar neste ciclo
- se o segundo digito for diferente de 0 */
- {
- if (segundo_digito == 9)
- {
- resultado3 = "IX";
- }
- else if (segundo_digito > 4)
- {
- resultado3 = "VIII".Substring(0, segundo_digito - 4);
- }
- else if (segundo_digito == 4)
- {
- resultado3 = "IV";
- }
- else
- {
- resultado3 = "III".Substring(0, segundo_digito);
- }
- }
- //Esta linha imprime o texto criado com a númeração romana do primeiro e depois do segundo digito
- Console.WriteLine(resultado2 + resultado3);
- Console.ReadKey();
- /******EM BAIXO SEGUE O PROGRAMA COM AS MARIQUICES TODAS, SIMPLIFICADO E ORGANIZADO******/
- /*COPIAR, TIRAR OS COMENTÁRIOS DAS PONTAS E CORRER*/
- /*
- int recebe;
- do
- {
- Console.Clear();
- Console.WriteLine("Introduza um valor entre 1 e 99: ");
- recebe = int.Parse(Console.ReadLine().Trim());
- } while (recebe.ToString().Length > 2 || recebe.ToString() == "0");
- string resultado = " ";
- int segundo_digito = recebe % 10;
- recebe = (int)((recebe % 100) / 10);
- if (recebe == 9)
- {
- resultado = "XC";
- }
- else if (recebe > 4)
- {
- resultado = "LXXX".Substring(0, recebe - 4);
- }
- else if (recebe == 4)
- {
- resultado = "XL";
- }
- else
- {
- resultado = "XXX".Substring(0, recebe);
- }
- if (segundo_digito != 0)
- {
- if (segundo_digito == 9)
- {
- resultado += "IX";
- }
- else if (segundo_digito > 4)
- {
- resultado += "VIII".Substring(0, segundo_digito - 4);
- }
- else if (segundo_digito == 4)
- {
- resultado += "IV";
- }
- else
- {
- resultado += "III".Substring(0, segundo_digito);
- }
- }
- Console.Write("Número em Romano: " + resultado);
- Console.ReadKey();
- */
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement