【C/C++数据结构与算法】C语言万年历

news2024/11/28 1:29:07

目录

项目分析

项目效果

头文件及全局变量

获取天数

打印月份、年份日历

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/664783.html

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

相关文章

【随笔闲谈】软件工程导论

目录 一、软件工程概述 二、启动阶段 三、计划阶段 四、实施阶段 五、收尾阶段 一、软件工程概述 软件危机&#xff1a;在计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的产生与自身的特点有关&#xff0c;还与软件开发、管理的方法不正确有关。 软件危…

chatgpt赋能python:Python打开目录:快速浏览目录中的所有文件

Python打开目录&#xff1a;快速浏览目录中的所有文件 Python是一种流行的编程语言&#xff0c;其可扩展性和易学性使其成为一种受欢迎的语言。Python的强大功能之一就是能够操作文件和目录。在本文中&#xff0c;我们将讨论如何使用Python在Windows、Mac和Linux上打开目录并列…

Opencv-C++笔记 (11) : opencv-图像二值化与LUB查找表

文章目录 一、概述二、THRESH_BINARY和THRESH_BINARY_INV三、THRESH_TRUNC四、THRESH_TOZERO和THRESH_TOZERO_INV五、THRESH_OTSU和THRESH_TRIANGLE六、LUT查找表 一、概述 我们在上一节程序中生成了一张只有黑色和白色的图像&#xff0c;这种“非黑即白”的图像像素的灰度值无…

MFC 非线程创建模态化窗口 实现工具栏拓展

1 实现基本工具栏 1.1 在Dlg.h文件中声明变量和定义资源ID #define ID_BUTTONS 501CToolBar m_toolbar; //工具栏 CImageList m_imageList; //工具栏图片 CImageList m_hotImageList; //工具栏热点图片 CReBar m_Rebar; //可以在位图上显示子窗口口 用来显示背景 CString…

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4&#xff0c;在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

Jenkins-pipeline自动化构建Java应用

本实验操作需要&#xff1a;Jenkins&#xff0c;git代码仓库&#xff08;如gitlab&#xff0c;gitee等都可以&#xff09;&#xff0c;maven&#xff0c;docker&#xff0c;docker镜像仓库&#xff08;habor&#xff0c;nexus或者阿里云ACR等&#xff09;以及k8s环境。 前期准…

nginx特点以及安装

目录 1.特点 2.nginx和apache的区别 3.nginx应用场景 4.安装nginx 5. 更新nginx版本 6.总结 1.特点 高性能 轻量级web服务软件 稳定性高 系统自选消耗低 对http并发链接处理能力高 #处理并发连接能力 1.cup个数 2.本地服务器最大文件打开数 2.nginx和apache的区别 ng…

chatgpt赋能python:打包Python应用程序成deb包

打包Python应用程序成deb包 随着Python编程语言的不断发展&#xff0c;越来越多的开发者使用Python编写应用程序。然而&#xff0c;将Python程序打包并制作成deb包以进行安装可能仍然是一个难点。本文将介绍如何使用Debian打包工具&#xff0c;将Python应用程序制作成deb包。 …

chatgpt赋能python:Python扩展库介绍

Python扩展库介绍 Python是一种广泛使用的编程语言&#xff0c;它的易用性和可扩展性是许多开发者选择它的原因之一。这个语言有着丰富的扩展库&#xff0c;让开发者能够更加高效地编写代码。在这篇SEO文章中&#xff0c;我们将介绍几个与Python相关的扩展库。 NumPy NumPy是…

RPC远程调用

简介 PRC是一种调用方式而不是一种协议 在本地调用方式时由于方法在同一个内存空间&#xff0c;所以程序中可以直接调用该方法&#xff0c;但是浏览器端和服务端程序是不在一个内存空间的&#xff0c;需要使用网络来访问&#xff0c;就需要使用TCP或者UDP协议&#xff0c;由于…

使用frp工具实现内网穿透以及配置多个ssh和web服务

frp简介 FRP 项目地址 https://github.com/fatedier/frp/blob/master/README_zh.md frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 环境准备 ssh连接 1. 需要一台可以直接访问…

简要介绍 | 交叉熵损失:原理和研究现状

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对交叉熵损失进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 交叉熵损失&#xff1a;原理、研究现状与未来展望 Under…

Web3 是什么?为何应该关注?

当我开始我的职业生涯时&#xff0c;“Web2.0”还是一个热门的新事物。 当我开始我的职业生涯时&#xff0c;正值互联网快速发展的时期&#xff0c;人们谈论的是“Web2.0”&#xff0c;这一概念引发了许多关于用户参与、社交媒体和在线合作的讨论。然而&#xff0c;随着时间的推…

SQL优化--如何分析优化呢?

目录 一个SQL语句执行很慢, 如何分析&#xff1f; ​编辑 重要属性 possible_key key key_len Extra type 面试回答 框架 范例 例&#xff1a; 上面三种查询我们都可以通过执行计划找到查询慢的原因&#xff0c;并且提供解决方案 比如聚合查询可以新增临时表&…

【Leetcode -563.二叉树的坡度 - Nowcoder -KY11.二叉树遍历】

Leetcode Leetcode -563.二叉树的坡度c Leetcode -563.二叉树的坡度 题目&#xff1a;给你一个二叉树的根节点 root &#xff0c;计算并返回 整个树 的坡度 。 一个树的 节点的坡度 定义即为&#xff0c;该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树…

leetcode数据库题第五弹

leetcode数据库题第五弹 1141. 查询近30天活跃用户数1148. 文章浏览 I1158. 市场分析 I1164. 指定日期的产品价格1174. 即时食物配送 II1179. 重新格式化部门表1193. 每月交易 I1204. 最后一个能进入电梯的人1211. 查询结果的质量和占比1251. 平均售价小结 1141. 查询近30天活跃…

chatgpt赋能python:Python打开文件目录:入门指南

Python打开文件目录&#xff1a;入门指南 打开文件目录是编程中常见的操作之一。Python 作为一种优秀的脚本语言&#xff0c;提供了众多的实用方法来操作文件系统。在本文中&#xff0c;我们将介绍如何使用 Python 打开文件目录&#xff0c;同时提供一些对 SEO 优化有帮助的技…

NodeJS 生成APIDOC⑩①

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言API 文档生成工具 APIDOC特点 APIDOC使用步骤0、 运行命令1、 安装插件3、 配置演示4、 ApidocJson配置文件5、效果图 总结 ✨文章有误请指正&#x…

Storm forming 风雨欲来 | 经济学人20230325版社论高质量双语精翻

本期精翻为2023年3月25日《经济学人》周报封面文章&#xff1a;《风雨欲来》&#xff08;Storm forming&#xff09;。 Storm forming 风雨欲来 As video games grow, they are eating the media 随着电子游戏的发展&#xff0c;它们正在蚕食媒体 The games business has lesso…

计算机网络概论

计算机网络概论 组成 客户端&#xff1a;就像蟹堡王的顾客一样。服务端&#xff1a;类似于蟹堡王的分店。路由器&#xff1a;扮演着转发分店的角色。网络协议&#xff1a;像转发表格一样帮助数据在网络中传输。 计算机网络基础 网络组成部分 主机&#xff1a;客户端和服务端…