java任意一年万年历代码,C语言实现万年历(完整源码)

原标题:C语言实现万年历(完整源码)

C语言实现万年历

各位~

最近看到以前写的代码——万年历

拿出来修改了一下,跟大家分享

有兴趣的可以试试

2e863557b67f64f3ef36787a8dfe5ae8.png

这是程序运行图,一个完整的日历,可以显示实时的年月日,用方括号把日定位到今天,还可以利用方向键查阅任意年份任意月份的日历。

运用的知识点有:1.数组;2.头文件中对系统时间的操作;3.键盘信息与计算机的交互。强调一点:像这种小项目级别的程序,整个项目框架的构建很重要,也就是整体逻辑思维很重要,记大家记住住!!!

为了方便大家学习,我把整个源码都给出了,这次大家也不用问有没有源码了,所有的都在下面,代码关键处都给出了注释,希望大家慢慢培养自己用所学知识做项目的感觉,不管大小,我保证只有你自己真正做出来才能感受到那种成就感。

完整版源码:

#include

#include

#include

#include "time.h"

int key;

int year, month;

int mon[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, /*定义各个月的天数*/

{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };

time_t lt;

int showtime() /*显示系统时间*/

{

lt = time(NULL);

printf(" 星期/月/日 时间 年n");

printf(" %s", ctime(

}

int nowyear() /*系统的年份*/

{

struct tm *local;

lt = time(NULL);

local = localtime(

return local->tm_year + 1900; /*系统年份从1900年为0年开始计算*/

}

int nowmonth() /*系统的月份*/

{

struct tm *local;

lt = time(NULL);

local = localtime(

return local->tm_mon + 1;

}

int nowday() /*系统在哪一天*/

{

struct tm *local;

lt = time(NULL);

local = localtime(

return local->tm_mday;

}

int getkey1(int year, int key) /*检测键盘的上下方向键*/

{

if (72 == key) /*上方向键代码是72*/

{

year++;

}

else if (80 == key) /*下方向键代码是80*/

{

year--;

}

return year;

}

int getkey2(int month, int key) /*检测键盘的左右方向键*/

{

if (77 == key) /*右方向键代码是77*/

{

month++;

}

else if (75 == key) /*左方向键代码是75*/

{

month--;

}

return month;

}

int isleap(int year) /*判断是否是闰年*/

{ /*被4整除但不被100整除的年时闰年*/

int leap; /*被400整除的是闰年*/

leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));

return leap;

}

int isweek(int year, int month, int day) /*判断X年X月X日是星期几*/

{

int i, j, week;

int allday = 0;

for (i = 0; i < year; i++)

{

if (1 == isleap(i)) /*闰年有366天*/

{

allday = allday + 366;

}

else

{

allday = allday + 365; /*非闰年有365天*/

}

}

for (j = 1; j < month; j++)

{

allday = allday + mon[isleap(year)][j];

}

allday = allday + day;

week = (allday - 1) % 7; /*计算当天为星期几,星期日至六为0至6*/

return week;

}

int showdata() /*显示系统月份的挂历*/

{

int i, z;

int j = 0;

printf("n");

printf(" %d年 %d月n", nowyear(), nowmonth());

printf(" *********************************************n");

printf(" Sun Mon Tues Wed Thur Fri Satn");

printf(" *********************************************n");

z = isweek(nowyear(), nowmonth(), 1);

for (i = 0; i < z; i++)

{

printf(" ");

}

for (i = 0; i < mon[isleap(nowyear())][nowmonth()]; i++)

{

if ((i == nowday() - 1) && (i < 9)) /*在系统时间的今天上做记号【】*/

{

printf(" [%d]", i + 1);

}

else if (i == nowday() - 1)

{

printf(" [%2d]", i + 1);

}

else if (i == nowday())

{

printf("%5d", i + 1);

}

else

{

printf("%6d", i + 1);

}

if ((0 == (z + i + 1) % 7) && ((i + 1) != mon[isleap(nowyear())][nowmonth()]))

{ /*每7天换一行*/

j++;

printf("n");

}

}

if (j == 3) /*令提示语保持在同一行*/

{

printf("nnnn");

}

if (j == 4)

{

printf("nnn");

}

if (j == 5)

{

printf("nn");

}

printf(" 按方向键进入查询状态");

}

int checkdata() /*显示要查询的月份的挂历*/

{

int i, z;

int j = 0;

printf("nnn");

printf(" %d年 %d月n", year, month);

printf(" ********************************************n");

printf(" Sun Mon Tues Wed Thur Fri Satn");

printf(" ********************************************n");

z = isweek(year, month, 1);

for (i = 0; i < z; i++)

{

printf(" ");

}

for (i = 0; i < mon[isleap(year)][month]; i++)

{

printf("%6d", i + 1);

if ((0 == (z + i + 1) % 7) && ((i + 1) != mon[isleap(year)][month]))

{

j++;

printf("n");

}

}

if (j == 3) /*令提示语保持在同一行*/

{

printf("nnnn");

}

if (j == 4)

{

printf("nnn");

}

if (j == 5)

{

printf("nn");

}

printf(" 按上下方向键查询年,按左右方向键查询月n");

printf(" 按ESC键退回系统时间");

}

int reno() /*刷新系统时间和挂历*/学习群(594089997)

{

while (!kbhit()) /*当键盘无输入时进行循环*/

{

showtime(); /*显示时间*/

showdata(); /*显示挂历*/

Sleep(1000); /*延迟1秒*/

system("cls"); /*清除屏幕*/

}

}

int str() /*检测键盘并显示要查询月的挂历*/

{

year = nowyear(); /*初始化年月为系统时间*/

month = nowmonth();

printf("nn");

key = 0; /*初始化按键记录*/

while (27 != key) /*当没有按ESC时循环*/

{

year = getkey1(year, key); /*把按键的值传递给year和month */

month = getkey2(month, key);

if (month >12)

{ /*满12个月就加一年*/

month = month % 12;

year = year + 1;

}

if (month <1) /*少于1月时退一年*/

{

month = month + 12;

year = year - 1;

}

system("cls"); /*清屏*/

checkdata();

getch(); /*键盘输入*/

key = getch();

}

}

int main(void) /*主函数*/

{

while (1) /*无限循环*/

{

reno();

str();

system("cls");

}

return 0;

}

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2014年8月5日,最新版本。 实用万年历是一款比较实用的多功能日历。日期计算等均采用了现代高精度天文算法。日期范围:从公元前4600年至公元10000年,历时近一万五千年。包括公历、农历、回历、历史年号、公农历节日、节气、干支(生辰八字)、生肖、星座、出梅入梅、九九三伏、28星宿、日月升降以及中国传统黄历的内容等。软件集成了自定义纪念日(生日等)、每日记事、日程安排、世界时间、闹钟定时提醒、网络校时、天气预报、电视节目预告、语音报时、通讯簿、收藏夹、记帐理财、密码箱与备忘录、屏幕锁、日历打印等实用工具。并可对记事、安排内容、通讯簿、收藏夹、记帐理财、密码箱与备忘录等设置密码进行保护。软件最小化后可以多种小窗口方式显示当日公农历及时间。 1、使用本软件时需注意:农历年月干支以及星座一般是以传统的节气交节时间来计算的,生肖一般是以每年立春日计算。每天23时起,按传统习惯干支以第二天计算。实用万年历既可以按照传统的节令方式又可以按照农历年月的方式来显示农历干支、生肖等,用户可以按照习惯自行选择。农历小年的日期用户也可以根据本地的风俗习惯进行设定。 2、设置为开机运行后,系统启动时软件自动以小窗口显示。 3、主窗口最小化后自动跳到当前日期,以小窗口显示,若有记事或安排时在小窗口上显示标记。小窗口有标题式、日历式、时钟式、显示到托盘图标、整合到任务栏的时间区 等多种方式可供选择。标题式、日历式、时钟式小窗口可以随意拖动位置,当小于屏幕边缘时鼠标离开后即在该处自动隐藏,鼠标移到该处时又出现,小窗口双击或鼠标右击后返回主窗口。显示到托盘图标、整合到任务栏的时间区这两种方式,当鼠标移动到托盘图标或任务栏的时间区,就会提示当日的信息。单击托盘图标或任务栏的时间区返回主窗口。 4、每日记事、日程安排添加后即在有关日期上分别显示记事、安排标记,在提示框上显示记事安排内容。 5、在日期上双击鼠标即自动打开每日记事窗口,★用鼠标右击记事与安排显示框更可快速地直接添加、修改、删除当日记事内容(推荐)。日程安排可有多种方式选择,起止时间可空,如为空,则默认以当前时间为起点,终止时间不限。安排内容在时间超过后不再显示,如果当前日期超过终止日期,则自动删除该项安排记录。 6、记事搜索和吉日查询时,如果查询到选择的内容,当鼠标移动到查询结果上时,鼠标指针变为“A?”单击查询结果,查询窗口最小化,主窗口自动跳到该时间并显示点击时间的详细内容。 7、数据的备份与还原:如果万年历中存有重要的数据,请定期备份数据,以免由于各种意外而导致数据库的损坏或丢失。备份的方法:选择主界面上的数据菜单,再点击备份保存,程序即自动按照日期将数据库保存为wak文件。备份时包括密码、以及调出密码的热键等也一起自动备份,请切记密码及热键!以免数据还原后忘了密码和热键。备份时最好能同时将备份文件备份到U盘等移动设备。在需要还原时,再在还原菜单上选择要还原的数据文件即可。 8、关于设置密码及热键:如果设置了密码和热键后,软件启动时即对记事、安排内容、通讯簿、收藏夹、记帐理财、密码箱与备忘录等进行锁定,不能查看搜索记事、安排内容、不能选择是否显示安排记事标记、不能进入密码设置界面。 设置密码及热键需同时设置忘记密码的安全问题及答案,请务必牢记密码和热键,特别是密码的安全问题和答案,可以在忘记密码或热键的时候取回密码及热键。 设置密码及热键后使用方法:在主界面按下预先设置好的热键,跳出密码框,输入密码后回车即解锁。解锁后加锁的方法:在日期板内任意位置按下鼠标右键即加锁;主窗口最小化后亦自动加锁。如果要取消密码保护功能,在解锁状态,进入设置窗口后在密码框及热键框内不输入任何内容确定即可。 9、实用万年历的安装与卸载:安装的时候最好不要放到系统盘,以免系统格式化重装时万年历中的数据丢失。卸载的时候建议选择保留万年历中的数据库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值