Ir ao conteúdo
  • Cadastre-se
s4lezardv1A

VisualG VETORES - falha em logica para ler numero repetido

Recommended Posts

galera perdi o dia inteiro tentando achar o erro aqui. Eu estou fazendo um algoritmo que leia 5 numeros e veja qual deles se repete, e imprima qual numero é , quantas vezes ele se repete e em quais indices. Ja fiz TUDO. mas ele tem um pequeno bug . Na primeira parte para comparar eu fiz com que se o numero fosse igual, o vetor x recebia 0, se fosse diferente o vetor x recebia o numero lido. Mais tarde eu fazia outra comparação e escrevia o vetor que repetia. Da tudo certo. Só que na segunda vez ele não grava o 0. exemplo: eu coloco 1 1 2 2 5.. beleza... era pra ele gravar 1 0 2 0 5 assim eu saberia que o numero 1 e 2 se repetiram. Mas ele ta gravando 1 0 2 2 5.

o codigo:

Var
// Seção de Declarações das variáveis 
Vx,Vy: vetor[1..5] de inteiro
i,j,k,l,numero,repetido: inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc...
 escrevaL("Digite 5 numeros")
 escreval("")
 para i de 1 ate 5 faca
 escreval("Digite o ",i,"° numero:")
 leia (numero)

 para j de 1 ate 5 faca
 se (numero= vx[j]) e (numero<>0) então
 vx[i]<-0
 vy[i]<-numero
 numero<-0
fimse
se (numero<>vx[i]) e (numero<>0) então
 vx[i]<-numero
 vy[i]<-numero

 numero<-0
 fimse
 fimpara
 fimpara
 
 escreval("")
 escreval("")
 para l de 1 ate 5 faca

 repetido<-0
 para k de 1 ate 5 faca
    se vx[l] = vy[k] então
    repetido<-repetido+1

    fimse
 fimpara
 se repetido>1 então
  escreval ("O numero ",vy[l]," apareceu ",repetido," vezes nas posições: ")
 para k de 1 ate 5 faca
    se vx[l] = vy[k] então
    escreva  ("{",k," }")

    fimse
    fimpara
    escreval("")
    fimse
 fimpara

 

 

Podem ver que se colocar por exemplo: 1 1 2 5 4 ele vai dar certo. Agora se colocar um segundo numero repetido ele ja não da certo.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1#

O código está incompleto. No mínimo falta o fimAlgoritmo. Acho que era só...

 

 

 

2#

Sempre mantenha o código indentado. A dica inicial é pressionar CTRL+G. Seu código ficaria algo assim:

algoritmo "FCdH"
var
   Vx,Vy :vetor[1..5] de inteiro
   i,j,k,l,numero,repetido :inteiro
inicio
escreval("Digite 5 numeros")
escreval("")
para i de 1 ate 5 faca
  //escreval("Digite o ",i,"° numero:")
  //SUGIRO SEM QUEBRA DE LINHA, TIRAR O ESPAÇO ANTES DO i E ESPAÇO DEPOIS DO ":"
   escreva ("Digite o",i,"° numero: ")
   leia(numero)
   para j de 1 ate 5 faca
      se (numero= vx[j]) e (numero<>0) ENTÃO
         vx[i]<-0
         vy[i]<-numero
         numero<-0
      fimSe
      se (numero<>vx[i]) e (numero<>0) ENTÃO
         vx[i]<-numero
         vy[i]<-numero
         numero<-0
      fimSe
   fimPara
fimPara
escreval("")
escreval("")
para l de 1 ate 5 faca
   repetido<-0
   para k de 1 ate 5 faca
      se vx[l] = vy[k] ENTÃO
         repetido<-repetido+1
      fimSe
   fimPara
   se repetido>1 ENTÃO
      //escreval("O numero ",vy[l]," apareceu ",repetido," vezes nas posições: ")
      escreval("O numero",vy[l]," apareceu",repetido," vezes nas posições: ")
      para k de 1 ate 5 faca
         se vx[l] = vy[k] ENTÃO
            escreva ("{",k," }")
         fimSe
      fimPara
      escreval("")
   fimSe
fimPara
fimAlgoritmo

 

 

 

3#

Em relação ao erro:

20 minutos atrás, s4lezardv1A disse:

eu coloco 1 1 2 2 5.. beleza... era pra ele gravar 1 0 2 0 5 assim eu saberia que o numero 1 e 2 se repetiram. Mas ele ta gravando 1 0 2 2 5.

 

Acho que eu entendi a lógica..., mas preciso dar uma revisada com calma para entender melhor a implementação do algoritmo.

 

Vou ver aqui, mas tarde eu volto...

 

 

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

CONSEGUIIII!!!!! eu acho.... kkk simon vegas, veja se a minha logica esta certa. Eu percebi que enquanto fazia o SE dentro do PARA ele ia vendo todo o vetor e escrevia os dados por cima, eu entendi então que eu precisava parar o codigo quando encontrasse um NUMERO=VETORX ou NUMERO<>VETORX... mas eu não conseguia, então toda hora ia escrevendo por cima, tentei com uma variavel logica, se = ele sai, ou se <> ele sai tambem, mas ele mudava o que estava dentro do SE. Era isso que estava faltando né? o que eu fiz é colocar uma condiçao se = ele ficava 1 e não importava se fosse por todo o vetor, ainda continua 1. dai depois do para ele usava esse 1 ai sim escrevia, e senão tivesse encontrado, ai ele escrevia outro dado: veja se ficou certo sem erros. Se puder rodar os 2 codigos. eu entendia que no primeiro codigo ele escrevia por cima, mas eu ainda assim não entendo porque ele escreve somente em cima do segundo numero repetido...

 

o codigo acredito que certo:

 

Var
   // Seção de Declarações das variáveis
   Vx,Vy: vetor[1..5] de inteiro
   i,j,k,l,numero,repetido: inteiro
   trava: inteiro
Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   escrevaL("Digite 5 numeros")
   escreval("")
   para i de 1 ate 5 faca
      escreval("Digite o ",i,"° numero:")
      leia (numero)
      trava<-0
      para j de 1 ate 5 faca
         se numero=vx[j] então
            se (numero<>0) então
               trava<-1
            fimse
         fimse
      fimpara

      se trava=1 então
         vx[i]<-0
         vy[i]<-numero
         numero<-0
      fimse
      se trava<>1 então
         vx[i]<-numero
         vy[i]<-numero
         numero<-0
      fimse
   fimpara
   escreval("")
   escreval("")
   para l de 1 ate 5 faca

      repetido<-0
      para k de 1 ate 5 faca
         se vx[l] = vy[k] então
            repetido<-repetido+1

         fimse
      fimpara
      se repetido>1 então
         escreval ("O numero ",vy[l]," apareceu ",repetido," vezes nas posições: ")
         para k de 1 ate 5 faca
            se vx[l] = vy[k] então
               escreva  ("{",k," }")

            fimse
         fimpara
         escreval("")
      fimse
   fimpara

eu gostaria de saber tambem se tem outra forma de comparar se um numero digitado se repete em um vetor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

UPDATE 1

1 hora atrás, s4lezardv1A disse:

      se (numero<>vx[i]) e (numero<>0) ENTÃO //i é fixo, estará comparando 5 vezes a mesma coisa.. só por isso já está errado (ficaria fora desse for)
         vx[i]<-numero
         vy[i]<-numero
         numero<-0

 

 

UPDATE 2

Tentei entender a sua lógica e reajustei o seu código... então, acho mais prático demonstrar as alterações que explicar item a item, já que foi baseado na sua própria lógica:

algoritmo "FCdH"
var
   Vx,Vy :vetor[1..5] de inteiro
   i,j,k,l,numero,qtdRepetido :inteiro
   repetido :logico
inicio
escreval("Digite 5 numeros")
escreval("")
para i de 1 ate 5 faca
   escreva ("Digite o",i,"° numero: ")
   leia(numero)
   repetido<-FALSO
   para j de 1 ate 5 faca
      se (numero=vx[j]) e (repetido=FALSO) ENTÃO
         //se for repetido o vetor vx fica coma posição com 0
         vx[i]<-0
         vy[i]<-numero
         repetido<-VERDADEIRO
      fimSe
   fimPara
   se repetido=FALSO ENTÃO //fica
      vx[i]<-numero
      vy[i]<-numero
   fimSe
fimPara
escreval("")
escreval("")
para l de 1 ate 5 faca
   qtdRepetido<-0
   para k de 1 ate 5 faca
      se vx[l] = vy[k] ENTÃO
         qtdRepetido<-qtdRepetido+1
      fimSe
   fimPara
   se qtdRepetido>1 ENTÃO
      escreval("O numero",vy[l]," apareceu",qtdRepetido," vezes nas posições: ")
      para k de 1 ate 5 faca
         se vx[l] = vy[k] ENTÃO
            escreva ("{",k," }")
         fimSe
      fimPara
      escreval("")
   fimSe
fimPara
fimAlgoritmo

Aqui fiz testes rápidos e funcionou... qualquer dúvida é só perguntar.

 

adicionado 1 minuto depois

 

UPDATE 3

30 minutos atrás, s4lezardv1A disse:

CONSEGUIIII!!!!! eu acho....

 

A minha resposta foi antes da sua resposta... vou analisar aqui e responde. Pera...

adicionado 12 minutos depois

 

UPDATE 4

Ajustando ficando ficaria algo assim:

algoritmo "FCdH"
var
   Vx,Vy :vetor[1..5] de inteiro
   i,j,k,l,numero,qtdRepetido :inteiro
   repetido :logico
inicio
escrevaL("Digite 5 numeros")
escreval("")
para i de 1 ate 5 faca
   escreval("Digite o",i,"° numero:")
   leia (numero)
   repetido<-falso
   para j de 1 ate 5 faca
      se numero=vx[j] ENTÃO
         //se (numero<>0) ENTÃO
         repetido<-verdadeiro
      fimse
   fimpara
   se repetido ENTÃO
      vx[i]<-0
      vy[i]<-numero
      //numero<-0
   senao
      vx[i]<-numero
      vy[i]<-numero
      //numero<-0
   fimse
fimpara
   escreval("")
   escreval("")
   para l de 1 ate 5 faca
      qtdRepetido<-0
      para k de 1 ate 5 faca
         se vx[l] = vy[k] ENTÃO
            qtdRepetido<-qtdRepetido+1
         fimse
      fimpara
      se qtdRepetido>1 ENTÃO
         escreval ("O numero ",vy[l]," apareceu ",qtdRepetido," vezes nas posições: ")
         para k de 1 ate 5 faca
            se vx[l] = vy[k] ENTÃO
               escreva  ("{",k," }")
            fimse
         fimpara
         escreval("")
      fimse
   fimpara
fimAlgoritmo

 

Qualquer dúvida é só perguntar.

adicionado 16 minutos depois

 

UPDATE 5

Dá para simplificar... ex.:

algoritmo "FCdH"
var
   Vx,Vy :vetor[1..5] de inteiro
   i,j         :inteiro
   qtdRepetido :inteiro
   repetido    :logico
inicio
escreval("Digite 5 numeros")
escreval("")
para i de 1 ate 5 faca
   escreval("Digite o",i,"° numero:")
   leia (vy[i])
   repetido<-falso
   para j de 1 ate 5 faca
      se vy[i]=Vx[j] ENTÃO
         repetido<-verdadeiro
         interrompa
      fimse
   fimpara
   se repetido ENTÃO
      vx[i]<-0
   senao
      vx[i]<-vy[i]
   fimse
fimpara
   escreval("")
   escreval("")
   para i de 1 ate 5 faca
      qtdRepetido<-0
      para j de 1 ate 5 faca
         se vx[i] = vy[j] ENTÃO
            qtdRepetido<-qtdRepetido+1
         fimse
      fimpara
      se qtdRepetido>1 ENTÃO
         escreval ("O numero ",vy[i]," apareceu ",qtdRepetido," vezes nas posições: ")
         para j de 1 ate 5 faca
            se vx[i] = vy[j] ENTÃO
               escreva  ("{",j," }")
            fimse
         fimpara
         escreval("")
      fimse
   fimpara
fimAlgoritmo

 

 ̶D̶á̶ ̶p̶a̶r̶a̶ ̶s̶i̶m̶p̶l̶i̶f̶i̶c̶a̶r̶ ̶a̶i̶n̶d̶a̶ ̶m̶a̶i̶s̶.̶.̶.̶ ̶p̶e̶r̶a̶.̶.̶.

 

Acho que seria isso... :)

 

 

adicionado 28 minutos depois

 

UPDATE 6

Sobre:

33 minutos atrás, s4lezardv1A disse:

eu gostaria de saber tambem se tem outra forma de comparar se um numero digitado se repete em um vetor...

 

Rapaz, deve ter... eu já me deparei com esse problema com outro usuário, mas não lembro se conseguiram resolver, mas acho que eu também não tentei "descobrir". Estou mais com a proposta do usuário tentar expor a sua lógica, ai os colaboradores tentamos entender e verificar se é viável e tal...

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi a logica certa então? O que eu entendi é que no primeiro algoritmo ele escrevia sempre em cima dos dados, acredito que como você disse era por causa do vx <>0 vx=0 em alguma parte um dos dois iria escrever por cima do outro, gerando erro isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×