Ir ao conteúdo
  • Cadastre-se
nowinskit

VisualG Vetor e valor inválido "0"

Recommended Posts

Olá, estou tentando entender o funcionamento ou "limitações" do VisualG. Usando vetor e armazenando números pares somente, acontece dele armazenar valores "0" para os índices "ímpares" que gostaria de manter sem nada. Pois assim fico obrigado em remover os zeros da saída, mas 0 é número par e se houver um valor de entrada 0 estarei cometendo erro ao remover todos eles na impressão.

 

Exemplo mantendo os zeros na "resposta":

Algoritmo "Exercicio"
VAR
   v1: VETOR [1..10] DE inteiro
   v2: Vetor[1..10] de inteiro
     x: INTEIRO
inicio

Para x de 1 ate 10 faca
   Escreva(x,"º v1: ")
   Leia(v1[x])
    Se v1[x] mod 2=0 então
       v2[x]:=v1[x]
    fimse
Fimpara
Escreval
   Para x de 1 ate 10 faca
         Escreval(x,"º  ",v2[x])
   fimpara
fimalgoritmo

 

Exemplo valores de entrada e saída

1º v1: 9
 2º v1: 2
 3º v1: 6
 4º v1: 9
 5º v1: 3
 6º v1: 0
 7º v1: 5
 8º v1: 6
 9º v1: 0
 10º v1: 3

 

 1º   0
 2º   2
 3º   6
 4º   0
 5º   0
 6º   0
 7º   0
 8º   6
 9º   0
 10º   0

 

Vejam que a sexta e nona entrada foram 0, assim me causando problemas para eliminar todos 0 da resposta.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu declararia uma variável y = 0 que aumenta sempre que v1[x] é par...

 

Se v1[x] mod 2=0 então

    y++

    v2[y]:=v1[x]

 

 

depois você imprime de 1 até y

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

8 horas atrás, nowinskit disse:

Usando vetor e armazenando números pares somente, acontece dele armazenar valores "0" para os índices "ímpares" que gostaria de manter sem nada.

Na verdade o que ocorre é que ao iniciar o programa, o Visualg, ao ir "criando as variáveis", automaticamente faz um "favor" de "inicializá-las"., ou seja, o que é número fica com 0, o que é caractere fica com "", o que é lógico fica com FALSO Etc.

 

Isso é uma "funcionalidade". Se não existisse, o valor da variável iria ficar com o "lixo" que já está na memória ram... Veja, a "criação" de uma variável funciona como uma "reserva de espaços" na memória, algo como dizer que da posição tal até a posição tal vai ser utilizada para armazenar o que você definiu... Os bits já estão lá..o programa apenas reserva o espaço. Daí, as vezes é necessário INICIALIZAR a variável, ou seja, "dar um valor inicial". Algumas linguagens de programação mais avançada, esse processo de "zerar" não existe!!!

 

Já no Visualg e Pascal, por exemplo, as variáveis globais são inicializadas automaticamente, ou seja, seria um "facilidade" que a linguagem já oferece ao usuário... No Pascal, por exemplo, isso já não ocorre com as variáveis locais, ou seja, que são criadas dentro de uma função ou procedimento (procedure e function).

 

 

RESUMINDO:

Não é que está armazenando zero nos ímpares, os número já estão lá! (pois o Visual já inicializou para você logo no início da execução)

 

 

 

Então, para o seu contexto, acontece que você está imprimindo sempre o segundo vetor completo. A forma como vai usar os vetores depende do enunciado! Como não foi citado, não dá para ter certeza... mas provavelmente deve ser algo como @PoTie sugeriu, ou seja, em vez "adicionar na posição correspondente", você pode ter uma variável auxiliar, que vai "contando" os ímpares e servirá para posicionar o segundo vetor a medida que vai surgindo novos números a serem adicionados.

 

 

Segue abaixo um código de como poderia ficar:

algoritmo "Exercicio"
var
   v1, v2 :vetor [1..10] de inteiro
   x,y    :inteiro
inicio
y<-0 //inicializa o controlador do vetor de pares
//obs.: veja que não seria necessário, pois as variáveis numéricas já começam com 0)
ALEATORIO 0,100 //para gerar números aleatórios nos leia(). Entre 1 e 100 (inclusos)
para x de 1 ate 10 faca
   escreva(x:2,"º v1: ")
   leia(v1[x]) //<-- aqui receberá o valor aleatório (simula o usuário digitando)
   se v1[x] mod 2=0 ENTÃO
      y<-Y+1 //atualiza o controlador
      v2[y]<-v1[x]
   fimSe
fimPara
ALEATORIO OFF
escreval()
para x de 1 ate y faca
   escreval(x,"º",v2[x])
fimPara
fimalgoritmo

 

No aguardo.

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

@PoTie Agradeço o exemplo.

 

@Simon Viegas Mas nesse método de reordenação eu perco a posição original que cada valor estava no vetor 1. Gostaria de manter ela.

 

Edit: Resolvi criando outro vetor para gravar as posições, mas não sei se é viável.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

1#

9 horas atrás, nowinskit disse:

Edit: Resolvi criando outro vetor para gravar as posições, mas não sei se é viável.

Por favor, poste o código para analisarmos e/ou também poder servi de bases para outros usuários.

 

 

 

2#

9 horas atrás, nowinskit disse:

@Simon Viegas Mas nesse método de reordenação eu perco a posição original que cada valor estava no vetor 1. Gostaria de manter ela.

 

Perceba:

23 horas atrás, Simon Viegas disse:

A forma como vai usar os vetores depende do enunciado


Entende? para se fazer algo, precisa ANTES saber o que precisa ser feito. Eu costumo citar algo assim: "Eu peço um cachorro-quente. Ai o garçom me entrega um delicioso X-tudo. Oras! eu quero comer com cachorro quente fio!"
 

O que importa é enunciado! Se ele mandou você pular da ponte, então pule!!! Não concorda? sugira a mudança ou algo do tipo... "que o garçom me ofereça o X tudo". Eu posso aceitar ou não... da mesma forma que o garçom pode me atender ou não...


Então, ainda não tenho o enunciado (ou o que se deseja)., ou seja, não dá para pensar em hipóteses "mais" ou "menos" adequadas para "resolver". Mas em relação à necessidade das posições, além de usar outro vetor como sugeriu, poderia ser algo assim:

 


2.1

Usar outra lógica, como atribuir um valor ou algo para os que não são pares. Exemplo:

algoritmo "Exercicio"
var
   v1 :vetor[1..10] de inteiro
   x      :inteiro
inicio
ALEATORIO 0,100
para x de 1 ate 10 faca
   escreva(x,"º v1: ")
   leia(v1[x])
fimPara
ALEATORIO OFF
escreval()
para x de 1 ate 10 faca
   escreva (x:2,"º")
   se v1[x] mod 2=0 ENTÃO
      escreval(v1[x])
   senao
      escreval("  -")
   fimSe
fimPara
fimAlgoritmo

Veja, como não sei se é "obrigado" a ter um segundo vetor, eu apenas usei 1.

 

 

2.2

Aproveitando essa sugestão sua de suar:

9 horas atrás, nowinskit disse:

[...] outro vetor para gravar as posições[...]


... tentei entender a lógica usada. Como serão 10 posições também, imaginei transformar o vetor 2 em matriz. Veja:
 

algoritmo "Exercicio"
var
   v1 :vetor [1..10] de inteiro
   v2 :vetor [1..10,1..2] de inteiro //[valor,posição desse valor]
   x,y    :inteiro
inicio
y<-0 //inicializa o controlador do vetor de pares
ALEATORIO 0,100 //para gerar números aleatórios nos leia(). Entre 0 e 100 (inclusos)
para x de 1 ate 10 faca
   escreva(x:2,"º v1: ")
   leia(v1[x]) //<-- aqui receberá o valor aleatório (simula o usuário digitando)
   se v1[x] mod 2=0 ENTÃO
      y<-Y+1 //atualiza o controlador
      v2[y,1]<-v1[x] //guarda o valor
      v2[y,2]<-x     //guarda a respectiva posição
   fimSe
fimPara
ALEATORIO OFF
escreval()
para x de 1 ate y faca
   escreval(v2[x,2]:2,"º",v2[x,1])
fimPara
fimalgoritmo

Perceba que nesse caso, teria que vê se seria permitido "transformar o vetor em matriz".
obs.: vetor e matriz não análogos. Um "vetor" seria uma matriz de uma coordenada. Assim como uma matriz seria um vetor de 2 (ou mais);

 

 

***

 

Por ai vai.

 

RESUMINDO:

Se tiver enunciado, por favor, poste para analisarmos.

Aproveita e posta o seu código para compararmos e efetuarmos análises.

 

No aguardo

adicionado 14 minutos depois

PS:
2.3
Uma outra forma utilizando dois 2 vetores:
 

algoritmo "Exercicio"
var
   v1, v2 :vetor[1..10] de inteiro
   x      :inteiro
inicio
ALEATORIO 0,100
para x de 1 ate 10 faca
   escreva(x:2,"º v1: ")
   leia(v1[x])
   se v1[x] mod 2=0 ENTÃO
      v2[x]<-v1[x]
   senao
      v2[x]<-(-1)
   fimSe
fimPara
ALEATORIO OFF
escreval()
para x de 1 ate 10 faca
   escreva (x:2,"º")
   se v2[x] <> (-1) ENTÃO
      escreval(v2[x])
   senao
      escreval("  -")
   fimSe
fimPara
fimAlgoritmo


Em fim.. podem existir várias lógicas para resolver um problema... o que pode limitar mais ou menos é o problema em si (enunciado).

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

×