Ir ao conteúdo
  • Cadastre-se

VisualG Converta números indo-arábicos para o formato romano e vice-versa


Posts recomendados

  • Membro VIP

OK. Ficou muito bom. Deixa guardado aí.

 

Sugiro fazer assim: salve esse arquivo e guarde separadamente. Crie um novo para fazer a segunda etapa.

 

Vamos lá:

17 minutos atrás, Irwing Seiji Ato disse:

Agora o algoritmo na parte de converter para romanos está OK agora tem que fazer o inverso como faço para pegar a posição da letra?

 

A lógica inicial tem que partir de você! É o mesmo esquema... Faça as abstrações... como você faria isso no papel? tente fazer de alguma forma, aí nos informe em que parte está com dúvidas. Por exemplo.. lá no outro código, você poderia ter dúvida em como separar os números.. você mesmo conseguiu utilizar a lógica das divisões e uso do mod. Daí surgiu a questão dos conflitos entre os tipos real e inteiro e tal.. resolvemos... etc etc etc.

 

Em fim, a proposta é te ajudar a você desenvolver a tua lógica. Se te passamos uma lógica inicial pronto, sem a sua tentativa, deixaremos de ter a oportunidade de estimular o desenvolvimento da tua criatividade.

 

Pense em algo ai... mete mão! se pintar uma dúvida sobre como fazer algum coisa, é só perguntar, beleza?

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

Não sei nem por onde começar o meu código está assim.

Var
// Seção de Declarações das variáveis 
romanoduasletras:["I","II","III","IV","V","VI","VII","VIII","IX","X",
            "XX","XXX","XL","L","LX","LXX","LXXX","XC","C","CC",
            "CCC","CD","D","DC","DCC","DCCC","CM","M","MM","MMM"] vetor de caractere
romanoumaletra:["I","V","X","L","C","D","M"] vetor de caractere
arabico:[1,5,10,50,100,500,1000] vetor de inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc... 

Como faço para ter um vetor que some em determinada posição e subtraia em outra posição? 

adicionado 17 minutos depois

Não sei como fazer a segunda parte estou perdido, fiz uns código porém não sei como pegar o vetor e pegar a posição para somar e subtrair, como crio um vetor que pega a posição?

Olhe o código

Var
// Seção de Declarações das variáveis 
romanoduasletras:["I","II","III","IV","V","VI","VII","VIII","IX","X",
            "XX","XXX","XL","L","LX","LXX","LXXX","XC","C","CC",
            "CCC","CD","D","DC","DCC","DCCC","CM","M","MM","MMM"] matriz de caractere
romanoumaletra:["I","V","X","L","C","D","M"] vetor de caractere
arabico:[1,5,10,50,100,500,1000] vetor de inteiro
n1:caractere
Inicio
// Seção de Comandos, procedimento, funções, operadores, etc... 
escreval("Conversor de número romano para indo-arábico")
escreval("digite um número maior que 0 e inferior a 4000")
leia(n1)

 

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

  • Membro VIP

Sobre:

1 hora atrás, Irwing Seiji Ato disse:

romanoduasletras:["I","II","III","IV","V","VI","VII","VIII","IX","X",
            "XX","XXX","XL","L","LX","LXX","LXXX","XC","C","CC",
            "CCC","CD","D","DC","DCC","DCCC","CM","M","MM","MMM"] matriz de caractere
romanoumaletra:["I","V","X","L","C","D","M"] vetor de caractere
arabico:[1,5,10,50,100,500,1000] vetor de inteiro

 

Essa definição de matriz ou vetor não é válida. Mas veja... para efetuar os testes, você não precisa tentar pegar a possível estrutura final... bastaria testar com 2 ou 3 "números", por exemplo... poderia usar, sei lá,  "I","II","III" e ver se conseguia rodar... ir futucando.. pesquisar outros exemplo de declaração de vetor etc.

 

Entende? precisa entender a essência da coisa... ou seja, "será que se eu colocar caracteres aqui no parâmetro do vetor vai funcionar?"... para isso, não precisaria fazer isso tudo, testes com estrutura pequenas.. após funcionar, aí sim iria aumentos aos poucos... :)

 

 

 

Sobre:

1 hora atrás, Irwing Seiji Ato disse:

Não sei como fazer a segunda parte estou perdido, fiz uns código porém não sei como pegar o vetor e pegar a posição para somar e subtrair, como crio um vetor que pega a posição?

Olhe o código

 

É aqui que entrar aquela questão de ABSTRAÇÃO.

7 horas atrás, Simon Viegas disse:

Minha dica é a seguinte: esqueça que existe programação ou VisualG. Abstraia isso.. Simplesmente pegue um número e tente traduzir de numérico para romano. 

Ex.:
100

150

95

18

 

Como sei que seria X, XC, XCV e XVIII? pegue outras combinações de número. Tente entender como você está fazendo para traduzir e descreva aqui. Imagine você explicando para uma pessoa ao seu lado.. "Oh! faça isso, isso e isso".

 

Mais pra frente ajudamos a traduzir para uma linguagem de programação.

 

Então, a minha sugestão é você tentar entender o problema no mundo real... Como você faria para traduzir MXLVIII em indo-arábico?

 

Tipo.. "ah, vou pegando letra por letra e vou traduzindo" (não é que seja só isso, é apenas um exemplo). Aí sim entraria a dúvida técnica: "como faço para separar essas letra por letra no VisualG?"

 

Aí poderíamos dizer: "rpz, dê uma pesquisada no comando Copia()". Pesquisando sobre o comando, verás que ele consegue copiar partes do caractere. Segue um exemplo:

algoritmo "Exemplo de como seperar as letras de caractere"
var
   texto    :caractere
   subTexto :caractere
   i        :inteiro
inicio
texto <- "MXLVIII"
para i de 1 ate Compr(texto) faca
   subTexto <- Copia(texto,i,1)
   escreval(subTexto)
fimPara
fimAlgoritmo

 

Ou seja, se sua dúvida é copiar partes de um caractere, o comando Copia() pode ser útil.

 

Qualquer dúvida é só perguntar.

 

 

4 minutos atrás, Irwing Seiji Ato disse:

Alguém tem alguma ideia de como devo proceder para fazer a segunda parte?

 

Tente fazer algo.. veja aí se o comando Copia() te ajuda. Ou qualquer coisa explique o que está tentando fazer que vamos te ajudando... ;)

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

Eu quero que determinada letra seja igual a determinado número vide tabela 

 I      V       X      L       C       D      M

 1      5      10     50     100    500  1000

E quero pegar o posição de cada letra, exemplo se X vem antes do C subtrai-se 10 ficando 90, e se fosse a direita iria somar XC igual 110 o mesmo ocorre com o I se aparecer a esquerda de 10 subtrai-se 1 e o mesmo ocorre com C quando é colocado a esquerda quando  o número maior que ele, o problema seria saber a posição das letras

Eu teria que desmontar letra por letra nesse comando copia e guardar e um vetor e depois compara-las, mas o problema que acho que não conseguiria resolver seria como saber a posição da letras, essa é a dificuldade como resolver isso

E também como faz para guardas estas letras desmontadas num vetor?

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

  • Membro VIP
39 minutos atrás, Irwing Seiji Ato disse:

Eu quero que determinada letra seja igual a determinado número vide tabela 

 I      V       X      L       C       D      M

 1      5      10     50     100    500  1000

 

Massa... a essência seria "associar uma letra a um valor", certo?. Se o que você imaginou foi "usar a letra como posição para um vetor", isso faz sentido, e daria até para fazer em algumas outras linguagens, mas no VisualG, não dá.

 

 

49 minutos atrás, Irwing Seiji Ato disse:

E quero pegar o posição de cada letra, exemplo se X vem antes do C subtrai-se 10 ficando 90, e se fosse a direita iria somar XC igual 110 o mesmo ocorre com o I se aparecer a esquerda de 10 subtrai-se 1 e o mesmo ocorre com C quando é colocado a esquerda quando o número maior que ele, o problema seria saber a posição das letras 

Eu teria que desmontar letra por letra nesse comando copia e guardar e um vetor e depois compara-las, mas o problema que acho que não conseguiria resolver seria como saber a posição da letras, essa é a dificuldade como resolver isso

E também como faz para guardas estas letras desmontadas num vetor?

 

Duas formas te ter acesso a cada letra:
- ir usando o Copia() mesmo. A posição posterior será simplesmente atual mais 1;

- jogar logo todas as posições num vetor de caracteres usando o Copia() e usar o vetor nas comparações. A posição 1 terá a primeira letra, a posição 2 a segunda; a 3 a terceira etc. A lógica é a mesma: a posição posterior será a posição atual mais 1.

 

 

 

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

  • Membro VIP
11 minutos atrás, Irwing Seiji Ato disse:

Como faço para utilizar o comando copia e salvar dentro de um vetor? 

Todas as nove letras nesse caso serão 9 por causa que vai até 3999 o número maior ocupa 9 casas

 

Veja um exemplo:

algoritmo "Exemplo2"
var
   vetCarac :vetor [1..9] de caractere
   texto    :caractere
   i        :inteiro
inicio
texto <- "MXLVIII"
para i de 1 ate Compr(texto) faca
   vetCarac[i] <- Copia(texto,i,1)
fimPara
para i de 1 ate Compr(texto) faca
   escreval(vetCarac[i])
fimPara
fimAlgoritmo

 

adicionado 5 minutos depois

ADENDO:

11 minutos atrás, Irwing Seiji Ato disse:

Todas as nove letras nesse caso serão 9 por causa que vai até 3999 o número maior ocupa 9 casas

 

Como assim 9 casas? cuidado aí! conclusão precipitada!!! Quem disse que o maior número tem a maior quantidade de casas?

 

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

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..9] de caractere
   romano:caractere
   i:inteiro
   letra1:caractere


Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite um número em romano para ser convertido em arábico")
   escreval("menor que 4000 e maior que 0")
   leia(romano)
   para i de 1 ate Compr(romano) faca
      vetromano[i]<-Copia(romano,i,1)
   fimpara
   se(vetromano[1]= "I") entao
   m<-1
   fimse
   se(vetromano[1] = "V") entao
   m<-5
   fimse
   se(vetromano[1]= "X") entao
   m<-10
   fimse
   se(vetoromano[1] = "L") entao
   m<-50
   fimse
   se(vetromano[1] = "C") entao
   m<-100
   fimse
   se(vetromano[1] = "D") entao
   m<-500
   fimse
   se(vetromano[1] = "M") entao
   m<-100
   fimse
   se(vetromano[1] = "I") e (vetromano[2] = "I") entao
   c<-2
   fimse
   se(vetromano[1] = "I") e (vetromano[2] = "V") entao
   c<-4
   fimse
   se(vetromano[1] = "V") e (vetormano[2]= "I") entao
   c<-6
   se(vetromano[1] = "I") e (vetromano[2] = "X") entao
   c<-9
   fimse
   se(vetromano[1] = "X") e (vetromano[2] = "I") entao
   c<-11
   se(vetromano[1] = "X") e (vetromano[2] ="L") entao
   c<-40

Fiz esse código

Porém não tem outro método do que ficar comparando vetor por vetor a letra e preenchendo com número? 

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

  • Membro VIP

O para iria, por exemplo, de 1 até "M"? não. O que você precisa é percorrer todas as letras.

 

Quantas letras terá o vetor?

 

adicionado 2 minutos depois
8 minutos atrás, Irwing Seiji Ato disse:

O maior número que é o 3999 é MMMCMXCIX ocupar nove casas

 

OK, mas:

 

50 minutos atrás, Simon Viegas disse:

Quem disse que o maior número tem a maior quantidade de casas?

 

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

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..9] de caractere
   romano:caractere
   i:inteiro
   letra1:caractere


Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite um número em romano para ser convertido em arábico")
   escreval("menor que 4000 e maior que 0")
   leia(romano)
   para i de 1 ate Compr(romano) faca
      vetromano[i]<-Copia(romano,i,1)
   fimpara
   para i de 1 ate Compr(romano) faca
      se(vetromano[i] = "I") entao
         escreval("1")
      fimse
      se(vetromano[i]= "II") entao
         escreval("2")
      fimse
      se(vetromano[i] = "III") entao
      escreval("3")
      fimse

Ficaria assim?

Porém só está imprimindo o 1, como deve ser?

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

  • Membro VIP

Sobre:

4 minutos atrás, Irwing Seiji Ato disse:

      se(vetromano[i] = "I") entao
         escreval("1")
      fimse
      se(vetromano[i]= "II") entao
         escreval("2")
      fimse
      se(vetromano[i] = "III") entao
      escreval("3")
      fimse

 

Como deveria funcionar cada um desses se? qual o valor que tem numa posição?

 

adicionado 2 minutos depois

...tem como uma letra ser igual a 3 letras?

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

  • Membro VIP
3 minutos atrás, Irwing Seiji Ato disse:

O valor que pode se ter numa posição é 1, 5,10,50,100,500 e 1000 somente, o resto fica nas outras casas

 

O valor que tem numa posição é UMA LETRA. O valor dessa letra é que você quer analisar...

 

Nos se que você postou, um está comparando UMA LETRA, com UMA LETRA. Um outro UMA LETRA com DUAS LETRAS e, por fim, UMA LETRA com TRÊS LETRAS. Entendeu?

Como UM vai ser igual a DOIS ou TRÊS?

adicionado 1 minuto depois

Se quer comparar 3 letras, precisará efetuar 3 comparações...

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

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..9] de caractere
   romano:caractere
   i:inteiro
   letra1:caractere


Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite um número em romano para ser convertido em arábico")
   escreval("menor que 4000 e maior que 0")
   leia(romano)
   para i de 1 ate Compr(romano) faca
      vetromano[i]<-Copia(romano,i,1)
   fimpara
   para i de 1 ate Compr(romano) faca
      se(vetromano[i] = "I") entao
         escreval("1")
      fimse
      se(vetromano[i]="V")entao
         escreval("5")
      fimse
      se(vetromano[i] = "X") entao
         escreval("10")
      fimse
      se(vetromano[i] = "L") entao
         escreval("50")
      fimse
      se(vetromano[i] = "C") entao
         escreval("100")
      fimse
      se(vetromano[i] = "M") entao
         escreval("1000")
      fimse
   fimpara

Como devo proceder nesse se com duas casas ou mais?

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

  • Membro VIP
14 minutos atrás, Irwing Seiji Ato disse:

Não entendi essa parte da soma, como devo somar os algarismos?

 

Vide:

Em 15/03/2019 às 18:11, Irwing Seiji Ato disse:

Agrupando as letras acima, podemos representar os números de acordo com um conjunto de regras: Com exceção de V, L e D, os outros numerais podem se repetir no máximo três vezes:

III = 3 XXX = 30

CCC = 300

MMM = 3000

Quando escritos à direita de numerais maiores, I, X e C somam-se aos valores dos primeiros:

VIII = 5 + 1 + 1 + 1 = 8

LXII = 50 + 10 + 1 + 1 = 62

CLVIII = 158

MCXX = 1000 + 100 + 10 + 10 = 1120

Mas se os numerais I, X e C estiverem à esquerda dos maiores, seus valores são subtraídos como, por exemplo, em:

IV = 5 - 1 = 4

IX = 10 - 1 = 9

XC = 100 - 10 = 90

 

O resultado será a soma do valor que cada letra representa.

 

 

Qual parte não entendeu? (primeiro você precisa entender o "para quê", o "como" é consequência. Você saberá fazer!).

adicionado 3 minutos depois

Spoiler!

Spoiler

Se você que ir somando, basta "ir somando", algo como:


resultado = resultado + "valor da letra"

O mesmo vale para os números que são obtidos através da subtração, ou seja, a subtração é em relação ao valor que "determinadas duas letras representam".... Ex.: XC = 100-10. O código vai somar 90!

 

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

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..9] de caractere
   romano:caractere
   i:inteiro
   m,c,d,u:inteiro
   arabico:inteiro


Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite um número em romano para ser convertido em arábico")
   escreval("menor que 4000 e maior que 0")
   leia(romano)
   para i de 1 ate Compr(romano) faca
      vetromano[i]<-Copia(romano,i,1)
   fimpara
   para i de 1 ate Compr(romano) faca
      se(vetromano[1] = "I") entao
         m<-1
      fimse
      se(vetromano[1]= "V")entao
         m<-5
      fimse
      se(vetromano[1] = "X") entao
         m<-10
      fimse
      se(vetromano[1] = "L") entao
         m<-50
      fimse
      se(vetromano[1] = "C") entao
         m<-100
      fimse
      se(vetromano[1] = "M") entao
         m<-1000
      fimse
      se(vetromano[2] = "I") entao
         c<-1
      fimse
      se (vetromano[1] = "I") e (vetromano[2] = "V") entao
         c<-4
      fimse
      se(vetromano[1] = "I") e (vetromano[2] = "X") entao
         c<-9
      fimse

      
      arabico<-m+c+d+u
      escreval(arabico)
   fimpara

Fiz essa parte da soma para armazenar porém o código quando executa e soma só aparece o 5 quando digito IV, não sei porque 

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

  • Membro VIP
agora, Irwing Seiji Ato disse:

Como faço para percorrer, o que eu fiz lá em cima colocando para i de 1 ate Compr(romano) faca 

está errado?

 

O que está errado é o parâmetro do vetor. Você colocou um número fixo. Todos os loops estão comparando os mesmo valores.

 

11 minutos atrás, Irwing Seiji Ato disse:

      se(vetromano[1] = "I") entao
         m<-1
      fimse
      se(vetromano[1]= "V")entao
         m<-5
      fimse
      se(vetromano[1] = "X") entao
         m<-10
      fimse
      se(vetromano[1] = "L") entao
         m<-50
      fimse
      se(vetromano[1] = "C") entao
         m<-100
      fimse
      se(vetromano[1] = "M") entao
         m<-1000
      fimse
      se(vetromano[2] = "I") entao
         c<-1
      fimse
      se (vetromano[1] = "I") e (vetromano[2] = "V") entao
         c<-4
      fimse
      se(vetromano[1] = "I") e (vetromano[2] = "X") entao
         c<-9
      fimse

 

 

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

para i de 1 ate Compr(romano) faca
      se(vetromano[i] = "I") entao
         m<-1
      fimse
      se(vetromano[i]= "V")entao
         m<-5
      fimse
      se(vetromano[i] = "X") entao
         m<-10
      fimse
      se(vetromano[i] = "L") entao
         m<-50
      fimse
      se(vetromano[i] = "C") entao
         m<-100
      fimse
      se(vetromano[i] = "M") entao
         m<-1000
      fimse
      se(vetromano[i] = "I") e (vetromano[i] = "I") entao
         c<-2
      fimse
      se (vetromano[i] = "I") e (vetromano[i] = "V") entao
         c<-4
      fimse
      se(vetromano[i] = "I") e (vetromano[i] = "X") entao
         c<-9
      fimse

@Simon ViegasEntão como ficaria para não deixar fixo os valores?

Ficaria assim como está em cima?

Fiz isso porém quando soma está dando valores errados

O VisualG tem a função de separar letras?

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!