M02 Exercício 17

Home Fóruns Programação Básica M02 Exercício 17

Visualizando 8 respostas da discussão
  • Autor
    Posts
    • #68949
      Arthur Coimbra
      Participante

      Boa noite, a questão pede para desenvolver um código capaz de diferir um ano bissexto e anos não bissextos. O código do professor foi este:

      programa
      {
      	
      	funcao inicio()
      	{
      		inteiro ano
      		
      		escreva("Digite um ano qualquer: ")
      		leia(ano)
      
      		se (ano % 4 == 0 e ano % 100 != 0 ou ano % 400 == 0){
      			escreva("O ano é bissexto.")
      		} senao {
      			escreva("O ano não é bissexto")
      		}
      	}
      	
      }

      —————————————————————–
      E o meu código foi:

      programa
      {
      	
      	funcao inicio()
      	{
      		inteiro ano
      		
      		escreva("Digite um ano qualquer: ")
      		leia(ano)
      
      		se (((ano % 4) == 0) e (((ano % 100) == 0) e (ano % 400) == 0)){
      			escreva("O ano é bissexto.")
      		} senao {
      			escreva("O ano não é bissexto")
      		}
      	}
      	
      }

      ————————————————–
      Ambos rodando, a principio eu achei que tinha feito alguma besteira e o meu estava errado, mas ao me deparar com resultados corretos mudei de ideia. Decidi então realizar uma comparação lógica entre a afirmação do professor e a minha, assim:

      (((ano % 4) == 0) e (((ano % 100) == 0) e (ano % 400) == 0)) <strong>==</strong> (ano % 4 == 0 e ano % 100 != 0 ou ano % 400 == 0)

      Usando esse código:

      programa
      {
      	inclua biblioteca Matematica
      	
      	funcao inicio()
      	{
      		inteiro ano = 0
      		logico igual = (((ano % 4) == 0) e (((ano % 100) == 0) e (ano % 400) == 0)) == (ano % 4 == 0 e ano % 100 != 0 ou ano % 400 == 0)
      
      		enquanto (ano <10000)
      		{
      		escreva(igual + " " + ano +"\n")
      		ano++
      		}
      	}
      }

      ———————————————————–
      Para minha surpresa o resultado é true para todos os valores de 0 a 10.000 da variável ano, o que indica pra mim que as “afirmações” lógicas são equivalentes.
      Minha duvida então é:
      1- As afirmações lógicas são realmente equivalentes e portanto meu código (assim como o do professor) está certo, ou tudo que eu fiz/disse não fez sentido?
      2- Caso realmente esteja certo seria possível me ajudar a montar uma tabela verdade que mostre de uma forma mais palpável como essa equivalência está acontecendo? Eu paguei uma cadeira de lógica na faculdade porém não lembro/domino suficientemente o assunto para desenvolve-la sozinho.

      • Este tópico foi modificado 2 anos, 10 meses atrás por IcaroFilho. Motivo: formatação de codigo
    • #68980
      IcaroFilho
      Moderador

      Arthur, Bom dia.
      Não entendi muito bem com quais anos fez o teste.
      Peguei os anos bissextos de 1998 a 2020 (1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020), e com todos os anos o resultado foi o mesmo.
      Seu programa: O ano não é bissexto
      Guanabara: O ano é bissexto

      Isto porque existe 2 falhas em sua logica.

      • Primeiro parte da premissa de que todo múltiplo de 100 é bissexto (ano % 100 == 0)
        Sendo que os múltiplos de 100 não serão bissextos a menos que seja múltiplo de 400.
      • Segundo que vc afirma que para ser bissexto, ele tem que ser múltiplo de 400 (atraves do operador logico e).
        Sendo assim você esta eliminando todos os anos múltiplos de 4 que não são múltiplos de 400.
      • Uso de parênteses desnecessariamente (no caso isto não gera o erro, mas polui o código)

      Quanto ao seu teste comparativo:
      Faça o seguinte. Faça um teste de mesa isolado. (simplesmente retire o laço e atribua um ano bissexto e um normal).

      programa{
      	inclua biblioteca Matematica
      	funcao inicio()	{
      		inteiro ano = 2000
      		logico igual
      		igual = (((ano % 4) == 0) e (((ano % 100) == 0) e (ano % 400) == 0)) == (ano % 4 == 0 e ano % 100 != 0 ou ano % 400 == 0)
      		escreva(igual)
      }}

      Verá que irá dar 2 resultados diferentes (verdadeiro para os anos múltiplos de 400 e falso para o resto)

      Mas pq então estou vendo todos os retornos TRUE ?
      Simples, o teste esta sendo realizando apenas um vez, pois ele esta fora do laço de repetição.
      Ou seja, ele so é testado uma vez com o valor 0 e depois vc cria um laço pra escrever o resultado logico e o ano sendo incrementado.
      Então, para corrigir seu teste basta colocar a expressão dentro do laço:

      inteiro ano = 0
      logico igual
      enquanto (ano <10000) {
          igual = (((ano % 4) == 0) e (((ano % 100) == 0) e (ano % 400) == 0)) == (ano % 4 == 0 e ano % 100 != 0 ou ano % 400 == 0)
          escreva(igual + " " + ano +"\n")
          ano++
      }

      Espero ter ajudado,
      Bons estudos !!

    • #76104

      Oi Estou com um problema parecido, mas nem tanto com o colega. Assim pelo que entendi para ser um ano bissexto ele tem que ser divisível por 4 e dar resto zero, divisível por 100 e não dar resto zero e também ser divisível por 400 e dar resto zero. Ou seja:

      se(ano_qualquer%4==0 e ano_qualquer% 100 !=0 e ano_qualquer%400==0)
      

      Note que aqui eu boto a expressão “e”! E o professor botou diferente do meu raciocínio. Botou assim “ou” no fim:

      se(ano_qualquer%4==0 e ano_qualquer% 100 !=0 ou ano_qualquer%400==0)

      Eu acho que o correto é usar 2 “es” e não um “e” e um “ou”. Porque o que eu quero é uma condição que tudo seja verdade onde um for falso torna tudo falso. Pelo menos é isso que entendi.

      Obrigado, desde já!

    • #76117

      Eu tentei criar um algoritmo para responder a minha pergunta: quem está correto eu ou o professor (quero deixar claro que não estou fazendo pouco caso do professor e não quero ser desrespeitoso). Mas não deu muito certo:

      
      programa
      {
      	/*
      	 Como determinar se um ano é bissexto
      Para determinar se um ano é bissexto, execute estas etapas:
      
      1-Se o ano for uniformemente divisível por 4, vá para a etapa 2. Caso contrário, vá para a etapa 5.
      2-Se o ano for uniformemente divisível por 100, vá para a etapa 3. Caso contrário, vá para a etapa 4.
      3-Se o ano for uniformemente divisível por 400, vá para a etapa 4. Caso contrário, vá para a etapa 5.
      4-O ano é bissexto (tem 366 dias).
      5-O ano não é um ano bissexto (tem 365 dias).
      
      FONTE: docs.microsoft.com/pt-br/office/troubleshoot/excel/determine-a-leap-year
      	 */
      	funcao inicio()
      	{
      	inteiro ano_qualquer
      	logico premissa1,premissa2,premissa3
      	cadeia premissa4,premissa5
      		escreva("Digite um ano qualquer: ")
      		leia(ano_qualquer)
      
                    premissa1 =  ano_qualquer%4==0
                    premissa2 = ano_qualquer % 100 !=0
                    premissa3 = ano_qualquer%400==0
                    premissa4 = " É ANO BISSEXTO!"
                    premissa5 = "NÃO É ANO BISSEXTO!"
      
                    se(premissa1 == verdadeiro e premissa2 == verdadeiro e premissa3 == verdadeiro)
                         escreva("O Samuel está correto")
                    se(premissa1 == verdadeiro e premissa2 == verdadeiro ou premissa3 == verdadeiro)
                         escreva("O professor está correto")
                    
      	}
      }
    • #76386
      Tutora Mayla
      Mestre

      Luiz, primeiramente vamos relembrar a regra para dizer se um ano é bissexto. Se o ano for divisível por 4 mas não for divisível por 100, ele é bissexto; se o ano for divisível por 400, ele é bissexto.

      Ao utilizarmos dois e como no seu código ano_qualquer%4==0 e ano_qualquer% 100 !=0 e ano_qualquer%400==0 estamos dizendo que um ano é bissexto quando ele satisfaz todas as 3 condições ao mesmo tempo. Isto é, ele é divisível por 4; ele não é divisível por 100; e ele é divisível por 400. Porém isto não reflete a regra correta para dizer se um ano é bissexto. Para ver melhor, vamos testar isto com o ano de 2020.

      1. 2020 % 4 == 0 é Verdadeiro. 2020 é divisível por 4
      2. 2020 % 100 != 0 é Verdadeiro. 2020 não é divisível por 100
      3. 2020 % 400 == 0 é Falso. 2020 não é divisível por 400

      E como para o e ser Verdadeiro, é necessário que todas as condições sejam verdadeiras, aqui irá retornar Falso significando que 2020 não é um ano bissexto.

      Agora vamos analisar a outra lógica ano_qualquer%4==0 e ano_qualquer% 100 !=0 ou ano_qualquer%400==0. Aqui dizemos que um ano é bissexto quando ele é divisível por 4 ao mesmo tempo que não é divisível por 100, ou quando é divisível por 400. Vamos testar com o ano de 2020.

      1. 2020 % 4 == 0 é Verdadeiro. 2020 é divisível por 4
      2. 2020 % 100 != 0 é Verdadeiro. 2020 não é divisível por 100
      3. 2020 % 400 == 0 é Falso. 2020 não é divisível por 400

      Temos agora Verdadeiro e Verdadeiro ou Falso, sabendo que o e tem precedência sobre o ou teremos Verdadeiro ou Falso, e isto resultará em Verdadeiro indicando que 2020 é bissexto, que é o correto.

      Espero ter ajudado, quaisquer outras dúvidas basta entrar em contato.

    • #95643

      FIZ NESSA LÓGICA, TAVA DANDO ERRADO AI COLOQUEI OUTRO SE, AI FUI VER EU TAVA COLOCADNO / INVÉS DE %

      programa
      { //EXERCICIO 017 – ANO BISSEXTO

      funcao inicio()
      {
      inteiro ano
      escreva(“Digite um ano qualquer: “)
      leia(ano)
      se (ano%4==0 e ano%100!=0 ou ano%400==0){
      escreva(“O ano “+ ano +(” É BISSEXTO”))
      }
      senao {
      escreva(“O ano “+ ano +” NÃO É BISSEXTO”)
      }
      }
      }`

    • #95653

      programa
      {
      //EXERCÍCIO 019 – INVERSO OU OPOSTO

      inclua biblioteca Matematica
      inclua biblioteca Tipos
      funcao inicio()
      {
      real n,nv
      escreva(“===================”)
      escreva(” Digite um numero: “)
      escreva(“===================”)
      escreva(” \nCAMPO DE DIGITO : “)
      leia(n)
      se (n > 0){
      nv = 1/n
      escreva(“\nO inverso de “+ n +” é igual a “+ nv)
      } senao {
      nv = Matematica.valor_absoluto(n)
      escreva(“\nO oposto de “+ n +” é “+ nv)
      }

      }
      }
      `

      • #95844
        IcaroFilho
        Moderador

        Bom dia. possui duvida nesse exercício ?
        Outra coisa, evite postar os exercícios fora de seus tópicos.
        Não tem como alguém com duvida no exercício 19 achar esta sua postagem que esta dentro do tópico do exercício 17.

    • #73889

      Gostaria de esclarecer algo sobre o exercício 17..

      eu fiz desta formna:

      se (((ano%4==0 ou ano%400==0) e ano%100!=0) ou (ano%100==0 e ano%400==0)) {
      			escreva(" É BISSEXTO!")
      		} senao {
      			escreva(" NÂO É BISSEXTO!")
      		}

      e usei estes sites para aprender o que era um ano bissexto e compreender o calculo:

      https://escolakids.uol.com.br/matematica/calculo-do-ano-bissexto.htm
      https://pt.wikihow.com/Descobrir-se-um-Ano-%C3%A9-Bissexto

      minha forma ficou bem parecida com a do professor, com excessão de que ficou maior..
      minha pergunta é: desse jeito ficou bom, tendo como base o sistes que me informei? essas linhas a mais são realmente desnecessárias?

    • #96223
      Tutora Jessica
      Moderador

      Olá Lucas, nos desculpe pela demora, por algum motivo a sua dúvida apareceu para aprovação recentemente.
      Seu código esta correto dessa forma, e parabéns por buscar alternativas e novos formatos de entender melhor quando esta com dúvidas!!
      Você também pode diminuir o seu código como no exemplo do moderador Ícaro colocou acima, fica ao seu critério, as duas formas são válidas.
      Continue assim que você vai longe e precisando só chamar no fórum, beleza?
      Bons estudos 🖖

Visualizando 8 respostas da discussão
  • Você deve fazer login para responder a este tópico.