培训第三天(打印某年的年历)

已知今天星期六,问n天后星期几
x=(6+n)%7
已知今天星期六,问n天前星期几
x=6-n%7
(一)已知2000年1月1日为星期六,求某一年的日历

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int num;
int isLeapyear(int year)//求某年是否为闰年
{
   int isOK=0;
   isOK=(year%4==0&&year%100!=0||year%400==0)?1:0;
  // printf("%d年是%d\n",year,isOK);
   return isOK;
}
int yearDays(int year)//求某年有几天
{
	int days=0;
	days=(isLeapyear(year)==1) ? 366 : 365;
	// printf("%d年有%d天\n",year,days);
	return days;
}
int yearMonthdays(int year ,int month )//求某年某月的天数
{
	   int days=0;
	   switch(month)
	   {
	   case 1:
	   case 3:
	   case 5:
	   case 7:
	   case 8:
	   case 10:
	   case 12:
	  days=31;
	  break;
	   case 4:
	   case 6:
	   case 9:
	   case 11:
	  days=30;
	  break;
	   case 2:
	  days=(isLeapyear(year)==1) ? 29 : 28;
		   break;
	   }
	 //  printf("%d年%d月有%d天\n",year,month,days);
	   return days;
}
int firstYearMonthDaysto2000_1_1(int year , int month)//求某年某月的第一天到2000年1月1日有多少天
{
		int i;
		int days=0;
		if(year>=2000)
		{
			   for(i=2000;i<year;i++)
		  days+=yearDays(i);
		  for(i=1;i<month;i++)
		  days+=yearMonthdays(year,i);
		}
		else
			{
		for(i=year+1;i<=2000;i++)
						days+=yearDays(i);
		for(i=month;i<=12;i++)
		 days+=yearMonthdays(year,i);
		}
		// printf("到2000年1月1日有%d\n",days);
		return days;
}
int yearMonthWeekDay(int year , int month)//求距2000年1月1日为n天的日子为星期几
{
	int weekday=99;
	int n=firstYearMonthDaysto2000_1_1(year,month);
	if(year>=2000)
	{
    	weekday=(6+n)%7;
	}
	else
	{
	   weekday=6-n%7;
	}
	return weekday;
}
void displayYearMonth(int year, int month)//输出某年某月的日历
{
	printf("------------------------%d年%d月------------------------\n",year,month);
	printf("日\t一\t二\t三\t四\t五\t六\t周\n");
	int i;
	int count=0;
	int zhou=1;
	int days=yearMonthdays(year,month);
	int weekday=yearMonthWeekDay(year,month);
	for(i=0;i<weekday;i++)
	{
		count++;
		printf("\t");
	}
	for(i=1;i<=days;i++)
	{
		count++;
		printf("%d\t",i);
		if(count%7==0)
		{
		   printf("%d\n",num++);
		} 
	}
	if(count%7!=0)
	{
		int a=count;
			  for(;a%7!=0;a++)
				   printf("\t");
			   printf("%d\n",num);
	}
	printf("\n");
}
void displayYear(int year)//输出某年的日历
{
	int i;
	for(i=1;i<=12;i++)
	{
			displayYearMonth(year,i);
	}
}
int main()
{
   int year;
   while(~scanf("%d",&year))
   {
	 num=1;
	 displayYear(year);
   }   
   return 0;
}


好的,下面是一个简单的打印某年的万年历的 C 语言程序: ``` #include <stdio.h> // 判断某一年是否为闰 int is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } // 计算某一年某一的天数 int get_days(int year, int month) { int days; if (month == 2) { if (is_leap_year(year)) { days = 29; } else { days = 28; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { days = 30; } else { days = 31; } return days; } // 打印一年某一的日历 void print_calendar(int year, int month, int start_day) { int days, i, j, k; days = get_days(year, month); printf("====================%d%d====================\n", year, month); printf(" 日 一 二 三 四 五 六\n"); k = 1; for (i = 1; i <= 6; i++) { for (j = 0; j < 7; j++) { if (i == 1 && j < start_day) { printf(" "); } else if (k <= days) { printf("%3d", k); k++; } else { break; } } if (k > days) { break; } printf("\n"); } printf("\n"); } int main() { int year, i, start_day; printf("请输入年份:"); scanf("%d", &year); start_day = (1 + 5 * ((year - 1) % 4) + 4 * ((year - 1) % 100) + 6 * ((year - 1) % 400)) % 7; for (i = 1; i <= 12; i++) { print_calendar(year, i, start_day); start_day = (start_day + get_days(year, i)) % 7; } return 0; } ``` 该程序会先通过 `is_leap_year` 函数判断某一年是否为闰,然后通过 `get_days` 函数计算某一年某一的天数。在 `print_calendar` 函数中,我们首先打印年份份,然后根据起始日(即该的第一天是周几)和天数打印日历。在 `main` 函数中,我们先让用户输入年份,然后通过蔡勒公式计算该的 1 1 日是星期几(可以参考百度百科的蔡勒公式相关内容),然后循环调用 `print_calendar` 函数打印的每个的日历。其中,起始日是根据蔡勒公式计算得出的,每个的起始日都是上个的起始日加上上个的天数再对 7 取余得到的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值