C语言实现万年历(附代码)

简介: 公元元1年1月1日是星期一(注:有说是星期六的,但从程序倒推回去是星期一,具体原因是一些历史问题,并不影响后续年份日历的呈现)。

C语言实现万年历

具备知识

1.公元元1年1月1日是星期一(注:有说是星期六的,但从程序倒推回去是星期一,具体原因是一些历史问题,并不影响后续年份日历的呈现)。

教皇格里戈八世在1582年2月24日颁布法令,永远抹去了1582年10月5日到1582年10月14日。

历史上从来不曾有过这10天。1582年10月4日是星期四,它的第二天是1582年10月15日星期五。

因此考虑到这10天的影响再去推算,公元元年1月1日就是星期六了。这里就以星期一进行计算。

2.判断平年与闰年的方法。

闰年:普通年需是4的整数倍,世纪年需是400的整数倍。

平年:除去闰年的全是平年。

3.平年2月有28天,闰年2月有29

(特别说明:该日历第一天是按星期日开始的,如下图所示)

2345_image_file_copy_99.jpg

各函数说明

检查平年闰年函数

将判断平年闰年的语句封装成函数,便于调用。

int check_year(int year){//检查平年闰年函数
  if((year%400==0)||(year%4==0&&year%100!=0)){
    return 1;//闰年返回1
  }else{
    return 0;//平年返回0
  }
}

判断需要输出年份的1月1日是星期几

该函数计算该年以前的所有天数,并除7取余,即得到所要输出年1月1日是星期几(0:代表星期日)。

int week_f(int year){//返回xx年1月1日是星期几 
  if(year==1){//1年1月1日星期一
    return 1;
  }
  int sum=0;
  for(int i=1;i<year;i++){
    if(check_year(i)==1){
      sum=sum+366;
    } else{
      sum=sum+365;
    }
  }
  return (sum+1)%7;
}

返回每月天数的函数month_run(int n)和month_ping(int n)

参数为月份。

如果是闰年则调用month_run(int n)。

否则调用month_ping(int n)。

int month_run(int n){
  switch(n){
    case 1:return 31;
    case 2:return 29;
    case 3:return 31;
    case 4:return 30;
    case 5:return 31;
    case 6:return 30;
    case 7:return 31;
    case 8:return 31;
    case 9:return 30;
    case 10:return 31;
    case 11:return 30;
    case 12:return 31;
  }
}
int month_ping(int n){
  switch(n){
    case 1:return 31;
    case 2:return 28;
    case 3:return 31;
    case 4:return 30;
    case 5:return 31;
    case 6:return 30;
    case 7:return 31;
    case 8:return 31;
    case 9:return 30;
    case 10:return 31;
    case 11:return 30;
    case 12:return 31;
  }
}

闰年输出函数

1.wee变量用于记录当前月的第一天是星期几。

下一月第一天的星期x=(上一月的星期x+上一月的天数)%7

wee=(wee+month_run(i))%7

2.enter变量用于检查什么时候换行,因为。

enter%7==0是换行条件

每月第一行时候需要加上前面的空格数量

在每个月输完enter需要减去下一个月的星期数,即

enter=enter-wee;

不然enter相当于加了两次星期数(第一次是在x个月最后一行,第二次是在x+1月的第一行空格处)。

void run(int week){
  int enter=0;//记录换行 
  int wee=week;
  for(int i=1;i<=12;i++){//最外层遍历12个月 
    printf("------>%d月<------\n",i);
    printf("日 一 二 三 四 五 六\n") ;//输出星期标头 
    for(int k=0;k<wee;k++){//输出空格 
      printf("  ");
      enter++;
    } 
    for(int j=1;j<=month_run(i);j++){//输出每月的天 
      if(enter%7==0){
        printf("\n");
      }
      printf("%d  ",j);
      enter++;  
    }
    wee=(wee+month_run(i))%7;
    enter=enter-wee;
    printf("\n\n\n"); 
  }
}

源码

#include<stdio.h>
/*1.公元1年1月1日,是星期一
  2.累加至输入年份之前的所有年的天数
  3.总天数模7,0(星期日)---6(星期六) 
*/
int check_year(int year){//检查平年闰年函数
  if((year%400==0)||(year%4==0&&year%100!=0)){
    return 1;
  }else{
    return 0;
  }
}
int week_f(int year){//返回xx年1月1日是星期几
  if(year==1){
    return 1;
  }
  int sum=0;
  for(int i=1;i<year;i++){
    if(check_year(i)==1){
      sum=sum+366;
    } else{
      sum=sum+365;
    }
  }
  //printf("sum=%d\n",sum);
  return (sum+1)%7;
}
int month_run(int n){
  switch(n){
    case 1:return 31;
    case 2:return 29;
    case 3:return 31;
    case 4:return 30;
    case 5:return 31;
    case 6:return 30;
    case 7:return 31;
    case 8:return 31;
    case 9:return 30;
    case 10:return 31;
    case 11:return 30;
    case 12:return 31;
  }
}
int month_ping(int n){
  switch(n){
    case 1:return 31;
    case 2:return 28;
    case 3:return 31;
    case 4:return 30;
    case 5:return 31;
    case 6:return 30;
    case 7:return 31;
    case 8:return 31;
    case 9:return 30;
    case 10:return 31;
    case 11:return 30;
    case 12:return 31;
  }
}
///闰年输出函数 
void run(int week){
  int enter=0;//记录换行 
  int wee=week;
  for(int i=1;i<=12;i++){//最外层遍历12个月 
    printf("------>%d月<------\n",i);
    printf("日 一 二 三 四 五 六\n") ;//输出星期标头 
    for(int k=0;k<wee;k++){//输出空格 
      printf("  ");
      enter++;
    } 
    for(int j=1;j<=month_run(i);j++){//输出每月的天 
      if(enter%7==0){
        printf("\n");
      }
      printf("%d  ",j);
      enter++;  
    }
    wee=(wee+month_run(i))%7;
    enter=enter-wee;
    printf("\n\n\n"); 
  }
}
///平年输出函数
 void ping(int week){
  int enter=0;//记录换行 
  int wee=week;
  for(int i=1;i<=12;i++){//最外层遍历12个月 
    printf("------>%d月<------\n",i);
    printf("日 一 二 三 四 五 六\n") ;//输出星期标头 
    for(int k=0;k<wee;k++){//输出空格 
      printf("  ");
      enter++;
    } 
    for(int j=1;j<=month_ping(i);j++){//输出每月的天 
      if(enter%7==0){
        printf("\n");
      }
      printf("%d  ",j);
      enter++;  
    }
    wee=(wee+month_ping(i))%7;
    enter=enter-wee;
    printf("\n\n\n"); 
  }
}
int main(){
  int year;
  int week=0;
  int sum=0; 
  printf("请输入年份:");
  scanf("%d",&year); 
  week=week_f(year);
  if(check_year(year)==1){
    run(week);
  } else{
    ping(week);
  }
  return 0;
}

运行结果

2345_image_file_copy_100.jpg


相关文章
|
C语言
C语言实现万年历
C语言实现万年历
90 0
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
|
程序员 C语言 C++
教你用C语言编写万年历,程序员超乎你的想象!
教你用C语言编写万年历,程序员超乎你的想象!
1867 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历
1. 写了个万年历的功能练练手。还没有写交互的代码,只是把方法写完了。先给出头部和方法签名 #include #define DAYS_PER_WEEK 7 #define MONTHS 12 #define DATE_HEADER " Sun Mon Tues Wed...
1881 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历2
1. 上一篇我们只完成了   a. 算出某年某月某日是星期几   b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历。一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历。
1866 0
|
机器学习/深度学习 C语言 Windows
用C语言写的万年历---亲手写的。好累哦
#include #include #include #define str "   SUN   MON  TUE   WED   THU   FRI   SAT   "void menu();         //操作菜单 int leap(int year);        //判断某年是不...
888 0
|
C语言
C语言实现万年历
给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include #include long int f(int year,int month) { /*f(年,月)=年-1,如月
1419 0
|
24天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
15天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
30 10