2017-06-14
c语言实现一个简单日历 用C语言编写一份日历系统 本文给大家分享的是一则使用C语言来实现的一个简单日历的代码,根据项目需求,实现了3个简单的小功能,推荐给大家,有需要的小伙伴可以参考下。
满足三个需求:
1.输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。
2.输入年月,输出该月的日历。
3.输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
最终完善版代码:
复制代码 代码如下:
#include<stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include <windows.h>
int year , month , day ;
int day_of_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
//char wek[7]={'周日','周一','周二','周三','周四','周五','周六'};
int current_year,current_month,current_day;
/************************************通用关键函数**************************************************/
void cls_screen()
{
printf("请按任意键返回!\n");
getchar();
getchar();
system("cls");
}
void get_current_time() //获取当前时间
{
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep);
current_year=1900+p->tm_year;
current_month=1+p->tm_mon;
current_day=p->tm_mday;
}
int judgement (int y)
{
if (y % 400 == 0 || (y % 100 !=0 && y %4 ==0))
return 1 ;
else return 0 ;
}
int show_week (int year , int month , int day)
{
/*
公式:w=(y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)%7
*/
int w ,k; //记录周几
int year_last=year %100,c=year/100 , m = month;
if (month==1 )
{
year_last-=1 ;
m=13 ;
}
else if (month==2)
{
year_last-=1;
m=14;
}
w = (year_last + year_last/4 + c/4 - 2*c +26*(m+1)/10+day-1); // abs 绝对值
if (w<0)
{
k=(w%7+7)%7;
}
else k=w%7;
return k ;
}
/************************************第一部分**************************************************/
void print_year (int year)
{
int i , k ,x ,first_week;
printf ("请输入想要查询的年月(格式如2012):");
scanf ("%d",&year);
printf("=======================%d年===========================\n",year);
printf("\n");
if (judgement(year))
{
day_of_month[1]=29;
}
else day_of_month[1]=28;
for (i=1 ; i <13 ; i++)
{
first_week = show_week(year,i,1);
printf("=====================%d月日历如下========================\n",i);
printf ("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for (x=1;x<=first_week;x++)
{
printf("\t");
if (x%7==0) printf ("\n");
}
for (k=1;k<=day_of_month[i-1];k++)
{
printf("%d\t",k);
if (x%7==0) printf ("\n");
x++;
}
printf("\n");
printf("\n");
printf("\n");
}
}
/************************************第二部分**************************************************/
void print_year_month ()
{
int k ,x ,first_week;
printf ("请输入想要查询的年月(格式如2012 12):");
do
{
scanf ("%d %d",&year,&month);
if (month<1||month>12)
{
printf("您输入的月份有误哦~请输入正确的月份\n");
printf ("请输入想要查询的年月(格式如2012 12):");
}
}while(1>month||month>12);
printf("=====================%d年%d月======================\n",year,month);
if (judgement(year))
{
day_of_month[1]=29;
}
else day_of_month[1]=28;
first_week = show_week(year,month,1);
printf ("Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
for (x=1;x<=first_week;x++)
{
printf("\t");
if (x%7==0) printf ("\n");
}
for (k=1;k<=day_of_month[month-1];k++)
{
printf("%d\t",k);
if (x%7==0) printf ("\n");
x++;
}
printf("\n");
}
/************************************第三部分**************************************************/
int year_before_sumdays (int year,int month, int day)
{
int days=0 ,i,judgement1;
int temp_day=0 ,sum_days; //
//printf ("%d,%d\n",current_year,current_month);
judgement1=judgement(year);
/*===================比当前少=====================*/
if (year < current_year )
{
for (i = year+1;i < current_year ;i++)
{
if (judgement(i))
{
days=days+356;
}
else days+=355;
}
for (i = month+1;i<=12;i++)
{
days=days+day_of_month[i-1];
}
days = days + day_of_month[month-1]-day; //指定日子距离当年结束还有多少天
//printf("去年还有%d\n",days);
for (i = 0;i < current_month-1;i++ )
{
if (judgement1)
{
day_of_month[1]=29;
}
temp_day = temp_day + day_of_month[i];
}
//当前日子是这一年的多少天
temp_day = temp_day + current_day;
//printf("今天是第%d天\n",temp_day);
sum_days=temp_day + days ;
}
/*===================比当前多=====================*/
if (year > current_year )
{
for (i =current_year+1;i < current_year ;i++)
{
if (judgement(i))
{
days=days+356;
}
else days+=355;
}
for (i = current_month+1;i<=12;i++)
{
days=days+day_of_month[i-1];
}
days = days + day_of_month[month-1]-current_day; //指定日子距离当年结束还有多少天
//printf("去年还有%d\n",days);
for (i = 0;i <month-1;i++ )
{
if (judgement1)
{
day_of_month[1]=29;
}
temp_day = temp_day + day_of_month[i];
}
//当前日子是这一年的多少天
temp_day = temp_day + day;
//printf("今天是第%d天\n",temp_day);
sum_days=temp_day + days ;
}
/*===================比当前一样=====================*/
if (year == current_year )
{
if(month <current_month)
{
for (i=month+1;i<current_month;i++)
{
if (judgement1)
{
day_of_month[1]=29;
}
days = days + day_of_month[i];
}
sum_days = days + current_day + day_of_month[month-1] - day ;
}
if (month>current_month)
{
for (i=current_month+1;i<month;i++)
{
if (judgement1)
{
day_of_month[1]=29;
}
days = days + day_of_month[i];
}
sum_days = days + day + day_of_month[month-1] - current_day ;
printf("%d\n",days);
}
if (month==current_month)
{
sum_days= abs(day-current_day);
}
}
return sum_days ;
}
void print(int year,int month,int day)
{
int week;
printf ("请输入想要查询的年月(格式如2012 12 12 ):");
do
{
scanf ("%d %d %d",&year,&month,&day);
if (judgement(year))
{
day_of_month[1]=29;
}
printf("\n");
if (day<=0 || day >day_of_month[month-1])
printf ("%d月没有%d,请重新输入(格式如2012 12 12 ):",month,day);
}while(day<=0 || day >day_of_month[month-1]);
week=show_week (year,month ,day);
printf("\n");
switch(month)//判断查找天是否阳历节日先由月份判断是否有节日的月份再由日判断是否为节日
{
case 1:switch(day)
{
case 1:printf("元旦") ;break;
default:printf("不是阳历节日");
}break;
case 2:switch(day)
{
case 14:printf("情人节(Valentines Day)");break;
default:printf("不是阳历节日");
}break;
case 3:switch(day)
{
case 8:printf("妇女节¨(Women's Day)");break;
case 12:printf("植树节(Arbor Day)");break;
default:printf("不是阳历节日");
}break;
case 4:switch(day)
{
case 1:printf("愚人节(April Fools Day)");break;
case 5:printf("清明节(Tomb-sweeping Day)");break;
default:printf("不是阳历节日");
}break;
case 5:switch(day)
{
case 1:printf("劳动节(Labor Day)");break;
case 4:printf("中国青年节(Chinese Youth Day)");
default:printf("不是阳历节日");
}break;
case 6:switch(day)
{
case 1:printf("儿童节(Children's Day)");break;
default:printf("不是阳历节日");
}break;
case 8:switch(day)
{
case 1:printf("建军节(the Army's Day)");break;
default:printf("不是阳历节日");
}break;
case 9:switch(day)
{
case 10:printf("教师节(Teacher's Day)");break;
default:printf("不是阳历节日");
}break;
case 10:switch(day)
{
case 1:printf("国庆节(National Day)");break;
case 31:printf("万圣节(Helloween Day)");break;
default:printf("不是阳历节日");
}break;
case 12:switch(day)
{
case 25 :printf("圣诞节(Christmas Day)");break;
default:printf("不是阳历节日");
}break;
}
printf("\n");
printf("%d年%d月%d号是:",year,month,day);
switch(week)//判断所查找天是星期几
{
case 0:printf("Sunday");break;
case 1:printf("Monday");break;
case 2:printf("Tuesday");break;
case 3:printf("Wednesday");;break;
case 4:printf("Thursday");break;
case 5:printf("Friday");break;
case 6:printf("Saturday");break;
}
printf("\n");
printf("距离今天有%d天\n",year_before_sumdays ( year, month, day));
printf("\n");
}
/********************************************************************************************/
void main ()
{
int choice,year,month,day,flag=1;
char c , k;
for(;1;)//显示程序菜单,为永真,每次查找完回到程序菜单ì
{
printf("===================================菜单选项===================================\n");
printf("请选择:\n");
printf("* * * * * * * * 1.查找某一年的年历 * * * * * * * *\n");
printf("* * * * * * * * 2.查找某一月的月历 * * * * * * * *\n");
printf("* * * * * * * * 3.查找某一天 * * * * * * * *\n");
printf("* * * * * * * * 0.退出 * * * * * * * *\n");
printf("==============================================================================\n");
printf("请输入您的选择: ");
do
{
if (flag)
{
c=getche();
printf("\n");
printf("确定选择%c吗? (y/Y )或者(n/N): ",c);
}
if (flag )
{
k=getche();
// printf("\n");
}
if (k == 'y' || k == 'Y')
{
printf("\n");
if (c=='\n')
{
printf("\n");
printf("输入有误,请输入数字\n");
printf("\n");
printf("请输入您的选择: ");
}
else if (!isdigit(c))
{
printf("\n");
printf("输入有误,请输入数字\n");
printf("\n");
printf("请输入您的选择: ");
}
else if (isdigit(c))
{
choice = c-'0' ;
if (choice < 0 || choice > 3 )
{
printf("输入有误,请输入0-3之间的数字\n");
}
else break ;
}
}
else if (k=='n' || k=='N')
{
printf("\n");
printf("你选择了否,请重新输入选项: ");
flag=1;
}
if ((k != 'y'&& k!='Y'&& k!= 'n'&& k!='N'))
{
printf("\n");
printf("请输入y/n: ");
flag=0;
if (flag == 0)
{
k=getche();
printf("\n");
//getchar();
}
}
}while(1);
if (choice==1)
{
print_year(year);
cls_screen();
}
else if (choice==2)
{
print_year_month ();
cls_screen();
}
else if (choice==3)
{
get_current_time();
print(year,month,day);
cls_screen();
}
else if (choice==0)
break;
else
{
printf ("您的输入有误,请重新输入\n");
}
}
}
以上就是本文所述的全部内容了,希望大家能够喜欢。
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
2014-09-05
PHP中的(++i)前缀自增 和 (i++)后缀自增
2014-09-05
php递归返回值的问题
2014-09-05
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
2017-04-12
常用dos命令及语法
2014-09-27
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
php 做权限管理
2014-09-05
nginx,php日志分割
2014-09-05
解决ThinkPHP在Nginx下无法使用pathin方式的问题
2014-09-05
c语言新手入门代码
2022-03-22
妄想山海九游版下载v1.0.0 安卓版
动作闯关 1.44G
下载将神门最新版下载v1.0 安卓版
卡牌对战 685.4M
下载武林外传网易版下载v1.33.160 安卓版
角色扮演 1.70G
下载逃跑吧少年变态版下载v6.8.3 安卓版
其它手游 401.3M
下载少女前线taptap手游下载v2.0600
卡牌对战 174M
下载食物语taptap官服下载v1.0.55 安卓版
角色扮演 1.23G
下载青云诀2快手版下载v1.6.8 安卓版
动作闯关 360M
下载叫我万岁爷九游平台下载v3.1.0 安卓官方版
经营养成 424.1M
下载二战风云国际版本下载v2.15.3 安卓版
下载
烈火雷霆霸世服下载v6.0 安卓版
下载
放学别跑华为版下载v2.2.0 安卓版
下载
解神者taptap版下载v2.0 安卓版
下载
圣斗士星矢日服下载v1.6.41.1 安卓版
下载
oppo天涯明月刀手游下载v1.1.3 安卓官方版
下载
放学别跑vivo版下载v2.2.0 安卓版
下载
乱世王者渠道手游下载v1.8.32.34 安卓版
下载