用c语言编写一个万年历
2015-05-10 18:21
281 查看
33
#include<stdio.h>
#include<stdlib.h>
typedef struct /*于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)
这里的Stu实际上就是struct Student的别名。Stu==struct Student*/
{
int year;
char month;
char day;
} *DATE; /*给结构体重命名,比如在定义了typedef struct node{int a;node *p} NODE;申请一个node型变量可用NODE来代替,如NODE a;相当于struct node a;*/
DATE NewDate(void);
int DestroyDate(DATE date);
int DaysAMonth(DATE date);
int CheckDate(DATE date);
int SetDate(DATE date,int year,int month,int day);
int GetWeek(DATE date);
int QueryDay(void);
int ShowMonth(DATE date);
int QueryMonth(void);
int QueryYear(void);
int ConfirmExit(void);
int Calendar(void);
DATE NewDate(void)
{
DATE date;
date=(DATE)malloc(sizeof(*date));
return date;
}
int DestroyDate(DATE date)
{
if(!date)
return 0;
free(date);
return 1;
}
int DaysAMonth(DATE date)
{
int days;
if(!date)
return 0;
switch(date->month)
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
days=31;
break;
case 4 :
case 6 :
case 9 :
case 11 :
days=30;
break;
default :
days=0;
break;
}
if(date->month==2)
if(date->year%4==0&&date->year%400!=0||date->year%400==0)
days=29;
else
days=28;
return days;
}
int CheckDate(DATE date)
{
if(!date)
return 0;
if(date->month<1||date->month>12)
return 0;
return 1;
}
int SetDate(DATE date,int year,int month,int day)
{
if(!date)
return 0;
date->year=year;
date->month=month;
date->day=day;
return CheckDate(date);
}
int GetWeek(DATE date)
{
int year,month,day;
if(!date)
return 0;
year=date->year;
month=date->month;
day=date->day;
if(month<=2)
{
month+=12;
--year;
}
return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7+1;
}
int QueryDay(void)
{
DATE date;
char cont;
int year,month,day;
static char *week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
if(!(date=NewDate()))
return 0;
do{
printf("请输入年月日 (XXXX,XX,XX)");
scanf("%d,%d,%d",&year,&month,&day);
if(SetDate(date,year,month,day))
{
printf("%4d年%2d月%2d日是%s,是否继续查询(Y/N)?",year,month,day,week[GetWeek(date)-1]);
scanf("%c",&cont);
}
else
{
printf("日期输入错误!\n");
}
}while(cont=='Y'||cont=='y');
DestroyDate(date);
return 1;
}
int ShowMonth(DATE date)
{
int startweek;
int days;
int i;
if(!date)
return 0;
startweek=GetWeek(date);
days=DaysAMonth(date);
printf(" S M T W S F S \n");
startweek=startweek%7;
for(i=0;i<startweek;++i)
printf(" ");
for(i=1;i<=days;++i)
{
printf(" %2d ",i);
startweek=(startweek+1)%7;
if(startweek==0)
printf("\n");
}
if(startweek!=0)
{
printf("\n");
}
return 1;
}
int QueryMonth(void)
{
int year,month;
DATE date;
if(!(date=NewDate()))
return 0;
printf("请输入要打印的月份(XXXX,XX)");
scanf("%d,%d",&year,&month);
if(SetDate(date,year,month,1))
{
printf("%4d年%2d月\n",year,month);
ShowMonth(date);
}
else
{
printf("月份输入错误!\n");
}
DestroyDate(date);
return 1;
}
int QueryYear(void)
{
int year;
int month;
DATE date;
char cont;
if(!(date=NewDate()))
return 0;
do{
printf("请输入要打印的年份(XXXX)");
scanf("%d",&year);
printf("%4d年\n",year);
for(month=1;month<=12;++month)
{
SetDate(date,year,month,1);
printf("%2d月\n",month);
ShowMonth(date);
}
printf("是否继续打印(Y/N)?");
scanf("%c",&cont);
}while(cont=='Y'||cont=='y');
DestroyDate(date);
return 1;
}
int ConfirmExit(void)
{
char exit;
printf("是否要真的退出(Y/N)");
scanf("%c",&exit);
if(exit=='Y'||exit=='y')
return 1;
else
return 0;
}
int Calendar(void)
{
int menu=1;
int tmp;
do{
switch(menu)
{
case 1 :
printf("\n|1 查星期| |2 月日历| |3 年日历| |4 退出|:");
scanf("%d",&tmp);
switch(tmp)
{
case 1 :
menu=11;
break;
case 2 :
menu=12;
break;
case 3 :
menu=13;
break;
case 4 :
menu=14;
break;
default :
printf("选择有误!\n");
break;
}
break;
case 11 :
QueryDay();
menu=1;
break;
case 12 :
QueryMonth();
menu=1;
break;
case 13 :
QueryYear();
menu=1;
break;
case 14 :
if(ConfirmExit())
menu=0;
else
menu=1;
break;
default :
return 0;
}
}while(menu);
return 1;
}
void main()
{
Calendar();
system("pause");
}
//本程序在devc上面试运行,测试成功。
#include<stdio.h>
#include<stdlib.h>
typedef struct /*于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)
这里的Stu实际上就是struct Student的别名。Stu==struct Student*/
{
int year;
char month;
char day;
} *DATE; /*给结构体重命名,比如在定义了typedef struct node{int a;node *p} NODE;申请一个node型变量可用NODE来代替,如NODE a;相当于struct node a;*/
DATE NewDate(void);
int DestroyDate(DATE date);
int DaysAMonth(DATE date);
int CheckDate(DATE date);
int SetDate(DATE date,int year,int month,int day);
int GetWeek(DATE date);
int QueryDay(void);
int ShowMonth(DATE date);
int QueryMonth(void);
int QueryYear(void);
int ConfirmExit(void);
int Calendar(void);
DATE NewDate(void)
{
DATE date;
date=(DATE)malloc(sizeof(*date));
return date;
}
int DestroyDate(DATE date)
{
if(!date)
return 0;
free(date);
return 1;
}
int DaysAMonth(DATE date)
{
int days;
if(!date)
return 0;
switch(date->month)
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
days=31;
break;
case 4 :
case 6 :
case 9 :
case 11 :
days=30;
break;
default :
days=0;
break;
}
if(date->month==2)
if(date->year%4==0&&date->year%400!=0||date->year%400==0)
days=29;
else
days=28;
return days;
}
int CheckDate(DATE date)
{
if(!date)
return 0;
if(date->month<1||date->month>12)
return 0;
return 1;
}
int SetDate(DATE date,int year,int month,int day)
{
if(!date)
return 0;
date->year=year;
date->month=month;
date->day=day;
return CheckDate(date);
}
int GetWeek(DATE date)
{
int year,month,day;
if(!date)
return 0;
year=date->year;
month=date->month;
day=date->day;
if(month<=2)
{
month+=12;
--year;
}
return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7+1;
}
int QueryDay(void)
{
DATE date;
char cont;
int year,month,day;
static char *week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
if(!(date=NewDate()))
return 0;
do{
printf("请输入年月日 (XXXX,XX,XX)");
scanf("%d,%d,%d",&year,&month,&day);
if(SetDate(date,year,month,day))
{
printf("%4d年%2d月%2d日是%s,是否继续查询(Y/N)?",year,month,day,week[GetWeek(date)-1]);
scanf("%c",&cont);
}
else
{
printf("日期输入错误!\n");
}
}while(cont=='Y'||cont=='y');
DestroyDate(date);
return 1;
}
int ShowMonth(DATE date)
{
int startweek;
int days;
int i;
if(!date)
return 0;
startweek=GetWeek(date);
days=DaysAMonth(date);
printf(" S M T W S F S \n");
startweek=startweek%7;
for(i=0;i<startweek;++i)
printf(" ");
for(i=1;i<=days;++i)
{
printf(" %2d ",i);
startweek=(startweek+1)%7;
if(startweek==0)
printf("\n");
}
if(startweek!=0)
{
printf("\n");
}
return 1;
}
int QueryMonth(void)
{
int year,month;
DATE date;
if(!(date=NewDate()))
return 0;
printf("请输入要打印的月份(XXXX,XX)");
scanf("%d,%d",&year,&month);
if(SetDate(date,year,month,1))
{
printf("%4d年%2d月\n",year,month);
ShowMonth(date);
}
else
{
printf("月份输入错误!\n");
}
DestroyDate(date);
return 1;
}
int QueryYear(void)
{
int year;
int month;
DATE date;
char cont;
if(!(date=NewDate()))
return 0;
do{
printf("请输入要打印的年份(XXXX)");
scanf("%d",&year);
printf("%4d年\n",year);
for(month=1;month<=12;++month)
{
SetDate(date,year,month,1);
printf("%2d月\n",month);
ShowMonth(date);
}
printf("是否继续打印(Y/N)?");
scanf("%c",&cont);
}while(cont=='Y'||cont=='y');
DestroyDate(date);
return 1;
}
int ConfirmExit(void)
{
char exit;
printf("是否要真的退出(Y/N)");
scanf("%c",&exit);
if(exit=='Y'||exit=='y')
return 1;
else
return 0;
}
int Calendar(void)
{
int menu=1;
int tmp;
do{
switch(menu)
{
case 1 :
printf("\n|1 查星期| |2 月日历| |3 年日历| |4 退出|:");
scanf("%d",&tmp);
switch(tmp)
{
case 1 :
menu=11;
break;
case 2 :
menu=12;
break;
case 3 :
menu=13;
break;
case 4 :
menu=14;
break;
default :
printf("选择有误!\n");
break;
}
break;
case 11 :
QueryDay();
menu=1;
break;
case 12 :
QueryMonth();
menu=1;
break;
case 13 :
QueryYear();
menu=1;
break;
case 14 :
if(ConfirmExit())
menu=0;
else
menu=1;
break;
default :
return 0;
}
}while(menu);
return 1;
}
void main()
{
Calendar();
system("pause");
}
//本程序在devc上面试运行,测试成功。
相关文章推荐
- c语言中如何设计和编写一个应用系统?
- 用C语言编写一个函数返回参数二进制中 1 的个数(3种方法)(谷歌笔试题)
- 用c语言实现 编写一个函数,它从一个字符串中提取一个子字符串
- 编写一个程序,把C语言的声明翻译成通俗语言
- C语言 编写一个程序从标准输入读取字符,并把他们写到标准输出。除了大写字母转换成小写字母之外,其他的原样输出。
- c语言:编写一个将输入复制到输出的程序,并将其中的多个空格用一个空格代替
- 【C语言编程】编写一个程序解决选择问题,令k=n/2
- 【c语言】为下面的函数原型编写函数定义,这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- C语言 编写一个c程序实现字符串到数字的转化
- 编写一个删除c语言中的注释语句/* */的程序
- C语言实现 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 【C语言】有一个字符串是:student a am i.现编写代码使其输出为i am a student.(要求其空间复杂度为O(1))
- 一个C语言编写的贪吃蛇游戏
- 【C语言】编写一个函数实现n^k,使用递归实现
- 【C语言】编写一个折半查找函数
- 一个C语言编写的不重复随机序列算法
- 编写函数,其功能是:将一个数字字符串转换为一个整数(不得调用C语言中提供的将字符串转换成整数的函数。)要求在主函数中输入该字符串并输出转换后的整数的值。
- 链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。 用C语言编写 用以存放输入的二进制数 建立 一个带头结点的线性链表
- 【C语言】为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- c语言:编写一个程序,可以直接接收键盘字符