Ir ao conteúdo
  • Cadastre-se

VisualG Programa de busca (sequencial) em vetor inclusive identificar repetições


Posts recomendados

😃Saudações galera, sou novo em programação e gostaria de suas valiosa dicas com relação a seguinte questão:

Faça um programa que efetue a busca do tipo sequencial por um valor em um vetor de 200   posições, sabendo que o mesmo valor pode ocorrer mais de uma vez no vetor. O programa deve  imprimir o número de ocorrências do valor de busca, caso ocorram.

Obs. (O programa deve ser desenvolvido por meio da ferramenta Visualg)

Comecei fazendo a questão, porém o mesmo não consegue identificar os valores repetidos no vetor. Por gentileza onde estou errando ?

Segue o código do programa:

algoritmo "busca sequencial "

var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico

procedimento preenchevetor

var j : inteiro

inicio
      para j de 1 ate 20 faca
           v[j] <- randi(200)
           escreval(j:10,v[j]:10)

      fimpara
fimprocedimento

inicio

 RESP:= verdadeiro
    enquanto RESP = verdadeiro faca
   preenchevetor
             escreva("Entre com o valor de busca (ESC termina) :")
             leia(vb)
         j <- 1
         repita
               se v[j] = vb entao
                  achou <- verdadeiro
               senao
         j <- j+1
               fimse
                    ate (achou=verdadeiro) ou (j>20)
               se achou entao
         escreval("Achei ", vb , " na posição ", j)
               senao
               se ( v[j] = vb) entao
                escreval(" Valor: ", vb , " repetiu na posição ", j)
               senao
         escreval("Nao achei.")
   fimse
 fimse

fimenquanto

fimalgoritmo

No mais só tenho a agradecer.

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

  • Membro VIP

Olá.

 

1#

Mantenha o código indentado. No Visualg o comando CTRL+G pode ajudar.

Ex.:

algoritmo "busca sequencial "
var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico

procedimento preenchevetor
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   RESP:= verdadeiro
   enquanto RESP = verdadeiro faca
      preenchevetor
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      senao
         se ( v[j] = vb) entao
            escreval(" Valor: ", vb , " repetiu na posição ", j)
         senao
            escreval("Nao achei.")
         fimse
      fimse
   fimenquanto
fimalgoritmo

 

 

2#

Vou tentar dar um pontapé inicial...

 

No código abaixo deixei apenas o trecho que "inicialmente tenta encontrar uma posição igual no vetor ou chegar ao fim. Se encontrar um igual, exibe a informação adequada":

      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      fimse

Insira isso tudo dentro de outro repita. Este vai terminar também quando j>20, ou seja, vai procurar procurar novamente... até que chegue ao fim do vetor. Entende?

 

Então, isso não é "uma" solução pronta. Verás por exemplo que vai ficar encontrando o mesmo número toda hora.. isso vai acontecer porque o j estará com o mesmo valor. Daí é com você.

 

Tente entender a proposta e vá tentando corrigir.

 

 

Obs.: nesse momento não se preocupe se é um número repetido ou não. Apenas faça que exiba todas as ocorrências de um mesmo número no vetor, ou seja, se tiver 3 números iguais, deve exibir que achou 3 vezes. Mais pra frente pensa nessa questão se é repetido.

 

 

Qualquer dúvida é só perguntar.

 

 

No aguardo.

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

Citação:

Spoiler
7 horas atrás, Simon Viegas disse:

Olá.

 

1#

Mantenha o código indentado. No Visualg o comando CTRL+G pode ajudar.

Ex.:



algoritmo "busca sequencial "
var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico

procedimento preenchevetor
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   RESP:= verdadeiro
   enquanto RESP = verdadeiro faca
      preenchevetor
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      senao
         se ( v[j] = vb) entao
            escreval(" Valor: ", vb , " repetiu na posição ", j)
         senao
            escreval("Nao achei.")
         fimse
      fimse
   fimenquanto
fimalgoritmo

 

 

2#

Vou tentar dar um pontapé inicial...

 

No código abaixo deixei apenas o trecho que "inicialmente tenta encontrar uma posição igual no vetor ou chegar ao fim. Se encontrar um igual, exibe a informação adequada":



algoritmo "busca sequencial "
var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico
   ENTER:caractere

procedimento preenchevetor
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   RESP:= verdadeiro
   enquanto RESP = verdadeiro faca
      preenchevetor
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      {senao}
      {   se ( v[j] = vb) entao}
      {      escreval(" Valor: ", vb , " repetiu na posição ", j)}
      {   senao}
      {      escreval("Nao achei.")}
      {   fimse}
      fimse
      escreva ("Pressione ENTER para continuar")
      leia(ENTER)
   fimenquanto
fimalgoritmo

Insira isso tudo dentro de outro repita. Este vai terminar também quando j>20, ou seja, vai procurar procurar novamente... até que chegue ao fim do vetor. Entende?

 

Então, isso não é "uma" solução pronta. Verás por exemplo que vai ficar encontrando o mesmo número toda hora.. isso vai acontecer porque o j estará com o mesmo valor. Daí é com você.

 

Tente entender a proposta e vá tentando corrigir.

 

 

Obs.: nesse momento não se preocupe se é um número repetido ou não. Apenas faça que exiba todas as ocorrências de um mesmo número no vetor, ou seja, se tiver 3 números iguais, deve exibir que achou 3 vezes. Mais pra frente pensa nessa questão se é repetido.

 

 

Qualquer dúvida é só perguntar.

 

 

No aguardo.

 

Ao tempo que agradeço a interação, deixo meu entendimento após sua excelente explicação. 
Fiz o que me disse, Inclusive acrescentei o vetor de modo que achou > 1, 
como forma de tentar fazer com que o vetor pudesse encontrar as ocorrências, mas não consegui. 

algoritmo "busca sequencial "
var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico
   ENTER:caractere

procedimento preenchevetor
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   RESP:= verdadeiro
   enquanto RESP = verdadeiro faca
      preenchevetor
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      senao
         repita
            se ( v[j] = vb)
               achou <- verdadeiro
            ate (achou > 1) ou (j>20)
            escreval(" Valor: ", vb , " repetiu na posição ", j)}
            senao}
            escreval("Nao achei.")}
         fimse
      fimse

      escreva ("Pressione ENTER para continuar")
      leia(ENTER)
   fimenquanto
fimalgoritmo
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

3#

O código postado lá em 2# estava errado... em vez de postar apenas o trecho, postei o código completo. Já corrigi.

 

Releia todo o 2# e tente fazer o que foi solicitado.

 

 

 

4#

Os códigos entre {} são COMENTÁRIOS, ou seja, estão inutilizados.. deixei para demonstrar o que tinha. Estas partes no seu código estão erradas e não é para ser utilizada. Apenas apague essas linhas que tem {}. Já removi do código de lá também

 

 

 

***

 

No aguardo

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

algoritmo "busca sequencial "
var
   j,k, vb : inteiro
   v : vetor[1..20] de inteiro
   v1: vetor [1..20] de inteiro
   achou : logico
   RESP: logico
   ENTER:caractere

procedimento preenchevetor
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   RESP:= verdadeiro
   enquanto RESP = verdadeiro faca
      preenchevetor
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      senao
         repita
           se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
         
      ate(achou > 0) ou (j>20)
         escreval(" o valor ", vb , "repetiu na posição ", j)
         fimse

 

      escreva ("Pressione ENTER para continuar")
      leia(ENTER)
   fimenquanto
fimalgoritmo

Saudações meu amigo Simon Viegas, voltei com o código ainda em construção, inclusive tentei fazer o solicitado no post #2, mas estamos quase lá ! Observe que acrescentei o repita dessa vez com "achou >0" como forma de tentar encontrar ocorrências, mas nada ainda.Desde já obrigado.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

4#

Para tentar exemplificar melhor, esse um esboço que verifica se um número está no vetor

algoritmo "busca sequencial "
var
   v    :vetor[1..20] de inteiro
   j,vb :inteiro
   achou:logico
   ENTER:caractere

procedimento preencheVetor()
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   enquanto verdadeiro faca
      preencheVetor()
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      achou<-falso
      repita
         se v[j] = vb entao
            achou <- verdadeiro
         senao
            j <- j+1
         fimse
      ate (achou=verdadeiro) ou (j>20)
      se achou entao
         escreval("Achei ", vb , " na posição ", j)
      fimse
      leia(ENTER)
   fimenquanto
fimalgoritmo

 

 

 

5#
Segue implementação do item 2#, mais alguns ajustes.

algoritmo "busca sequencial "
var
   v    :vetor[1..20] de inteiro
   j,vb :inteiro
   achou:logico
   ENTER:caractere

procedimento preencheVetor()
var j : inteiro
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   enquanto verdadeiro faca
      preencheVetor()
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      j <- 1
      repita
         achou<-falso
         repita
            se v[j] = vb entao
               achou <- verdadeiro
            senao
               j <- j+1
            fimse
         ate (achou=verdadeiro) ou (j>20)
         se achou entao
            escreval("Achei ", vb , " na posição ", j)
         fimse
         j <- j+1
      ate j>20
      leia(ENTER)
   fimenquanto
fimalgoritmo

 

 

 

6#

O enunciado NÃO pede para dizer se achou ou não um número, mas sim o número de ocorrências.

 

Em 18/11/2018 às 23:37, Occam Gates disse:

Faça um programa que efetue a busca do tipo sequencial por um valor em um vetor de 200  posições, sabendo que o mesmo valor pode ocorrer mais de uma vez no vetor. O programa deve  imprimir o número de ocorrências do valor de busca, caso ocorram.

 

 

Ou seja, é necessário contar quantas vezes o número foi encontrado. Após exibir o resultado.

 

***

 

Qualquer dúvida é só perguntar.

 

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

  • Membro VIP

Boa parte do aprendizado é através da experiência... a medida que vai tendo contato, vai assimilando conceitos (o que é diferente de decorar). Aos poucos vai desenvolvendo, também, a capacidade de mesclar os conhecimentos adquiridos... inclusive para "supor" mais ou menos como seria algo novo que está tendo contato... a mente vai abrindo...

 

 

Aproveitando, segue uma simplificação do código:

algoritmo "Busca Sequencial 1.3"
var
   v    :vetor[1..20] de inteiro
   j,vb :inteiro
   achou:logico
   ENTER:caractere

procedimento preencheVetor()
inicio
   para j de 1 ate 20 faca
      v[j] <- randi(200)
      escreval(j:10,v[j]:10)
   fimpara
fimprocedimento

inicio
   enquanto VERDADEIRO faca
      preencheVetor()
      escreva("Entre com o valor de busca (ESC termina) :")
      leia(vb)
      achou<-FALSO
      para j de 1 ate 20 faca
         se v[j] = vb entao
            achou<-VERDADEIRO
            escreval("Achei",vb," na posição",j)
         fimSe
      fimPara
      se nao achou entao
         escreval("O numero",vb," nao foi encontrado no vetor")
      fimSe
      leia(ENTER)
   fimEnquanto
fimAlgoritmo

 

Se fosse apenas para achar um, poderia ser algo assim:

         se v[j] = vb entao
            achou<-VERDADEIRO
            escreval("Achei",vb," na posição",j)
            interrompa
         fimSe

 

 

obs.: tente entender a essência dos código.. o para seria como um enquanto mais especifico, ou seja, que tem a característica de repetir trechos, mas delimitado por uma quantidade predeterminada. Já o enquanto, dos código anteriores, também estão limitados por uma quantidade (porque não usar o para?), mas TAMBÉM tem outra dependência que é a se já achou ou não, ou seja, o enquanto é mais flexível para as condições (menos especialista). Nesse para acima foi utilizado um interrompa para "forçar o interrompimento dele", tendo um efeito análogo se estivesse utilizando um enquanto, ou seja, dar meio que um ar de gambiarra... (pelo menos para mim), mas que teoricamente é aceito pela comunidade...

 

Entende? para percorrer um vetor geralmente usamos para... ele tende a ser mais propício, mas como era necessário parar de procurar quando achar, foi utilizado um enquanto, assim como o conceito de flag (bandeira) para sinalizar que é para parar. Utilizando o interrompa, consigo utilizar o para.

 

obs.2: no caso, a flag achou serviu tanto para parar de procurar, tanto para indicar se achou ou não lá fora do laço de repetição.

 

obs.3: esse tal conceito de flag é bem simples... a ideia a justamente verificar "como a bandeira está flamulando (seu estado) e assim ter determinado comportamento". É como numa corrida de Formula 1. Quando o piloto ver uma bandeira amarela, flamulando de determinada forma, ele tem que passa a ter determinado comportamento (reduzir velocidade; não efetuar ultrapassagem etc). Perceba como é interessante... como será que funciona a cabeça do piloto? ele fica vendo a cada trecho se tem bandeira ou não? será que ele fica num estado de alerta suspenso, capaz de captar se algum novo evento surgiu e ter um comportamento em relação ele? etc etc... Se fosse programar um jogo de corrida, talvez teria que pesar sobre algo do tipo... verás que existem diversos paradigmas de programação. Geralmente, o ambiente de estudo já vai dar qual vertente deve seguir. No Visualg, por exemplo, teria meio que verificar a bandeira... tipo "se tem alguma bandeira, então se bandeira amarela, então reduza a velocidade, senao se bandeira preta, vá para o box"... ou algo do tipo.
 

 

Por ai vai.

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