Evolution Posted December 3, 2012 at 10:16 PM Report #485620 Posted December 3, 2012 at 10:16 PM Boa noite. Estou com uma duvida na resolução do seguinte exercício: Faça um Programa que peça para entrar com um ano com 4 dígitos e determine se omesmo é ou não bissexto. Eu não sei mesmo como resolver este exercício. 😕
nunopicado Posted December 3, 2012 at 10:20 PM Report #485623 Posted December 3, 2012 at 10:20 PM Mais especificamente, não sabes calcular se um ano é bissexto ou não, não é assim? 🙂 Um ano bissexto como sabes, ocorre a cada 4 anos. Isto significa que tens aqui uma maneira simples de saber. Se dividires o ano por 4, numa divisão inteira, só podes ter 4 opções para o resto da divisão: 0, 1, 2 ou 3 Ora, se o ano ocorre a cada 4, dividindo o ano por 4 o resto deverá ser 0. Assim, basta-te ler o ano, e proceder ao calculo do resto de divisão inteira (operador MOD), e verificar se o resultado é 0. Se for, é bissexto. Se não for, é comum. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted December 3, 2012 at 10:33 PM Report #485626 Posted December 3, 2012 at 10:33 PM Incompleto, meu caro @nuno 😉 Um ano é bissexto se for divisível por 4 e, se for divisível por 400 ou não divisível por 100. Knowledge is free!
nunopicado Posted December 3, 2012 at 10:40 PM Report #485631 Posted December 3, 2012 at 10:40 PM hehhehe Essa não me lembrei! Mas já agora, convém então ter em atenção ao desfasamento de 1 dia que ocorrerá no ano 4882. Mas este podemos deixar para os entendidos da altura, que apelidarão isto de "O Novo Bug do Milénio!" 😉 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Evolution Posted December 3, 2012 at 10:59 PM Author Report #485635 Posted December 3, 2012 at 10:59 PM Obrigado aos dois pela ajuda, já esta mais um exercício resolvido.
thoga31 Posted December 3, 2012 at 11:15 PM Report #485640 Posted December 3, 2012 at 11:15 PM Obrigado aos dois pela ajuda, já esta mais um exercício resolvido. Podemos ver a tua implementação em código? 🙂 Knowledge is free!
Evolution Posted December 4, 2012 at 04:28 PM Author Report #485695 Posted December 4, 2012 at 04:28 PM (edited) Claro, aqui está. Program Bissexto ; Var ano, bi : Integer; Begin write ('Digite um ano: '); readln (ano); bi := ano mod 4; if bi = 0 then writeln ('Bissexto.') else writeln ('Não Bissexto'); readln; End. Edited December 4, 2012 at 05:07 PM by thoga31 GeSHi
thoga31 Posted December 4, 2012 at 05:07 PM Report #485709 Posted December 4, 2012 at 05:07 PM Em suma: gastei o meu teclado para nada. Knowledge is free!
pwseo Posted December 4, 2012 at 06:06 PM Report #485723 Posted December 4, 2012 at 06:06 PM Evolution, Se leres a thread com mais atenção repararás que o teu código possui uma solução incompleta. Relê o que o thoga31 disse sobre os anos bissextos -- não basta verificar se é divisível por 4.
Evolution Posted December 4, 2012 at 06:55 PM Author Report #485734 Posted December 4, 2012 at 06:55 PM Bem já não estou a perceber nada. Então tenho que dividir duas vezes o ano?
thoga31 Posted December 4, 2012 at 07:41 PM Report #485742 Posted December 4, 2012 at 07:41 PM Bem já não estou a perceber nada. Então tenho que dividir duas vezes o ano? Dividir o ano duas vezes? Não entendi... Aquilo que eu disse foi muito simples: Um ano é bissexto se for divisível por 4 e, se for divisível por 400 ou não divisível por 100. Esta é a regra para determinar se um ano é bissexto ou não. Tens de ver três coisas em conjunto: a) se é divisível por 4 e, b) se é divisível por 400 ou c) divisível por 100. E aqui muito cuidado com os e's e ou's, não os apliquei assim só porque achei engraçado. Knowledge is free!
nunopicado Posted December 5, 2012 at 12:19 PM Report #485854 Posted December 5, 2012 at 12:19 PM Já agora, e para que o programa fique preparado para o "Bug do 4º Milénio", ainda se deveria implementar mais uma condição. Dizem os entendidos que o Calendário Gregoriano, com todas as suas premissas, ainda assim não bate certo com o ano solar, e que por esse motivo, a cada 4000 anos ele irá ficar adiantado 1 dia. Como tal, pondera-se a inclusão de uma regra no cálculo dos anos bissextos que consiste em, se o ano for divisivel por 4000, não é bissexto (regra que tem prioridade sobre as actuais), por forma a corrigir esse enorme desvio. Claro está, como de costume, deixa-mos tudo para a última, e essa regra ainda não foi oficialmente imposta (o pensamento é "temos tempo até lá, outros que se preocupem com isso". Mas como eu sou um gajo muito à frente do meu tempo, resolvi fazer a formula já com isso previsto. Como parece mal deixar aqui a papinha toda feita, deixo a formula, a titulo de curiosidade, em "linguagem ExcelPT" =SE(E(RESTO(ANO;4000)<>0;OU(RESTO(ANO;400)=0;E(RESTO(ANO;4)=0;RESTO(ANO;100)<>0)));"BISSEXTO";"NORMAL") sendo ANO a célula onde está o valor do ano a calcular... "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Evolution Posted December 5, 2012 at 06:02 PM Author Report #485914 Posted December 5, 2012 at 06:02 PM Obrigado Nuno, vou já corrigir o código e já posto aqui o código.
Evolution Posted December 5, 2012 at 06:27 PM Author Report #485928 Posted December 5, 2012 at 06:27 PM Já tenho o código assim mas agora estou outra vez com dificuldades. Na linha 7 dá erro e diz que a operação não é válida para a operação or. Observação: eu estou no 10º ano e este é o primeiro módulo em que uso pascal, ainda não sei todos os comandos do pascal. Program Bissexto ; Var ano, bi : Integer; Begin write ('Digite um ano: '); readln (ano); bi := ano mod 4000; if bi <> 0 or bi = 0 then writeln ('Bissexto.') else writeln ('Normal'); readln; End.
nunopicado Posted December 5, 2012 at 06:40 PM Report #485932 Posted December 5, 2012 at 06:40 PM (edited) Amigo Evolution, não leves a mal que te diga, mas não estás a prestar atenção. Aliás, se leres o teu código, ou se o testares, verás que todos os anos são bissextos. A tua condição é: Se bi for diferente de 0 ou bi for igual a 0, o ano é bissexto... Pensa lá bem se isto faz sentido! Além do mais, o 4000 é uma "brincadeira". Fala-se em adicionar isso às regras, mas ainda não está feito (nem deverá estar tão cedo), pelo que não vale a pena pensares nele. E ainda que o incluisses, nunca seria só essa a regra, senão só haviam anos normais a cada 4000 anos. Analisa bem as regras que o Thoga te disse, e vê a minha formula do Excel, que facilmente é convertível para Pascal. Aqui fica ela sem a regra dos 4000 para não te confundir: =SE(OU(RESTO(ANO;400)=0;E(RESTO(ANO;4)=0;RESTO(ANO;100)<>0));"BISSEXTO";"NORMAL") PS: O erro que te dá é porque para usares mais do que uma condição no IF, tens de as colocar entre parentesis curvos. No teu exemplo seria: if (bi <> 0) or (bi = 0) then Edited December 5, 2012 at 06:43 PM by nunopicado "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
thoga31 Posted December 5, 2012 at 06:54 PM Report #485936 Posted December 5, 2012 at 06:54 PM Observação: eu estou no 10º ano e este é o primeiro módulo em que uso pascal, ainda não sei todos os comandos do pascal. Não é preciso saber os 300.000 procedimentos e funções do Pascal (e não "comandos") para fazer este exercício. Aqui o teu problema é este: nós falamos, tu apanhas zero. Basicamente só tens aplicado de cada vez uma das sugestões que te são dadas. Eu já disse duas vezes como se calcula o ano bissexto, e ainda não vi nada que aplique isto: Um ano é bissexto se for divisível por 4 e, se for divisível por 400 ou não divisível por 100. A história de ser divisível por 4000 é apenas uma pequena brincadeira para tornar o programa mais accurate. Por último, recomendo que leias coisas sobre lógica. (b=0) or (b<>0) é uma condição verdadeira para qualquer b. E sinceramente nem entendi onde foste desencantar esta condição para o if. Peço desculpa se estou a ser um pouco mais frio, mas isto já me fez chegar ao meu limite (estou a ser muito franco). Não consigo ser mais claro do que já fui, eu e o @nunopicado já te dissemos tudo... Knowledge is free!
Evolution Posted December 5, 2012 at 06:59 PM Author Report #485939 Posted December 5, 2012 at 06:59 PM Ok obrigado na mesma, e desculpem o tempo perdido.
thoga31 Posted December 5, 2012 at 07:09 PM Report #485943 Posted December 5, 2012 at 07:09 PM (edited) Ok obrigado na mesma, e desculpem o tempo perdido. Se fosse tempo perdido, nenhum de nós teria sequer respondido. Falando pessoalmente, eu não seria membro do P@P se não tivesse gosto em ensinar e em ajudar os outros. A única coisa aqui que me deixou um pouco frustrado foi o facto de já ter dito 3 vezes a solução e ainda não teres pegado nela. Em vez de desistires (de nós e da nossa ajuda), porque é que não te centras na condição que calcula o ano bissexto? Este exercício é muito simples, só tens é de ler todas as nossas sugestões e não apenas aplicar uma delas. Edited December 5, 2012 at 07:10 PM by thoga31 Knowledge is free!
Evolution Posted December 5, 2012 at 07:13 PM Author Report #485944 Posted December 5, 2012 at 07:13 PM (edited) É isto??? Program Bissexto ; Var ano, bi : Integer; Begin write ('Digite um ano: '); readln (ano); bi := ano mod 4 mod 400; if bi = 0 then writeln ('Bissexto.') else writeln ('Normal'); readln; End. Edited December 5, 2012 at 07:15 PM by thoga31 GeSHi
thoga31 Posted December 5, 2012 at 07:19 PM Report #485945 Posted December 5, 2012 at 07:19 PM (edited) Uma coisa. O que faz este trecho: ano mod 4 mod 400? Uma pista: quero saber quanto é n + 3 e quanto é n + 4. Não vou fazer n+3+4 porque isso não me dá as somas em separado. Solução para o teu caso: 1) utilização de and e or. 2) Não guardar o resultado de cada divisão numa variável, é desnecessário. 3) Voltar a ler a condição para saber se um ano é bissexto, que é composta por 3 partes (ou 4 se contares com a questão dos 4000...). Edited December 5, 2012 at 07:19 PM by thoga31 Knowledge is free!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now