一个关于struct tm 和 time_t 的结构体的探讨(日历打印)。。。

 

 编程实现,获取计算机的当前时间,根据当前日期的年份和月份,在屏幕上输出本月的月历,并等待用户输入。

例如当前是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 <stdio.h>
#include <time.h>
#include <string.h>
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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值