Home › Fóruns › Programação Básica › M02 Exercício 17
- Este tópico contém 11 respostas, 8 vozes e foi atualizado pela última vez 3 meses, 2 semanas atrás por Tutora Jessica.
-
AutorPosts
-
-
8 de junho de 2021 às 23:05 #68949Arthur CoimbraParticipante
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 3 anos, 5 meses atrás por IcaroFilho. Motivo: formatação de codigo
-
9 de junho de 2021 às 09:25 #68980IcaroFilhoModerador
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 !! - Primeiro parte da premissa de que todo múltiplo de 100 é bissexto (ano % 100 == 0)
-
24 de setembro de 2021 às 08:28 #76104Luiz Samuel Santos SilvaMembro
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á!
-
24 de setembro de 2021 às 10:42 #76117Luiz Samuel Santos SilvaMembro
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") } }
-
27 de setembro de 2021 às 22:36 #76386Tutora MaylaMestre
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ódigoano_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.2020 % 4 == 0
é Verdadeiro. 2020 é divisível por 42020 % 100 != 0
é Verdadeiro. 2020 não é divisível por 1002020 % 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.2020 % 4 == 0
é Verdadeiro. 2020 é divisível por 42020 % 100 != 0
é Verdadeiro. 2020 não é divisível por 1002020 % 400 == 0
é Falso. 2020 não é divisível por 400
Temos agora
Verdadeiro e Verdadeiro ou Falso
, sabendo que oe
tem precedência sobre oou
teremosVerdadeiro 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.
-
15 de junho de 2022 às 10:06 #95643Matheus Vidal TenórioParticipante
FIZ NESSA LÓGICA, TAVA DANDO ERRADO AI COLOQUEI OUTRO SE, AI FUI VER EU TAVA COLOCADNO / INVÉS DE %
programa
{ //EXERCICIO 017 – ANO BISSEXTOfuncao 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”)
}
}
}` -
15 de junho de 2022 às 12:01 #95653Matheus Vidal TenórioParticipante
programa
{
//EXERCÍCIO 019 – INVERSO OU OPOSTOinclua 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)
}}
}
`-
17 de junho de 2022 às 09:59 #95844IcaroFilhoModerador
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.
-
-
23 de junho de 2022 às 10:39 #73889Lucas Maciel FranciscoParticipante
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-Bissextominha 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? -
23 de junho de 2022 às 13:04 #96223Tutora JessicaModerador
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 🖖 -
5 de agosto de 2024 às 12:36 #141091kauã rafaelParticipante
pessoal, eu percebi que para o ano ser bissexto ele tem que ser divisivel por 4 e dar um numero inteiro ai tentei expressar isso em linha de codigo só que ta dando erro
programa
{inclua biblioteca Matematica
inclua biblioteca Texto
funcao inicio()
{
inteiro A
real D
escreva(“Digite um ano qualquer: “)
leia(A)D = A/4
se (D == inteiro) {
escreva(“O ano “+ D + ” É BISSEXTO!”)
} senao {
escreva (“o ano ” + D + ” Não é bissexto!”)
}}
} -
5 de agosto de 2024 às 13:54 #141098Tutora JessicaModerador
Olá Kaua, trouxe sua dúvida para uma já existente no fórum, acima você encontra uma ótima explicação do Ícaro , dê uma olhada e caso não consiga resolver retorne ao fórum que vamos tentar lhe ajudar melhor. 🖖🏼
-
-
AutorPosts
- Você deve fazer login para responder a este tópico.