用C编写万年历系统问题和代码详解

在这里插入图片描述

问题:

要求:模仿现实生活中的挂历。 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。 当系统日期变到下一月时,系统自动翻页到下一月。

代码详解:

这段代码可以生成指定年份所对应的日历。下面是该代码的详细解释:

1. 头文件及函数定义部分:

#include <stdio.h>

int year(int y)
{
    if ((y%4==0) && (y%100!=0) || y%400==0) // 判断闰年
        return 366;
    else
        return 365;
}

代码中定义了一个 year() 函数,用于判断某一年是否为闰年。

## 2. 主函数部分:

```c
int main()
{
    int y;
    int i,j,sum=0;    
    int begin,week;
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // 定义每月的天数
    scanf("%d",&y); // 输入年份
    for(i=1;i<y;i++)
    sum+=year(i); // 计算1900年至输入年份之前的年份天数之和
    week=(sum+1)%7; // 计算输入年份1月1日是星期几
    if(year(y)==366)
      days[1]=29; // 如果输入年份是闰年,则将2月的天数改为29
    printf("\n%d年日历如下:\n\n",y); // 打印年份
    for(i=0;i<12;i++) // 逐月生成日历
    {
        printf("       %d月          \n",i+1); // 打印月份
        printf("  7  1  2  3  4  5  6\n"); // 打印星期
        printf("=====================\n"); // 打印分隔线
        begin=1; // 初始化每个月的第一天
        for(j=0;j<week;j++) // 打印当月的第一天前的空格
            printf("   ");
        while(begin<=days[i]) // 打印当月的日期
        {
            printf("%3d",begin); // 打印日期
            begin++; // 下一天
            week=(week+1)%7; // 计算星期
            if(week%7==0)
                printf("\n"); // 打印换行符
        }
        printf("\n\n"); // 打印两个空行
    }
    return 0;
}

接下来,我们逐步解释上述代码的各个部分。

3. 输入年份

scanf("%d",&y);

该行代码用于输入要生成日历的年份。

4. 计算前几年的天数之和

1900 年是因为西方国家在那个时候开始使用格里高利历(Gregorian calendar),这个历法的起点是公元前 1 年的 1 月 1 日。而在格里高利历之前,西方国家使用的是儒略历(Julian calendar),其起点是公元前 45 年的 1 月 1 日。因此,如果使用儒略历作为起点,计算方式会有所不同。

for(i=1;i<y;i++)
    sum+=year(i);

该部分代码用于计算从 1900 年到输入的年份之前所有年份的天数之和。i 的初始值为 1,因为 1900 年不能算在前几年之中。sum 变量用于存储天数之和。

5. 计算输入年份1月1日是星期几

week=(sum+1)%7;

该行代码用于计算输入年份 1 月 1 日是星期几。因为 1900 年的 1 月 1 日是星期一,所以要加上一个偏移量 1。

6. 根据是否为闰年设定每月的天数

if(year(y)==366)
    days[1]=29;

该部分代码用于判断输入年份是否为闰年,如果是,则将 2 月的天数设定为 29。

7. 开始逐月生成日历

for(i=0;i<12;i++)
{
    printf("       %d月          \n",i+1);
    printf("  7  1  2  3  4  5  6\n");
    printf("=====================\n");
    begin=1;
    for(j=0;j<week;j++)
        printf("   ");
    while(begin<=days[i])
    {
        printf("%3d",begin);
        begin++;
        week=(week+1)%7;
        if(week%7==0)
            printf("\n");
    }
    printf("\n\n");
}

该部分代码用于逐月生成日历。首先打印月份。然后打印星期。最后打印分隔线。begin 变量用于存储当前要打印的日期,week 变量用于存储当前日期是星期几。在打印当月的日期之前,要先打印当月的第一天前的空格。

代码使用了一个 while 循环来打印当月的日期。在循环体内,先打印当前日期,然后使 begin 变量加 1。接着,计算下一天是星期几,并判断是否需要换行。当 begin 变量大于当月的天数时,退出循环。

8. 完整代码

下面是完整的代码:

#include <stdio.h>

// 判断是否为闰年
int year(int y)
{
    if((y%4==0&&y%100!=0)||y%400==0)
        return 366;
    else
        return 365;
}

int main()
{
    int y,sum=0,i,j,begin,week=1;
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // 每月的天数

    printf("请输入要生成日历的年份:");
    scanf("%d",&y);

    // 计算前几年的天数之和
    for(i=1;i<y;i++)
        sum+=year(i);

    // 计算输入年份1月1日是星期几
    week=(sum+1)%7;

    // 根据是否为闰年设定每月的天数
    if(year(y)==366)
        days[1]=29;

    printf("\n%d年日历如下:\n\n",y);
    for(i=0;i<12;i++)
    {
        printf("       %d月          \n",i+1);
        printf("  7  1  2  3  4  5  6\n");
        printf("=====================\n");
        begin=1;
        for(j=0;j<week;j++)
            printf("   ");
        while(begin<=days[i])
        {
            printf("%3d",begin);
            begin++;
            week=(week+1)%7;
            if(week%7==0)
                printf("\n");
        }
        printf("\n\n");
    }
    return 0;
}

在这里插入图片描述

C++代码:

最后,我尝试用刚学的C++类的知识写了一份C++的代码,感兴趣的小伙伴可以看看.
下面是C++的代码:

注释如下:

```c++
#define _CRT_SECURE_NO_WARNINGS  1 // 去掉警告
#include <iostream>
#include<cstdlib> // 用于包含exit函数
#include<chrono> // 包含时间相关的头文件
#include<cstring> // 包含字符串相关的头文件
using namespace std;

// 枚举月份
enum {
	January=0,
	February,
	March,
	April,
	May,
	June,
	July,
	August,
	September,
	October,
	November,
	December,
};

class Calendar {
public:
	int sum=0; // 表示闰年之前有多少天,初始为0
	int year=GetTime(); // 年份为当前系统时间所在的年份
	int week=0; // 当前月份的1号是星期几
protected:
	int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; // 存储月份天数
public:
	int IsLeap(int year); // 判断是否闰年的函数
	Calendar(){} // 默认构造函数
	Calendar(int year) { // 带参数构造函数
		this->year = year;
		for (int i = 1; i < year; i++) // 计算闰年之前有多少天
		{
			this->sum += IsLeap(i);
		}
		this->week = (sum + 1) % 7; // 计算当前年份的1月1号是星期几
	}
	int GetTime() // 获取当前系统时间所在的年份
	{
		// 获取当前系统时间
		std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
		// 转换为时间戳
		std::time_t now_c = std::chrono::system_clock::to_time_t(now);
		// 转换为本地时间
		std::tm* local_time = std::localtime(&now_c);
		// 获取当前年份
		int year = local_time->tm_year + 1900;
		// 输出当前年份
		std::cout << "当前年份为:" << year << std::endl;
		return year; // 返回当前年份
	}
	void PrintCalendar(); // 打印日历的函数
};

int Calendar:: IsLeap(int year) // 判断是否闰年的函数
{
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		return 366; // 是闰年则返回366
	else
		return 365; // 否则返回365
}

void Calendar::PrintCalendar() // 打印日历的函数
{
	int begin = 1; // 每个月份的开始日期从1号开始
	cout << this->year << "年日历>>>" << endl; // 输出年份所对应的日历
	for (int j = January; j <= December; j++) // 遍历所有月份
	{
		begin = 1; // 当前月份开始日期为1号
		cout << "	       第" << j + 1 << "月" << endl; // 输出当前月份
		cout << "  7  1  2  3  4  5  6" << endl; // 输出星期几
		printf("=====================\n");
		for (int i = 0; i < this->week; i++) // 输出当前月份1号前的空格,即空白处
		{
			cout << "   ";
		}
		while (begin <= this->month[j]) // 输出当前月份的日期
		{
			printf("%3d", begin++); // 输出日期并加1
			week = (week + 1) % 7;
			if (!week)
				cout << endl; // 如果星期天了,换行输出下一行日期
		}
		cout << endl<<endl; // 输出完毕当前月份的日期后,换行
	}
}

int main() {
	Calendar c; // 创建Calendar对象
	c.PrintCalendar(); // 打印当前年份所对应的日历
	return 0;
}

这份代码主要实现了日历的打印功能。其中使用了枚举类型来表示月份,通过计算闰年之前有多少天来判断当前的日期是星期几,再输出对应的日期表格。在类中还实现了一个获取当前系统时间所在年份的函数。整个程序比较简单易懂,是一个较好的练手题目。

总结

本文介绍了如何使用 C 语言编写一个简单的日历生成程序。该程序使用了基本的循环、条件语句和数组等语法。读者可以根据自己的需要对程序进行扩展和优化。

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
万年历是一种常见的日历系统,可以显示从公元1年到公元3000年的日期和节日信息。万年历系统的源程序是指用于开发和实现万年历功能的代码万年历系统的源程序主要包括以下几个关键部分: 1.日期计算算法万年历需要能够准确计算指定日期的星期几、农历日期、节气等信息。源程序中需要包含相关的日期计算算法,以确保日期信息的准确性。 2.界面设计和显示:源程序需要实现万年历系统的界面设计和显示功能,包括日历的布局、日期的显示以及节日信息的展示等。通过编程语言的图形库或者界面设计工具,实现界面的美观和易用性。 3.用户交互功能:源程序需要实现用户与万年历系统的交互功能,包括用户输入指定日期并获取相关信息的功能。用户交互功能可以通过命令行参数、图形界面控件或者网页表单等方式实现。 4.节日信息库:源程序需要包含节日信息库,包括传统节日、法定假日等。通过节日信息库,系统可以根据指定日期自动查询并显示相关的节日信息。 5.错误处理和异常处理:万年历系统的源程序需要考虑各种可能的错误情况,如用户输入错误日期、计算错误等。源程序中需要包含错误处理和异常处理的代码,以提高系统的鲁棒性和用户体验。 万年历系统的源程序开发需要深入了解日期计算算法、界面设计和编程语言等知识。通过合理的设计和优化,可以实现一个功能完善、稳定可靠的万年历系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值