要求:模仿现实生活中的挂历。 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。 当系统日期变到下一月时,系统自动翻页到下一月。
这段代码可以生成指定年份所对应的日历。下面是该代码的详细解释:
#include
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
接下来,我们逐步解释上述代码的各个部分。
scanf("%d",&y);
该行代码用于输入要生成日历的年份。
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
变量用于存储天数之和。
week=(sum+1)%7;
该行代码用于计算输入年份 1 月 1 日是星期几。因为 1900 年的 1 月 1 日是星期一,所以要加上一个偏移量 1。
if(year(y)==366)
days[1]=29;
该部分代码用于判断输入年份是否为闰年,如果是,则将 2 月的天数设定为 29。
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
变量大于当月的天数时,退出循环。
下面是完整的代码:
#include
// 判断是否为闰年
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++
#define _CRT_SECURE_NO_WARNINGS 1 // 去掉警告
#include
#include // 用于包含exit函数
#include // 包含时间相关的头文件
#include // 包含字符串相关的头文件
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 语言编写一个简单的日历生成程序。该程序使用了基本的循环、条件语句和数组等语法。读者可以根据自己的需要对程序进行扩展和优化。