Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
  • Membro VIP
Postado

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
Postado

@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
  • Membro VIP
Postado

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

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