C语言实现万年历(附代码) 小白完成的第一个C语言程序,希望大家多多关注,点赞

C语言实现万年历
前言:本文章向大家介绍如何使用C语言代码实现万年历使用实例,讲解编写万年历的方法,教你轻松学会写出万年历。这个小程序算是我自己写的第一个比较完整的小程序,算是对大一上学期学习的C语言程序设计基础的一个总结

万年历正文内容

  • 知识强调
  • 特别说明
  • 各函数说明
    • 1.打印星号函数
    • 2.打印日历抬头函数
    • 3.判断闰年平年函数
    • 4.计算总天数函数
    • 5.打印日历函数
    • 6.main函数(主函数)
  • 完整代码
  • 总结

知识强调

特别说明

各函数说明

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是日历上面空余的天数图片1

得到的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时,看我们所写的程序运行结果是不是能和电脑上的日历一样。
这是我们运行出来的结果:
2002-12
这是电脑日历:2002-12-
我们可以从这两个图片观察出,我们代码运行出来的结果与电脑日历上是差不多的。

总结
以上便是根据年月的输入,输出所在的当月日历。在这个基础上,我们还能够编写通过输入年份,输出这一年十二个月的日历,如果感兴趣的小伙伴们,可以自行尝试写一下。
这是我第一次写的完整的一个程序,如果有错误的地方或者有疑问的地方,请大家在评论区中指出。希望大家能给我这个新人点个关注,点点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/221274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask学习二:项目拆分、请求与响应、cookie

教程 教程地址&#xff1a; 千锋教育Flask2框架从入门到精通&#xff0c;Python全栈开发必备教程 老师讲的很好&#xff0c;可以看一下。 项目拆分 项目结构 在项目根目录下&#xff0c;创建一个App目录&#xff0c;这是项目下的一个应用&#xff0c;应该类似于后端的微服…

一般将来时

一般将来时 概念 表示将要发生的动作或打算、计划准备做某事 时间 tomorrow 明天 the day after tomorrow 后天 next week 下周 next weekend 下周末 next month 下个月 next year 明年 ...句子结构 主语 be&#xff08;am/is/are&#xff09;going to do … 计划,…

类与对象(下)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX&#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&a…

windows下docker环境搭建与运行实战

背景 学习docker使用&#xff0c;需要环境&#xff0c;今天主要的目标是在windows环境下安装docker环境。 为什么要这么搞&#xff0c;主要是企业内部服务器&#xff0c;都是跟公网隔离的&#xff0c;没有访问公网权限&#xff0c;所以镜像什么的&#xff0c;从公网拉取完全没…

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…

如果客户端同时有ipv4和ipv6,浏览器是如何选择用哪种ip

在互联网协议&#xff08;IP&#xff09;的发展历程中&#xff0c;IPv4和IPv6是两种主要的版本。对于一个客户端来说&#xff0c;同时拥有IPv4和IPv6的能力是常见的情况。那么&#xff0c;当一个客户端同时具有IPv4和IPv6的能力时&#xff0c;浏览器是如何选择使用哪种IP进行通…

pygame加载图像,并让小球做平抛运动

文章目录 load转换和存储自由落体 在游戏设计中&#xff0c;图像显示是必不可少的功能&#xff0c;pygame中的image模块便用于加载图像。 load 通过load函数&#xff0c;可以加载多种图像格式&#xff0c;如下表所示 旧版本bmp, gpeg, png, pcx, tiff, xpmc, lbm(以及pbm, p…

下载网页内容成HTML文件

今天遇到了一个非常好用的、开源的网页下载插件: SingleFile&#xff0c;它可以将当前网页里的文字、图片、超链接等&#xff0c;合并成单一的.html文件&#xff0c;便于保存和浏览查看。下面介绍SingleFile的安装和使用。 1、下载SingleFile插件 SingleFile官网地址&#xff…

【计算机网络笔记】多路访问控制(MAC)协议——轮转访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

31 - MySQL调优之SQL语句:如何写出高性能SQL语句?

从今天开始&#xff0c;我将带你一起学习 MySQL 的性能调优。MySQL 数据库是互联网公司使用最为频繁的数据库之一&#xff0c;不仅仅因为它开源免费&#xff0c;MySQL 卓越的性能、稳定的服务以及活跃的社区都成就了它的核心竞争力。 我们知道&#xff0c;应用服务与数据库的交…

一文从Vue2过渡到Vue3

文章目录 Vue3简介创建Vue3.0工程使用 vue-cli 创建使用 vite 创建Vue3工程结构变化 常用 Composition API拉开序幕的setupref函数reactive函数Vue3.0中的响应式原理vue2.x的响应式Vue3.0的响应式 reactive对比refsetup的两个注意点计算属性与监视computed函数watch函数watchEf…

Java游戏之王者荣耀

首先创建类&#xff1a; 游戏运行结果如下&#xff1a; GameFrame类 所需图片&#xff1a; GameObject类 Turret类 所需图片&#xff1a; TurretBlue类 TurretRed类 Champion类 所需图片&#xff1a; 单个&#xff1a; move包: ChampionDaji类 所需图片&#xff1a; Minio…