Ir ao conteúdo

Posts recomendados

Postado

Acho que sei como finalmente fazer primeiramente eu pegaria o valor em romano digitado, pegaria o tamanho da letra valor atribuído seria n tamanho da letra e desse tamanho da letra tiraria n-1, depois tentaria dividir a letra, não sei o comando no VisualG para separar as letras e criaria um variável para armazenar o separamento dessas letras nesse caso separador criaria outra variável nesse caso s e receberia zero depois faria um para onde i =0 e i tem que ser menor que o tamanho da letra nessa e iria somando por +1 depois abriria um se verificando se a divisão da letras separador = "M" então s= s+1000 e dentro desse se abriria outro se  e se se separador[i-1]= "C" então s= s-200, terminaria esse se depois abriria outro se verificando se separador = "D" então s=s+500 e dentro abriria outro se e se separador[i-1] = "C" então s=s-200 depois fecharia esse se e abriria outro se separador = "C" então s=s+100 e dentro desse se abriria outro se se separador[i-1] = "X" e então s=s-20 depois terminaria esse se e abriria outro se, se separador = "L" então s=s+50 dentro abriria outro se, se separador[i-1] = "X" então

s=s-20 depois terminaria esse se e abriria outro se, se separador="X" então s=s+10 abriria outro se, se separador[i-1] = "I" então s=s-2 depois fecharia esse se depois abriria outro se, se separador="V" então s=s+5 e dentro desse se abriria outro se, se separador[i-1] = "I" então s=s-2 fecharia esse se depois abriria outro se se separador = "I" então s=s+1

depois daria um escreval(s)

 

Postado
Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i: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[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i+1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "D") entao
         arabico<-arabico+500
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "C") entao
         arabico<-arabico+100
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "L") entao
         arabico<-arabico+50
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "X") entao
         arabico<-arabico+10
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i]= "V")entao
         arabico<-arabico+5
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i] = "I") entao
         arabico<-arabico+1
      fimse
   fimpara
   escreval(arabico)

Acho que agora está imprimindo certo, acho que finalizei a segunda parte

 

 

  • Curtir 1
  • Membro VIP
Postado

Olá.

 

@Irwing Seiji Ato, basicamente você precisará fazer o seguinte:

 

1) Entender o que está acontecendo;

2) Achar uma forma para corrigir o erro.

 

Então, está ocorrendo um erro no código porque você está tentando acessar uma posição que não existe. Se o vetor é de 1 a 15, você não vai conseguir acessar a posição 0. Veja que tem i-1 ali no parâmetro... quando i=1 vai dar *****.

 

Pronto, primeiro você precisa entender isso que está ocorrendo e arrumar uma forma de contornar.

 

ADENDO:

Para adiantar, tem outro problema... tem momento que você está usando soma, onde deveria ser arabico.

Postado

É ó código apresentou este erro mesmo do MC apareceu 900 aqui, onde está o erro?

Var
   // Seção de Declarações das variáveis
   opcao:inteiro
   num :inteiro
   m,c,d,u:inteiro
   rest:inteiro
   rm,rc,rd,ru:caractere
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i:inteiro
   arabico:inteiro

Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite 1 para converter um número indo-arábico para")
   escreval("romano e digite 2 para converter um número romano para")
   escreval("indo-arábico")
   leia(opcao)
   se(opcao = 1) entao
      escreval("Digite um número indo-arábico para ser")
      escreval("convertido em romano menor que 4000 e maior que 0")
      leia(num)
      m <- int(num/1000)
      rest <- num mod 1000
      c <- int(rest/100)
      rest <- rest mod 100
      d <- int(rest/10)
      u <- rest mod 10
      se (m=1) entao
         rm<-"M"
      fimse
      se (m=2)entao
         rm<-"MM"
      fimse
      se (m=3) entao
         rm<-"MMM"
      fimse
      se (c=1)entao
         rc<-"C"
      fimse
      se (c=2)entao
         rc<-"CC"
      fimse
      se (c=3)entao
         rc<-"CCC"
      fimse
      se (c=4)entao
         rc<-"CD"
      fimse
      se (c=5)entao
         rc<-"D"
      fimse
      se (c=6)entao
         rc<-"DC"
      fimse
      se (c=7)entao
         rc<-"DCC"
      fimse
      se (c=8)entao
         rc<-"DCCC"
      fimSe
      se (c=9)entao
         rc<-"CM"
      fimse
      se (d=1)entao
         rd<-"X"
      fimse
      se (d=2)entao
         rd<-"XX"
      fimse
      se (d=3)entao
         rd<-"XXX"
      fimse
      se (d=4)entao
         rd<-"XL"
      fimse
      se (d=5)entao
         rd<-"L"
      fimse
      se (d=6)entao
         rd<-"LX"
      fimse
      se (d=7)entao
         rd<-"LXX"
      fimse
      se (d=8)entao
         rd<-"LXXX"
      fimse
      se (d=9)entao
         rd<-"XC"
      fimse
      se (u=1)entao
         ru<-"I"
      fimse
      se (u=2)entao
         ru<-"II"
      fimse
      se (u=3)entao
         ru<-"III"
      fimse
      se (u=4)entao
         ru<-"IV"
      fimse
      se (u=5)entao
         ru<-"V"
      fimse
      se (u=6)entao
         ru<-"VI"
      fimse
      se (u=7)entao
         ru<-"VII"
      fimse
      se (u=8)entao
         ru<-"VIII"
      fimse
      se (u=9)entao
         ru<-"IX"
      fimse
      escreval(rm,rc,rd,ru)
   senao
      se(opcao = 2)entao
         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] = "M") entao
               arabico<-arabico+1000
               se(vetromano[i+1] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "D") entao
               arabico<-arabico+500
               se(vetromano[i-1] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "C") entao
               arabico<-arabico+100
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "L") entao
               arabico<-arabico+50
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "X") entao
               arabico<-arabico+10
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i]= "V")entao
               arabico<-arabico+5
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i] = "I") entao
               arabico<-arabico+1
            fimse
         fimpara
         escreval(arabico)
      fimse
   fimse

 

  • Confuso 1
  • Membro VIP
Postado

Acho melhor só "misturar os 2" após finalizar o segundo. Beleza? são módulos separados... fica mais fácil analisar individualmente.

 

Então, o código está basicamente com o mesmo problema. Teste com mais calma. Além do problema original ainda existir no código, criou um novo (digite por exemplo "MC", que é 1100). Sugiro voltar para o código anterior e reanalisar o problema e a partir daí bolar uma forma de corrigir o erro (de está acessando uma posição que não existe).

Postado

Corrigi o código, ve se está certo

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i: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[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "D") entao
         arabico<-arabico+500
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "C") entao
         arabico<-arabico+100
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "L") entao
         arabico<-arabico+50
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "X") entao
         arabico<-arabico+10
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i]= "V")entao
         arabico<-arabico+5
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i] = "I") entao
         arabico<-arabico+1
      fimse
   fimpara
   escreval(arabico)

 

  • Confuso 1
Postado

O erro que estava ocorrendo era que estava subtraindo em vez de adicionando caso o número seja menor que o número atrás e não precisava somar ou subtrair do vetor

Mudei o começo do código na parte

se(vetromano[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200

não podia ser subtraído por -1

@Simon ViegasO código está funcionando?

adicionado 16 minutos depois

Que parte não entendeu do código?

A parte da subtração por menos 200 se dá pelo fato que vai repetir lá embaixo a soma por isso quando o vetor for anterior subtrai-se 200 o mesmo ocorre em outros casos aí

  • Curtir 1
  • Confuso 1
  • Membro VIP
Postado
44 minutos atrás, Irwing Seiji Ato disse:

O erro que estava ocorrendo era que estava subtraindo em vez de adicionando caso o número seja menor que o número atrás e não precisava somar ou subtrair do vetor

Mudei o começo do código na parte


se(vetromano[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200

não podia ser subtraído por -1

@devair1010@Simon ViegasO código está funcionando?

 

Não. O erro que estava ocorrendo era esse:

1 hora atrás, Simon Viegas disse:

Então, está ocorrendo um erro no código porque você está tentando acessar uma posição que não existe. Se o vetor é de 1 a 15, você não vai conseguir acessar a posição 0. Veja que tem i-1 ali no parâmetro... quando i=1 vai dar *****. 

 

Ao tentar corrigir ele, você criou um novo:

58 minutos atrás, Simon Viegas disse:

Além do problema original ainda existir no código, criou um novo (digite por exemplo "MC", que é 1100).

 

Observação: esse erro ainda não existia no primeiro código de hoje! correto? ele vai tá lá agora pois a postagem foi editada :). Este é um caso que era preferível apenas postar o código novo abaixo com a alteração... em vez de mexer no código original da outra postagem. (quem for ler o tópico posteriormente pode ficar confuso).

 

 

Resumindo:

58 minutos atrás, Simon Viegas disse:

Sugiro voltar para o código anterior e reanalisar o problema e a partir daí bolar uma forma de corrigir o erro (de está acessando uma posição que não existe).

 

:)



ADENDO:
Para simplificar. Sugiro pegar o código abaixo:

algoritmo "FCdH"
var
   vetRomano :vetor[1..15] de caractere
   romano    :caractere
   arabico   :inteiro
   i         :inteiro

inicio
   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] = "M") entao
         arabico <- arabico+1000
         se (vetRomano[i-1] = "C") entao
            arabico <- arabico-200
         fimse
      fimse
      se (vetRomano[i] = "D") entao
         arabico <- arabico+500
         se (vetRomano[i-1] = "C") entao
            arabico <- arabico-200
         fimse
      fimse
      se (vetRomano[i] = "C") entao
         arabico <- arabico+100
         se (vetRomano[i-1] = "X") entao
            arabico <- arabico-20
         fimse
      fimse
      se (vetRomano[i] = "L") entao
         arabico <- arabico+50
         se (vetRomano[i-1] = "X") entao
            arabico <- arabico-20
         fimse
      fimse
      se (vetRomano[i] = "X") entao
         arabico <- arabico+10
         se (vetRomano[i-1] = "I") entao
            arabico <- arabico-2
         fimse
      fimse
      se (vetRomano[i]= "V")entao
         arabico <- arabico+5
         se (vetRomano[i-1] = "I") entao
            arabico <- arabico-2
         fimse
      fimse
      se (vetRomano[i] = "I") entao
         arabico <- arabico+1
      fimse
   fimpara
   escreval(arabico)
fimalgoritmo


É basicamente o "original".

 

Nele, está "apenas" com o erro do "acesso a uma posição do vetor que não existe".

A proposta é que você analise esse problema. Entenda o que isso significa, após isso, tentar corrigir.

RESUMINDO:
 

47 minutos atrás, Simon Viegas disse:

- qual o erro que estava ocorrendo antes?

- o que você fez para corrigir? 


O erro é que pode está acessando uma posição do vetor que não existe.
"O que você fez" será o que você fará a partir de agora.

 

 

  • Curtir 1
Postado

Terminado?

adicionado 4 minutos depois

O código completo ficou assim 

Var
   // Seção de Declarações das variáveis
   opcao:inteiro
   num :inteiro
   m,c,d,u:inteiro
   rest:inteiro
   rm,rc,rd,ru:caractere
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i:inteiro
   arabico:inteiro

Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite 1 para converter um número indo-arábico para")
   escreval("romano e digite 2 para converter um número romano para")
   escreval("indo-arábico")
   leia(opcao)
   se(opcao = 1) entao
      escreval("Digite um número indo-arábico para ser")
      escreval("convertido em romano menor que 4000 e maior que 0")
      leia(num)
      m <- int(num/1000)
      rest <- num mod 1000
      c <- int(rest/100)
      rest <- rest mod 100
      d <- int(rest/10)
      u <- rest mod 10
      se (m=1) entao
         rm<-"M"
      fimse
      se (m=2)entao
         rm<-"MM"
      fimse
      se (m=3) entao
         rm<-"MMM"
      fimse
      se (c=1)entao
         rc<-"C"
      fimse
      se (c=2)entao
         rc<-"CC"
      fimse
      se (c=3)entao
         rc<-"CCC"
      fimse
      se (c=4)entao
         rc<-"CD"
      fimse
      se (c=5)entao
         rc<-"D"
      fimse
      se (c=6)entao
         rc<-"DC"
      fimse
      se (c=7)entao
         rc<-"DCC"
      fimse
      se (c=8)entao
         rc<-"DCCC"
      fimSe
      se (c=9)entao
         rc<-"CM"
      fimse
      se (d=1)entao
         rd<-"X"
      fimse
      se (d=2)entao
         rd<-"XX"
      fimse
      se (d=3)entao
         rd<-"XXX"
      fimse
      se (d=4)entao
         rd<-"XL"
      fimse
      se (d=5)entao
         rd<-"L"
      fimse
      se (d=6)entao
         rd<-"LX"
      fimse
      se (d=7)entao
         rd<-"LXX"
      fimse
      se (d=8)entao
         rd<-"LXXX"
      fimse
      se (d=9)entao
         rd<-"XC"
      fimse
      se (u=1)entao
         ru<-"I"
      fimse
      se (u=2)entao
         ru<-"II"
      fimse
      se (u=3)entao
         ru<-"III"
      fimse
      se (u=4)entao
         ru<-"IV"
      fimse
      se (u=5)entao
         ru<-"V"
      fimse
      se (u=6)entao
         ru<-"VI"
      fimse
      se (u=7)entao
         ru<-"VII"
      fimse
      se (u=8)entao
         ru<-"VIII"
      fimse
      se (u=9)entao
         ru<-"IX"
      fimse
      escreval(rm,rc,rd,ru)
   senao
      se(opcao = 2)entao
         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] = "M") entao
               arabico<-arabico+1000
               se(vetromano[i] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "D") entao
               arabico<-arabico+500
               se(vetromano[i-1] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "C") entao
               arabico<-arabico+100
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "L") entao
               arabico<-arabico+50
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "X") entao
               arabico<-arabico+10
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i]= "V")entao
               arabico<-arabico+5
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i] = "I") entao
               arabico<-arabico+1
            fimse
         fimpara
         escreval(arabico)
      fimse
   fimse

 

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

Terminado?


Então, veja:

6 minutos atrás, Simon Viegas disse:

É basicamente o "original".

 

Nele, está "apenas" com o erro do "acesso a uma posição do vetor que não existe".

A proposta é que você analise esse problema. Entenda o que isso significa, após isso, tentar corrigir.



PS:
É do meu perfil essa forma de "estimular que você dê os seus pulos" (sou prolixo, fazer o quê?). Até porque estamos num subfórum de iniciantes, ou seja, entendo que o objetivo em si não é a resposta (não que acho que você queira tudo mastigado). Tudo depende do contexto... num ambiente mais avançado, poderíamos ter uma pressuposição que o usuário já "tentou de tudo" e está precisando de um apoio extra. Tipo, eu poderia simplesmente de dar UMA possível solução, mas perderia a oportunidade de te ajudar "aprender a aprender" como se virar.


RESUMINDO:
Sugiro que pegue o código que postei anteriormente. Como citado, ele ainda está com o erro de acesso a posição que não existe. Entenda o que isso significa. Daí, tente corrigir.

 

Tem alguma dúvida sobre o erro atual? (de acesso a uma posição que não existe?)

  • Curtir 1
  • Membro VIP
Postado
18 minutos atrás, Irwing Seiji Ato disse:

Não nenhuma dúvida sobre o erro, algumas vezes falta atenção porque são muitas linhas para codificar

Obrigado

O código agora está certo ou tem algum erro?

 

Que código?

 

Poste o código atual completo. (pressione Ctrl+T para selecionar tudo, depois Ctrl+C para copiar).

  • Curtir 1
Postado
Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i: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[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "D") entao
         arabico<-arabico+500
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "C") entao
         arabico<-arabico+100
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "L") entao
         arabico<-arabico+50
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "X") entao
         arabico<-arabico+10
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i]= "V")entao
         arabico<-arabico+5
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i] = "I") entao
         arabico<-arabico+1
      fimse
   fimpara
   escreval(arabico)
Fimalgoritmo

 

  • Curtir 1
  • Membro VIP
Postado

Vamos recomeçar...

 

Pegue o código abaixo. Ele está apenas com o erro de "acesso a uma posição que não existe". Esse erro pode ocorrer em vários lugares. Segue o código:

algoritmo "FCdH"
var
   vetRomano :vetor[1..15] de caractere
   romano    :caractere
   arabico   :inteiro
   i         :inteiro

inicio
   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] = "M") entao
         arabico <- arabico+1000
         se (vetRomano[i-1] = "C") entao
            arabico <- arabico-200
         fimse
      fimse
      se (vetRomano[i] = "D") entao
         arabico <- arabico+500
         se (vetRomano[i-1] = "C") entao
            arabico <- arabico-200
         fimse
      fimse
      se (vetRomano[i] = "C") entao
         arabico <- arabico+100
         se (vetRomano[i-1] = "X") entao
            arabico <- arabico-20
         fimse
      fimse
      se (vetRomano[i] = "L") entao
         arabico <- arabico+50
         se (vetRomano[i-1] = "X") entao
            arabico <- arabico-20
         fimse
      fimse
      se (vetRomano[i] = "X") entao
         arabico <- arabico+10
         se (vetRomano[i-1] = "I") entao
            arabico <- arabico-2
         fimse
      fimse
      se (vetRomano[i]= "V")entao
         arabico <- arabico+5
         se (vetRomano[i-1] = "I") entao
            arabico <- arabico-2
         fimse
      fimse
      se (vetRomano[i] = "I") entao
         arabico <- arabico+1
      fimse
   fimpara
   escreval(arabico)
fimalgoritmo


Pegue esse código e tente corrigir. Depois poste o código completo que foi corrigido. Para isso, pressione Ctrl+T no VisualG, depois copie com Ctrl+C e poste aqui informando onde fez a alteração e porque fez ela.

 

No aguardo.

  • Curtir 1
Postado
Algoritmo "semnome"
// Disciplina  :  [Linguagem e Lógica de Programação]
// Professor   : Antonio Carlos Nicolodi
// Descrição   : Aqui você descreve o que o programa faz! (função)
// Autor(a)    : Nome do(a) aluno(a)
// Data atual  : 16/03/2019
Var
   // Seção de Declarações das variáveis
   vetromano:vetor[1..15] de caractere
   romano:caractere
   i: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[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "D") entao
         arabico<-arabico+500
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "C") entao
         arabico<-arabico+100
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "L") entao
         arabico<-arabico+50
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "X") entao
         arabico<-arabico+10
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i]= "V")entao
         arabico<-arabico+5
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i] = "I") entao
         arabico<-arabico+1
      fimse
   fimpara
   escreval(arabico)
Fimalgoritmo

O erro que estava ocorrendo era nessa parte

se(vetromano[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200
         fimse

 

Onde estava subtraindo do vetor dando nesse caso uma posição inexistente

E quando coloquei MMMCMXCIX retornou o valor 4199 ainda está com erro

  • Curtir 2
  • Membro VIP
Postado
2 minutos atrás, Irwing Seiji Ato disse:

O erro que estava ocorrendo era nessa parte


se(vetromano[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i] = "C") entao
            arabico<-arabico-200
         fimse

  

Onde estava subtraindo do vetor dando nesse caso uma posição inexistente

 

Adianto que não resolveu, certo?

Agora vamos analisar a alteração feita.

Está com algo assim: "se letra atual for igual a 'M', então some 1000". Depois, "se essa mesma letra for igual a 'C', então subtraia 200".
Ou seja, não tem como uma letra ser "M" e se "C" ao mesmo tempo. Tem algo errado aí.

 

Obs.: Não é só nessa linha, a mesma lógica se repete em outra partes do código. Mas pode tentar resolver somente essa parte antes, após resolver, terá que trocar as outras que tem o mesmo problema.

 

  • Curtir 1
Postado

O erro está na parte do vetor teria que começar com [0..15]

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

não começar do 1

estou certo?

Var
   // Seção de Declarações das variáveis
   vetromano:vetor[0..15] de caractere
   romano:caractere
   i: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[i] = "M") entao
         arabico<-arabico+1000
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "D") entao
         arabico<-arabico+500
         se(vetromano[i-1] = "C") entao
            arabico<-arabico-200
         fimse
      fimse
      se(vetromano[i] = "C") entao
         arabico<-arabico+100
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "L") entao
         arabico<-arabico+50
         se(vetromano[i-1] = "X") entao
            arabico<-arabico-20
         fimse
      fimse
      se(vetromano[i] = "X") entao
         arabico<-arabico+10
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i]= "V")entao
         arabico<-arabico+5
         se(vetromano[i-1] = "I") entao
            arabico<-arabico-2
         fimse
      fimse
      se(vetromano[i] = "I") entao
         arabico<-arabico+1
      fimse
   fimpara
   escreval(arabico)
Fimalgoritmo

 

adicionado 12 minutos depois

Acho que terminei o código completo fica assim 

Algoritmo "semnome"
// Disciplina  :  [Linguagem e Lógica de Programação]
// Professor   : Antonio Carlos Nicolodi
// Descrição   : Aqui você descreve o que o programa faz! (função)
// Autor(a)    : Nome do(a) aluno(a)
// Data atual  : 17/03/2019
Var
   // Seção de Declarações das variáveis
   opcao:inteiro
   num :inteiro
   m,c,d,u:inteiro
   rest:inteiro
   rm,rc,rd,ru:caractere
   vetromano:vetor[0..15] de caractere
   romano:caractere
   i:inteiro
   arabico:inteiro

Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escreval("Digite 1 para converter um número indo-arábico para")
   escreval("romano e digite 2 para converter um número romano para")
   escreval("indo-arábico")
   leia(opcao)
   se(opcao = 1) entao
      escreval("Digite um número indo-arábico para ser")
      escreval("convertido em romano menor que 4000 e maior que 0")
      leia(num)
      m <- int(num/1000)
      rest <- num mod 1000
      c <- int(rest/100)
      rest <- rest mod 100
      d <- int(rest/10)
      u <- rest mod 10
      se (m=1) entao
         rm<-"M"
      fimse
      se (m=2)entao
         rm<-"MM"
      fimse
      se (m=3) entao
         rm<-"MMM"
      fimse
      se (c=1)entao
         rc<-"C"
      fimse
      se (c=2)entao
         rc<-"CC"
      fimse
      se (c=3)entao
         rc<-"CCC"
      fimse
      se (c=4)entao
         rc<-"CD"
      fimse
      se (c=5)entao
         rc<-"D"
      fimse
      se (c=6)entao
         rc<-"DC"
      fimse
      se (c=7)entao
         rc<-"DCC"
      fimse
      se (c=8)entao
         rc<-"DCCC"
      fimSe
      se (c=9)entao
         rc<-"CM"
      fimse
      se (d=1)entao
         rd<-"X"
      fimse
      se (d=2)entao
         rd<-"XX"
      fimse
      se (d=3)entao
         rd<-"XXX"
      fimse
      se (d=4)entao
         rd<-"XL"
      fimse
      se (d=5)entao
         rd<-"L"
      fimse
      se (d=6)entao
         rd<-"LX"
      fimse
      se (d=7)entao
         rd<-"LXX"
      fimse
      se (d=8)entao
         rd<-"LXXX"
      fimse
      se (d=9)entao
         rd<-"XC"
      fimse
      se (u=1)entao
         ru<-"I"
      fimse
      se (u=2)entao
         ru<-"II"
      fimse
      se (u=3)entao
         ru<-"III"
      fimse
      se (u=4)entao
         ru<-"IV"
      fimse
      se (u=5)entao
         ru<-"V"
      fimse
      se (u=6)entao
         ru<-"VI"
      fimse
      se (u=7)entao
         ru<-"VII"
      fimse
      se (u=8)entao
         ru<-"VIII"
      fimse
      se (u=9)entao
         ru<-"IX"
      fimse
      escreval(rm,rc,rd,ru)
   senao
      se(opcao = 2)entao
         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] = "M") entao
               arabico<-arabico+1000
               se(vetromano[i] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "D") entao
               arabico<-arabico+500
               se(vetromano[i-1] = "C") entao
                  arabico<-arabico-200
               fimse
            fimse
            se(vetromano[i] = "C") entao
               arabico<-arabico+100
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "L") entao
               arabico<-arabico+50
               se(vetromano[i-1] = "X") entao
                  arabico<-arabico-20
               fimse
            fimse
            se(vetromano[i] = "X") entao
               arabico<-arabico+10
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i]= "V")entao
               arabico<-arabico+5
               se(vetromano[i-1] = "I") entao
                  arabico<-arabico-2
               fimse
            fimse
            se(vetromano[i] = "I") entao
               arabico<-arabico+1
            fimse
         fimpara
         escreval(arabico)
      fimse
   fimse

Fimalgoritmo

 

  • Curtir 1
  • Obrigado 1
  • Membro VIP
Postado
7 minutos atrás, Irwing Seiji Ato disse:

O erro está na parte do vetor teria que começar com [0..15]

 

Eu particularmente cheguei nessa "solução"... :D


Mas se atente que o erro NÃO estava na declaração do vetor, mas sim na lógica utilizada. Aconteceu que você precisou acessar a posição anterior, e estava dando problema. A definição do vetor em si estava correta. Alterar para 0, foi uma forma de contornar o erro. É diferente!

  • Curtir 1
Postado

O erro está no vetor mesmo a lógica está certa tente colocar MMMDCCCLXXXVIII que ocupa quinze casas, veja de 1 até 15 temos somente 14 casas não quinze diferente de 0 a 15

O número vetor começa a partir deste número pelo menos no VisualG é assim

O vetor é (FINAL - INICIO) não tem esse +1 aí não de onde sai esse +1?

 

  • Curtir 1
  • Membro VIP
Postado
7 minutos atrás, Irwing Seiji Ato disse:

O erro está no vetor mesmo a lógica está certa tente colocar MMMDCCCLXXXVIII que ocupa quinze casas, veja de 1 até 15 temos somente 14 casas não quinze diferente de 0 a 15


Nops!


O tamanho do vetor é igual a "FINAL - INICIO + 1". Pense assim: de 1 a 3 tem quantos? 1, 2 e 3, ou seja, 3 casas. Logo, de 1 a 15 tem 15. O vetor estava certo, apenas a lógica utilizada para verificar os valores que estava em conflito.

 

Tipo, para resolver, poderia verificar algo como. "se for a primeira posição, não verifique se tem letra a esquerda". ;)

adicionado 1 minuto depois

ou

Em vez de procurar a posição anterior, verifique a posterior. Daí iria surgir o problema de NÃO ter espaço no final... da mesma forma, teria que dar uma casa a mais no vetor para evitar o erro.

  • Curtir 1
Postado

Afinal o código todo está funcional?

O erro era a declaração do vetor mesmo o vetor começar a partir daquele número é (FINAL-INICIO), não (FINAL-INÍCIO + 1) , de onde tirou esse mais 1?

adicionado 4 minutos depois

Que concluímos que a quantidade de casas do vetor é igual (FINAL-INÍCIO)

  • Curtir 1
  • Confuso 1
  • Membro VIP
Postado

Sobre:

1 hora atrás, Irwing Seiji Ato disse:

Afinal o código todo está funcional?

 

O que você define como funcional? vamos lá:

 

Como citei:

3 horas atrás, Simon Viegas disse:

o objetivo em si não é a resposta

 

Ou seja, não estamos procurando um FIM. Não é somente o resultado que importa aqui... mas sim o MEIO. "Como chegar a fim válido ou correto".

 

Em relação à correção, desta forma, alterando as coordenadas do vetor, estamos meio que fazendo um armengue... o vetor em si deveria ir de 1 até o tamanho máximo possível, que supostamente é 15. Abaixo complemento.

 

 

Sobre:

1 hora atrás, Irwing Seiji Ato disse:

Afinal o código todo está funcional?

O erro era a declaração do vetor mesmo o vetor começar a partir daquele número é (FINAL-INICIO), não (FINAL-INÍCIO + 1) , de onde tirou esse mais 1?

adicionado 4 minutos depois

Que concluímos que a quantidade de casas do vetor é igual (FINAL-INÍCIO)


Não, não era! A declaração estava correta. Deveria ser de 1 a 15. APENAS A SUA LÓGICA PARA CALCULAR OS VALORES ENTROU EM CONFLITO. Então, essa fórmula de "final-inicio+1 é referente ao tamanho de um vetor e ela está correta (suponho eu). Veja, você argumentou que de 1 a 15 tem 14 posições, certo?... daí eu contra-argumentei que não. De a 1 a 15 tem 15 posições, e não 14... Nesse momento, estamos discutindo se de 1 a 15 tem 14 ou se tem 15 posições... não é?

 

Quando eu disse:

 

1 hora atrás, Simon Viegas disse:

O tamanho do vetor é igual a "FINAL - INICIO + 1".

 

Estou justamente me referindo ao TAMANHO... o que é diferente de "DEFINIÇÃO DA FAIXA DO VETOR NO VISUALG"... isso é outra coisa. Tente abstrair os conceitos... ou seja, estamos, nesse momento, se referindo ao "tamanho" em si, logo, tentei demonstrar como se calcular um tamanho. Se temos uma faixa de X a Y, quantos número temos? use a fórmula que citei e vai descobrir. Ex.:

final = 15
inicio = 1
tamanho = ? (o que eu quero descobrir)

Logo, temos:
tamanho = final - inicio + 1
tamanho = 15 - 1 + 1
tamanho = 15


Ah! eu quero 20 posições, mas preciso que o vetor comece da posição 12 (por algum motivo), qual vai ser o valor da posição final? (como vou declarar o meu vetor?)

final = ?
inicio = 16
tamanho = 20

Logo, temos:
final - 16 + 1 = 20
final = 35

Logo, o vetor poderia ser declarado assim:

meuVetor :vetor[16..35] de inteiro

 

Entende? "FINAL - INICIO + 1" é uma fórmula para calcular o tamanho de um vetor. :D

 

Lembre-se: o problema no seu código estava ocorrendo porque em determinado momento, você estava fazendo o VisualG acessar uma posição que não existe!!! Alterar para 0 foi apenas uma forma de disponibilizar essa posição. O que estava errado era ter acessado a posição, e não o tamanho em si. Alterar o tamanho (passando a ter 16) foi apenas uma consequência para a solução que você achou (liberar um espaço a esquerda).

Liberar a posição 0 foi para liberar a posição, e não para aumentar o tamanho.

 

 

RESUMINDO:
- o vetor estava certo. Deveria ir de 1 a 15;

- para contornar um erro, foi proposto alterar a definição das coordenadas do vetor, ou seja, liberando um espaço a esquerda. Ai pode entrar outra questão: essa alteração é válida ou não? Vamos considerar que sim... que é válido mexer na estrutura do vetor.

 

 

 

 

 

adicionado 51 minutos depois

@Irwing Seiji Ato, para finalizar e ficar praticamente 100% 🤩, temos:

  1. USE UMA VARIÁVEL SÓ PARA A RESPOSTA
    Seria interessante trocar o:
    rm,rc,rd,ru :caractere

    por algo como:

       romano :caractere

    ou seja, em vez de ter uma variável para cada parte, apenas use uma e vá concatenando. ex.:

          se (m=1) entao
             romando <- romando + "M"
          fimse
          se (m=2)entao
             romando <- romando + "MM"
          ...
          ...



     

  2. USE SE/SENAO OU ESOLHA/CASO EM VEZ DE SE SIMPLES
    Alterar alguns dos conjuntos que estão com se simples para se/senao. Isso precisa ser feito, caso contrário estará com erro de lógica (pois são condições mutuamente excludentes); OU se preferir, mudar para escolha/caso (será até mais fácil e dará no mesmo, pois será equivalente aos se/senao);


     

  3. VALIDAÇÃO DOS DADOS DE ENTRADA
    Como está escrito:
    2 horas atrás, Irwing Seiji Ato disse:

    [...] em romano menor que 4000 e maior que 0

    Seria interessante validar o valor, ou seja, "enquanto o número for menor que 1 OU o número for maior que 4000", emitir uma mensagem informando que o valor é invalido, e ler um novo valor.
     

Por ai vai.

Para adiantar, poste o código completo atual para darmos uma última revisada. Já deixar separado.

Após, crie uma cópia do código e  começa a tentar aplicar esses pontos acima. Considero os 3 interessantes, mas o 2 é fundamental.


Fico no aguardo da versão atual (antes das novas alterações). Qualquer dúvida sobre esses 3 pontos ou outra qualquer é só perguntar também.
 

No aguardo.

  • Curtir 1
  • Confuso 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!