PTA7-6万年历

7-6 万年历

分数 20

 

全屏浏览题目

 

切换布局

作者 李卫明

单位 杭州电子科技大学

编写程序, 读入任一年份,模拟挂历输出该年年历, 要求每两月并排显示。每个日期占4位,左右月份间空8位,标题位于相应中间位置,年历标题和每月后空一行。
星期几可通过与基准日相差天数求得,不所有简化公式,如使用简化公式,需证明其正确性。输入年份范围为1900~2100。

输入格式:

年份。

输出格式:

双列年历。

输入样例:

2019

输出样例:

                        2019 Calendar



          January                              February

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

           1   2   3   4   5                               1   2

   6   7   8   9  10  11  12           3   4   5   6   7   8   9

  13  14  15  16  17  18  19          10  11  12  13  14  15  16

  20  21  22  23  24  25  26          17  18  19  20  21  22  23

  27  28  29  30  31                  24  25  26  27  28        



           March                                April

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

                       1   2               1   2   3   4   5   6

   3   4   5   6   7   8   9           7   8   9  10  11  12  13

  10  11  12  13  14  15  16          14  15  16  17  18  19  20

  17  18  19  20  21  22  23          21  22  23  24  25  26  27

  24  25  26  27  28  29  30          28  29  30                

  31                                                            



            May                                  June

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

               1   2   3   4                                   1

   5   6   7   8   9  10  11           2   3   4   5   6   7   8

  12  13  14  15  16  17  18           9  10  11  12  13  14  15

  19  20  21  22  23  24  25          16  17  18  19  20  21  22

  26  27  28  29  30  31              23  24  25  26  27  28  29

                                      30                        



            July                                August

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

       1   2   3   4   5   6                           1   2   3

   7   8   9  10  11  12  13           4   5   6   7   8   9  10

  14  15  16  17  18  19  20          11  12  13  14  15  16  17

  21  22  23  24  25  26  27          18  19  20  21  22  23  24

  28  29  30  31                      25  26  27  28  29  30  31



         September                            October

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

   1   2   3   4   5   6   7                   1   2   3   4   5

   8   9  10  11  12  13  14           6   7   8   9  10  11  12

  15  16  17  18  19  20  21          13  14  15  16  17  18  19

  22  23  24  25  26  27  28          20  21  22  23  24  25  26

  29  30                              27  28  29  30  31        



          November                            December

 Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat

                       1   2           1   2   3   4   5   6   7

   3   4   5   6   7   8   9           8   9  10  11  12  13  14

  10  11  12  13  14  15  16          15  16  17  18  19  20  21

  17  18  19  20  21  22  23          22  23  24  25  26  27  28

  24  25  26  27  28  29  30          29  30  31                


完整代码:

#include<stdio.h>
int Month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

int runnian(int n)
{
	if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))
	{
		return 1;

	}
	else {
		return 0;
	}
}

int sumday(int n)
{
	int i;
	int count = 1;
	int sum = 0;
	for (i = 1900; i < n; i++)
	{
		if (runnian(i) == 1)
		{
			count += 2;
		}
		else {
			count += 1;
		}
		count = count % 7;
	}

	return count;
}
void printmonth(int i)
{
	switch (i)
	{
	case 1:
		printf("          January                              February\n");
		break;
	case 2:
		printf("           March                                April\n");
		break;
	case 3:
		printf("            May                                  June\n");
		break;
	case 4:
		printf("            July                                August\n");
		break;
	case 5:
		printf("         September                            October\n");
		break;
	case 6:
		printf("          November                            December\n");
		break;
	default:
		printf("请重新输入正确的数值\n");
		break;
	}
}

int main()
{
	int n, j = 0, count1 = 0;
	scanf("%d", &n);
	if (runnian(n) == 1)
	{
		Month[2] = 29;
	}
	int m = sumday(n);
	printf("                        %d Calendar\n", n);

	int week = sumday(n);//从礼拜几开始
	int week1[13] = { 0 };
	week1[1] = week;
	for (int p = 2; p <= Month[1]; p++)
	{
		week = (week + 1) % 7;
	}
	week1[2] = (week + 1) % 7;

	for (int i = 3; i <= 12; i++)//每个月从礼拜几开始
	{
		for (int p = 1; p <= Month[i - 1]; p++)
		{
			week = (week + 1) % 7;
		}
		week1[i] = (week + 1) % 7;
	}
	int a[32] = { 0 };
	for (int i = 1; i <= 31; i++)
	{
		a[i] = i;
	}

	int i = 1;
	for (int c = 1; c <= 6; c++)
	{

		int flag = 0;
		int x = 1;
		int weekk = week1[i + 1];
		week = week1[i];
		printf("\n");
		printf("\n");
		printf("\n");
		printmonth(c);
		printf("\n");
		printf(" Sun Mon Tue Wed Thu Fri Sat         Sun Mon Tue Wed Thu Fri Sat\n");
		printf("\n");
		//开始打印
		for (int k = 1; k <= week * 4; k++)
		{
			printf(" ");
		}
		for (j = 1; j <= Month[i]; j++)
		{
			printf("%4d", j);
			week = (week + 1) % 7;
			
			 if (a[x] == Month[i + 1] && j == Month[i])
			{
				
				break;
			}
			else if (week == 0 || j == Month[i])
			{
				if (j != Month[i])
				{
					printf("        ");


					if (flag == 0)
					{
						flag = 1;
						for (int k = 1; k <= week1[i + 1] * 4; k++)
						{
							printf(" ");
						}

						while (1)
						{
							if (a[x] <= Month[i + 1])
							{
								if (a[x] != Month[i + 1]) {
									printf("%4d", a[x]);
									x++;

								}
								else if (a[x] == Month[i + 1])
								{
									printf("%4d", a[x]);
									printf("\n");
									
									break;
								}

							}
							weekk = (weekk + 1) % 7;
							if (weekk == 0)
							{
								if (a[x] == Month[i + 1])
								{
									x--;
								}
								printf("\n");
								printf("\n");
								
								break;
							}
						}
					}
					else
					{
						
						while (1)
						{
							if (a[x] <= Month[i + 1])
							{
								if (a[x] != Month[i + 1]) {
									printf("%4d", a[x]);
									x++;

								}
								else if (a[x] == Month[i + 1])
								{
									printf("%4d", a[x]);
									printf("\n");
									printf("\n");
									
									break;
								}

							}
							weekk = (weekk + 1) % 7;
							if (weekk == 0)
							{
							
								if (a[x] == Month[i + 1])
								{
									x--;
								}
								printf("\n");
								printf("\n");
								
								break;
							}
						}
					}
				}
				else {
					
					int week3 = week1[i + 1];
					while (week3 % 7 != 0)
					{
						printf("    ");
						week3++;
					}
					printf("        ");
					
					
					while (1)
					{
						
						if (a[x] <= Month[i + 1])
						{
							if (a[x] != Month[i + 1]) {
								printf("%4d", a[x]);
								x++;

							}
							else if (a[x] == Month[i + 1])
							{
								printf("%4d", a[x]);
								printf("\n");
								
								break;
							}

						}
						else {
							printf("\n");
							
							break;
						}

						weekk = (weekk + 1) % 7;
						if (weekk == 0)
						{
						
							
								x--;
							
							printf("\n");
							printf("\n");
							
							break;
						}
					}
				}
			}
		}

		if (a[x] < Month[i + 1])
		{
			x++;
			printf("                                    ");
			
			while (1)
			{
				if (a[x] <= Month[i + 1])
				{
					if (a[x] != Month[i + 1]) {
						printf("%4d", a[x]);
						x++;

					}
					else if (a[x] == Month[i + 1])
					{
						printf("%4d", a[x]);
						printf("\n");
						break;
					}

				}
				else {
					printf("\n");
					
					break;
				}
				weekk = (weekk + 1) % 7;
				if (weekk == 0)
				{
				
					printf("\n");
					printf("\n");
					
					break;
				}
			}
		}
		i = i + 2;
	}
	return 0;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值