C语言实现万年历

news2024/11/27 0:43:14

C语言实现万年历

一、项目介绍

需求和功能是用纯C语言实现一个可以属于年份,属于一个年份就可以显示该年各个月份的日历,如同日历一般,每个月当中每天对应的星期均可查看,即万年历,要求格式整齐,星期对照直观。

二、运行截图

三、完整源码

#include<stdio.h>
#include<windows.h>
  
#define Mon 1
#define Tues 2
#define Wed 3
#define Thur 4
#define Fri 5
#define Sat 6
#define Sun 0
  
#define January_days 31
#define February_days 28
#define March_days 31
#define April_days 30
#define May_days 31
#define June_days 30
#define July_days 31
#define August_days 31
#define September_days 30
#define October_days 31
#define November_days 30
#define December_days 31
  
#define first1month January_days
#define first2month January_days+February_days
#define first3month January_days+February_days+March_days
#define first4month January_days+February_days+March_days+April_days
#define first5month January_days+February_days+March_days+April_days+May_days
#define first6month January_days+February_days+March_days+April_days+May_days+June_days
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days+November_days
  
int known_weekday = Tues;
int known_year = 1901;
int konwn_month = 1;
int known_day = 1;
  
int day_count(int month)
{
    switch(month)
    {
    case 1: return 0;break;
    case 2: return first1month;break;
    case 3: return first2month;break;
    case 4: return first3month;break;
    case 5: return first4month;break;
    case 6: return first5month;break;
    case 7: return first6month;break;
    case 8: return first7month;break;
    case 9: return first8month;break;
    case 10: return first9month;break;
    case 11: return first10month;break;
    case 12: return first11month;break;
    }
}
  
const char* month_name(int month)
{
    switch(month)
    {
    case 1:
        return "一月";
        break;
    case 2:
        return "二月";
        break;
    case 3:
        return "三月";
        break;
    case 4:
        return "四月";
        break;
    case 5:
        return "五月";
        break;
    case 6:
        return "六月";
        break;
    case 7:
        return "七月";
        break;
    case 8:
        return "八月";
        break;
    case 9:
        return "九月";
        break;
    case 10:
        return "十月";
        break;
    case 11:
        return "十一月";
        break;
    case 12:
        return "十二月";
        break;
    default:
        break;
    }
}
  
/*按格式打印某年某月名称*/
void first_line_print(int month, int year)
{
    //printf("%20s %d \n",month_name(month),year);
    printf("%8d年 %s \n",year, month_name(month));
}
  
/*按格式打印星期名称*/
void week_print()
{
    //printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");
    printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
}
  
/*计算该年该月份与已知日子之间的距离天数*/
int date_distance_count(int month, int year)
{
    int leap_year_count = 0;
    int i;
    int distance;
     
    if (year > known_year)
    {
        for (i=known_year; i<year; i++)
        {
            if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
            {
                leap_year_count++;
            }
        }
         
        if (month > 2)
        {
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
            {
                leap_year_count++;
            }
        }
    }
    else
        if (year == known_year)
        {
            if (month > 2)
            {
                leap_year_count = 1;
            }
        }
         
         
        distance = (year - known_year)*365 + leap_year_count + day_count(month);
         
        return distance;
}
  
/*确定该月份第一天是星期几*/
int makesure_firstday_weekday(int month, int year)
{
    int date_distance = 0;
    int weekday;
     
    date_distance = date_distance_count(month, year);
    weekday = (known_weekday + date_distance)%7;
     
    return weekday;
}
  
/*依次打印出该月份的日子*/
void print_in_turn(int month, int firstday, int year)
{
    int i = 1;
    int weekday;
     
    switch(firstday)
    {
    case Sun:
        break;
    case Mon:
        printf("%-3s","");
        break;
    case Tues:
        printf("%-6s","");
        break;
    case Wed:
        printf("%-9s","");
        break;
    case Thur:
        printf("%-12s","");
        break;
    case Fri:
        printf("%-15s","");
        break;
    case Sat:
        printf("%-18s","");
        break;
    }
     
    switch(month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        {
            for(i=0; i<31; i++)
            {
                weekday = (firstday + i)%7;
                printf("%-3d",i+1);
                 
                if(weekday == Sat)
                {
                    printf("\n");
                }
            }
            break;
        }
    case 2:
        {
            if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
            {
                for(i=0; i<29; i++)
                {
                    weekday = (firstday + i)%7;
                    printf("%-3d",i+1);
                     
                    if(weekday == Sat)
                    {
                        printf("\n");
                    }
                }
                break;
            }
            else /*平年*/
            {
                for(i=0; i<28; i++)
                {
                    weekday = (firstday + i)%7;
                    printf("%-3d",i+1);
                     
                    if(weekday == Sat)
                    {
                        printf("\n");
                    }
                }
                break;
            }
             
        }
    case 4:
    case 6:
    case 9:
    case 11:
        {
            for(i=0; i<30; i++)
            {
                weekday = (firstday + i)%7;/*计算该天是星期几*/
                printf("%-3d",i+1);
                 
                if(weekday == Sat)
                {
                    printf("\n");/*如果是星期六,则换行*/
                }
            }
            break;
        }
    }
}
  
void date_print(int month, int year)
{
    int firstday;
     
    firstday = makesure_firstday_weekday(month, year);
    print_in_turn(month, firstday, year);
    printf("\n");
}
  
void main_month(int month, int year)
{
    first_line_print(month, year);
    week_print();
    date_print(month, year);
    printf("\n\n");
}
  
void main_calendar(int year)
{
    int i;
    for(i=1; i<=12; i++)
    {
        main_month(i, year);
    }
}
  
int main()
{
    int year;
     
    printf("请输入年份:year = ");
    scanf("%d",&year);
    printf("\n");
     
    while(year < 1902)
    {
        printf("请输入大于1901的年份\n");
         
        printf("请输入年份:year = ");
        scanf("%d",&year);
        printf("\n");
    }
     
    main_calendar(year);
     
    scanf(" ");
    return 0;
}

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

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

相关文章

5、Hydra与Crunch基本使用

文章目录 一、关于Hydra与Crunch二、在操作机上使用Crunch生成用户名和密码字典三、在操作机上使用Hydra对靶机FTP登录密码进行字典攻击 一、关于Hydra与Crunch Hydra&#xff08;九头蛇&#xff09;是一个相当强大的暴力密码破解工具。该工具支持几乎所有协议的在线密码破解&…

基于驾驶训练算法优化概率神经网络PNN的分类预测 - 附代码

基于驾驶训练算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于驾驶训练算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于驾驶训练优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Spring Boot 项目中读取 YAML 文件中的数组、集合和 HashMap

在 Spring Boot 项目中&#xff0c;我们经常使用 YAML 文件来配置应用程序的属性。在这篇博客中&#xff0c;我将模拟如何在 Java 的 Spring Boot 项目中读取 YAML 文件中的数组、集合和 HashMap。 1. 介绍 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种人类…

《数据结构与算法之美》读书笔记2

链表操作的技巧 1.理解指针 将摸个变量赋值给指针&#xff0c;实际上就是将这个变量的地址赋给指针&#xff0c;或者&#xff0c;指针中存储了这个变量的地址&#xff0c;指向了这个变量&#xff0c;所以可以通过指针找到这个变量。 2.内存泄漏或指针丢失 删除链表节点时&a…

对称加密与非对称加密的区别是什么?

对称加密与非对称加密的区别是什么&#xff1f; 对称加密概念&#xff1a;好处和坏处&#xff1a;基本原理 非对称加密概念&#xff1a;工作原理&#xff1a; 两者区别安全性处理速度密钥管理通信双方数量 对称加密 概念&#xff1a; 同一个密钥可以同时用来对信息进行加密和…

Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第三篇&#xff0c;前两篇的链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建…

老师应具备什么样的心理素质

老师&#xff0c;一个充满智慧与挑战的职业&#xff0c;就像园丁&#xff0c;用无私的爱和耐心&#xff0c;滋养着每一颗渴望知识的幼苗。那么&#xff0c;作为教育从业者&#xff0c;要具备哪些心理素质呢&#xff1f; 强大的情绪管理能力 老师的工作绝非一帆风顺。在教育学生…

JAVA - 阻塞队列

一、什么是堵塞队列 堵塞队列&#xff08;Blocking Queue&#xff09;是一种特殊类型的队列&#xff0c;它具有一些特定的行为和限制。在堵塞队列中&#xff0c;当队列为空时&#xff0c;尝试从队列中取出元素的操作将会被阻塞&#xff0c;直到队列中有可用元素&#xff1b;当…

【社会网络分析第6期】Ucient实操

一、导入数据处理二、核心——边缘分析三、聚类分析四、网络密度 一、导入数据处理 将数据导入Ucinet首先需要对数据进行处理。 承接上一期的数据格式&#xff1a;【社会网络分析第5期】gephi使用指南 原先得到的数据格式如下&#xff1a; 接下来打开ucinet&#xff1a; 之后…

免费 2 个月!ChatGPT-4 和 Claude 2 都能用

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我&#xff0c;获取最新编程及AI干货、高赞工具和项目分享。 在后台回复“books”&#xf…

10、鸿蒙组件的实现语法

1、查看在线开发文档 在开发工具的右边有API帮助&#xff0c;打开后可以查阅需要的内容 2、创建组件的语法 组件名(options) options组件初始化参数。比如创建Text文本组件&#xff0c;options是显示的文本内容。 Text(我是一个文本) 3、配置组件属性 组件的属性一般用于…

【数据库基础】

目录&#xff1a; 前言什么是数据库主流数据库服务器&#xff0c;数据库&#xff0c;表关系MySQL架构SQL分类存储引擎 前言 剑指offer&#xff1a;一年又1天 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a;…

npm中的npx命令

1.概念 npx是一个执行npm软件包的二进制文件&#xff0c;通俗的讲&#xff0c;他可以执行npm的一些指令。 2.示例 用babel将ES6语法转为ES5语法 npx babel src/js -d dist/js会执行babel的相关功能&#xff0c;如果没有安装&#xff0c;也会自动安装。 当在执行npx <co…

单片机学习3——数码管

数码管&#xff0c;根据内部结构&#xff0c;可分为共阴极数码管和共阳极数码管。七段发光管加上一个小数点&#xff0c;共计8段。因此&#xff0c;我们对它编程的时候&#xff0c;刚好是用一个字节。 数码管的显示方式&#xff1a; 1&#xff09;静态显示&#xff1b; 2&…

【刷题笔记】数组-双指针||覆盖||重复元素

【刷题笔记】数组-双指针||覆盖||重复元素 目录 移除元素删除有序数组中的重复项删除有序数组中的重复项 II分析 移除元素 https://leetcode.cn/problems/remove-element/ 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并…

90. 打家劫舍II (房子围成一圈)

题目 题解 class Solution:def rob(self, nums: List[int]) -> int:def dp(nums: List[int]) -> int:N len(nums)# 定义状态&#xff1a;dp[i]表示从第i个房屋开始偷窃&#xff0c;能够偷到的最高金额dp [0 for i in range(N)]for i in range(N-1, -1, -1):if i N-1:…

软件工程期末复习(选择+填空+判断)

文章目录 软件工程期末复习一、 选择题 软件工程期末复习 一、 选择题 1.“软件危机”的表现不包括&#xff1a;&#xff08;c&#xff09; A、软件产品不能按期交付 B、用户对“已完成的”软件产品时常不满意 C、程序员越来越供不应求 D、软件项目难以管理&#xff0c;维护困…

各平台chatGPT使用体验(国内外)

首推&#xff1a;openAI 地址&#xff1a;https://chat.openai.com/ 这个真的很好用&#xff0c;而且回复的结果也基本让让人满意&#xff0c;个人首推&#xff0c;而且对比国内的除了回答更令人满意外&#xff0c;它更连贯&#xff0c;不像国内的gpt一句一问&#xff0c;跟进…

RabbitMQ之延迟消息实战

RabbitMQ之延迟消息实战 使用死信交换机实现延迟消息 使用死信交换机的过期时间以及没有消费者进行消费&#xff0c;时间到了就会到死信队列中&#xff0c;由此可以实现延迟消息使用延迟消息插件 前提&#xff1a;需要mq配置插件 延时信息案例实战 把一个30分钟的延迟消息可以…

Nginx(八) aio sendfile directio 组合使用测试(1)

thread_pool default threads32 max_queue65535; http {aio threadsdefault;directio 2m;sendfile on;sendfile_max_chunk 1m;#### Gzip压缩服务配置#gzip off; # 设置是否开启gzip压缩服务&#xff0c;用于提高传输速度&#xff0c;默认关闭(off)。#gzi…