; Exercicio 9 - Dia-da-semana;; Exercício resolvido por: Rui Maia (deathseeker25@portugal-a-programar.org) ;; Quer saber em que dia da semana ocorreu o 25 de Abril de 1974? Ou em que dia da semana nasceu,; sem perguntar aos seus pais?;; Para determinar o dia da semana de uma data do calendário, utiliza-se um algoritmo que agora se descreve.; Mas antes disso:; ; m -> mês do ano em que Março é o mês 1, Abril é o 2, até Dezembro que é o mês 10. Janeiro e Fevereiro;são considerados os meses 11 e 12 do ano anterior (esta identificacao dos meses, perfeitamente anormal;é utilizada apenas neste algoritmo).; d -> dia do mês; a -> ano do século; s -> século anterior (mais uma identificacao anormal, para utilizador no algoritmo);; Por exemplo, para 4 de Julho de 1989 será m=5, d=4, a=89, s=19. Por outro lado, para 4 de Janeiro do mesmo ano;será m=11, d=4, a=88, s=19.;; Vejamos agora os passos do algoritmo. Seja:;; mint = parte inteira de (13*m-1)/5; aint = parte inteira de a/4; sint = parte inteira de s/4; x = mint + aint + sint + d + a-2*s; dia = resto da divisao inteira x/7;; dia é a resposta, de acordo com a identificacao seguinte: dia=0 é o Domingo, dia=1 é segunda-feira, e assim ;sucessivamente até dia=6 que corresponde a Sábado.;; Escreva em Scheme o programa dia-da-semana que, em relacao a uma data, pede o dia, mês e ano e responde com o ;respectivo dia da semana. Na chamada que se segue, a data em causa é 18 de Agosto de 2001.;;>(dia-da-semana);dia : 18;mes: 8;ano: 2001;dia da semana: 6;(defineatribui-dia(lambda(dmas)(let((mint(quotient(-(*13m)1)5))(aint(quotienta4))(sint(quotients4)))(+mintaintsintd(-a(*2s))))))(definecalcula-dia(lambda(x)(remainderx7)))(defineatribui-ano-consoante-o-mes(lambda(mesano)(cond((or(=mes11)(=mes12))(sub1(remainderano100)))(else(remainderano100)))))(defineatribui-mes(lambda(mes)(cond((=mes1)11)((=mes2)12)((=mes3)1)((=mes4)2)((=mes5)3)((=mes6)4)((=mes7)5)((=mes8)6)((=mes9)7)((=mes10)8)((=mes11)9)((=mes12)10))))(definedia-da-semana(lambda()(display"dia: ")(let((dia(read)))(display"mes: ")(let((mes(read)))(display"ano: ")(let((ano(read)))(display"dia da semana: ")(let((m(atribui-mesmes))(ddia)(a(atribui-ano-consoante-o-mes(atribui-mesmes)ano)); o comando remainder da o resto de uma divisao..(s(quotientano100)))(if(<(calcula-dia(atribui-diadmas))0); se o resultado for menor do que zero(+7(calcula-dia(atribui-diadmas))); faz-se 7 + resultado, ja que o resultado e negativo(calcula-dia(atribui-diadmas))))))))); caso nao seja, faz-se apenas o calcula-dia...;> (dia-da-semana);dia: 18;mes: 8;ano: 2001;dia da semana: 6;> (dia-da-semana);dia: 25;mes: 4;ano: 1974;dia da semana: 4;> (dia-da-semana);dia: 16;mes: 6;ano: 1989;dia da semana: 5;> (dia-da-semana);dia: 16;mes: 6;ano: 2007;dia da semana: 6;> (dia-da-semana);dia: 2;mes: 12;ano: 2007;dia da semana: 0