Ir ao conteúdo
  • Cadastre-se

VisualG Estudo de Caso - Faça a Leitura de 60 Idades e Agrupe em três faixas etárias


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Boas, estou tentando resolver este problema mas estou tendo problemas para listar as idades nas respetivas faixas etárias, vou passar o Código que já tenho feito. Tentei obter numa questão similar que está num outro tópico mas estou esbarrando no mesmo problema. 

 

O problema pede 60 entradas de idades mas para testar estou colocando apenas 5 entradas de Idades.

var
   idades: vetor [1..5] de Inteiro
   menores: vetor [1..5] de Inteiro
   adulto: vetor [1..5] de Inteiro
   idoso: vetor [1..5] de Inteiro
   Cont, CI, CM, CA, CID: Inteiro
Procedimento Topo()

Inicio
      Escreval("=========================================")
      Escreval("|        E S T U D O  DE C A S O        |")
      Escreval("=========================================")
      Escreval("|          LÓGICA DE PROGRAMAÇÃO        |")
      Escreval("=========================================")
FimProcedimento
inicio
// Seção de Comandos 
   Para Cont <- 1 ate 5 faca // Entrada e contagem de Idades por Faixa etária
        Topo()
        Escreva("Digite a Idade do ", Cont,"º Aluno: ")
        Leia(idades[Cont])
        CI <- CI + 1 // Contagem Integral
        Se (idades[Cont] >= 0) e (idades[Cont] <= 18) entao
           menores[Cont] <- idades[Cont]  // Armazena os menores de idade no Vetor menores
           CM <- CM + 1
        FimSE
        Se (idades[Cont] > 18) e (idades[cont] <= 60) entao
           adulto[Cont] <- idades[Cont]
           CA <- CA + 1
        FimSE
        Se (idades[Cont] > 60) entao
           idoso[Cont] <- idades[Cont]
           CID <- CID + 1
        FimSe
        LimpaTela
   FimPara
   
   Topo()
   Escreva("Menores: ")
   Para Cont <- 1 ate CM faca
          escreva(menores[Cont],", ")
   FimPara
   Escreval(" ")
   Escreva("Adultos: ")
   Para Cont <- 1 ate CA faca
          escreva(adulto[Cont], ", ")
   FimPara
   Escreval(" ")
   Escreva("Idosos: ")
   Para Cont <- 1 ate CID faca
        Escreva(idoso[Cont], ", ")
   FimPara

fimalgoritmo

 


Essencialmente tenho um grande problema, se introduzir todas as idades numa faixa etária, o programa retorna os valores corretamente na respectiva faixa etária. Caso introduza idades de diferentes faixas etárias, ele já bagunça tudo, retorna entradas vazias e omite as entradas corretas. Olhando o Escopo, as informações estão sendo armazenadas nos locais corretos e os contadores acumulam os valores devidos, então não sei onde esteja o erro. A Versão que estou a usar o VisalG é a 2.0.

Tentei sem sucesso usar Se <> 0 e repetir o Se por idade nos ciclos (Para) das faixas etárias mas o problema repete-se. 

Tem ainda a questão da virgula final que gostaria de substituir por um Ponto final que também não encontrei solução. 

Quem poder ajudar desde já agradeço.

Link para o post
Compartilhar em outros sites
1 hora atrás, Bruno Condado disse:

Boas, estou tentando resolver este problema mas estou tendo problemas para listar as idades nas respetivas faixas etárias, vou passar o Código que já tenho feito. Tentei obter numa questão similar que está num outro tópico mas estou esbarrando no mesmo problema. 

 

O problema pede 60 entradas de idades mas para testar estou colocando apenas 5 entradas de Idades.


var
   idades: vetor [1..5] de Inteiro
   menores: vetor [1..5] de Inteiro
   adulto: vetor [1..5] de Inteiro
   idoso: vetor [1..5] de Inteiro
   Cont, CI, CM, CA, CID: Inteiro
Procedimento Topo()

Inicio
      Escreval("=========================================")
      Escreval("|        E S T U D O  DE C A S O        |")
      Escreval("=========================================")
      Escreval("|          LÓGICA DE PROGRAMAÇÃO        |")
      Escreval("=========================================")
FimProcedimento
inicio
// Seção de Comandos 
   Para Cont <- 1 ate 5 faca // Entrada e contagem de Idades por Faixa etária
        Topo()
        Escreva("Digite a Idade do ", Cont,"º Aluno: ")
        Leia(idades[Cont])
        CI <- CI + 1 // Contagem Integral
        Se (idades[Cont] >= 0) e (idades[Cont] <= 18) entao
           menores[Cont] <- idades[Cont]  // Armazena os menores de idade no Vetor menores
           CM <- CM + 1
        FimSE
        Se (idades[Cont] > 18) e (idades[cont] <= 60) entao
           adulto[Cont] <- idades[Cont]
           CA <- CA + 1
        FimSE
        Se (idades[Cont] > 60) entao
           idoso[Cont] <- idades[Cont]
           CID <- CID + 1
        FimSe
        LimpaTela
   FimPara
   
   Topo()
   Escreva("Menores: ")
   Para Cont <- 1 ate CM faca
          escreva(menores[Cont],", ")
   FimPara
   Escreval(" ")
   Escreva("Adultos: ")
   Para Cont <- 1 ate CA faca
          escreva(adulto[Cont], ", ")
   FimPara
   Escreval(" ")
   Escreva("Idosos: ")
   Para Cont <- 1 ate CID faca
        Escreva(idoso[Cont], ", ")
   FimPara

fimalgoritmo

 


Essencialmente tenho um grande problema, se introduzir todas as idades numa faixa etária, o programa retorna os valores corretamente na respectiva faixa etária. Caso introduza idades de diferentes faixas etárias, ele já bagunça tudo, retorna entradas vazias e omite as entradas corretas. Olhando o Escopo, as informações estão sendo armazenadas nos locais corretos e os contadores acumulam os valores devidos, então não sei onde esteja o erro. A Versão que estou a usar o VisalG é a 2.0.

Tentei sem sucesso usar Se <> 0 e repetir o Se por idade nos ciclos (Para) das faixas etárias mas o problema repete-se. 

Tem ainda a questão da virgula final que gostaria de substituir por um Ponto final que também não encontrei solução. 

Quem poder ajudar desde já agradeço.

Ao Fazer o Passo a Passo reparei que ele Cita as primeiras idades da respectiva faixa, imaginando que eu introduzo, 2, 23, 67, 25 e 7 -  Ele armazena CM: 2, 0, 0, 0, 7 / CA: 0, 23, 0, 25, 0/ CID: 0, 0, 67, 0, 0. Acumulando CM: 2/ CA: 2/ CID: 1 - aí ele em vez de passar os valores preenchidos passa, Menores: 2, 0, / Adulto: 0, 23, / Idoso: 0, . Acabei fazendo uma alteração Tirando os acumuladores específicos (CM, CA, CID) e usando o acumulador Geral (CI) com essa alteração ele retorna todos os valores, mas tenho o problema das casas vazias. Vou tentar inserir <> de zero, mas vai me levantar um problema na primeira faixa etária. Deixa ver se resulta!!!

Link para o post
Compartilhar em outros sites

Consegui resolver o problema por um caminho:

A Solução Passou por atribuir a todos os valores Vazios o valor de -1 na Faixa de menores (única que aceita o Zero como Idade) Dessa Forma no ciclo de repetição da Faixa de Menores consigo usar o Se para separa a idade Zero dos Espaços Vazios. Nas outras Faixas Só vai validar as opções <> de 0.

var
   idades: vetor [1..5] de Inteiro
   menores: vetor [1..5] de Inteiro
   adulto: vetor [1..5] de Inteiro
   idoso: vetor [1..5] de Inteiro
   Cont, CI, CM, CA, CID: Inteiro
Procedimento Topo()

Inicio
      Escreval("=========================================")
      Escreval("|      F A I X A S  E T Á R I A S       |")
      Escreval("=========================================")
      Escreval("|          LÓGICA DE PROGRAMAÇÃO        |")
      Escreval("=========================================")
FimProcedimento
inicio
// Seção de Comandos 
   CI <- 0
   CM <- 0
   CA <- 0
   CID <- 0
   Para Cont <- 1 ate 5 faca // Entrada e contagem de Idades por Faixa etária
        Topo()
        Escreva("Digite a Idade do ", Cont,"º Aluno: ")
        Leia(idades[Cont])
        CI <- CI + 1 // Contagem Integral
        Se (idades[Cont] >= 0) e (idades[Cont] <= 18) entao
           menores[Cont] <- idades[Cont]  // Armazena os menores de idade no Vetor menores
           CM <- CM + 1
        Senao
             menores[Cont] <- -1
        FimSE
        Se (idades[Cont] > 18) e (idades[cont] <= 60) entao
           adulto[Cont] <- idades[Cont]
           CA <- CA + 1
        FimSE
        Se (idades[Cont] > 60) entao
           idoso[Cont] <- idades[Cont]
           CID <- CID + 1
        FimSe
        LimpaTela
   FimPara
   
   Topo()
   Escreva("Menores: ")
   Para Cont <- 1 ate CI faca
        Se (menores[Cont] <> -1) entao
          escreva(menores[Cont],", ")
        FimSe
   FimPara
   Escreval(" ")
   Escreva("Adultos: ")
   Para Cont <- 1 ate CI faca
        Se (adulto[Cont] <> 0) entao
          escreva(adulto[Cont], ", ")
        FimSE
   FimPara
   Escreval(" ")
   Escreva("Idosos: ")
   Para Cont <- 1 ate CI faca
        Se (idoso [Cont] <> 0) entao
          Escreva(idoso[Cont], ", ")
        FimSE
   FimPara

fimalgoritmo

Para ficar perfeito, só falta a virgula final ser substituída por Ponto. Exemplo: no meu código vai aparecer

Menores: 2, 4, 6, e eu gostaria que retorna-se Menores: 2, 4, 6. Se alguém poder ajudar fico grato. Se encontrarem outro caminho de resolução fiquem á vontade para Postar.

Depois irei colocar o Código Final com o Exercício Completo. 

Link para o post
Compartilhar em outros sites
Para Cont <- 1 ate 5 faca // Entrada e contagem de Idades por Faixa etária
        Topo()
        Escreva("Digite a Idade do ", Cont,"º Aluno: ")
        Leia(idades[Cont])
        CI <- CI + 1 // Contagem Integral
        Se (idades[Cont] >= 0) e (idades[Cont] <= 18) entao
           menores[Cont] <- idades[Cont]  // Armazena os menores de idade no Vetor menores
           CM <- CM + 1
        FimSE

Essa é parte do código que tentei fazer, seria após a condição se fazer um clico de repetição, criando aí menores[CM]?

 

Link para o post
Compartilhar em outros sites
  • Moderador
  • Solução

 

Olá.

 

Cada vetor tem o seu próprio "contador". Bastaria utilizar. Algo como:

 

        se (idades[cont] >= 0) e (idades[cont] < 18) entao
          CM <- CM + 1 
          menores[CM] <- idades[cont]     
        fimSe

 

 

   escreva ("Menores: ")
   para cont <- 1 ate CM faca
        escreva (menores[cont],", ")
        fimSe
   fimPara

 

  • Curtir 1
Link para o post
Compartilhar em outros sites
43 minutos atrás, Simon Viegas disse:

 

Olá.

 

Cada vetor tem o seu próprio "contador". Bastaria utilizar. Algo como:

 


        se (idades[cont] >= 0) e (idades[cont] < 18) entao
          CM <- CM + 1 
          menores[CM] <- idades[cont]     
        fimSe

 

 


   escreva ("Menores: ")
   para cont <- 1 ate CM faca
        escreva (menores[cont],", ")
        fimSe
   fimPara

 

Boas Amigo, 

Deu certo, estava no caminho certo, eu até tinha tentado fazer assim, mas deu um erro e assumi que seria por conta de Menores[CM].

Assim acabei achando o caminho pelas duas Soluções.

Em relação á Virgula no Final, não tem como tirar ela?

O algoritmo retorna/ Menores: 2, 4, 6, - E Gostaria que ele retorna-se / Menores: 2, 4, 6.

Vou estudar aqui para ver se consigo fazer essa troca. se souberes como fazer dá uma dica aí. 

Muito Obrigado pela ajuda

Link para o post
Compartilhar em outros sites
  • Moderador
23 minutos atrás, Bruno Condado disse:

Em relação á Virgula no Final, não tem como tirar ela?

O algoritmo retorna/ Menores: 2, 4, 6, - E Gostaria que ele retorna-se / Menores: 2, 4, 6.

 

Sim tem. Tente entende como você quer imprimir o resultado e crie um algoritmo para imprimir dessa forma desejada... Vá tentando e testando...

 

Link para o post
Compartilhar em outros sites
3 minutos atrás, Simon Viegas disse:

 

Sim tem. Tente entende como você quer imprimir o resultado e crie um algoritmo para imprimir dessa forma desejada... Vá tentando e testando...

 

Ok, vou tentar. Depois Coloco aqui como cheguei lá. 

Link para o post
Compartilhar em outros sites
Em 06/04/2021 às 15:35, Simon Viegas disse:

 

Sim tem. Tente entende como você quer imprimir o resultado e crie um algoritmo para imprimir dessa forma desejada... Vá tentando e testando...

 

Boas achei um caminho para Retirar a Virgula Final e terminar com Ponto Final.

Para Fins práticos vou colocar só o código respeitante a uma categoria no Ponto onde é feita a separação. Mas a Solução que arrumei para o caso de a faixa etária estar vazia acabou de criar um problema para o caso de a idade ser zero.

Escreval(" ")
   Escreva("Menores: ") // Escreve a Faixa Menores: 
   Para Cont de 1 ate CM - 1 faca // Ciclo de repetição menos o termo Final
        Escreva(Menores[Cont],", ")
   FimPara
   Se (Menores[Cont] = 0) entao // Para o Caso de a faixa etária estar vazia
      Escreva(" ")
   Senao
        Escreva(Menores[CM],".")// Vai Escrever o último termo Terminando com Ponto Final
   FimSe

Uma ajuda para resolver a Situação em que a idade é igual a zero. Criei ela para no caso de a faixa etária estar vazia não dar erro. Mas aí ele não vai aceitar a idade Zero

  • Curtir 1
Link para o post
Compartilhar em outros sites
1 hora atrás, Bruno Condado disse:

Boas achei um caminho para Retirar a Virgula Final e terminar com Ponto Final.

Para Fins práticos vou colocar só o código respeitante a uma categoria no Ponto onde é feita a separação. Mas a Solução que arrumei para o caso de a faixa etária estar vazia acabou de criar um problema para o caso de a idade ser zero.


Escreval(" ")
   Escreva("Menores: ") // Escreve a Faixa Menores: 
   Para Cont de 1 ate CM - 1 faca // Ciclo de repetição menos o termo Final
        Escreva(Menores[Cont],", ")
   FimPara
   Se (Menores[Cont] = 0) entao // Para o Caso de a faixa etária estar vazia
      Escreva(" ")
   Senao
        Escreva(Menores[CM],".")// Vai Escrever o último termo Terminando com Ponto Final
   FimSe

Uma ajuda para resolver a Situação em que a idade é igual a zero. Criei ela para no caso de a faixa etária estar vazia não dar erro. Mas aí ele não vai aceitar a idade Zero

O Problema foi Fácil de resolver, pois se uma Faixa etária retorna vazia então o contador Específico vai estar zerado, e é a partir daí que deve partir SE. Então a solução para o ponto e virgula sem dar erro é: 

Escreval(" ")
   Escreva("Menores: ")
   Se (CM = 0) entao
      Escreva(" ")
   Senao
        Para Cont de 1 ate CM - 1 faca
             Escreva(Menores[Cont],", ")
        FimPara
        Escreva(Menores[CM],". ")
   FimSe

 

  • Obrigado 1
Link para o post
Compartilhar em outros sites
  • Moderador

Essa é ideia... vai alterando e testado até ficar de uma forma interessante. :)

 

Quando tiver com um problema semelhante já terá uma base melhor e "perderá" menos tempo achando uma solução.

 

  • Curtir 1
Link para o post
Compartilhar em outros sites
9 horas atrás, Simon Viegas disse:

Essa é ideia... vai alterando e testado até ficar de uma forma interessante. :)

 

Quando tiver com um problema semelhante já terá uma base melhor e "perderá" menos tempo achando uma solução.

 

Tem outra forma de resolver? Se tiver compartilha aí.

Link para o post
Compartilhar em outros sites
  • Moderador

@Bruno Condado, acho que ficou muito bom.

 

Se surgir para você outras ideias, tente implementar... Tente imaginar um resultado desejado primeiro, ou seja: primeiro idealize o problema, para a partir daí tentar idealizar uma solução para ele.

 

Para o problema que atual, a sua solução me parece boa!

  • Curtir 1
Link para o post
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...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!