【C/C++实战项目】万年历

news2025/1/6 20:03:41

目录

项目分析

项目效果

头文件及全局变量

获取天数

打印月份、年份日历

main函数


项目分析

  • 实现查询某一个年份、月份,以日历的格式打印
  • 为了观赏性利用符号对打印的每一个日期进行分格
  • 特殊节日日期能够在日历中标注出来
  • 万年历的起始日期是公元1年,公元1年的第一天是周一
  • 项目的核心是通过计算距离公元1年1月1号的天数差
  • 打印的关键不仅在于根据天数差打印日期,还在于打印日历的格子框架

项目效果

头文件及全局变量

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

char g_week[7][10] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
char g_mon[13][10] = { "", "Janury", "February", "March", "April", "May", "June",
                       "July", "Auguet", "September", "October", "November", "December" };

获取天数

  1. 判断瑞年
  2. 获取某月天数
  3. 获取某月距离公元1年的天数差
bool LeapYear(int year) 
{
    return ((year % 4 == 0) && year % 100 != 0) || year % 400 == 0;
}

int GetMonDays(int year, int mon) 
{
    int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (mon == 2 && LeapYear(year)) 
        return 29;
    return days[mon];
}

int DaysGap(int year, int mon) 
{
    int days = 0;
    int i = 1;
    while (i < year) 
    {
        if (LeapYear(i)) 
            days += 366;
        else 
            days += 365;
        ++i;
    }
    int j = 1;
    while (j < mon) 
    {
        days += GetMonDays(year, j);
        ++j;
    }
    return days;
}

打印月份、年份日历

项目的算法核心,年份的打印可以对月份打印进行嵌套循环打印

打印月份时对特殊节日进行标注

days是当月距离公元1年1月的天数差

ret值是days对7取余,得到当月的第一天是周几,ret是0则是周一,依此规则累加

void ShowMon(int year, int mon) 
{
    printf("\n                            %10s\n", g_mon[mon]);
    printf("*---------*---------*---------*---------*---------*---------*---------*\n");
    int i;
    for (i = 0; i < 7; ++i) 
        printf("|%9s", g_week[i]);

    printf("|\n");
    for (i = 0; i < 7; ++i) 
        printf("|---------");

    printf("|\n");
    int days = DaysGap(year, mon);
    int m_days = GetMonDays(year, mon);
    int ret = days % 7;
    for (i = 0; i < ret; ++i) 
        printf("|         ");

    int temp = 7 - ret;
    for (i = 1; i <= m_days; ++i) {
        if (mon == 1 && i == 1) 
            printf("|元旦节 %2d", i);
        else if (mon == 6 && i == 1) 
            printf("|儿童节 %2d", i);
        else if (mon == 10 && i == 1) 
            printf("|国庆节 %2d", i);
        else 
            printf("|%9d", i);
        if (i == temp || (i - temp) % 7 == 0) 
        {
            printf("|\n");
            int j;
            for (j = 0; j < 7; ++j) 
                printf("|---------");
            printf("|\n");
        }
    }
    ret = (ret + m_days) % 7;
    if (ret != 0) 
    {
        printf("|\n");
        int j;
        for (j = 0; j < ret; ++j) 
            printf("|---------");
        printf("|\n");
    }
    printf("\n");
}

void ShowYear(int year) 
{
    printf("\n***------***-----***     万年历 (公元 %d 年)     ***-----***------***\n", year);
    int i = 1;
    for (i = 1; i <= 12; ++i) 
        ShowMon(year, i);
}

main函数

void Menu() 
{
    printf("\n  ***********************************************\n");
    printf("  ****************** 1.查询年月     *************\n");
    printf("  ****************** 2.查询年份     *************\n");
    printf("  ****************** 0.退出查询     *************\n");
    printf("  ***********************************************\n");
    printf("请输入选项:");
}

int main() 
{
    int input;
    do 
    {
        Menu();
        scanf("%d", &input);
        int year, mon;
        switch (input) 
        {
        case 1:
            system("cls");
            printf("请输入要查询的年月: ");
            scanf("%4d%2d", &year, &mon);
            ShowMon(year, mon);
            break;
        case 2:
            system("cls");
            printf("请输入要查询的年份: ");
            scanf("%4d", &year);
            ShowYear(year);
            break;
        case 0:
            printf("退出查询\n");
            return 0;
        default:
            printf("输入错误,请重新输入\n");
        }
    } while (input);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Orin Nx] 如何跑满GPU和CPU,观察温度和散热性能?

1、环境说明 硬件: Nvidia Orin NX 16GB 软件&#xff1a;Jetson Linux R35.3.1 2、工具安装部署 GPU的压力测试主要使用工具&#xff1a; https://github.com/anseeto/jetson-gpu-burn CPU的压力测试主要使用工具 stress 注意安装 jetson-gpu-burn需要在 /etc/apt/sourc…

SpringBoot 客户信息管理系统-计算机毕设 附源码80944

SpringBoot客户信息管理系统 摘 要 随着计算机技术的发展&#xff0c;特别是计算机网络技术与数据库技术的发展&#xff0c;使用人们的生活与工作方式发生了很大的改观。本课题研究的客户信息管理系统&#xff0c;主要功能模块包括统计图&#xff0c;系统用户&#xff08;管理…

JS高级用法:像大神一样玩转JavaScript

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 众所周知&#xff0c;JavaScript是一种非常流行的编程语言&#xff0c;它已经成为了…

回收站如何添加到桌面?没有回收站的数据怎么恢复

最近收到很多这样的咨询&#xff1a; 咨询1&#xff1a;在网吧上网&#xff0c;不小心把照片删了&#xff0c;可恨的是这里没有回收站&#xff0c;请问怎么找回照片&#xff01;&#xff01;&#xff01;急&#xff0c;谢谢了。 咨询2&#xff1a;在网吧上网&#xff0c;一删除…

emmylua+Rider 断点调试

1、下载安装并激活好rider&#xff08;本次版本基于&#xff1a;JetBrains Rider 2023.1.3&#xff09; 2、从插件商店中安装emmylua 3、打开项目 在unity中设置好&#xff0c;使用rider打开项目即可 4、Unity中打开相应的场景 &#xff08;此场景基于Xlua官方Demo展示&…

初中生台灯如何选择?眼科专家推荐的学生台灯分享

保护视力一直是家长们经常提醒孩子们的一句话&#xff0c;但据统计青少年学生的近视率还是非常高&#xff0c;很多家长认为这是不良的用眼习惯导致的&#xff0c;却没想过可能是其他原因&#xff0c;因为孩子除了自身保持良好的用眼习惯外&#xff0c;在学习时用眼的光线也是十…

有哪些智能聊天ai机器人?这几种ai工具都能进行聊天

在当前ai技术日益成熟的时代&#xff0c;越来越多的ai聊天机器人开始走进我们的生活中&#xff0c;为我们带来更多乐趣和便利。这几款ai聊天机器人不仅可以陪伴我们度过孤独的夜晚&#xff0c;还可以为我们提供各种对话服务。它们能理解我们的话语&#xff0c;与我们进行自然对…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念&#xff0c;定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…

【unity每日一记】transform类精华之珠

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【Java】JVM学习(二)

JVM的内存区域 运行时数据区域 运行时数据区的定义&#xff1a; Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 Java 引以为豪的就是它的自动内存管理机制。相比于 C的手动内存管理、复杂难以理解的指针等&#xff0c;Java 程序写起来就方…

前端Vue自定义精美tabs,可设置下划线图标 热门标题

前端Vue自定义精美tabs&#xff0c;可设置下划线图标 热门标题&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13186 效果图如下&#xff1a; # cc-beautyTabs #### 使用方法 使用方法 <!-- tabchange: tab选择事…

为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言AI的崛起与编程语言…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

轻松复制:Elasticsearch 中跨集群复制指南

跨集群的数据复制是一个复杂且耗时的过程。 公司必须使用外部工具或编写自定义脚本将数据从一个集群移动到另一个集群。 Elasticsearch 以其跨集群复制功能来救援。 跨集群复制 (CCR) 是 Elasticsearch 中的一项内置功能&#xff0c;允许近乎实时地将数据从一个集群复制到另一…

C语言预处理命令

文章目录 1 什么是预处理命令2 预处理指令实例3 C语言宏定义4 C语言预处理命令总结参考 1 什么是预处理命令 这些在编译之前对源文件进行简单加工的过程&#xff0c;就称为预处理&#xff08;即预先处理、提前处理&#xff09;。预处理主要是处理以#开头的命令&#xff0c;例如…

【c语言】-- 操作符汇总(万字详解)

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习操作符。 让我们开启c语言学习之…

【正点原子STM32连载】第四十章 红外遥控实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

管理类联考——逻辑——知识篇——形式逻辑——二、性质模态——haimian

性质 考点分析 定义分类 思维导图 模态 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量112 定义分类 断定事物发生可能性的命题就是模态命题。 按照可能性的高低&#xff0c;我们可以将模态命题分为如下几类&#xff1a; ①必然发…

Android12 设置系统默认不休眠-迅为RK3588开发板

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - 60000 0x7fffffff 更多详情 公众Hao/B站&#xff1a;迅为电子

MFC第九天 CRect类的封装和窗口坐标系转换及获取窗口ID 以及对CTime类与COleDateTime类简介

文章目录 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介CRect类的封装窗口坐标系转换及获取窗口IDCTime类与COleDateTime类简介关于设置日期控件上的时间问题 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介 CRect类的…