Validação de Data com ano bissexto! Dúvidas

11 respostas Resolvido
visualg
D

Olá pessoal, sou inciante, coisa de Meses estudando… estou aprendendo só…
estou com dificuldade para criar um algoritmo no Visualg que valide datas levando em consideração o ano bissexto.

algoritmo "bissexto"
var
dia, mes,  ano : inteiro

inicio
// Seção de Comandos
   escreval(ano, "Digite um dia, mês e ano:  ")
   leia(dia, mes, ano)
      se (ano mod 400 = 0) ou ((ano mod 4 = 0) e (ano mod 100 <> 0))  entao
     se ( mes = 02 ) e ( dia > 29 ) entao
escreval( data inválida)

   fimse 
fimse
   
fimalgoritmo

Esse é o problema… já fiz de várias formas e não da certo…

11 Respostas

L

Todo ano bissexto, é múltiplo de 4, exemplo:

2000, 2004, 2008,2012, 2016, 2020
D

(ano mod 4 = 0) será um ano bissexto ??

o problema é como validar a data com esse resultado…

Obrigado pela ajuda!

L

Qual o problema?
Construir um algoritmo é ordenar tuas ideias a respeito de como resolver um problema.
Note, com o que eu falei, você já resolve uma boa parte da validação, para checar se é ou não bissexto

se (ano mod 4 = 0) entao
    //Aqui você aplica a lógica que quiser
senao
D

Chegou onde eu queria…
essa é lágica… pelo menos a minha kkkkkkk
se (mes = 2) e (dia > 28) ou (dia > 29) entao
escreva(“Data inválida!”)
senao
escreva(“Data válida!”)

só não dá certo…

já fiz assim também…

se ((mes = 2) e (dia > 28)) ou ((mes = 2) e (ano mod 400 = 0) e (ano mod 4 = 0) e (ano mod 100 <> 0) e (dia > 29)) entao
escreva(“Data inválida!”)
senao
escreva(“Data válida!”)

e não dá certo…
Travei Luiz e não sei como sair… por isso vim aqui…

L

Cara, “não dá certo” é algo muito abrangente.
1 - Você digita algo como 30, 2, 2016 e o visualg imprime “Data válida”?
2 - Aparece alguma mensagem de erro?

D

Não aparece mensagem de erro não… mas de lógica não funciona mesmo… :sweat:

Olha o primeiro código completo

var
dia, mes, ano: inteiro

inicio
escreval(“Digite o dia, mês e ano de uma data qualquer”)
leia(dia, mes, ano)
se (mes < 1) ou (mes > 12) ou (dia < 1) ou (dia > 31) ou (ano < 0) entao
escreva(“Data inválida!”)
senao
se ((mes = 4) ou (mes = 6) ou (mes = 9) ou (mes = 11)) e (dia > 30) entao
escreva(“Data inválida!”)
senao
se ((mes = 2) e (dia > 28)) ou ((mes = 2) e (ano mod 400 = 0) e (ano mod 4 = 0) e (ano mod 100 <> 0) e (dia > 29)) entao
escreva(“Data inválida!”)
senao
escreva(“Data válida!”)
fimse
fimse
fimse

fimalgoritmo

Mas não dá certo… se eu digitar 29 02 2016 dá inválida…

Por isso que o povo fala que é difícil… Acho que preciso estudar mais pra entender da lógica…

L
Solucao aceita

Talvez tenha faltado refinar um pouco mais

Algoritmo "semnome"
// Disciplina  :  [Linguagem e Lógica de Programação] 
// Professor   : Antonio Carlos Nicolodi 
// Descrição   : Aqui você descreve o que o programa faz! (função)
// Autor(a)    : Nome do(a) aluno(a)
// Data atual  : 10/04/2017
Var
// Seção de Declarações das variáveis 
dia, mes, ano: inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc... 
escreval("Digite o dia, mês e ano de uma data qualquer")
leia(dia, mes, ano)
se (mes < 1) ou (mes > 12) ou (dia < 1) ou (dia > 31) ou (ano < 0) entao
   escreva("Data inválida!")
senao
     se ((mes = 4) ou (mes = 6) ou (mes = 9) ou (mes = 11)) e (dia > 30) entao
        escreva("Data inválida!")
     senao
          se (ano mod 4 = 0) entao
             se (mes = 2) e (dia > 29) entao
                escreva("Data inválida!")
             senao
                  escreva("Data válida!")
             fimse
          senao
              se (mes = 2) e (dia > 28) entao
                 escreva("Data inválida!")
              senao
                   escreva("Data válida!")
              fimse
          fimse
     fimse
fimse

Fimalgoritmo
D

Muito bom…

pelo que entendi, eu estava misturando demais…

se (ano mod 4 = 0) entao
se (mes = 2) e (dia > 29) entao
escreva(“Data inválida!”)
senao
escreva(“Data válida!”)
fimse
senao
se (mes = 2) e (dia > 28) entao
escreva(“Data inválida!”)
senao
escreva(“Data válida!”)
fimse


Estava querendo fazer isso tudo em (se, então, senão)…
e vc fez, (se, então, se, então, senão fimse; se, então, senão, fimse)…
ou seja você explicou melhor o que você queria ao computador…

é isso? vendo esse meu erro, o que recomenta estudar?

Obs.: Obrigado mesmo, pela ajuda!! vou imprimir os dois códigos, o meu e o seu e estudar…

L

Na verdade, é fácil se perder quando se tenta validar muitas coisas juntas (eu também tive problemas com isso).
Aí resolvi desmembrar.

D

É verdade, eu particularmente não estava entendo, nem vendo os erros…
e você resolveu rapidinho quando eu mandei o código… sou grato pela atenção!

Desmembrar? é algum termo da programação?

D

Mas 1900 não é bissexto mas é múltiplo de 4

Criado 10 de abril de 2017
Ultima resposta 23 de abr. de 2021
Respostas 11
Participantes 3