C语言之日历问题

一、代码展示 

#include<stdio.h>
int leapyear(int year)//判断是不是闰年函数
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}
int days(int year, int month, int* day)//判断一个月有几天
{if (month != 2)return day[month - 1];elsereturn 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}
int sumdays(int year, int month, int* day) 
{int sum=0;for (int i = 1900; i < year; i++) {if (leapyear(i) == 1)sum += 366;elsesum += 365;}for (int j = 1; j < month; j++) {sum += days(year, j, day);//计算一年中到目标月有几天}return sum;
}
int print(int month, int year, int* day) {int max = days(year, month, day);int min = sumdays(year, month, day) % 7;printf("       %d月      %d年       \n", month, year);printf("  一  二  三  四  五  六  日\n");for (int j = min; j > 0; j--) {printf("    ");}for (int i = 1; i <= max; i++) {printf("%4d", i);if ((i + min) % 7 == 0)printf("\n");}
}int main() {int year, month;int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };printf("Please enter the year and month you want to query:");scanf("%d %d", &year, &month);if (month > 12 || month < 1){printf("Input Error!\n");}print(month, year, day);putchar('\n');return 0;
}

二、代码分析

int leapyear(int year)//判断是不是闰年函数
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)return 1;elsereturn 0;
}

 这是一个名为 leapyear 的函数,用来判断给定的年份是否为闰年。根据闰年的规则,如果一个年份能被4整除且不能被100整除,或者能被400整除,那么这个年份就是闰年。该函数返回1表示是闰年,返回0表示不是闰年。

int days(int year, int month, int* day)//判断一个月有几天
{if (month != 2)return day[month - 1];elsereturn 28 + leapyear(year);//如果是闰年则28+1;如果不是就28
}

days 函数用于确定一个月份有多少天。对于非二月(2月)的月份,天数直接由数组 day 提供,其中 day 数组包含了每个月的天数。对于2月,如果当前年是闰年,那么2月就有29天,否则只有28天。

int sumdays(int year, int month, int* day) 
{int sum=0;for (int i = 1900; i < year; i++) {if (leapyear(i) == 1)sum += 366;elsesum += 365;}for (int j = 1; j < month; j++) {sum += days(year, j, day);//计算一年中到目标月有几天}return sum;
}

sumdays 函数计算从1900年到给定年份的前一年之间的总天数,再加上给定年份中截止到目标月份的总天数。这样得到的是自1900年以来的累积天数,可以用来确定星期几。

int print(int month, int year, int* day) {int max = days(year, month, day);int min = sumdays(year, month, day) % 7;printf("       %d月      %d年       \n", month, year);printf("  一  二  三  四  五  六  日\n");for (int j = min; j > 0; j--) {printf("    ");}for (int i = 1; i <= max; i++) {printf("%4d", i);if ((i + min) % 7 == 0)printf("\n");}
}

print 函数负责打印出给定月份和年份的日历。首先,它调用 days 和 sumdays 函数来获取这个月有多少天和月初是星期几。然后按照格式打印出日历的头信息,接着通过循环打印出日期,并在每7个数字后换行以形成一周的格式。

int main() {int year, month;int day[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };printf("Please enter the year and month you want to query:");scanf("%d %d", &year, &month);if (month > 12 || month < 1){printf("Input Error!\n");}print(month, year, day);putchar('\n');return 0;
}

主函数 main 是程序的入口点。它声明了两个整数变量 year 和 month 来存储用户输入的年份和月份。还初始化了一个包含各个月份天数的数组 day。接下来提示用户输入要查询的年份和月份,并检查输入是否有效(即月份是否在1到12之间)。最后调用 print 函数打印日历,并在结束时添加一个新行字符。

三、结果展示

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

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

相关文章

如何在JavaScript中使用大于和小于运算符

在你的 JavaScript 程序中&#xff0c;你经常需要比较两个值&#xff0c;以确定一个是否大于另一个或小于另一个。这就是大于和小于运算符派上用场的地方。 在本文中&#xff0c;我们将通过代码示例更详细地介绍如何使用这些运算符。 &#xff08;本文内容参考&#xff1a;ja…

Acwing---875. 快速幂

快速幂 1.题目2.基本思想3.代码实现 1.题目 给定 n n n 组 a i ai ai, b i bi bi, p i pi pi&#xff0c;对于每组数据&#xff0c;求出 abii m o d mod mod pi 的值。 输入格式 第一行包含整数 n n n。 接下来 n n n 行&#xff0c;每行包含三个整数 a i ai ai, b i …

Leetcode-102. 二叉树的层序遍历

今天的情人节和树过了...... 题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[…

【机器学习笔记】 9 集成学习

集成学习方法概述 Bagging 从训练集中进行子抽样组成每个基模型所需要的子训练集&#xff0c;对所有基模型预测的结果进行综合产生最终的预测结果&#xff1a; 假设一个班级每个人的成绩都不太好&#xff0c;每个人单独做的考卷分数都不高&#xff0c;但每个人都把自己会做的…

Atmel ATSHA204应用总结

1 ACES软件安装 Atmel Crypto Evaluation Studio (ACES) https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/Atmel%20Crypto%20%20Studio%20(ACES) 2 基本概念 ACES CE&#xff1a;Atmel Crypto Evalution Studio Configuration Environment&#xff08;基于加…

L2-021 点赞狂魔

一、题目 二、解题思路 统计每个人点赞的不同标签的数量&#xff1a;每行列出一位用户的点赞标签&#xff0c;这些标签可能有重复的&#xff0c;所以将用户的点赞标签存放在 set 里&#xff0c;通过 size() 函数获得点赞的不同标签的数量&#xff1b;结构体包括用户的信息&…

Uniapp真机调试没有检测到设备,请插入设备或启动模拟器后刷新再试

最近用HbuilderX开发遇到了一个问题&#xff0c;之前插上手机就能调试&#xff0c;但最近再写app的时候&#xff0c;插上手机&#xff0c;也打开了开发者模式&#xff0c;但就是检测不到设备。 后来发现是要打开MIDI模式。vivo手机路径为&#xff1a;系统管理与升级->开发者…

VS2022创建控制台应用程序后没有Main了,该如何解决?

用VS2022创建一个控制台应用后&#xff0c;没有名称空间和Main函数了&#xff0c;只有一个WriteLine&#xff0c;如下所示。 // See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!");首先说明一下原因&#xff0c;在…

元器件焊盘的PCB处理方式分析与总结

对于高速信号走线的特性阻抗&#xff0c;都需要按照实际要求进行精度控制&#xff0c;所以&#xff0c;任何因设计因素带来的阻抗波动都应该进行优化&#xff0c;如下图所示&#xff0c;为一个12层板设计中的50Ω微带走线&#xff0c;需要在走线之上放置电感&#xff1b; 但是&…

django定时任务(django-crontab)

目录 一&#xff1a;安装django-crontab&#xff1a; 二&#xff1a;添加django_crontab到你的INSTALLED_APPS设置&#xff1a; 三&#xff1a;运行crontab命令来创建或更新cron作业&#xff1a; 四&#xff1a;定义你的cron作业 五&#xff1a;创建你的管理命令&#xff…

RCS系统之:基础算法

设计仓库机器人的控制管理系统涉及到路径规划、任务分配、库存管理、通信系统等方面。以下是一个基本的仓库机器人控制管理系统方案的概述&#xff1a; 路径规划&#xff1a;设计一个路径规划系统&#xff0c;用于确定机器人在仓库内的最佳行驶路径&#xff0c;以最大程度地提…

vue3之setup的基本使用

setup是一个全新的配置项&#xff0c;值是一个函数&#xff0c;既然是配置项&#xff0c;是否与data、methods是兄弟&#xff1f; 没错&#xff0c;确实是兄弟关系&#xff0c;只不过到了vue3&#xff0c;就不怎么使用data这些配置项&#xff0c;会使用setup&#xff0c;让我为…