实例介绍
【实例简介】
巩固C语言基础,开发的万年历程序。
【实例截图】
【核心代码】
#include "time.h" /*包含的头文件*/
#include "stdio.h"
#include "math.h"
#include "windows.h"
#include "conio.h"
#define KEYNUMUp 0x48 /*宏定义*/
#define KEYNUMDown 0x50
#define KEYNUMLeft 0x4b
#define KEYNUMRight 0x4d
int eachyeartotal(int year,int month,int day); /*函数声明*/
int counterdays(int year,int month,int day);
int nowtime(int year,int month,int day);
int week(int year,int month,int day);
int maxDay(int year,int month);
int isleap(int year);
void whatweek(int year,int month,int day);
void display(int year ,int month);
void display2(int year,int month);
void display3(int year,int month,int day) ;
void setDay1(int year,int month,int day);
void setDay2(int year,int month,int day);
void setDay3(int year,int month,int day);
void jieri(int month,int day);
void display1(int day);
void getmenu();
int main() /*主函数*/
{
int year,month,day,select;
while(1)
{
system("cls");
getmenu();
printf(" 请输入相应数字:"); /*菜单选择 */
scanf("%d",&select);
system("cls");
switch(select)
{
case 1: /*当选择为1时显示日期查询*/
printf(" 日期查询:输入天数(如5):");
scanf("%d",&day);
if(day>0&&day<10000) /*日期选择从0-10000 */
{ display1(day);
printf(" 提示 按任意键:返回菜单\n\n");
setDay2( year,month, day);
}
else
system("cls");
printf(" 输入无效,重新输入!\n");
break;
case 2: /*当选择为2显示月历*/
printf(" 月历查询:输入年月(如2011,6):");
scanf("%d,%d",&year,&month);
if(year>0&&year<10000&&month>=1&&month<=12)
{
display2(year,month);
printf(" 提示 按←:上个月 按→:下个月 按其他键:返回菜单\n\n");
setDay2( year,month, day);
}
else
system("cls");
printf(" 输入无效,重新输入!\n");
break;
case 3: /*当选择为3时显示日历*/
printf(" 日期显示:输入年月日(比如2011,6,23):");
scanf("%d,%d,%d",&year,&month,&day);
if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month))
{
display3(year,month,day);
printf(" 提示 按↑:前一天 按↓:后一天 按其他键:返回菜单\n\n");
setDay3( year,month, day);
}
else
system("cls");
printf(" 输入无效,重新输入!\n");
break;
case 4:
printf("\n\n\n\n\n\n\n\n\n\n");
printf(" *******************************************\n\n");
printf(" * 感谢使用本万年历工具 *\n\n");
printf(" * 制作人:第五组 *\n\n");
printf(" *******************************************\n\n");
printf("\n\n\n\n\n\n\n\n");
exit(0);
default: /*当输入其他数字时,输入无效,重新输入*/
system("cls");
printf(" 输入无效,重新输入!\n");
}
}
}
int isleap(int year) /*判断是否为闰年*/
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int maxDay(int year,int month) /*每月的天数*/
{
int a[]={31,28,31,30,31,30,31,31,30,31,30,31}; /*每个月中的天数*/
if(isleap( year))
a[1]=29; /*闰年2月份有29天*/
return a[month-1];
}
int eachyeartotal(int year,int month,int day) /*判断某天是一年中的第几天*/
{
int i,sum=0;
for(i=1;i<month;i )
sum =maxDay(year,i);
sum =day;
return sum;
}
int week(int year,int month,int day) /*对天数进行判断确定是星期几*/
{
int number=(year-1) (year-1)/4-(year-1)/100 (year-1)/400
eachyeartotal(year,month,day);
number=number%7 ;
return number;
}
void display(int year ,int month) /*输出年月*/
{
int max,number,i,j=1;
max=maxDay(year,month);
number=week(year,month,1);
printf(" %4s %4s %4s %4s %4s %4s %4s\n","Sun","Mon","Tue","Wed",
"Thu","Fri","sat");
for(i=0;i<number;i )
printf(" "); /*1号前的星期补空格*/
while(j<=max)
{
printf("%6d",j);
if (i%7==6)
printf("\n"); /* 每7格换一行*/
i ;
j ;
}
printf("\n\n");
}
void display1(int day) /*输出年历*/
{ struct tm when;
time_t now, result;
char *a;
time( &now );
when = *localtime( &now );
printf("\n");
printf( "现在时间是 %s\n", asctime( &when ) );
printf( "查询距离时间是: " );
when.tm_mday = when.tm_mday day;
if( (result = mktime( &when )) != (time_t)-1 )
{ a=asctime( &when );
printf( " %d天后时间是 %s\n",
day, a);
} else
perror( "mktime failed" );
}
void display2(int year,int month) /*输出月历*/
{
printf("\n%d 年 %d 月\n ",year,month);
display(year,month);
}
void display3(int year,int month,int day) /*输出日历*/
{
whatweek( year,month,day);
jieri(month,day);
counterdays(year,month, day);
}
int counterdays(int year,int month,int day) /*判断今天距特定日期的天数*/
{
int year1, days0,days1,month1,days, day1;
time_t timep;
struct tm *p;
time(&timep);
p=gmtime(&timep);
year1=(1900 p->tm_year) ;
month1=(1 p->tm_mon) ;
day1=(p->tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/
days0=(year-1)*365 (year-1)/4-(year-1)/100 (year-1)/400 eachyeartotal(year,month,day);
days1=(year1-1)*365 (year1-1)/4-(year1-1)/100 (year1-1)/400 eachyeartotal(year1,month1,day1);
days=days0-days1; /*计算出两个日期之间的时间差*/
printf("\n 今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);
return days;
}
void whatweek(int year,int month,int day) /*判断是星期几*/
{
int number;
number=(year-1) (year-1)/4-(year-1)/100 (year-1)/400 eachyeartotal(year,month,day);
number=number%7 ;
switch( number)
{
case 0:
printf( "\n %d年%d月%d日是星期日",year,month,day);break;
case 1:
printf( "\n %d年%d月%d日是星期一",year,month,day);break;
case 2:
printf( "\n %d年%d月%d日是星期二",year,month,day);break;
case 3:
printf( "\n %d年%d月%d日是星期三",year,month,day);break;
case 4:
printf( "\n %d年%d月%d日是星期四",year,month,day);break;
case 5:
printf( "\n %d年%d月%d日是星期五",year,month,day);break;
case 6:
printf( "\n %d年%d月%d日是星期六",year,month,day);break;
default:
system("cls");
printf(" 出现错误!\n" );
}
}
void jieri(int month,int day) /*判断是否公历节日*/
{
if(month==1)
switch(day)
{
case 1:
printf(",这天是元旦");
}
if(month==2)
switch(day)
{
case 14:
printf(",这天是情人节");
}
if(month==3)
switch(day)
{
case 8:
printf(",这天是妇女节");
break;
case 12:
printf(",这天是植树节");
}
if(month==4)
switch(day)
{
case 1:
printf(",这天是愚人节");
}
if(month==5)
switch(day)
{
case 1:
printf(",这天是劳动节");
break;
case 4:
printf(",这天是青年节");
}
if(month==6)
switch(day)
{
case 1:
printf(",这天是儿童节");
}
if(month==7)
switch(day)
{
case 1:
printf(",这天是建党节");
}
if(month==8)
switch(day)
{
case 1:
printf(",这天是建军节");
break;
case 23:
printf(",今天是我的生日");
}
if(month==9)
switch(day)
{
case 10:
printf(",这天是教师节");
}
if(month==10)
switch(day)
{
case 1:
printf(",这天是国庆节");
}
if(month==12)
switch(day)
{
case 24:
printf(",今天是平安夜");
break;
case 25:
printf(",今天是圣诞节");
}
}
void setDay1(int year,int month,int day) /*通过键盘返回主菜单*/
{ char k;
getch();
k=getch();
system("cls");
getchar();
}
void setDay2(int year,int month,int day) /*通过键盘"←""→"控制月历的变换*/
{
char k;
getch();
k=getch();
switch(k)
{
case KEYNUMLeft: /*"←"月份变小*/
if(month<2)
{
month =12;
year--;
}
if(year<1)
{
system("cls");
printf(" 警告!超出范围!\n");
break;
}
month--;
display2(year , month);
setDay2(year,month,day);
break;
case KEYNUMRight:/*"→"月份变小*/
if(month>11)
{
month-=12;
year ;
}
if(year<9999);
month ;
display2(year , month);
setDay2(year,month,day);
break;
default:
system("cls");
;
}
}
void setDay3(int year,int month,int day) /*通过键盘"↑""↓"控制日期的变换*/
{
char k;
getch();
k=getch();
switch(k)
{
case KEYNUMUp : /*"↑"日期变小*/
if(day<2)
{
month--;
day=maxDay(year,month);
}
if(month<1)
{
month =12;
year--;
}
if(year<1)
{
system("cls");
printf(" 警告!超出范围!\n");
break;
}
day--;
display3(year , month,day);
setDay3(year,month,day);
break;
case KEYNUMDown: /*"↓"日期变大*/
day ;
if(day>maxDay(year,month))
{
day=1;
month ;
}
if(month>12)
{
month-=12;
year ;
}
if(year<10000);
display3(year , month,day);
setDay3(year,month,day);
break;
default:
system("cls");
;
}
}
void getmenu() /* 显示菜单选择*/
{
struct tm when;
time_t now, result;
int days;
time( &now );
when = *localtime( &now );
printf(" ***************主菜单***************\n\n");
printf(" * 欢迎进入万年历系统 *\n\n");
printf(" * 现在时间是 *\n\n");
printf(" %s \n",asctime( &when ) );
printf(" * 1、日期查询 *\n\n");
printf(" * 2、月历查询 *\n\n");
printf(" * 3、日历查询 *\n\n");
printf(" * 4、退出系统 *\n\n");
printf(" ************************************\n\n");
}
标签: 万年历
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论