Ir ao conteúdo
  • Cadastre-se

VisualG Switch Case: erro na validação de data usando "CASO"


Posts recomendados

Alguém me ajuda, estou fazendo validação da data de nascimento usando switch case, considerando ano bissexto também, mas está dando esse erro que esperava uma expressão do tipo inteiro... Não estou conseguindo ver onde tem erro... Por favor, se alguém puder me ajuda, agradeço.

 

image.png.51a902275292145f4739f4ed85d71649.png

image.thumb.png.43d11ef0f32f979291deb9d08c144ed4.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @everton.carniato. Seja bem vindo ao Fórum do Clube do Hardware.

 

1#

Por favor, poste o código em forma de texto, em vez de imagem. Para isso, favor se usar a tag CODE.

 

 

 

2#

Para facilitar as verificações, poste também o enunciado completo.

 

 

 

3#

Em relação ao erro, você está usando o escolha/caso de forma errada, ou seja, não está respeitando a sua sintaxe. Dê uma pesquisa no o tema. Ex.:

http://www.apoioinformatica.inf.br/produtos/item/13-comando-de-selecao-multipla

 

Ou a depender, use a estrutura se/senão.

http://www.apoioinformatica.inf.br/produtos/visualg/linguagem/item/12-comando-de-desvio-condicional

 

***

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

ENUNCIADO: 

Uma universidade deseja saber algumas informações estatísticas referente a uma sala de aula com 40 alunos. Para isso, fora elaborado um questionário contendo as seguintes perguntas:

- Nome do aluno

- Data de nascimento (DD/MM/AAAA)

- Sexo (F/M/O)

- Signo

- Altura

- Peso

Desta forma, deseja-se apresentar no final as seguintes informações:

a) Percentual de alunos do sexo Feminino

B) média de idade dos alunos

c) nome e peso da pessoa mais pesada do sexo masculino

d) quantidade de pessoas do signo de GEMEOS abaixo de 1,75m de altura

e) nome e altura da pessoa mais baixa

f) média aritmética de peso de todos os alunos entrevistados

g) percentual de pessoas que nasceram em ano BISSEXTO

h) quantidade de pessoas que nasceram em dias PRIMO

J) quantidade de alunos por signo

 

--------------------------------------------------------------------------------------------------

Eu vi depois o erro, mas agora já estou usando o "SE", porém não estou conseguindo, ele trava o visualg toda vez que executo, só preciso validar a entrada da data de nascimento. Para os meses que só tiverem 30 dias, não permitir inserir 31, e para quando o ano não for bissexto, não permitir que insira o dia 29 em fevereiro.

segue o código que estou tentando:

 

<code>

algoritmo "exerc17"
var
   nome,sexo,signo:caracter
   altura:real
   peso,cont,dia,mes,ano:inteiro
   
inicio


     
           escreval("|-------------------- FICHA DE INFORMAÇÕES --------------------|")
           escreval(" Preencha os campos abaixo:")
// Nome ------------------------------------------------------------------------
           escreva (" 1. Nome do aluno: ")
           leia(nome)
           escreval
// Data ------------------------------------------------------------------------

           escreval (" 2. Data de nascimento (DD/MM/AAAA): ")
            repita
             escreva("    Dia: ")
             leia(dia)
             se (dia<1) ou (dia>31) então
               escreval("Dia inválido.")
             fimse
            ate (dia>=1) e (dia<=31)

            repita
             escreva("    Mês: ")
             leia(mes)
             se (mes<1) ou (mes>12) então
               escreval("Mês inválido.")
             fimse
            ate (mes>=1) e (mes<=12)

            repita
             escreva("    Ano: ")
             leia(ano)
             se (ano<1900) ou (ano>2100) então
               escreval("Ano inválido.")
             fimse
            ate (ano>=1900) e (ano<=2100)
//---
            repita
              se (mes=4) e (dia>30) então
                escreva("Dia inválido, insira novamente: ")
                leia(dia)
              fimse

              se (mes=6) e (dia>30) então
                escreva("Dia inválido, insira novamente: ")
                leia(dia)
              fimse

              se (mes=9) e (dia>30) então
                escreva("Dia inválido, insira novamente: ")
                leia(dia)
              fimse

              se (mes=11) e (dia>30) então
                escreva("Dia inválido, insira novamente: ")
                leia(dia)
              fimse

              se (mes=2) e (dia>29) então
                escreva("Dia inválido, insira novamente: ")
                leia(dia)
              fimse

            ate ((mes=4) e (dia<=30)) ou ((mes=6) e (dia<=30)) ou ((mes=9) e (dia<=30)) ou ((mes=11) e (dia<=30)) ou ((mes=2) e (dia<=29))

fimalgoritmo

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O erro está no último repita/ate. Lá você criou condições um monte de se e uma condição no ate, daí, por algum motivo não está entrando em nenhum se, ao mesmo tempo que a condição do ate não está senda atendida, ou seja, fica num loop infinito.

 

Ai entra as indagações: onde foi pedido para validar a data?  e para quê? não encontrei isso no enunciado (veja aí um exemplo da importância dele). Simplesmente suponha que sempre será digitado uma data correta e pronto!.

 

Se atente ao que foi pedido!

 

Mais pra frente... muuuuito mais pra frente, pode pensar em implementar "essa melhoria".

 

 

Segue uma sugestão de esboço para dar continuidade:

algoritmo "exerc17"
// Uma universidade deseja saber algumas informações estatísticas referente a
// uma sala de aula com 40 alunos. Para isso, fora elaborado um questionário
// contendo as seguintes perguntas:
//- Nome do aluno
//- Data de nascimento (DD/MM/AAAA)

{FALTA IMPLEMENTAR}
//- Sexo (F/M/O)
//- Signo
//- Altura
//- Peso
//Desta forma, deseja-se apresentar no final as seguintes informações:
//a) Percentual de alunos do sexo Feminino
//b) média de idade dos alunos
//c) nome e peso da pessoa mais pesada do sexo masculino
//d) quantidade de pessoas do signo de GEMEOS abaixo de 1,75m de altura
//e) nome e altura da pessoa mais baixa
//f) média aritmética de peso de todos os alunos entrevistados
//g) percentual de pessoas que nasceram em ano BISSEXTO
//h) quantidade de pessoas que nasceram em dias PRIMO
//j) quantidade de alunos por signo
var
   nome,sexo,signo:caracter
   altura:real
   peso,cont,dia,mes,ano:inteiro
inicio
escreval("|-------------------- FICHA DE INFORMAÇÕES --------------------|")
escreval(" Preencha os campos abaixo:")
escreva (" 1. Nome do aluno: ")
leia(nome)
escreval(" 2. Data de nascimento (DD/MM/AAAA): ")
escreva ("    Dia: ")
leia(dia)
escreva ("    Mês: ")
leia(mes)
escreva ("    Ano: ")
leia(ano)






//PARA TESTAR SE ESTÁ LENDO CORRETAMENTE
escreval("*** DADOS DO ALUNO ***")
escreval("Nome do aluno     : ",nome)
escreval("Data de nascimento: ",dia,"/",mes:2,"/",ano:4)
escreval("Sexo              : ")
escreval("Signo             : ")
escreval("Altura            : ")
escreval("Peso              : ")


fimAlgoritmo

 

Após ler os dados corretamente de um aluno, faça o programa ler 3 alunos. Após implemente um, e somente um, item do enunciado, como a letra b (que é mais simples).

 

Ai posta o código aqui para analisarmos.

 

 

No aguardo.

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

Antes de ler a resposta aqui consegui fazer, segue o código: 

algoritmo "exerc17"
var
   nome,sexo,signo,nomePmaior,nomeAmenor:caracter
   altura,peso,pesomaior,alturamenor,mediapeso:real
   cont,dia,mes,ano,mulheres,idade,mediaid,pessoasD,pessoasG,contH,apoioH,pessoasH,aries,touro,gemeos,cancer,leao,virgem,libra,escorpiao,sagitario,capricornio,aquario,peixes:inteiro
   
inicio
      mulheres:=0
      idade:=0
      pesomaior:=0
      pessoasD:=0
      alturamenor:=999999999999999999999999999999
      mediapeso:=0
      pessoasG:=0
      apoioH:=0
      pessoasH:=0
      aries:=0
      touro:=0
      gemeos:=0
      cancer:=0
      leao:=0
      virgem:=0
      libra:=0
      escorpiao:=0
      sagitario:=0
      capricornio:=0
      aquario:=0
      peixes:=0
      mediaid:=0

      para cont de 1 ate 40 faca
           escreval("|-------------------- FICHA DE INFORMAÇÕES --------------------|")
           escreval(" Preencha os campos abaixo:")
// Nome ------------------------------------------------------------------------
           escreva (" 1. Nome do aluno: ")
           leia(nome)
           escreval
// Data ------------------------------------------------------------------------

           escreval (" 2. Data de nascimento (DD/MM/AAAA): ")
             escreva("    Dia: ")
             leia(dia)
             escreva("    Mês: ")
             leia(mes)
             escreva("    Ano: ")
             leia(ano)
        REPITA
           Se (dia<1) ou (dia>31) então
             escreva(" Dia inválido, insira novamente: ")
             leia(dia)
           fimse
           se (mes<1) ou (mes>12) então
             escreva(" Mês inválido, insira novamente: ")
             leia(mes)
           fimse
           se (ano<1900) então
             escreva(" Ano inválido, insira novamente: ")
             leia(ano)
           fimse
        ATE (dia>=1) e (dia<=31) e (mes>=1) e (mes<=12) e (ano>=1900)

        ENQUANTO ((mes=2) e (ano mod 4=0) e (dia>29)) ou ((mes=2) e (ano mod 4<>0) e (dia>28)) faca
           se (mes=2) então
             se (ano mod 4<>0) e (dia>28) então
               escreva(" Dia inválido, insira novamente: ")
               leia(dia)
               senao
                 se  (ano mod 4=0) e (dia>29) então
                   escreva(" Dia inválido, insira novamente: ")
                   leia(dia)
                 fimse
             fimse
           fimse
        fimenquanto
        
        ENQUANTO ((mes=4) ou (mes=6) ou (mes=9) ou (mes=11)) e (dia>30) faca
                 se (mes=4) e (dia>30) então
                   escreva(" Dia inválido, insira novamente: ")
                   leia(dia)
                 fimse
                 se (mes=6) e (dia>30) então
                   escreva(" Dia inválido, insira novamente: ")
                   leia(dia)
                 fimse
                 se (mes=9) e (dia>30) então
                   escreva(" Dia inválido, insira novamente: ")
                   leia(dia)
                 fimse
                 se (mes=11) e (dia>30) então
                   escreva(" Dia inválido, insira novamente: ")
                   leia(dia)
                 fimse
        fimenquanto
         escreval
       //b) média de idade dos alunos
            se (dia>15) e (mes>4) então
                idade:=2018-ano-1
                senao
                  idade:=2018-ano
            fimse
            mediaid:=mediaid+idade
       
       //g) percentual de pessoas que nasceram em ano BISSEXTO
            se (ano mod 4=0) então
              pessoasG:=pessoasG+1
            fimse
            
       //h) quantidade de pessoas que nasceram em dias PRIMO
             para contH de 1 ate dia faca
               se (dia mod contH=0) então
                 apoioH:=apoioH+1
               fimse
             fimpara
             se (apoioH=2) então
               pessoasH:=pessoasH+1
             fimse
            
// Sexo ------------------------------------------------------------------------
         repita
           escreva (" 3. Sexo (F/M/O): ")
           leia(sexo)
           escolha sexo
             caso "M"
             caso "F"
             caso "O"
             outrocaso
               escreval("Informe um sexo válido.")
           fimescolha
         ate (sexo="F") ou (sexo="M") ou (sexo="O")
           escreval

        //a)Percentual de alunos do sexo feminino
           SE (sexo="F") então
             mulheres:=mulheres+1
           fimse
       
// Signo -----------------------------------------------------------------------
           se (dia>=21) e (dia<=31) e (mes=3) ou (dia>=1) e (dia<=19) e (mes=4) então
             signo:="Áries"
             aries:=aries+1
             senao
              se (dia>=20) e (dia<=30) e (mes=4) ou (dia>=1) e (dia<=20) e (mes=5) então
                signo:="Touro"
                touro:=touro+1
                senao
                  se (dia>=21) e (dia<=31) e (mes=5) ou (dia>=1) e (dia<=21) e (mes=6) então
                    signo:="Gêmeos"
                    gemeos:=gemeos+1
                    senao
                      se (dia>=22) e (dia<=30) e (mes=6) ou (dia>=1) e (dia<=22) e (mes=7) então
                        signo:="Câncer"
                        cancer:=cancer+1
                        senao
                          se (dia>=23) e (dia<=31) e (mes=7) ou (dia>=1) e (dia<=22) e (mes=8) então
                            signo:="Leão"
                            leao:=leao+1
                            senao
                              se (dia>=23) e (dia<=31) e (mes=8) ou (dia>=1) e (dia<=22) e (mes=9) então
                                signo:="Virgem"
                                virgem:=virgem+1
                                senao
                                  se (dia>=23) e (dia<=30) e (mes=9) ou (dia>=1) e (dia<=22) e (mes=10) então
                                    signo:="Libra"
                                    libra:=libra+1
                                    senao
                                      se (dia>=23) e (dia<=31) e (mes=10) ou (dia>=1) e (dia<=21) e (mes=11) então
                                        signo:="Escorpião"
                                        escorpiao:=escorpiao+1
                                        senao
                                          se (dia>=22) e (dia<=30) e (mes=11) ou (dia>=1) e (dia<=21) e (mes=12) então
                                            signo:="Sagitário"
                                            sagitario:=sagitario+1
                                            senao
                                              se (dia>=22) e (dia<=31) e (mes=12) ou (dia>=1) e (dia<=19) e (mes=1) então
                                                signo:="Capricórnio"
                                                capricornio:=capricornio+1
                                                senao
                                                  se (dia>=20) e (dia<=31) e (mes=1) ou (dia>=1) e (dia<=18) e (mes=2) então
                                                    signo:="Aquário"
                                                    aquario:=aquario+1
                                                    senao
                                                      se (dia>=19) e (dia<=29) e (mes=2) ou (dia>=1) e (dia<=20) e (mes=3) então
                                                        signo:="Peixes"
                                                        peixes:=peixes+1

                                                      fimse
                                                  fimse
                                              fimse
                                          fimse
                                      fimse
                                  fimse
                              fimse
                          fimse
                      fimse
                  fimse
              fimse
           fimse
           escreval(" 4. Signo: ",signo)
           escreval

// Altura ----------------------------------------------------------------------
           escreva(" 5. Altura(m): ")
           leia(altura)
          REPITA
           se (altura<=0) então
             escreva(" Altura inválida, insira novamente: ")
             leia(altura)
           fimse
          ATE (altura>0)
           escreval
           
       // d) quantidade de pessoas do signo de GEMEOS abaixo de 1,75m de altura
          se (signo="Gêmeos") e (altura<1.75) então
            pessoasD:=pessoasD+1
          fimse

       // e) nome e altura da pessoa mais baixa
          se (altura<alturamenor) então
            alturamenor:=altura
            nomeAmenor:=nome
          fimse
       
// Peso ------------------------------------------------------------------------
           escreva(" 6. Peso: ")
           leia(peso)
           repita
             se (peso<=0) então
               escreva(" Peso inválido, insira novamente: ")
               leia(peso)
             fimse
           ate (peso>0)

        //c) nome e peso da pessoa mais pesada do sexo masculino
           se (sexo="M") e (peso>pesomaior) então
             pesomaior:=peso
             nomepmaior:=nome
           fimse
           
        // f) média aritmética de peso de todos os alunos entrevistados
              mediapeso:=mediapeso+peso

//------------------------------------------------------------------------------
        limpatela
      fimpara
// Respostas -------------------------------------------------------------------



   escreval("|-------------------- RESULTADOS --------------------|")
   escreval
   escreval("  a) Percentual de alunos do sexo feminino: ",(10*mulheres)/4,"%;")
   escreval("  b) Média de idade dos alunos: ",mediaid/40," anos;")
   escreval("  c) Nome e peso da pessoa mais pesada do sexo masculino: ",nomepmaior," pesa",pesomaior," kg;")
   escreval("  d) Quantidade de pessoas do signo de gêmeos abaixo de 1,75m de altura: ",pessoasD," ;")
   escreval("  e) Nome e altura da pessoa mais baixa: ",nomeAmenor," mede",alturamenor," m;")
   escreval("  f) Média aritmética de peso de todos os alunos entrevistados: ",mediapeso/40," kg;")
   escreval("  g) Percentual de pessoas que nasceram em ano BISSEXTO: ",(10*pessoasG)/4,"%;")
   escreval("  h) Quantidade de pessoas que nasceram em dias PRIMO: ",pessoasH,";")
   escreval("  j) Quantidade de alunos por signo: ")
   escreval("     -Áries: ",aries)
   escreval("     -Touro: ",touro)
   escreval("     -Gêmeos: ",gemeos)
   escreval("     -Câncer: ",cancer)
   escreval("     -Leão: ",leao)
   escreval("     -Virgem: ",virgem)
   escreval("     -Libra: ",libra)
   escreval("     -Escorpião: ",escorpiao)
   escreval("     -Sagitário: ",sagitario)
   escreval("     -Capricórnio: ",capricornio)
   escreval("     -Aquário: ",aquario)
   escreval("     -Peixes: ",peixes)
   
fimalgoritmo

 

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

  • Membro VIP

Olá @everton.carniato.

 

Muito bacana. Parece-me que está funcionando bem... talvez alguns pequenos ajustes, como limitar o ano máximo de nascimento, ou seja, foi estipulando "a partir de 1900", mas não verifica se informar, por exemplo, 2020 ("homem do futuro?").

 

Não fiz testes nem verificações mais profundas... mas de um modo geral me parece bom mesmo.

 

Então, esses dias descobrir um recurso que pode ser muito interessante para esse programa: O USO DE LISTAS PARA AUTOPREENCHIMENTO DOS DADOS, ou seja, é possível fazer que o Visualg gere os dados, a partir de uma lista, e vá alimentando o programa sozinho. Vai simular um usuário digitando os dados... ou seja, preencherá os leia() automaticamente. :tw_glasses:

 

É simples. Bastar criar a lista, lá em MANUTENÇÃO/CONFIGURAÇÕES, ai vai na guia LISTAS. Cria uma lista nova, por exemplo, NOMES FEMININOS e insere uma relação de nomes. Ex.:

 

Lista de nomes femininos:

Spoiler

Alice
Sophia
Helena
Valentina
Laura
Isabella
Manuela
Júlia
Heloísa
Luiza
Maria Luiza
Lorena
Lívia
Giovanna
Maria Eduarda
Beatriz
Maria Clara
Cecília
Eloá
Lara
Maria Júlia
Isadora
Mariana
Emanuelly
Ana Júlia
Ana Luiza
Ana Clara
Melissa
Yasmin
Maria Alice
Isabelly
Lavínia
Esther
Sarah
Elisa
Antonella
Rafaela
Maria Cecília
Liz
Marina
Nicole
Maitê
Isis
Alícia
Luna
Rebeca
Agatha
Letícia
Maria-
Gabriela
Ana Laura
Catarina
Clara
Ana Beatriz
Vitória
Olívia
Maria Fernanda
Emilly
Maria Valentina
Milena
Maria Helena
Bianca
Larissa
Mirella
Maria Flor
Allana
Ana Sophia
Clarice
Pietra
Maria Vitória
Maya
Laís
Ayla
Ana Lívia
Eduarda
Mariah
Stella
Ana
Gabrielly
Sophie
Carolina
Maria Laura
Maria Heloísa
Maria Sophia
Fernanda
Malu
Analu
Amanda
Aurora
Maria Isis
Louise
Heloise
Ana Vitória
Ana Cecília
Ana Liz

 

Pronto, ai no programa, basta fazer algo assim:

   escreval("|-------------------- FICHA DE INFORMAÇÕES --------------------|")
   escreval(" Preencha os campos abaixo:")
   // Nome ------------------------------------------------------------------------
   escreva (" 1. Nome do aluno: ")
   ALEATORIO ON //aqui ativa o recurso de "auto preencher o leia()
   lista "NOMES FEMININOS" //aqui defino "com o que os leia() serão preenchidos
   leia(nome) //<-- como está dentro do ALEATORIO ON, vai ser preenchido automaticamente!!! Como uma mágica!!
   ALEATORIO OFF //aqui desabilita o recurso. Tudo volta como era antes.

 

Pronto!!!

 

 

ALGUMAS DICAS:

1#

- Em relação a esse recurso de "auto-preencher", renomeie o arquivo "lista.txt", caso exista, lá na raiz da pasta do Visualg. De "lista.txt" para "lista_original.txt" (não perder as listas originais ou anterior)

- Abra (ou reabra) o Visualg, verás que não terá listas cadastradas... ai cria uma nova. Automaticamente será criado um novo arquivo "lista.txt". Cria uma lista de "NOMES FEMININOS" e outra de "NOMES MASCULINOS".

- Como o programa também precisa saber o sexo, faria um sorteio para qual lista vai sortear (ex.: 0 para "feminino", 1 para "masculino"). De acordo com o sorteado, usaria a lista correspondente, ao mesmo tempo que "setaria" o sexo. Entende?

obs.: sugerir inicialmente testar só com uma lista... depois de dominar o recurso, implementa o sorteio do sexo.

 

 

2#

Para sortear números não precisa de listas... pois dá para estipular números diretamente no próprio ALEATÓRIO (vide Google). Eu acho que não gerar números reais, mas daria para criar um "sub-algoritmo" para sortear, por exemplo, de 50 a 99, transformar em parte decimal e somar 1. (sorteou 75, transformo em 0,75, adiciono 1. Dá 1.75... tenho uma altura sorteado ;))   OU  cria uma lista de alturas... com alguns repetidos ou mais de uma faixa, aumentando a probabilidade de um grupo de alturas... etc

 

 

3#

Na hora de apresentar o programa, você levaria as duas versões... ou seja, uma tradicional, onde é necessário digitar dado por dado, e outra com autopreenchimento completo... ai, copiava o arquivo "lista.txt" e orientaria a substituir lá na pasta do Visualg, sacou? Não tem erro.

 

4#

Esse uso da listas é bem bacana, a depender poderia até ser sugerir ao professor explicar como funciona... ou seja, após entender (que é bem simples), num exercício da vida vida, ele forneceria o arquivo "lista.txt" e daria a opção dos alunos utilizar ela. (para o aluno, iria só colocar a lista na pasta do Visual, e configuraria cada leia() com o nome da lista correspondente). Fica a ia sugestão.

 

 

***

 

No aguardo.

 

 

 

 

 

E por ai vai.

 

No aguardo.

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

  • Membro VIP
40 minutos atrás, everton.carniato disse:

Opa, obrigado pelas dicas!! Irei estudar mais afundo e realizar testes com a dica da lista. 

Não tem mistério.

 

- Cria a lista;

- Usa a lista lá no aleatório. (ou seja, o ALEATORIO vai "sortear" um dos dados da lista informada e jogar no leia())

 

Tente fazer testes simples... ai vai aprimorando...

  • Curtir 1
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...