C++实现简单日历(win11日历)

📇文章目录

  • 🚀实现目标
  • 🚀效果
  • 🚀计算上一个月的最后一天是周几
  • 🚀打印日历函数
  • 🚀完整代码

🚀实现目标

在这里插入图片描述
我们想要的效果:
1.布局类似
2.键盘按下←或者→会切换到下一个月(这里直接看原码就可以了)
3.可以实现自定义输入年份

🚀效果

按下→ 切换到下一个月
按下←切换到上一个月
按下Esc 退出
按下Tab 输入自定义年月
在这里插入图片描述

🚀计算上一个月的最后一天是周几

我们规定 公元1年1月1日是周一
所以我们只需要计算从1年1月1日到这一天一共有几天
比如 1年1月1日到1年1月6日一共有6天
那么 1年1月6日 就是周6 (6%7)

而计算从1年1月1日到上个月的最后一天 有几天

需要考虑:

  • 这一年之前有多少个年 (也就是前面有几个365天)
  • 然后 计算从1年到去年 有几个闰年 有几个闰年就+几(闰年366天)
  • 然后计算从今年第的一天到上一个月有多少天
//判断闰年函数 
bool IsLeapYear(int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		return true;
	}
	return false;
}
//计算某一个月有有几天
int DaysOfMonth(int year, int month)
{
	int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (IsLeapYear(year))
		months[2]++;
	int days = months[month];
	
	return days;
}
//计算从1年1月1日到上个月的最后一天有多少天
int TotalDaysBefore(int year, int month)
{
	int total = 0;
	/*这一年之前的天数,(以平年计算)*/
	total += (year - 1) * 365;
	/*算出这一年之前的闰年个数 366天*/
	int leapyear = (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
	total += leapyear;
	/*还有 这一年*/
	for(int i = 1; i < month; i++)
	{
		total += DaysOfMonth(year, i);
	}
	return total;
}

🚀打印日历函数

这里我们主要考虑的是
首先需要根据上个月的最后一天是周几来判断 这个月的第一天从哪里开始打印
如果上个月的最后一天是周六 那么这个月的第一天就从周天开始
而周天是第一个位置 所以前面不需要空格
如果上个月的最后一天是周一,那么这个月的第一天需要在周二开始打印
也就是前面有两个空格
我们利用一个数num来标识 上个月的最后一天是周几,num是由上个月的最后一天与1年1月1日之间的天数 %7 得到的,范围是0-6
周天num=0–空1格
周一num=1–空两格…
周六num=6–不空格
所以 如果num != 6 那么空格数是num+1

void PrintCalendar(int datys, int year, int month)
{
	cout << "Su" << '\t' << "Mo" << '\t' << "Tu" << '\t' << "We" << '\t' << "Th" << '\t' << "Fr" << '\t' << "Sa"<< endl;
	cout << endl;
	/*根据这个年月 算出之前有多少天*/
	int daysbefore = TotalDaysBefore(year, month);
	/*公元1年1月1日是周1*/
	int num = daysbefore % 7;
	/*num是上一个月的最后一天是星期几*/
	if (num != 6)
	{
		for (int i = 0; i < num+1; i++)
			cout << ' '<<'\t';
	}
	/*接下来用num控制输出的位置,num也就是该天是周几*/
	num++;
	for (int i = 1; i <= DaysOfMonth(year,month); i++)
	{
		/*输出今天是几号*/
		cout << i << '\t';
		/*判断下一个位置是不是周天 如果是周天 那么换行*/
		if ((num+1) % 7 == 0)
		{
			cout << endl;
			cout << endl;

		}

		num++;
	}
	cout << endl;
	
}

🚀完整代码

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)

#include<iostream>
#include<conio.h>
using namespace std;

/*控制输出日历,参数分别是*/
void PrintCalendar(int daysBefore, int year, int month);
/*找出某一月份的天数*/
int DaysOfMonth(int year, int month);
/*找出某年某月 的上一个月与1年1月1日差多少天*/
int TotalDaysBefore(int year, int month);
int main()
{
	/*获取当前日期 自动显示日历*/
	time_t data;
	struct tm* p;
	time(&data);
	p = localtime(&data);
	const char* eng_month[13] = { 0,"January","Feburary","March","April","May","June","July","August","September","October","November","December" };
	int input = 0;
	int year = 1900+p->tm_year;
	int month = 1+p->tm_mon;
	int ch = 0;
	do
	{
		/*每一次打印把上一次打印的给清除*/
		system("cls");
		
		cout << eng_month[month] << ' ' << year << '\t'<<'\t'<<'<' <<'\t' << '>' << endl;
		cout << endl;

		PrintCalendar(TotalDaysBefore(year, month), year, month);
		/*用户选择 然后循环上去进行下一次打印 */
		cout << endl;
		cout << '\t'<<'\t'<<'\t'<<'\t' << '\t' << '\t' <<'\t' <<'\t' << "<-custom: tab->" << endl;
		cout << '\t'<<'\t'<<'\t'<<'\t' << '\t' << '\t' <<'\t' <<'\t' << "<-exit:   Esc->" << endl;
		cout << endl;
		cout << "Option::" << endl;
		//cin >> input;

		/* 72:上 
		   80:下
		   77:左、
		   75:右*/
		while (1)
		{
			if (_kbhit())
			{
				ch = _getch();
				if (ch == 75)
				{
					
					month -= 1;
					if (month <= 0)
					{
						month += 12;
						--year;
					}
					break;
				}
				else if (ch == 77)
				{
					

					month += 1;
					if (month >= 13)
					{
						month = month % 12;
						++year;
					}
					break;
				}
				else if (ch == 9)
				{
			
					cout << "year: ";
					cin >> year;
					cout << "month: ";
					cin >> month;

					break;
				}
				else if (ch == 27)
				{
					cout << endl;
					cout << '\t' << "thanks for using!" << endl;
					cout <<'\t' << "bye~" << endl;
					break;
					
				}
				else
				{
					
					break;
				}
			}

		}
		
	} while (ch!=27);

	return 0;
}

//判断闰年
bool IsLeapYear(int year)
{
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		return true;
	}
	return false;
}
//计算某个月有多少天
int DaysOfMonth(int year, int month)
{
	int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (IsLeapYear(year))
		months[2]++;
	int days = months[month];
	
	return days;
}
//计算从1年1月1日 到上一个月的最后一天有多少天
int TotalDaysBefore(int year, int month)
{
	int total = 0;
	/*这一年之前的天数,(以平年计算)*/
	total += (year - 1) * 365;
	/*算出这一年之前的闰年个数 366天*/
	int leapyear = (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;
	total += leapyear;
	/*还有 这一年*/
	for(int i = 1; i < month; i++)
	{
		total += DaysOfMonth(year, i);
	}
	return total;
}
//打印日历
void PrintCalendar(int datys, int year, int month)
{
	cout << "Su" << '\t' << "Mo" << '\t' << "Tu" << '\t' << "We" << '\t' << "Th" << '\t' << "Fr" << '\t' << "Sa"<< endl;
	cout << endl;
	/*根据这个年月 算出之前有多少天*/
	int daysbefore = TotalDaysBefore(year, month);
	/*公元1年1月1日是周1*/
	int num = daysbefore % 7;
	/*num是上一个月的最后一天是星期几*/
	if (num != 6)
	{
		for (int i = 0; i < num+1; i++)
			cout << ' '<<'\t';
	}
	/*接下来用num控制输出的位置,num也就是该天是周几*/
	num++;
	for (int i = 1; i <= DaysOfMonth(year,month); i++)
	{
		/*输出今天是几号*/
		cout << i << '\t';
		/*判断下一个位置是不是周天 如果是周天 那么换行*/
		if ((num+1) % 7 == 0)
		{
			cout << endl;
			cout << endl;

		}

		num++;
	}
	cout << endl;
	
}

在这里插入图片描述
     感谢阅读哦 给个赞把~~😛

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 02

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econom…

Linux-远程访问及控制

一、SSH远程管理 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令。与早期的 Telent&#xff08;远程登录…

【设计模式深度剖析】【10】【行为型】【状态模式】

&#x1f448;️上一篇:访问者模式 设计模式-专栏&#x1f448;️ 文章目录 状态模式定义英文定义直译如何理解呢&#xff1f; 状态模式的角色Context&#xff08;环境类&#xff09;State&#xff08;抽象状态类&#xff09;ConcreteState&#xff08;具体状态类&#xff09…

EXCEL数据导入HIVE

引言 本文将论述如何将Windows本地的excel表数据&#xff0c;导入到虚拟机Linux系统中的Hadoop生态中的Hive数据仓库中。 实验准备 DBeaver Hive3.1&#xff08;Hadoop3.1&#xff09; excel数据表 实验步骤 一、首先打开虚拟机&#xff0c;启动Hadoop&#xff0c;启动h…

71-TCP协议工作原理及实战

一 服务器端 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> // 专门用于建立TCP连接并传输数据信息 #include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE namespace Ui { class M…

vscode字符多行自动增长插件。

多行字符自动增长插件CharAutoIncre 当你使用shiftalt选中了多行,并输入了’1’,这时这几行都变成了’1’. 这时你可以选中&#xff08;shift左键&#xff09;为’1’的这几行, 接下来按下shiftaltq此时’1’变为了’12345’自增长的样式。 同时本插件支持字符’a-z,A-Z’。 目…

windows环境下,怎么查看本机的IP、MAC地址和端口占用情况

1.输入ipconfig,按回车。即查看了IP地址&#xff0c;子码掩码&#xff0c;网关信息。 2.输入ipconfig/all,按回车。即查看了包含IP地址&#xff0c;子码掩码&#xff0c;网关信息以及MAC地址 3.我们有时在启动应用程序的时候提示端口被占用&#xff0c;如何知道谁占有了我们需要…

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

深入解析OOM问题与解决方案:一次实战排查经历

近日&#xff0c;公司服务突然出现连续不断的Full GC&#xff08;Full Garbage Collection&#xff0c;全垃圾回收&#xff09;&#xff0c;在短短时间内发生了四次&#xff0c;之后服务竟然自动重启。这一异常情况让我们团队倍感困扰&#xff0c;因为在系统监控中&#xff0c;…

Spring Boot集成vaadin快速入门demo

1.什么是vaadin&#xff1f; Vaadin 是用于构建单页 Web 应用的流行 Java 框架。 它由一家专门从事富 Internet 应用设计和开发的芬兰公司开发。 估计有 15 万开发者使用 Vaadin。 它的开发始于 2002 年。 Vaadin 框架特性 以下是 Vaadin 特性的列表&#xff1a; 这是一个 J…

PHP蜜语翻译器在线文字转码解码源码

源码介绍 PHP蜜语翻译器在线文字转码解码源码 文字加密通话、一键转换、蜜语密码 无需数据库,可以将文字、字母、数字、代码、表情、标点符号等内容转换成新的文字形式&#xff0c;通过简单的文字以不同的排列顺序来表达不同的内容&#xff01;支持在线加密解密 有多种加密展示…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构&#xff0c;即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地&#xff0c;它为您的所有数据需求提供了一个中心枢纽。然而&#xff0c;构建和管理有效的数据湖可能很复杂。 这…

MySQL之优化服务器设置和复制(一)

优化服务器设置 操作系统状态 CPU密集型的机器 CPU密集型服务器的vmstat输出通常在us列会有一个很高的值&#xff0c;报告了花费在非内核代码上的CPU时钟;也可能在sy列有很高的值&#xff0c;表示系统CPU利用率&#xff0c;超过20%就足以令人不安了。在大部分情况下&#xff…

无代码爬虫软件八爪鱼采集器-如何设计判断是、否

我们在设计采集规则的时候&#xff0c;可能会需要判断&#xff0c;比如采集评论的时候“展开更多回复”&#xff0c;就点击这个按钮&#xff0c;像这种情况就可以设计一个判断模块进入 判断模块添加后会自动生成两个&#xff0c;默认都是不判断直接执行&#xff0c;如果我们需要…

网络安全:数据库安全性

文章目录 网络安全&#xff1a;数据库安全性引言数据库安全性的重要性常见的数据库安全威胁数据库安全性的最佳实践数据加密访问控制审计和监控 结语 网络安全&#xff1a;数据库安全性 引言 在前两篇文章中&#xff0c;我们讨论了SQL注入的概念和防范措施。本篇文章将聚焦于…

记一次线上jVM调优

文章目录 问题描述问题分析尝试优化业务代码优化方案修改后代码补充点 问题描述 部门调整&#xff0c;接手一个新项目&#xff0c;为方便后续描述叫user-web&#xff0c;随后推动IT降本&#xff0c;要求根据实际业务量调整服务器实例数量和配置&#xff0c;调整前服务器配置为…

【DevOps】Elasticsearch 数据跨集群同步方案

目录 1、Elasticsearch Cross-Cluster Replication (CCR) 1.1、优点 1.2、缺点 1.3、步骤 1.4、示例 2. Logstash 或其他 ETL 工具 2.1、优点 2.2、缺点 2.3、步骤 3. Apache Kafka 或 RabbitMQ 3.1、优点 3.2、缺点 3.3、步骤 4、使用 Reindex API 进行跨集群同…

基于 Thingsboard 定制开发,国产化企业级、低代码 AIoT 物联网平台

项目源码&#xff0c;文末联系小编 01 ThingsKit 物联网平台 ThingsKit 是基于 Thingsboard 开源物联网平台二次开发&#xff0c;面向中小型企业开箱即用的低代码物联网平台&#xff0c;提供N1N&#xff08;N个终端产品1个物联网平台N个行业方案&#xff09;的产品服务矩阵&…

2024爱分析·AI Agent创新成就奖开启申报丨奖项征集

AI Agent正成为企业数字化转型的关键力量。它们不仅提升了工作效率&#xff0c;优化了客户体验&#xff0c;更是在数据分析、决策支持和自动化流程中扮演着至关重要的角色。随着技术的不断进步和应用场景的拓展&#xff0c;AI Agent正以其独特优势&#xff0c;引领企业进入一个…