C语言实现万年历
前言:本文章向大家介绍如何使用C语言代码实现万年历使用实例,讲解编写万年历的方法,教你轻松学会写出万年历。这个小程序算是我自己写的第一个比较完整的小程序,算是对大一上学期学习的C语言程序设计基础的一个总结
知识强调
特别说明
各函数说明
1.打印星号函数
2.打印日历抬头函数
3.判断闰年平年函数
4.计算总天数函数
5.打印日历函数
6.main函数(主函数)
完整代码
总结
知识强调
1.由于教皇格里戈八世在1582年2月24日颁布法令,永远抹去了1582年10月5日到1582年10月14日。所以导致历史上永远不存在这10天。1582年2月24日是星期四,它的第二天是1582年10月5日,这天是星期五。
因此考虑到这十天的影响,所以本篇文章使用1900年1月1日进行计算,这天正好是星期一,便于我们的程序计算。
2.判断闰年与平年的方法
闰年:年份数是4的倍数但不是100的倍数,或者年份数是400的倍数。
平年:除去闰年的年份就都是平年。
3.闰年有366天,平年有365天。闰年的二月有29天,平年的二月有28天。
特别说明:
1.本文所写的日历的第一天是从星期一开始的,与某些纸质日历从星期日开始的不同。
2.本篇文章所写的日历是某一年某一个月的日历,不是完整的年日历。
如下图所示
各函数说明
1.打印星号函数
void printStar()
{
printf("*****************************************************\n");
}
目的是为了在修饰输出后的万年历,使其更加美观,好看。
2.打印日历抬头函数
char weekday[7][10]={"一","二","三","四","五","六","日"};
void printBegin()
{
printf("\t\t\t万年历\t\t\t\n");
printStar();
for(int i=0;i<7;i++)
{
printf("%s\t",weekday[i]);
}
printf("\n");
}
将日历的抬头与封装在一起,方便输出周一至周日。
3.判断闰年平年函数
int leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
/*int four,hundred,fourhundred;
four=year%4;
hundred=year%100;
fourhundred=year%400;
if(four==0&&hundred==0&&fourhundred==0)
{
return 1;
}
else if(four==0&&hundred!=0&&fourhundred!=0)
{
return 1;
}
return 0;*/
}
将判断闰年与平年的函数封装成一个函数,更见方便调用。在这里,计算平年与闰年有两种方法,第二种方法理解起来有点麻烦。更加希望选择第一种。
4.计算总天数函数
//1900年1月1日是星期一,比较方便后面的计算
//我们需要算我们输入的年份离1900年有多少天
int daySum(int year,int month)
{
//1900 1 1 是星期一
int i,sum=0;
for(i=1900;i<year;i++)
{
//判断当前年份是闰年还是平年
{
if(leap(i))
{
sum+=366;
}
else
{
sum+=365;
}
}
}
for(i=0;i<month-1;i++)//i<month-1是因为我们不能将我们输入的月份计算在内
{
if(leap(year)==1)
{
sum+=runnian[i];
}
else
{
sum+=pingnian[i];
}
}
return sum;
}
这个函数是计算我们输入的月份离1900年1月1日有多少天,方便我们下面计算。
5.打印日历函数
//打印日历
void printResult(int sum,int year,int month)
{
int result,temp,i;//result为余数,temp为中间变量,i为循环变量
result=sum%7;//日历上前面空余的天数,就是总天数除以7的余数
//把当前月份空余的天数用空格表示
for(i=0;i<result;i++)
{
printf("\t");
}
temp=7-result;//从第几格开始打印一号
if(leap(year)==1)
{
//数组下标从0开始
//月份只能从1开始
for(i=1;i<=runnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
else
{
for(i=1;i<=pingnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
}
printf("\n");
}
这个函数的作用就是打印日历,result是日历上面空余的天数
得到的result就是为了将这些空白部分输出,把当前月份空余天数输出。
5.main函数(主函数)
int main(void)
{
//用户输入年 月
printf("请输入年-月:");
scanf("%d-%d",&year,&month);
printBegin();
int sum=daySum(year,month);
printResult(sum,year,month);
printStar();
system("pause");//防止闪屏
return 0;
}
将其他函数在主函数中调用,就能做出一个完整的万年历。
完整代码
/*
1.用户输入年,月
2.打印一个日历
*/
#define _CRT_SECURE_NO_WARNINGS//使用宏定义是让编译器进行操作,让编译器忽略内库存的问题
#include<stdio.h>
#include<stdlib.h>
int year,month;
//闰年和平年 2月份天数不一样
int runnian[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int pingnian[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char weekday[7][10]={"一","二","三","四","五","六","日"};
//打印星号
void printStar()
{
printf("*****************************************************\n");
}
//打印日历的抬头
void printBegin()
{
printf("\t\t\t万年历\t\t\t\n");
printStar();
for(int i=0;i<7;i++)
{
printf("%s\t",weekday[i]);
}
printf("\n");
}
//判断当前年份是闰年还是平年
int leap(int year)
{
if(year%4==0&&year%100!=0||year%400==0)
{
return 1;
}
else
{
return 0;
}
/*int four,hundred,fourhundred;
four=year%4;
hundred=year%100;
fourhundred=year%400;
if(four==0&&hundred==0&&fourhundred==0)
{
return 1;
}
else if(four==0&&hundred!=0&&fourhundred!=0)
{
return 1;
}
return 0;*/
}
//1900年1月1日是星期一,比较方便后面的计算
//我们需要算我们输入的年份离1900年有多少天
int daySum(int year,int month)
{
//1900 1 1 是星期一
int i,sum=0;
for(i=1900;i<year;i++)
{
//判断当前年份是闰年还是平年
{
if(leap(i))
{
sum+=366;
}
else
{
sum+=365;
}
}
}
for(i=0;i<month-1;i++)//i<month-1是因为我们不能将我们输入的月份计算在内
{
if(leap(year)==1)
{
sum+=runnian[i];
}
else
{
sum+=pingnian[i];
}
}
return sum;
}
//打印日历
void printResult(int sum,int year,int month)
{
int result,temp,i;//result为余数,temp为中间变量,i为循环变量
result=sum%7;//日历上前面空余的天数 ,就是总天数除以7的余数
//把当前月份空余的天数用空格表示
for(i=0;i<result;i++)
{
printf("\t");
}
temp=7-result;//从第几格开始打印一号
if(leap(year)==1)
{
//数组下标从0开始
//月份只能从1开始
for(i=1;i<=runnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
printf("\n");
}
else
{
for(i=1;i<=pingnian[month-1];i++)
{
printf("%d\t",i);
if(i==temp||(i-temp)%7==0)
{
printf("\n");
}
}
}
printf("\n");
}
int main(void)
{
//用户输入年 月
printf("请输入年-月:");
scanf("%d-%d",&year,&month);
printBegin();
int sum=daySum(year,month);
printResult(sum,year,month);
printStar();
system("pause");//防止闪屏
return 0;
}
这里我们进行一个测试,当我们输入2022-12时,看我们所写的程序运行结果是不是能和电脑上的日历一样。
这是我们运行出来的结果:
这是电脑日历:
我们可以从这两个图片观察出,我们代码运行出来的结果与电脑日历上是差不多的。文章来源:https://www.toymoban.com/news/detail-516212.html
总结
以上便是根据年月的输入,输出所在的当月日历。在这个基础上,我们还能够编写通过输入年份,输出这一年十二个月的日历,如果感兴趣的小伙伴们,可以自行尝试写一下。
这是我第一次写的完整的一个程序,如果有错误的地方或者有疑问的地方,请大家在评论区中指出。希望大家能给我这个新人点个关注,点点赞!文章来源地址https://www.toymoban.com/news/detail-516212.html
到了这里,关于C语言实现万年历(附代码) 小白完成的第一个C语言程序,希望大家多多关注,点赞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!