万年历软件设计,万年历简易制作
java编程一个简单的万年历
http://ishare.iask.sina.com.cn/f/23434336.html
不用谢高手们,你们表演的时刻到了,我不会功能挺强大呀,你做好,我参考一下。
跪求51单片机+12864液晶+1302时钟制成的万年历c程序?
顶层文件 万年历.C
#include
#include "LCD1602.h"
#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit speaker=P2^4;
bit key_flag1=0,key_flag2=0;
SYSTEMTIME adjusted;
uchar sec_add=0,min_add=0,hou_add=0,day_add=0,mon_add=0,yea_add=0;
uchar data_alarm[7]={0};
/************键盘控制******************************/
int key_scan() //扫描是否有键按下
{ int i=0;
uint temp;
P1=0xf0;
temp=P1;
if(temp!=0xf0)
i=1;
else
i=0;
return i;
}
uchar key_value() //确定按键的值
{
uint m=0,n=0,temp;
uchar value;
uchar v[4][3]={'2','1','0','5','4','3','8','7','6','b','a','9'} ;
P1=0xfe; temp=P1; if(temp!=0xfe)m=0;
P1=0xfd;temp=P1 ;if(temp!=0xfd)m=1;
P1=0xfb;temp=P1 ;if(temp!=0xfb)m=2;
P1=0xf7;temp=P1 ;if(temp!=0xf7)m=3;
P1=0xef;temp=P1 ;if(temp!=0xef)n=0;
P1=0xdf;temp=P1 ;if(temp!=0xdf)n=1;
P1=0xbf;temp=P1 ;if(temp!=0xbf)n=2;
value=v[m][n];
return value;
}
/***************************设置闹铃函数*******************************/
void naoling(void)
{
uchar i=0,l=0,j;
init1602();
while(key_flag2&&i<12)
if(key_scan()){j=key_value();write_data(j);if(i%2==0)data_alarm[l]=(j-'0')*10;else {data_alarm[l]+=(j-'0');l++;}i++;delay(600);}
write_com(0x01);
}
uchar according(void)
{ uchar k;
if(data_alarm[0]==adjusted.Year&&data_alarm[1]==adjusted.Month&&data_alarm[2]==adjusted.Day&&data_alarm[3]==adjusted.Hour&&data_alarm[4]==adjusted.Minute&&data_alarm[5]==adjusted.Second)
k=1;
else k=0;
return k;
}
void speak(void)
{uint i=50;
while(i)
{speaker=0;
delay(1);
speaker=1;
delay(1);
i--;
}
}
void alarm(void)
{uint i=10;
while(i)
{
speak();
delay(10);
i--;
}
}
/**************************修改时间操作********************************/
void reset(void)
{
sec_add=0;
min_add=0;
hou_add=0;
day_add=0;
mon_add=0;
yea_add=0 ;
}
void adjust(void)
{
if(key_scan()&&key_flag1)
switch(key_value())
{case '0':sec_add++;break;
case '1':min_add++;break;
case '2':hou_add++;break;
case '3':day_add++;break;
case '4':mon_add++;break;
case '5':yea_add++;break;
case 'b':reset();break;
default: break;
}
adjusted.Second+=sec_add;
adjusted.Minute+=min_add;
adjusted.Hour+=hou_add;
adjusted.Day+=day_add;
adjusted.Month+=mon_add;
adjusted.Year+=yea_add;
if(adjusted.Second>59) adjusted.Second=adjusted.Second%60;
if(adjusted.Minute>59) adjusted.Minute=adjusted.Minute%60;
if(adjusted.Hour>23) adjusted.Hour=adjusted.Hour%24;
if(adjusted.Day>31) adjusted.Day=adjusted.Day%31;
if(adjusted.Month>12) adjusted.Month=adjusted.Month%12;
if(adjusted.Year>100) adjusted.Year=adjusted.Year%100;
}
/**************************中断处理函数*********************************/
void changing(void) interrupt 0 using 0 //需要修改时间和日期,或者停止修改
{
if(key_flag1)key_flag1=0;
else key_flag1=1;
}
void alarming(void) interrupt 3 using 0 //需要设置闹铃或者停止设置
{
if(key_flag2)key_flag2=0;
else key_flag2=1;
}
/********************************主函数***********************************/
main()
{uint i;
uchar *l;
uchar p1[]="D:",p2[]="T:";
SYSTEMTIME T;
EA=1;
EX0=1;
IT0=1;
EA=1;
EX1=1;
IT1=1;
init1602();
Initial_DS1302() ;
while(1)
{ write_com(0x80);
write_string(p1,2);
write_com(0xc0);
write_string(p2,2);
DS1302_GetTime(&T) ;
adjusted.Second=T.Second;
adjusted.Minute=T.Minute;
adjusted.Hour=T.Hour;
adjusted.Week=T.Week;
adjusted.Day=T.Day;
adjusted.Month=T.Month;
adjusted.Year=T.Year;
for(i=0;i<9;i++)
{
adjusted.DateString[i]=T.DateString[i];
adjusted.TimeString[i]=T.TimeString[i];
}
adjust();
if(key_flag2)naoling();
if(according())alarm();
DateToStr(&adjusted);
TimeToStr(&adjusted);
write_com(0x82);
write_string(adjusted.DateString,8);
write_com(0xc2);
write_string(adjusted.TimeString,8);
delay(10);
}
(二)头文件1 显示模块 LCD1602.H
#ifndef LCD_CHAR_1602_2009_5_9
#define LCD_CHAR_1602_2009_5_9
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs = P2^0;
sbit lcdrw = P2^1;
sbit lcden = P2^2;
void delay(uint z) // 延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) // 写入指令数据到 lcd
{
lcdrw=0;
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) // 写入字符显示数据到 lcd
{
lcdrw=0;
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init1602() // 初始化设定
{
lcdrw=0;
lcden=0;
write_com(0x3C);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void write_string(uchar *pp,uint n)
{
int i;
for(i=0;i
}
#endif
(三)头文件2 时钟模块 DS1302.H
#ifndef _REAL_TIMER_DS1302_2009_5_20_
#define _REAL_TIMER_DS1302_2003_5_20_
sbit DS1302_CLK = P2^6; //实时时钟时钟线引脚
sbit DS1302_IO = P2^7; //实时时钟数据线引脚
sbit DS1302_RST = P2^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct SYSTEM_TIME
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9]; //用这两个字符串来放置读取的时间
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
/******内部指令**********/
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0;
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1; //因为在前面已经定义了ACC0 = ACC^0;以便再次利用DS1302_IO = ACC0;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
/********************************/
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10);
else
Write1302(0x8E,0x00);
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)<<4 | (Value%10))); //将十进制数转换为BCD码
} //在DS1302中的与日历、时钟相关的寄存器存放的数据必须为BCD码形式
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将BCD码转换为十进制数
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}
unsigned char *DataToBCD(SYSTEMTIME *Time)
{
unsigned char D[8];
D[0]=Time->Second/10<<4+Time->Second%10;
D[1]=Time->Minute/10<<4+Time->Minute%10;
D[2]=Time->Hour/10<<4+Time->Hour%10;
D[3]=Time->Day/10<<4+Time->Day%10;
D[4]=Time->Month/10<<4+Time->Month%10;
D[5]=Time->Week/10<<4+Time->Week%10;
D[6]=Time->Year/10<<4+Time->Year%10;
return D;
}
void DateToStr(SYSTEMTIME *Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME *Time)
{
//将十进制数转换为液晶显示的ASCII值
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}
void Initial_DS1302(void)
{
unsigned char Second;
Second=Read1302(DS1302_SECOND);
if(Second&0x80) //初始化时间
DS1302_SetTime(DS1302_SECOND,0);
}
void DS1302_TimeStop(bit flag) // 是否将时钟停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);
else
Write1302(DS1302_SECOND, Data&0x7F);
}
#endif目录 III
第一章 绪 论 - 1 -
1.1课题的背景 - 1 -
1.2课题意义 - 2 -
1.3本章小结 - 3 -
第二章 总体设计方案与论证 - 4 -
2.1 电源模块方案的选择与论证 - 4 -
2.2 时钟电路方案的选择与论证 - 4 -
2.3 显示电路方案的选择与论证 - 5 -
2.4 闹钟电路方案的选择与论证 - 5 -
2.5 键扫描电路方案的选择与论证 - 6 -
2.6 本章小结 - 6 -
第三章 系统硬件设计 - 7 -
3.1 主控芯片STC89C52的介绍 - 7 -
3.1.1 STC89C52的主要性能参数 - 7 -
3.1.2 STC89C52单片机的功能特性概述: - 8 -
3.2时钟部分功能介绍及电路设计 - 11 -
3.3显示模块功能介绍及电路设计 - 14 -
3.4闹钟电路模块介绍及电路设计 - 16 -
3.5功能按键模块介绍及电路设计 - 17 -
3.6电源模块介绍及电路设计 - 17 -
3.7 本章小结 - 18 -
第四章 系统软件设计 - 19 -
4.1日历程序设计 - 19 -
4.2 时间调整程序设计 - 20 -
4.3 闹钟设置程序设计 - 22 -
4.4 闹钟蜂鸣程序设计 - 23 -
4.5本章小结 - 23 -
第五章 系统调试 - 24 -
5.1系统的调试 - 24 -
5.2系统的调试出现的问题及解决 - 24 -
5.3本章小结 - 24 -
第六章 结 论 - 25 -
参考文献 - 26 -
致 谢 - 27 -
附录 - 28 -
附录一 :本设计电路原理图 - 28 -
附录二:数字日历钟电路设计的C程序 - 29 -貌似程序漫长的 额 加727690822
万年历程序设计思路
当然使用蔡勒公式了
最后附上我以前回答的一个....知道地址
http://zhidao.baidu.com/question/9433604.html
万年历的 但是不实现农历
如何计算某一天是星期几?
slowtiger 发表于 2005-10-11 21:43:00
如何计算某一天是星期几?
—— 蔡勒(Zeller)公式
历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。
即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。
1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)
算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。
以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下:
蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期5。
你的生日(出生时、今年、明年)是星期几?不妨试一试。
不过,以上公式只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)。
过程的推导:(对推理不感兴趣的可略过不看)
星期制度是一种有古老传统的制度。据说因为《圣经·创世纪》中规定上帝用了六
天时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生
活,而星期日是休息日。从实际的角度来讲,以七天为一个周期,长短也比较合适。所
以尽管中国的传统工作周期是十天(比如王勃《滕王阁序》中说的“十旬休暇”,即是
指官员的工作每十日为一个周期,第十日休假),但后来也采取了西方的星期制度。
在日常生活中,我们常常遇到要知道某一天是星期几的问题。有时候,我们还想知
道历史上某一天是星期几。通常,解决这个方法的有效办法是看日历,但是我们总不会
随时随身带着日历,更不可能随时随身带着几千年的万年历。假如是想在计算机编程中
计算某一天是星期几,预先把一本万年历存进去就更不现实了。这时候是不是有办法通
过什么公式,从年月日推出这一天是星期几呢?
答案是肯定的。其实我们也常常在这样做。我们先举一个简单的例子。比如,知道
了2004年5月1日是星期六,那么2004年5月31日“世界无烟日”是星期几就不难推算出
来。我们可以掰着指头从1日数到31日,同时数星期,最后可以数出5月31日是星期一。
其实运用数学计算,可以不用掰指头。我们知道星期是七天一轮回的,所以5月1日是星
期六,七天之后的5月8日也是星期六。在日期上,8-1=7,正是7的倍数。同样,5月15
日、5月22日和5月29日也是星期六,它们的日期和5月1日的差值分别是14、21和28,也
都是7的倍数。那么5月31日呢?31-1=30,虽然不是7的倍数,但是31除以7,余数为2,
这就是说,5月31日的星期,是在5月1日的星期之后两天。星期六之后两天正是星期一。
这个简单的计算告诉我们计算星期的一个基本思路:首先,先要知道在想算的日子
之前的一个确定的日子是星期几,拿这一天做为推算的标准,也就是相当于一个计算的
“原点”。其次,知道想算的日子和这个确定的日子之间相差多少天,用7除这个日期
的差值,余数就表示想算的日子的星期在确定的日子的星期之后多少天。如果余数是
0,就表示这两天的星期相同。显然,如果把这个作为“原点”的日子选为星期日,那
么余数正好就等于星期几,这样计算就更方便了。
但是直接计算两天之间的天数,还是不免繁琐。比如1982年7月29日和2004年5月
1日之间相隔7947天,就不是一下子能算出来的。它包括三段时间:一,1982年7月29
日以后这一年的剩余天数;二,1983-2003这二十一个整年的全部天数;三,从2004年
元旦到5月1日经过的天数。第二段比较好算,它等于21*365+5=7670天,之所以要加
5,是因为这段时间内有5个闰年。第一段和第三段就比较麻烦了,比如第三段,需要把
5月之前的四个月的天数累加起来,再加上日期值,即31+29+31+30+1=122天。同理,第
一段需要把7月之后的五个月的天数累加起来,再加上7月剩下的天数,一共是155天。
所以总共的相隔天数是122+7670+155=7947天。
仔细想想,如果把“原点”日子的日期选为12月31日,那么第一段时间也就是一个
整年,这样一来,第一段时间和第二段时间就可以合并计算,整年的总数正好相当于两
个日子的年份差值减一。如果进一步把“原点”日子选为公元前1年12月31日(或者天文
学家所使用的公元0年12月31日),这个整年的总数就正好是想算的日子的年份减一。这
样简化之后,就只须计算两段时间:一,这么多整年的总天数;二,想算的日子是这一
年的第几天。巧的是,按照公历的年月设置,这样反推回去,公元前1年12月31日正好是
星期日,也就是说,这样算出来的总天数除以7的余数正好是星期几。那么现在的问题就
只有一个:这么多整年里面有多少闰年。这就需要了解公历的置闰规则了。
我们知道,公历的平年是365天,闰年是366天。置闰的方法是能被4整除的年份在
2月加一天,但能被100整除的不闰,能被400整除的又闰。因此,像1600、2000、2400
年都是闰年,而1700、1800、1900、2100年都是平年。公元前1年,按公历也是闰年。
因此,对于从公元前1年(或公元0年)12月31日到某一日子的年份Y之间的所有整年
中的闰年数,就等于
[(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400],
[...]表示只取整数部分。第一项表示需要加上被4整除的年份数,第二项表示需要去掉
被100整除的年份数,第三项表示需要再加上被400整除的年份数。之所以Y要减一,这
样,我们就得到了第一个计算某一天是星期几的公式:
W = (Y-1)*365 + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (1)
其中D是这个日子在这一年中的累积天数。算出来的W就是公元前1年(或公元0年)12月
31日到这一天之间的间隔日数。把W用7除,余数是几,这一天就是星期几。比如我们来
算2004年5月1日:
W = (2004-1)*365 + [(2004-1)/4] - [(2004-1)/100] + [(2004-1)/400] +
(31+29+31+30+1)
= 731702,
731702 / 7 = 104528……6,余数为六,说明这一天是星期六。这和事实是符合的。
上面的公式(1)虽然很准确,但是计算出来的数字太大了,使用起来很不方便。仔
细想想,其实这个间隔天数W的用数仅仅是为了得到它除以7之后的余数。这启发我们是
不是可以简化这个W值,只要找一个和它余数相同的较小的数来代替,用数论上的术语
来说,就是找一个和它同余的较小的正整数,照样可以计算出准确的星期数。
显然,W这么大的原因是因为公式中的第一项(Y-1)*365太大了。其实,
(Y-1)*365 = (Y-1) * (364+1)
= (Y-1) * (7*52+1)
= 52 * (Y-1) * 7 + (Y-1),
这个结果的第一项是一个7的倍数,除以7余数为0,因此(Y-1)*365除以7的余数其实就
等于Y-1除以7的余数。这个关系可以表示为:
(Y-1)*365 ≡ Y-1 (mod 7).
其中,≡是数论中表示同余的符号,mod 7的意思是指在用7作模数(也就是除数)的情
况下≡号两边的数是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,这样我们就得到
了那个著名的、也是最常见到的计算星期几的公式:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D. (2)
这个公式虽然好用多了,但还不是最好用的公式,因为累积天数D的计算也比较麻
烦。是不是可以用月份数和日期直接计算呢?答案也是肯定的。我们不妨来观察一下各
个月的日数,列表如下:
月 份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
--------------------------------------------------------------------------
天 数: 31 28(29) 31 30 31 30 31 31 30 31 30 31
如果把这个天数都减去28(=4*7),不影响W除以7的余数值。这样我们就得到另一张
表:
月 份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
------------------------------------------------------------------------
剩余天数: 3 0(1) 3 2 3 2 3 3 2 3 2 3
平年累积: 3 3 6 8 11 13 16 19 21 24 26 29
闰年累积: 3 4 7 9 12 14 17 20 22 25 27 30
仔细观察的话,我们会发现除去1月和2月,3月到7月这五个月的剩余天数值是3,2,3,2,
3;8月到12月这五个月的天数值也是3,2,3,2,3,正好是一个重复。相应的累积天数中,
后一月的累积天数和前一月的累积天数之差减去28就是这个重复。正是因为这种规律的
存在,平年和闰年的累积天数可以用数学公式很方便地表达:
╭ d; (当M=1)
D = { 31 + d; (当M=2) (3)
╰ [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d + i. (当M≥3)
其中[...]仍表示只取整数部分;M和d分别是想算的日子的月份和日数;平年i=0,闰年
i=1。对于M≥3的表达式需要说明一下:[13*(M+1)/5]-7算出来的就是上面第二个表中的
平年累积值,再加上(M-1)*28就是想算的日子的月份之前的所有月份的总天数。这是一
个很巧妙的办法,利用取整运算来实现3,2,3,2,3的循环。比如,对2004年5月1日,有:
D = [ 13 * (5+1) / 5 ] - 7 + (5-1) * 28 + 1 + 1
= 122,
这正是5月1日在2004年的累积天数。
假如,我们再变通一下,把1月和2月当成是上一年的“13月”和“14月”,不仅仍
然符合这个公式,而且因为这样一来,闰日成了上一“年”(一共有14个月)的最后一
天,成了d的一部分,于是平闰年的影响也去掉了,公式就简化成:
D = [ 13 * (M+1) / 5 ] - 7 + (M-1) * 28 + d. (3≤M≤14) (4)
上面计算星期几的公式,也就可以进一步简化成:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] - 7
+ (M-1) * 28 + d.
因为其中的-7和(M-1)*28两项都可以被7整除,所以去掉这两项,W除以7的余数不变,
公式变成:
W = (Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + [ 13 * (M+1) / 5 ] + d.
(5)
当然,要注意1月和2月已经被当成了上一年的13月和14月,因此在计算1月和2月的日子
的星期时,除了M要按13或14算,年份Y也要减一。比如,2004年1月1日是星期四,用这
个公式来算,有:
W = (2003-1) + [(2003-1)/4] - [(2003-1)/100] + [(2003-1)/400] + [13*(13+1)/5]
+ 1
= 2002 + 500 - 20 + 5 + 36 + 1
= 2524;
2524 / 7 = 360……4.这和实际是一致的。
公式(5)已经是从年、月、日来算星期几的公式了,但它还不是最简练的,对于年
份的处理还有改进的方法。我们先来用这个公式算出每个世纪第一年3月1日的星期,列
表如下:
年份: 1(401,801,…,2001) 101(501,901,…,2101)
--------------------------------------------------------------------
星期: 4 2
====================================================================
年份:201(601,1001,…,2201) 301(701,1101,…,2301)
--------------------------------------------------------------------
星期: 0 5
可以看出,每隔四个世纪,这个星期就重复一次。假如我们把301(701,1101,…,2301)
年3月1日的星期数看成是-2(按数论中对余数的定义,-2和5除以7的余数相同,所以可
以做这样的变换),那么这个重复序列正好就是一个4,2,0,-2的等差数列。据此,我们
可以得到下面的计算每个世纪第一年3月1日的星期的公式:
W = (4 - C mod 4) * 2 - 4. (6)
式中,C是该世纪的世纪数减一,mod表示取模运算,即求余数。比如,对于2001年3月
1日,C=20,则:
W = (4 - 20 mod 4) * 2 - 4
= 8 - 4
= 4.
把公式(6)代入公式(5),经过变换,可得:
(Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] ≡ (4 - C mod 4) * 2 - 1
(mod 7). (7)
因此,公式(5)中的(Y-1) + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400]这四项,在计算
每个世纪第一年的日期的星期时,可以用(4 - C mod 4) * 2 - 1来代替。这个公式写
出来就是:
W = (4 - C mod 4) * 2 - 1 + [13 * (M+1) / 5] + d. (8)
有了计算每个世纪第一年的日期星期的公式,计算这个世纪其他各年的日期星期的公式
就很容易得到了。因为在一个世纪里,末尾为00的年份是最后一年,因此就用不着再考
虑“一百年不闰,四百年又闰”的规则,只须考虑“四年一闰”的规则。仿照由公式(1)
简化为公式(2)的方法,我们很容易就可以从式(8)得到一个比公式(5)更简单的计算任意
一天是星期几的公式:
W = (4 - C mod 4) * 2 - 1 + (y-1) + [y/4] + [13 * (M+1) / 5] + d. (9)
式中,y是年份的后两位数字。
如果再考虑到取模运算不是四则运算,我们还可以把(4 - C mod 4) * 2进一步改写
成只含四则运算的表达式。因为世纪数减一C除以4的商数q和余数r之间有如下关系:
4q + r = C,
其中r即是 C mod 4,因此,有:
r = C - 4q
= C - 4 * [C/4]. (10)
则
(4 - C mod 4) * 2 = (4 - C + 4 * [C/4]) * 2
= 8 - 2C + 8 * [C/4]
≡ [C/4] - 2C + 1 (mod 7). (11)
把式(11)代入(9),得到:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1. (12)
这个公式由世纪数减一、年份末两位、月份和日数即可算出W,再除以7,得到的余数是
几就表示这一天是星期几,唯一需要变通的是要把1月和2月当成上一年的13月和14月,
C和y都按上一年的年份取值。因此,人们普遍认为这是计算任意一天是星期几的最好的
公式。这个公式最早是由德国数学家克里斯蒂安·蔡勒(Christian Zeller, 1822-
1899)在1886年推导出的,因此通称为蔡勒公式(Zeller’s Formula)。为方便口算,
式中的[13 * (M+1) / 5]也往往写成[26 * (M+1) / 10]。
现在仍然让我们来算2004年5月1日的星期,显然C=20,y=4,M=5,d=1,代入蔡勒
公式,有:
W = [20/4] - 40 + 4 + 1 + [13 * (5+1) / 5] + 1 - 1
= -15.
注意负数不能按习惯的余数的概念求余数,只能按数论中的余数的定义求余。为了方便
计算,我们可以给它加上一个7的整数倍,使它变为一个正数,比如加上70,得到55。
再除以7,余6,说明这一天是星期六。这和实际是一致的,也和公式(2)计算所得的结
果一致。
最后需要说明的是,上面的公式都是基于公历(格里高利历)的置闰规则来考虑
的。对于儒略历,蔡勒也推出了相应的公式是:
W = 5 - C + y + [y/4] + [13 * (M+1) / 5] + d - 1. (13)
========================================
(2005-10-20 22:25:00) --------(4575252)
计算任何一天是星期几的几种算法
近日在论坛上看到有人在问星期算法,特别整理了一下,这些算法都是从网上搜索而来,算法的实现是我在项目中写的。希望对大家有所帮助。
一:常用公式
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,w:星期;c:世纪;y:年(两位数); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
相比于通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。
三:对蔡勒(Zeller)公式的改进
作者:冯思琮
相比于另外一个通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。不过,笔者给出的通用计算公式似乎更加简洁(包括运算过程)。现将公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。其他符号与蔡勒(Zeller)公式中的含义相同。
四:基姆拉尔森计算公式
这个公式名称是我给命名的,哈哈希望大家不要见怪。
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。我的是用C语言编写的
#include
#include
#include
#include
int Whatdate(int n);
int Isleapyear(int year);
void main(int argc,char *argv[])
{
unsigned int year,montag = 1,weektag;
char *month[12] ={"JANUARY","FEBRUARU","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"};
int monthday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(argc !=2 )
{
printf("Use this program like this:example9-16 3");
exit(0);
}
year = atoi(argv[1]);
if( Isleapyear(year) ) //表示是闰年
monthday[1] = 29;
//计算这一年的第一天是星期几
weektag = Whatdate(year);
//打印
while(montag<=12)
{
int i;
printf( " ====%s====\n",month[montag-1] );
printf( "Sun Mon Tues Wed Thu Fri Sat\n" );
if(weektag!=7)
for(i=0;i<(int)weektag;i++)
printf(" ");
for(i=1;i<=monthday[montag-1];i++)
{
printf("%-8d",i);
if(weektag==6)
printf("\n");
weektag = (weektag+1) % 7;
}
montag++;
printf("\n\n");
}
}
int Whatdate(int n)
{
int week = 7,i;//以2006年的
if(2006>n) //往回到
{
for(i=1;i<=2006-n;i++)
{
if((week==1 && Isleapyear(2006-i)==0) || (week==2 && Isleapyear(2006-i)==1 ))
week = 7;
else if(week==1 && Isleapyear(2006-i))
week =6;
else
week = week -1 - Isleapyear(2006-i);
}
}
else if(2006
for(i=0;i
week = 1;
else if(week==7 && Isleapyear(2006+i))
week = 2;
else
week = week +1 +Isleapyear(2006+i);
}
return week;
}
int Isleapyear(int year)
{
if( (year%4==0 && year%100!=0) || year%400==0 )
return 1;
else
return 0;
}脚本说明:
第一步:把如下代码加入区域中
第二步:把中的内容改为:
简单的万年历JAVA语言
天啊,好高的要求
c语言 万年历的程序设计
#include
#include
#include
#include
using namespace std;
int week(int,int,int); //根据年月日判断星期几
int leap_year(int); //判断闰年
void display_year(int ); //显示某年日历
void demand_day(int,int,int); //查询某天
int main()
{
int y,m,d,es=1;
while(es)
{
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,12);
cout<<"请选择操作:\n1→显示某年日历\
\n2→查询某天\n0→退出"<
if(tp[1]!='\0'||tp[0]>'2'||tp[0]<'0'){cout<<"输入有误"<
{
case 1:{cout<<"请输入年份:";cin>>y;system("cls");display_year(y);break;}
case 2:{cout<<"请输入年、月、日,以空格分开:";cin>>y>>m>>d;system("cls");
demand_day(y,m,d);break;}
case 0:{es=0;break;}
}
}
return 0;
}
//-----根据年月日判断星期几-------------------------
int week(int y,int m, int d)
{
int week1,yy=y;
if(m==1) {m=13;yy--;}
if(m==2) {m=14;yy--;}
week1=(d+2*m+3*(m+1)/5+yy+yy/4-yy/100+yy/400)%7;
int s;
switch (week1)
{
case 0: s=1; break;
case 1: s=2; break;
case 2: s=3; break;
case 3: s=4; break;
case 4: s=5; break;
case 5: s=6; break;
case 6: s=0; break;
}
return s;
}
//----判断闰年-------------------------------------
int leap_year(int y)
{
int i;
if((y%4==0&&y%100!=0)||y%400==0)i=1;
else i=0;
return i;
}
//--------显示某年日历------------------------
void display_year(int y)
{
int n1,n2,i,j,a[13],c,d;
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,5);
cout<
cout<
a[4]=a[6]=a[9]=a[11]=30; //确定每月天数
if(leap_year(y))a[2]=29;
else a[2]=28; //
for(i=1;i<=11;i+=2) //六次循环
{
SetConsoleTextAttribute(consolehwnd,1);
cout<
cout<
n1=week(y,i,1);n2=week(y,i+1,1);
if(n1) //-----------
{
for(j=1;j<=n1;j++) //
cout<
for(j=1;j<=7-n1;j++)
cout<
{ //-----输出每次循环的第一行---
for(j=1;j<=n2;j++)
cout<
for(j=1;j<=7-n2;j++)
cout<
for(int m=1;m<6;m++) //每月日历最多占六行
{
if(c>a[i])cout<
for(j=c;j<=a[i];j++)
{
cout<
if(j==a[i]){cout<
}
cout<
{ //
cout<
if(j==a[i+1]){cout<
cout<
cout<
cout<
//--------查询某天------------
void demand_day(int y,int m,int d)
{
int n;
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,5);
n=week(y,m,d);
switch(n)
{
case 1:cout<
}
cout<
int
leap
(int
year)
{if(year%4==0&&year%100!=0||year%400==0)
//判断是否是闰年
return
1;
else
return
0;
}
int
days_month
(int
month,int
year)
//判断大月和小月
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
//找出大月
return
31;
if(month==4||month==6||month==9||month==11)
//找出小月
return
30;
if(month==2&&leap(year)==1)
return
29;
//判断二月是29天还是29天
else
return
28;
}
int
firstday(int
month,int
year)
{int
w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
//判断每个月开始的第一天是星期几
return
w;
}
main()
{int
i,j=1,k=1,a,b,month,year;
printf(\\"
input
month
and
year:
\\");
scanf(\\"%d%d\\",&month,&year);
//输入月和年
b=days_month(month,year);
a=firstday
(month,year);
printf(\\"
Sun
Mon
Tue
Wed
Thu
Fri
Sat
\\");
//输出对应当月的日历
if(a==7)
{for(i=1;i<=b;i++)
{printf(\\"%4d\\",i);
if(i%7==0)
{printf(\\"
\\");
}
}
}
if(a!=7)
{while
(j<=4*a)
{printf(\\"
\\");
j++;
}
for(i=1;i<=b;i++)
{printf(\\"%4d\\",i);
if(i==7*k-a)
{printf(\\"
\\");
k++;
}
}
}
printf(\\"
\\");
}
基于STM32的电子万年历系统设计
在**学上,厨房一般不适合在南方,因为南面是火性的,而且厨房也是火性的,对住宅不利,而且向南的厨房中的食物也容易腐化,所以**不要把厨房设置在南面,也不要设计在整个住宅的中间位置,因为这两个地方对整个住宅的健康和招财**有很大的影响,所以我们应该把厨房设计在东方**,那么厨房在东北角**的**又是怎么样的呢?
在**学中位于东北丑寅方位的厨房为吉,艮方位为凶,因为在正东北方为土,东北背阳,而且有湿气,又有寒冷的东北风,**书上称“表鬼门”。所以厨房在东北角**的**不是很好,那么我们就要对厨房的方位进行化解了。
(1)在厨房在东北角**中,我们的厨房灶具应该怎么摆放,灶具在厨房中代表着创造力,因为这个是各种美味食物的**的主要厨具。它代表的是创造力和贡献的能力。所以炉具在厨房中的设计在灶台的中央上面是**的。而且厨灶采用不锈钢的材料**。
(2)在古代认为炉灶的方向向南或者向东**,因为东方属木,木生火对于厨房的**有帮助作用,而且又可以配合着自然风,对厨房有很大的帮助作用,但是随着时代的发展,我们采用天然气或者电力做饭,就可以对位置有一个改变,但是还是要对**做一个参考,在厨房在东北角**中,我们就要保证厨房的油烟问题,否则带来的健康问题就不好解决了。
(3)在厨房在东北角**中,厨房是用水、用火的地方,因此,要注意“水火既济”的调和,方能确保家道兴旺,无论厨房在哪个方位,厨房不能封闭,不然会引起火灾,而且厨房**通风好,有阳台和后院对家里的**会更好。
梦见发生火灾是什么意思
梦见发生火灾是什么意思,梦境是有很多种不同的类型,做梦能够帮助大脑恢复自身的功能,并且可以加强大脑的功能。因为在做梦时可以使大脑内部产生一些比较活跃的化学反应,下面是梦见发生火灾是什么意思。
梦见发生火灾是什么意思1
梦见火灾,代表了困难和损失,提醒你工作生活中要多加小心。
大的火灾,表明会遇到较大的阻碍。
小的火灾,可能会有小的困难和损失。
如梦见火灾发生在自己家里,表示你所担心的事很有可能会发生,要多加谨慎。
梦见火灾发生在别的地方,提示你采取有效的措施,就有可能避免即将出现的损失或困难。
如果梦见失火,人们惊慌失措,而你非常冷静并可以控制局面,这样的梦,表示你心中正渴望承担责任,或是觉得自己的领导能力没有得到应有的认可。
心理学解梦
梦境解说:放火主受损。火主财,放火,就是把财产放走,意味着损失。梦见自己放火,财严妻遭受损失,要防范小偷入室盗窃,商人要小心自己的投资。但是梦见别人放火,则会从困境中摆脱出来。
心理分析:火在梦中常常象征着纯洁。火的力量可以给人赐于生命和创造,人们用火改变自己的生活。有时候,火也指示你应该变换自己的性欲力量。你如果在梦中被活活烧死,意味着对新的关系或新的生活阶段十分害怕,你也许感到应该为自己的信仰遭受折磨。
精神象征:从这层角度讲,火线洗礼象征着精神力量的新意识和意识转换。
梦见发生火灾是什么意思2
1、如果是做梦梦到自己家发生了比较小的火灾,则表明梦者最近可能会遭遇一些小的财务损失。如果做梦梦到的是比较大的火灾,则表明梦者最近会遇到一些比较大的麻烦,这种麻烦不单单指财务方面,因此在这里提醒梦者最近在生活、工作、学习之中都要格外的小心。
2、如果是做梦梦到火灾,而且是发生在自己的家里,则表明现实中会有不好的事情发生。尤其是自己一直长久以来担忧的事情,很有可能会在近期变为现实。
3、如果是做梦梦到火灾,但是火灾发生的地点不在自己家,没有波及到自身,则表明自己最近会遇到一些可以化解的矛盾。具体来说就是梦者依然会遇到一些麻烦,但是这些麻烦事只要引起了梦者足够的重视,并且积极地想办法去解决,那么问题很容易就会被化解。
4、如果是女人做梦梦到火灾,则要注意一下自己的感情方面的问题。梦者要好好的反思一下自己在感情里面所处的地位,所付出的多少,有没有真心地去对待这段感情,真心地对待另一半。切忌在感情里面耍一些小手段,那样的话只会引火上身。
5、如果是正在怀孕的人梦到了火灾,则表明自己在生产的时候可能会有不顺。在生孩子的过程中,梦者可能要承受比一般孕妇更多的痛苦。但是建议梦者不要紧张和害怕,因为这些不好的情绪不仅会对腹中孩子的健康状况产生一些不好的影响,而且在生产的时候还会加重自己的痛苦。梦者要放松自己的心态,积极地去调整,让自己慢慢适应那种环境。
6、如果是做梦梦到自己在火灾里面救人,则不是一个好的兆头。梦者在现实中属于那种“老好人”的'性格,即无论别人请求自己做什么事情,自己都会想办法取帮助别人,哪怕这样做会损坏梦者自身的利益。而且对于现实中一些性格不好的人、
甚至欺负自己的人,梦者也不会去怪罪或者追究,反而会想方设法为他人开脱。这种“老好人”性格会让大家觉得梦者的原则性不强,比较软弱,比较容易被欺负。如果梦者是一个普通的小职员倒也罢了,假如是一个领导的话,那么一定要去改一改。
7、如果是正在准备自己的婚事的人梦到火灾,而且自己在火灾之中逃生,则不是一个好的兆头。表明梦者在婚姻方面不会那么顺利,会遇到多方阻碍,尤其是自己的母亲方面。因此建议梦者在结婚之前,和自己的母亲好好坐下来谈谈心,沟通一下。
8、如果是有着出门计划的人梦到了火灾,而且自己还在火灾里边逃生,则不是一个好兆头。表明梦者最近一段时间并不适宜出门,如果出门的话会遇到一些麻烦事。
有的人很希望自己能够自由的控制自己的梦境,这样就不用担心受到噩梦的困扰,也可以在现实中对应一些比较好的预示。但是梦是一个人的潜意识的一种体现,潜意识本身就不受人的控制,梦就也一样。
梦见发生火灾是什么意思3
梦见火灾的梦境解析
梦见火灾,预示着近期你的运势不好,做事情的时候总是力不从心,也许是压力过大造成的。
不同人梦见火灾的梦境解析
出行的人梦见火灾,建议大变动,延期几天再出行。
怀孕的人梦见火灾,预示可望生男,夏占生女。南方少去。
恋爱中的人梦见火灾,说明可望成婚。坦诚相待。
本命年的人梦见火灾,意味着顺其自然,天助人助,平顺如意。
做生意的人梦见火灾,代表反覆不定,不利财运,不宜守旧业得财。
梦见火灾的其他梦境解析
梦见山上发生火灾,预示着近期你的求职运势很好,自己的表现得到考官的欣赏,有机会得到好的职位。
梦见火灾烧死人,在人际关系上有转机。与反目成仇的亲友,可能因为一些小事又言归于好。应该热情地去接纳他。
梦见火灾烧别人的房子,预示着最近的嫉妒心会变的很强烈,比如别人买了辆车自己会很眼气,如果不能及早调整这种心态不利于眼前人际关系的发展。
梦见火灾的吉凶
基础运吉,境遇可稍安定,因勤勉而有一时之大成功,但成功运劣,以致不能有所伸张发展,且恐有再败之兆,若人格或地格有凶数者,恐交通生祸或陷于体弱病难,或急功招败,或凶变遭难、祸端危害之虑。【吉凶相抵】
梦见火灾的宜忌
「宜」宜修理家用电器,宜乘大巴,宜追公交车。
「忌」忌回忆怀旧,忌酒后吐真言,忌跨界合作。
看到这个题目我笑了,很是好提问的到底是何方仙人?这完全是要超凡脱俗,起要成仙的节奏啊。不过,也可能是还在上学的小女孩小男孩,一心想着好好学习,所以,想要找到 个方法来克制自己的青春懵懂的小情愫。坦白说,一个正常人,意思是还有荷尔蒙正常分泌的人,是没有办法对任何异性不动心的。
记得前几天我们在一个禅院里做为期几天的闭关修行。给我们上课的就是一个修了一二十年,还算是小有造诣的男性禅师。但在我们上瑜 珈课的时候,傻子都能看得出来,他的视线就没有离开过当时教我们的美女瑜珈老师。哈哈。而且,他当年也会很坦诚的问他的师父,类似于这样的问题: 我们修行人如何有生理反应了,该怎么办?
我觉得,这就是一种对自己的诚实。所以,不管你是什么年纪,什么职业,做人,首先就要对自己诚实。接受自己身心很正常 ,很自然,也很健康的现象与反应。如果对自己太残忍,或者太虚伪,那么,也是要付出代价的。我保证。这边也举一个小例子。我一姑姑的儿子。平时不说溺爱吧,也算是把他当宝贝的那种。从小学到上大学,这十多年的时间里,他也从一个儿童成长为一个青年。但他妈妈始终在他面前念叨的一个观点和要求就是,上学不能谈恋爱,千万不能谈恋爱。那感觉有点像故事中,老和尚教小和尚说女人是老虎差不太多。我表弟也是一个非常听话的男生。乖到似乎没有经历过叛逆期的那种。初中,高中,甚至大学,都是老老实实的,本本分分的把时间用于学习上。当然,好像他的学习成绩也就一般一般,并出突出的那种。大学毕业后,他父母急了, 就开始赶着他出去找女朋友了。而他呢,似乎己经丧失了与异性交往的能力或自信。根本就不出门的。听说前几年的竟然突然犯了桃花疯。用科学的名词就是精神分裂。赤身裸体的在村里晃来晃去。从专业的角度来讲,这实实在在是与他青春期以来的 情感 压抑不无关联。
从心理学上来讲,喜欢一个人,其实是一种能力,是一种从儿童走向成人的重要的心理能力。在云南孩子在18岁的时候,还会特别举行隆重的成人礼。所以,对异性动心,是一种生而为人的基本能力,一种不可或缺的重要能力。SO,问问自己,还能去压抑吗?
就我个人而言,我更加喜欢交敢于直言的朋友,因为敢于直言的朋友性格直爽,容易相处,而且能够让我感觉到彼此友谊的真诚。而奉承讨好的朋友容易让我觉得友情的虚假。
在我交朋友的过程当中,我更加喜欢叫那些敢于直言的朋友,很多人说敢于直言的朋友很容易“口出狂言”,伤害到彼此之间的感情,我认为不是这样的,敢于直言说明彼此之间的感情真挚真诚,不虚假,只有真正的朋友才敢于直面说出的错误,因为真正的朋友是真心想要为你好的,虚假的朋友才会对你有所隐瞒。我相信很多人都有遇到过那些奉承讨好的朋友吧,他们因为某种利益关系有意的靠近你、讨好你,虽然对你说的都是一些能够讨你开心的话,但是这些话你明显可以感受到不真诚,奉承讨好的朋友他们不会对你直言,他们只会对你有所隐瞒,他们不会考虑到你的真实情感,只会考虑这件事情对他本身好还是不好。
我认为大家在交朋友的过程当中应该要擦亮双眼,不能被利益蒙蔽了自己的双眼,有时候“口出狂言”的朋友才是真正为你的好的,真正的朋友应该是为自己两肋插刀的,在你遇到困难的时候及时为你提供帮助,真正的朋友不会顾忌他们自身的利益,他们只会关心你的喜怒哀乐;相反,那些奉承讨好的朋友,他们在你遇到困难的时候,他们会躲得远远的,因为对他们的利益关系有伤害的事情他们是绝对不会去做的。
在你需要帮助的时候最能够检验一个朋友是否值得你深交了。为什么说我更加喜欢那些敢于直言的朋友,因为他们勇于指出我的错误,能够让我成长;他们勇于鼓励我,说明他们真心为我好。
记性差的人不聪明。
什么都记不住相当于没有经验,几十年如一日,也将毫无长进,那还怎么聪明。
长记性:
一个能量充实的大脑。
我们的大脑在记忆知识的时候需要排除外界的干扰,需要一个安静的环境,除非你的注意力能非常集中也可以再嘈杂的环境记忆,不过不经过专业的训练很难达到这一的水平。
一个能量充实的大脑需要充足的休息,学生的饮食营养也要均衡,最好不要挑食。再者记忆的时候需要脑细胞活跃,因此充足的氧气也是关键,比如说背诵的时候或者考试的时候可以做一下深呼吸。
适度的强化学习
为什么说要适度的强化学习呢?其实就是区别于过度学习而言的,具体怎么区分是否是强化学习还是过度学习呢?首先要求学生要合理安排时间,做到劳逸结合,太疲劳的时候反而记忆力不会最佳。同时学习也不能太松松垮垮的,不能适度的紧张就不能集中注意力学习。
想用c#设计一个万年历软件,能显示对应的阴历时间,特殊节气,特殊节日...
以前帮别人做的 比你要求的功能还要多一点。
如果你的VS版本是 2010以前的的话,用记事本打开NoteCalendar.csproj
修改 ToolsVersion="4.0" 成 ToolsVersion="3.5"
c语言设计万年历
论文很简单啊,把你设计的这个东西的前因后果写完整理整理就可以了。比如你搞这个东西的动机是什么,目前市场状态是怎么样,你用了几种方案,比较几种方案你所采用的方案的优点是什么,不足又是什么。主要的分析计算等。基本上就这样就可以了。论文切忌空动和大。小而实为首选。
查看原帖>>
nkzgxmvelc非常愿意替你回答问题噢!tgnwtidumo
可以的话,就采纳我吧!
2013/6/13
2:00:43这是当时我做的一个小小的课题,希望对你有所帮助
#include
"stdio.h"
/*
Required
for
MS-DOS
use
*/
#define
ENTER
0x1C0D
/*
Enter
key
*/
int
year,
month,
day;
static
char
*days[8]
=
{"
","Sunday
","Monday
","Tuesday
",
"Wednesday","Thursday
","Friday
","Saturday
"};
struct
TIMEDATE
{
int
year;
/*
year
1980..2099
*/
int
month;
/*
month
1=Jan
2=Feb,
etc.
*/
int
day;
/*
day
of
month
0..31
*/
int
hours;
/*
hour
0..23
*/
int
minutes;
/*
minute
0..59
*/
int
seconds;
/*
second
0..59
*/
int
hsecs;
/*
1/100ths
of
second
0..99
*/
char
dateline[47];
/*
date
&
time
toger
*/
};
static
struct
TIMEDATE
today;
main()
{
char
cmonth[3];
char
cday[3];
char
cyear[5];
double
getdays();
double
daynumb,
numbnow;
int
weekday,
retcode,
dayer,
i;
dayer
=
datetime(&today);
clrscn();
for
(i=0;i<3;++i)cmonth[i]='\0';
for
(i=0;i<3;++i)cday[i]='\0';
for
(i=0;i<5;++i)cyear[i]='\0';
putstr(5,8,14,"Enter
date
in
MM
DD
YYYY
format:");
while
(retcode
!=
ENTER)
{
retcode
=
bufinp(5,41,13,2,cmonth);
if
(retcode
!=
ENTER)
retcode
=
bufinp(5,44,13,2,cday);
if
(retcode
!=
ENTER)
retcode
=
bufinp(5,47,13,4,cyear);
}
year
=
atoi(&cyear);
month
=
atoi(&cmonth);
day
=
atoi(&cday);
daynumb
=
getdays(year,
month,
day);
numbnow
=
getdays(today.year,
today.month,
today.day);
weekday
=
weekdays(daynumb);
if
(numbnow
-
daynumb
==
0)
printf("\n\n%02d-%02d-%d
is",month,
day,
year);
if
(numbnow
-
daynumb
>
0)
printf("\n\n%02d-%02d-%d
was",month,
day,
year);
if
(numbnow
-
daynumb
<
0)
printf("\n\n%02d-%02d-%d
will
be",month,
day,
year);
printf("
a
%s\n",days[weekday]);
}
/*
end
MAIN
*/
/************************************************************
*
GETDAYS
-
From
integer
values
of
year
(YYYY),
month
*
*
(MM)
and
day
(DD)
this
subroutine
returns
a
*
*
double
float
number
which
represents
the
*
*
number
of
days
since
Jan
1,
1980
(day
1).
*
*
This
routine
is
the
opposite
of
GETDATE.
*
************************************************************/
double
getdays(year,
month,
day)
int
year,
month,
day;
{
int
y,m;
double
a,b,d,
daynumb;
double
floor(),intg();
/**********************************
**
make
correction
for
no
year
0
**
**********************************/
if
(year
<
0)
y
=
year
+
1;
else
y
=
year;
/*********************************************************
**
Jan
and
Feb
are
months
13
and
14
in
this
calculation
**
*********************************************************/
m
=
month;
if
(month
<
3)
{
m
=
m
+
12;
y
=
y
-
1;
}
/**************************
**
calculate
Julian
days
**
**************************/
d
=
floor(365.25
*
y)
+
intg(30.6001
*
(m
+
1))
+
day
-
723244.0;
/**********************************************
**
use
Julian
calendar
if
before
Oct
5,
1582
**
**********************************************/
if
(d
<
-145068.0)
daynumb
=
d;
/*************************************
**
otherwise
use
Gregorian
calendar
**
*************************************/
else
{
a
=
floor(y
/
100.0);
b
=
2
-
a
+
floor(a
/
4.0);
daynumb
=
d
+
b;
}
return(daynumb);
}
/*
end
GETDAYS
*/
/********************************************************
*
GETDATE
-
This
routine
takes
a
double
float
number
*
*
representing
the
number
of
days
since
Jan
1,*
*
1980
(day
1)
and
returns
the
year
month
and
*
*
day
as
pointer
integers
*
*
This
routine
is
the
opposite
of
GETDAYS
*
********************************************************/
getdate(numb)
double
numb;
{
double
a,aa,b,c,d,e,z;
double
date;
date
=
numb;
z
=
intg(date
+
2444239.0);
if
(date
<
-145078.0)
a
=
z;
else
{
aa
=
floor((z
-
1867216.25)
/
36524.25);
a
=
z
+
1
+
aa
-
floor(aa/4.0);
}
b
=
a
+
1524.0;
c
=
intg((b
-
122.1)
/
365.25);
d
=
intg(365.25
*
c);
e
=
intg((b
-
d)
/
30.6001);
day
=
b
-
d
-
intg(30.6001
*
e);
if
(e
>
13.5)
month
=
e
-
13.0;
else
month
=
e
-
1.0;
if
(month
>
2)
year
=
c
-
4716.0;
else
year
=
c
-
4715.0;
if
(year
<
1)
--year;
return;
}
/*
end
GETDATE
*/
/********************************************************
*
WEEKDAYS
-
This
routine
takes
a
double
float
number
*
*
representing
the
number
of
days
since
Jan
1,*
*
1980
(day
1)
and
returns
the
day
of
the
week*
*
where
1
=
Sunday,
2
=
Tuesday,
etc.
*
********************************************************/
int
weekdays(numb)
double
numb;
{
double
dd;
int
day;
dd
=
numb;
while
(dd
>
28000.0)
dd
=
dd
-
28000.0;
while
(dd
<
0)
dd
=
dd
+
28000.0;
day
=
dd;
day
=
((day
+
1)
%
7)
+
1;
return(day);
}
/********************************************************
*
FRACT
-
This
routine
takes
a
double
float
number
*
*
and
returns
the
fractional
part
as
a
double
*
*
float
number
*
********************************************************/
double
fract(numb)
double
numb;
{
int
inumb;
double
fnumb;
while
(numb
<
-32767)
numb
+=
32767;
while
(numb
>
32767)
numb
-=
32767;
inumb
=
numb;
fnumb
=
inumb;
return(numb-fnumb);
}
/*
end
FRACT
*/
/********************************************************
*
FLOOR
-
This
routine
takes
a
double
float
number
*
*
and
returns
the
next
smallest
integer
*
********************************************************/
double
floor(numb)
double
numb;
{
double
fract(),
intg();
double
out;
out
=
intg(numb);
if
(numb
<
0
&&
fract(numb)
!=
0)
out
-=
1.0;
return(out);
}
/*
end
FLOOR
*/
/********************************************************
*
INTG
-
This
routine
takes
a
double
float
number
*
*
and
returns
the
integer
part
as
a
double
*
*
float
number
*
********************************************************/
double
intg(numb)
double
numb;
{
double
fract();
return(numb
-
fract(numb));
}
/*
end
INTG
*/默,你如果换个语言课本上就有了^
C语言程序设计万年历
int GetDays (int year,int month,int day)
{
int sum=0;
if (DateCheck(year,month,day)==0)
{
return -1;//日期有误
}
if(year>=1901)
{
int X=(int)(year/100);//世纪数
int Y=X-(int)(X/4);//如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去
if (month<=2&&month>0)
{
year--;//把1月、2月视为上一年的13月、14月(纯粹为了计算需要)
month+=12;
}
sum=(int)(365.25*(year-1900))+(int)(30.6*(month+1))+day-Y-49;//以365.25(本来实际太阳年是365.2425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)
//月份以30.6天的平均值计算。最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0
}
return sum;//返回距离1900年1月1日的总天数(积日)
}#include
int leap (int year)
{if(year%4==0&&year%100!=0||year%400==0) //判断是否是闰年
return 1;
else return 0;
}
int days_month (int month,int year) //判断大月和小月
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //找出大月
return 31;
if(month==4||month==6||month==9||month==11) //找出小月
return 30;
if(month==2&&leap(year)==1) return 29; //判断二月是29天还是29天
else return 28;
}
int firstday(int month,int year)
{int w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1; //判断每个月开始的第一天是星期几
return w;
}
main()
{int i,j=1,k=1,a,b,month,year;
printf("\n input month and year:\n");
scanf("%d%d",&month,&year); //输入月和年
b=days_month(month,year);
a=firstday (month,year);
printf(" Sun Mon Tue Wed Thu Fri Sat \n"); //输出对应当月的日历
if(a==7)
{for(i=1;i<=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n");
}
}
}
if(a!=7)
{while (j<=4*a)
{printf(" ");
j++;
}
for(i=1;i<=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++;
}
}
}
printf("\n");
}