输入年,输出一整年的日历

输入年,输出一整年的日历

 

 

 

 

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include<math.h>

 

int Year_return, Month_return, Days_return;                               //date_after_days()的传出参数

 

int Left_remain_output_days = 0, Right_remain_output_days = 0;             //循环中每月剩余需要的输出的天数,left是1~6月,right是另一边

 

int days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };       //每月的天数

 

//输出普通的表头

void print_head(int year) {

    printf("|-------------------------------------------------------The Calender of Year %d-------------------------------------------------------|\n",year);

}

//输出普通的表尾

void print_tail() {

    printf("|---------------------------------------------------------------------------------------------------------------------------------------|\n");

}

 

//输出每月开始的表头,传入month

void print_month_head(int month) {

    printf("|\t%d\tSun\tMon\tTue\tWed\tThu\tFri\tSat\t%d\tSun\tMon\tTue\tWed\tThu\tFri\tSat\t|\n", month, month + 6);

}

 

//return每隔一年要加的天数

int add_days_if_lunar(int year_pointer) {               

    if (year_pointer % 4 == 0 && year_pointer % 100 != 0 || year_pointer % 400 == 0) {

         return 366;

    }

    else

         return 365;

}

 

//获取该日与1970.1.1相隔的天数

int days_between_1970(int year, int month, int day) {

    int year_pointer = 1970, month_pointer = 1, day_pointer = 1;           //计算机系统日期的起始时间

    int sum = 0;

    int days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };       //每月总天数

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {

         days_of_month[1] = 29;

    }

 

    while (year - year_pointer > 0) {                                          //隔年加每年的天数

         sum += add_days_if_lunar(year_pointer);

         year_pointer++;

    }

 

    while (month - month_pointer > 0) {                                        //隔月加天数

         sum += days_of_month[month_pointer - 1];

         month_pointer++;

    }

    sum += day;

 

    return sum;

}

 

//返回星期几

int day_of_week_get(int sum) {                                                 //参数:相隔1970.1.1的天数

    int day_of_week = 4;                                                      //day_of_week初始化为1970.1.1的星期四,最后加相隔天数再%7就是星期几

    day_of_week = (sum + day_of_week - 2) % 7 + 1;

    return day_of_week;

}

 

//返回过了passed_days天后的日期

void date_after_days(int year,int month,int day,int passed_days) {

    int days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };       //每月总天数

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {

         days_of_month[1] = 29;

    }

 

    while (passed_days > 0) {

         day++;

         passed_days--;

         if (day > days_of_month[month-1]) {

             day = 1;

             month++;

         }

         if (month > 12) {

             month = 1;

             year++;

         }

    }

 

    Year_return = year;

    Month_return = month;

    Days_return = day;

}

 

//输出每行数字的循环

int print_number_line_of_each_side(int year,int month,int day_output_start) {

    int space_number = day_output_start;                 //指示空格之后的 1 的个数

    //输出开头的空格

    while (space_number > 0) {                          

         printf(" \t");

         space_number--;

    }

 

    int *remain_output_days;

    if (month <= 6) {                                    //判断是哪一边的remain_days要初始化

         remain_output_days = &Left_remain_output_days;

    }

    else {

         remain_output_days = &Right_remain_output_days;

    }

 

    int cursor = 0;

 

    //开始循环输出数字

    for (cursor = day_output_start - 1 + 2; cursor <= 8; cursor++) {

         if (*remain_output_days >= 1) {                      //如果还需要输出日期的数字,就继续输出

             if (cursor == 8) {

                  if (month <= 6) {

                      printf(" \t");

                  }

                  break;

             }

             printf("%d \t", days_of_month[month - 1] - *remain_output_days + 1);

             (*remain_output_days)--;

         }

         else {           

             if (!(cursor == 8 && *remain_output_days == 0 && month > 6))

                  printf(" \t");                                  //输出每月末的空格

         }

    }

 

    return false;

}

 

int main(){

    int year = 0, sum = 0, start_month = 0;

    int day_output_start;

    printf("Please input the year whose calendar you want to know:");

    scanf("%d", &year);

    year = 2004;

 

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {

         days_of_month[1] = 29;

    }

 

    //输出每年的开始的表头

    print_head(year);

 

    for (start_month = 1; start_month <= 6; start_month++) {

         print_month_head(start_month);

         for (int test = 0; test < 6; test++) {

             printf("|\t \t");

             if (test == 0) {

                  Left_remain_output_days = days_of_month[start_month - 1];

                  day_output_start = day_of_week_get(days_between_1970(year, start_month, 1));         //获取这个月的第一天的星期几

                  print_number_line_of_each_side(year, start_month, day_output_start);

             }

             else

                  print_number_line_of_each_side(year, start_month, 0);

 

             if (test == 0) {

                  Right_remain_output_days = days_of_month[start_month - 1 + 6];

                  day_output_start = day_of_week_get(days_between_1970(year, start_month + 6, 1));             //获取加6个月后的第一天的星期几

                  print_number_line_of_each_side(year, start_month + 6, day_output_start);

             }

             else

                  print_number_line_of_each_side(year, start_month + 6, 0);

             printf("|\n");

         }

 

    }

 

    print_tail();

 

    return 0;

}

 

 

 

 

 

posted on 2021-01-29 19:49  平ping  阅读(285)  评论(0)    收藏  举报