编程实现,获取计算机的当前时间,根据当前日期的年份和月份,在屏幕上输出本月的月历,并等待用户输入。
例如当前是2011-11-11,则在屏幕上输出:
2011年11月 月历
星期日 |
星期一 |
星期二 |
星期三 |
星期四 |
星期五 |
星期六 |
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
|
|
|
运行后,当用户按键盘上的“<-”键时,输出当前显示月份的前一月的月历,按键盘上的“->”键,输出当前月份的后一月的月历,直到用户按回车键后结束程序运行。
提示:计算元旦是星期几的算法:设year表示年
d=year+((year-1)/4)-((year-1)/100)+((year-1)/400)
week=d除7的余数;如果week=0表示元旦为星期日;week=1则表元旦为星期一、……依此类推。
注意:请采用结构化程序的设计的方法,按照如下要求编写程序:
(1) 编写函数void getCurrenDate(int * year,int * month),在该函数中,获取系统时间,将当前日期的年份、月份分别存放在参数year和month所指向的变量中
(2) 编写函数int getNewYearDay(int year),在该函数中,返回参数year所表示的年份的元旦是星期几,如果是星期日返回0,星期一返回1,……,其余依此类推
(3) 编写函数void show(),在该函数中循环的等待接收用户的输入,并根据用户的输入,输出相应月份的月历。当按“<-”键时,输出当前显示月份的前一月的月历,当按“->”键时,输出当前月份的后一月的月历,按回车键时,结束循环。
(4) 编写函数void printCalendar (int year,int month),在该函数中,按照题目要求,根据参数year表示的年份和month表示的月份,输出该月的月历
(5) 在main函数中调用函数,完成程序的功能。
代码:
#include
#include
#include
const int leap_Year_Month[]={31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int noleap_Year_Month[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const char *Week[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL};
const int Base_year = 1900;
const int Day_of_week = 7;
const int Base_mon = 1;
//declare of the functions
void getCurrenDate(int *year, int *month);
int getNewYearDay(int year);
void show();
void printCalendar(int _year, int _month);
int leapYear(int year);
int leapYear(int year){
if((year != 0) && (year % 100 == 0 && year % 400 == 0) || (year % 100 != 0 && year % 4 == 0))
return 1;
else
return 0;
}
void getCurrenDate(int *year, int *month){
time_t rawtime;
struct tm * timeinfo;
time( &rawtime );
timeinfo = localtime( &rawtime );
*year = timeinfo->tm_year + Base_year;
*month = timeinfo->tm_mon + Base_mon;
//printf("today is %d %d", *year, *month);
}
inline int getNewYearDay(int year){
int d = year + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400);
return d % Day_of_week;
}
void show(){
int year, month;
char ch;
getCurrenDate(&year, &month);
printCalendar(year, month);
while(1){
printf("\n");
printf("please choose the options: \nforward (Key: f), backward(Key: b), stop(Key :Enter)");
ch = getchar();
getchar();
if( ch == 'b' ){
month--;
if(month == 0) {
year--;
month=12;
printCalendar(year, month);
}
else
printCalendar(year, month);
}
else
if (ch == 'f') {
month++;
if(month == 13) {
year++;
month = 1;
printCalendar(year, month);
}
else
printCalendar(year, month);
}
else
if(ch == '\n')break;
else continue;
}
}
void printCalendar(int _year, int _month){
int sum = 0, control = 0;
int i = 0, j = 0, k = 0;
printf("\t\t\tYear: %d\tMonth: %d\n", _year, _month);
printf("\tSun\tMon\tTue\tWed\tThu\tFri\tSat\n");
if(leapYear(_year) == 1) {
sum = getNewYearDay(_year);
for ( k = 0; k < _month-1; ++k)
sum += leap_Year_Month[k];
control = sum % Day_of_week;
for ( i = 0; i < control; i++)printf("\t");
for ( j = 0; j < leap_Year_Month[_month - 1]; j++ )
{
printf("\t%d", j+1);
if((j+1 + control) % Day_of_week == 0) printf("\n");
}
}
else
{
sum = getNewYearDay(_year);
for ( k = 0; k < _month-1; ++k)
sum += noleap_Year_Month[k];
control = sum % 7;
for ( i = 0; i < control; i++)printf("\t");
for ( j = 0; j < noleap_Year_Month[ _month -1]; j++ )
{
printf("\t%d", j+1);
if((j+1 + control)% Day_of_week == 0) printf("\n");
}
}
}
int main()
{
show();
}