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语言实现万年历
107 0
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(下)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
C语言经典实例:11-20例:使用结构体输出学生成绩、编制万年历、验证哥德巴赫猜想、求二维数组最大最小值、数组求素数、数组元素排序、进制数的转换进制数的转换、找出次大值、重组数组(上)
|
程序员 C语言 C++
教你用C语言编写万年历,程序员超乎你的想象!
教你用C语言编写万年历,程序员超乎你的想象!
1891 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历
1. 写了个万年历的功能练练手。还没有写交互的代码,只是把方法写完了。先给出头部和方法签名 #include #define DAYS_PER_WEEK 7 #define MONTHS 12 #define DATE_HEADER " Sun Mon Tues Wed...
1888 0
|
算法 C语言
【C语言】第一个C语言小程序 —— 日期算法和万年历2
1. 上一篇我们只完成了   a. 算出某年某月某日是星期几   b. 打印出某年某月的日历 这一次我写了一个打印某一年的日历。一开始我是不打算写的,因为可以调用之前的方法,分别打印出这一年12个月的日历。
1875 0
|
机器学习/深度学习 C语言 Windows
用C语言写的万年历---亲手写的。好累哦
#include #include #include #define str "   SUN   MON  TUE   WED   THU   FRI   SAT   "void menu();         //操作菜单 int leap(int year);        //判断某年是不...
893 0
|
C语言
C语言实现万年历
给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include #include long int f(int year,int month) { /*f(年,月)=年-1,如月
1428 0
|
16天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
52 23
|
16天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
46 15

热门文章

最新文章