能够对超出范围的数据,或者录入的错误数据给出错误提示。界面清晰,可以通过键盘录入年、月,也可以通过“←”和“→”实现月份的增减,通过“↑”和“↓”实现年份的增减。
3、编写一日历显示程序(2人)
具体要求实现如下功能:
1)能够显示日历信息,包括年份、月份、星期。
2)能够指定1949-2050年之间的任意年份、月份。
3)能够对超出范围的数据,或者录入的错误数据给出错误提示。
4)界面清晰,可以通过键盘录入年、月,也可以通过“←”和“→”实现月份的增减,通过“↑”和“↓”实现年份的增减。
#include "time.h"
#include "stdio.h"
/*
struct tm {
int tm_sec; // 秒 – 取值区间为[0,59]
int tm_min; // 分 - 取值区间为[0,59]
int tm_hour; // 时 - 取值区间为[0,23]
int tm_mday; // 一个月中的日期 - 取值区间为[1,31]
int tm_mon; // 月份(从一月开始,0代表一月) - 取值区间为[0,11]
int tm_year; // 年份,其值等于实际年份减去1900
int tm_wday; // 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推
int tm_yday; // 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。
};
*/
int CAL[6][7]; //存放一个月的月历信息
char WEEK[7][10]={{"星期日"},{"星期一"},{"星期二"},{"星期三"},{"星期四"},{"星期五"},{"星期六"}};
void initData()
{ //初始化数据
int i,j;
for(i=0;i<6;i++)
for(j=0;j<7;j++)
CAL[i][j]=-1;
}
int dayNum(int y,int m)
{ //根据年份,月份,返回该月的天数
if((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))
return 31;
else if((m==4)||(m==6)||(m==9)||(m==11))
return 30;
else if(m==2)
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 29;
else
return 28;
}
else
return 0;
}
int getWeekDay(int y,int m,int d)
{
//输入年月日,返回该天为星期几
struct tm t;
time_t t_of_day;
int weekday;
t.tm_year=y-1900; //年
t.tm_mon=m-1; //月
t.tm_mday=d; //日
t.tm_hour=0; //时
t.tm_min=0; //分
t.tm_sec=1; //秒
t.tm_isdst=0;
t_of_day=mktime(&t); //70-1-1之后的时间
// printf(ctime(&t_of_day));
weekday=t.tm_wday;
return weekday;
}
void createCal(int y,int m)
{ //对选定月份的月历数据表进行初始化
int w,i,j,k,d;
//k代表本月总天数,w代表本月第一天为星期几
w=getWeekDay(y,m,1);
k=dayNum(y,m);
d=1;
for(j=w;j<7;j++,d++)
CAL[0][j]=d; //设置月历第一行数据
for(i=1;i<6;i++) //设置第2-5行数据
for(j=0;j<7;j++,d++)
{
if(d<=k)
CAL[i][j]=d;
else
return ;
}
}
void printHead(int y,int m)
{ //打印首部:年月,以及星期一,星期二。。。。。
int i;
printf("\n");
for(i=0;i<23;i++)
printf(" ");
printf("%d年%d月\n\n",y,m);
for(i=0;i<7;i++)
printf("%8s",WEEK[i]);
printf("\n");
}
void printCal()
{ //输出月历内容
int i,j;
for(i=0;i<6;i++)
{
for(j=0;j<7;j++)
{
if(CAL[i][j]<1)
printf(" ");
else if(CAL[i][j]<10)
printf(" %d ",CAL[i][j]);
else
printf(" %d ",CAL[i][j]);
}
printf("\n");
}
}
void output(int y,int m)
{ //输出某年某月的月历内容
initData(); //初始化数据
createCal(y,m); //生成日历
printHead(y,m); //输出首部
printCal(); //输出该月月历
}
int curYear()
{ //获取当前年份
struct tm *tmp;
time_t lt;
lt=time(NULL);
tmp=gmtime(<);
return tmp->tm_year+1900;
}
int curMonth()
{ //获取当前月份
struct tm *tmp;
time_t lt;
lt=time(NULL);
tmp=gmtime(<);
return tmp->tm_mon+1;
}
void main()
{
int y,m,d,flag;
char c;
output(curYear(),curMonth());
} 调用就可以了
具体要求实现如下功能:
1)能够显示日历信息,包括年份、月份、星期。
2)能够指定1949-2050年之间的任意年份、月份。
3)能够对超出范围的数据,或者录入的错误数据给出错误提示。
4)界面清晰,可以通过键盘录入年、月,也可以通过“←”和“→”实现月份的增减,通过“↑”和“↓”实现年份的增减。
#include "time.h"
#include "stdio.h"
/*
struct tm {
int tm_sec; // 秒 – 取值区间为[0,59]
int tm_min; // 分 - 取值区间为[0,59]
int tm_hour; // 时 - 取值区间为[0,23]
int tm_mday; // 一个月中的日期 - 取值区间为[1,31]
int tm_mon; // 月份(从一月开始,0代表一月) - 取值区间为[0,11]
int tm_year; // 年份,其值等于实际年份减去1900
int tm_wday; // 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推
int tm_yday; // 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。
};
*/
int CAL[6][7]; //存放一个月的月历信息
char WEEK[7][10]={{"星期日"},{"星期一"},{"星期二"},{"星期三"},{"星期四"},{"星期五"},{"星期六"}};
void initData()
{ //初始化数据
int i,j;
for(i=0;i<6;i++)
for(j=0;j<7;j++)
CAL[i][j]=-1;
}
int dayNum(int y,int m)
{ //根据年份,月份,返回该月的天数
if((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12))
return 31;
else if((m==4)||(m==6)||(m==9)||(m==11))
return 30;
else if(m==2)
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 29;
else
return 28;
}
else
return 0;
}
int getWeekDay(int y,int m,int d)
{
//输入年月日,返回该天为星期几
struct tm t;
time_t t_of_day;
int weekday;
t.tm_year=y-1900; //年
t.tm_mon=m-1; //月
t.tm_mday=d; //日
t.tm_hour=0; //时
t.tm_min=0; //分
t.tm_sec=1; //秒
t.tm_isdst=0;
t_of_day=mktime(&t); //70-1-1之后的时间
// printf(ctime(&t_of_day));
weekday=t.tm_wday;
return weekday;
}
void createCal(int y,int m)
{ //对选定月份的月历数据表进行初始化
int w,i,j,k,d;
//k代表本月总天数,w代表本月第一天为星期几
w=getWeekDay(y,m,1);
k=dayNum(y,m);
d=1;
for(j=w;j<7;j++,d++)
CAL[0][j]=d; //设置月历第一行数据
for(i=1;i<6;i++) //设置第2-5行数据
for(j=0;j<7;j++,d++)
{
if(d<=k)
CAL[i][j]=d;
else
return ;
}
}
void printHead(int y,int m)
{ //打印首部:年月,以及星期一,星期二。。。。。
int i;
printf("\n");
for(i=0;i<23;i++)
printf(" ");
printf("%d年%d月\n\n",y,m);
for(i=0;i<7;i++)
printf("%8s",WEEK[i]);
printf("\n");
}
void printCal()
{ //输出月历内容
int i,j;
for(i=0;i<6;i++)
{
for(j=0;j<7;j++)
{
if(CAL[i][j]<1)
printf(" ");
else if(CAL[i][j]<10)
printf(" %d ",CAL[i][j]);
else
printf(" %d ",CAL[i][j]);
}
printf("\n");
}
}
void output(int y,int m)
{ //输出某年某月的月历内容
initData(); //初始化数据
createCal(y,m); //生成日历
printHead(y,m); //输出首部
printCal(); //输出该月月历
}
int curYear()
{ //获取当前年份
struct tm *tmp;
time_t lt;
lt=time(NULL);
tmp=gmtime(<);
return tmp->tm_year+1900;
}
int curMonth()
{ //获取当前月份
struct tm *tmp;
time_t lt;
lt=time(NULL);
tmp=gmtime(<);
return tmp->tm_mon+1;
}
void main()
{
int y,m,d,flag;
char c;
output(curYear(),curMonth());
} 调用就可以了
温馨提示:答案为网友推荐,仅供参考