C++打印日历

本文详细介绍了如何使用C++编程语言实现一个函数,根据输入的年份和月份计算出该年的日历,包括判断闰年和确定每个月的第一天是星期几,以及按照特定的输出格式打印日历。
摘要由CSDN通过智能技术生成

【问题描述】已知:公元1年1月1日是星期一,根据输入的年份和月份来输出该年月的日历。

每个星期几占5个字节,右对齐,由于简写显示本身就占3个字节,所以只需要在简写前面多输出两个空格就好了。每个日期数字占5个字节,也是右对齐,这样能使输出的日历上下对齐。

 步骤:

1、定义函数leapYear:判断闰年;

2、定义函数whatDay:计算某年某月的1号是星期几;

3、定义函数printMonth:按要求的格式打印某年某月的日历。

#include<iostream>
using namespace std;
int leapYear(int y)    //判断是否闰年 
//闰年能被4整除且不被100整除或者被400整除 
{
	if(y%4==0&&y%100!=0||y%400==0)
	   return 1;
	return 0;
}
int whatDay(int year,int month)    //计算某年某月的一号是星期几 
{
	int dyear=0,nd=0,w,lyear=0;//lyear表示闰年,dyear为非闰年,nd为一共多少天 
	if (year == 1)nd=0;
	else{
		for (int i=1;i<year;i++){
		
		     if(leapYear(i))lyear+=1;//调用判断是否为闰年的函数 
		     else dyear +=1;
	}
	nd=dyear*365+lyear*366;}//先计算从公元1年到现在这些年有多少天 
	if(month==1)nd += 1;
	else{
		int month1[]={1,31,0,31,30,31,30,31,31,30,31,30,31};
		for (int j=0;j<=month-1;j++)//month-1,表示计算今年从1月1到所求的月份的一号之前已经过了多少天 
		{
			nd+= month1[j];
		}
		if (leapYear(year)&&month >=3)nd+=29;//再次判断是否闰年,2月的天数不同 
		if (leapYear(year)==0&&month >=3)nd+=28;
	} 
	w=0;
	w+=nd;
	w=w%7;//得到的总天数除7,余下的天数为所求的月份第一天是星期几 
	if(w==0)w=7;
	return w;
}
void printMonth(int year, int month)    //打印 
{
	int day=whatDay(year,month);//得到这个月一号是星期几 
	int month1[]={1,31,0,31,30,31,30,31,31,30,31,30,31};
	if(leapYear(year)) month1[2]=29;
	else month1[2]=28;
	cout<<"  Mon  Tue  Wed  Thu  Fri  Sat  Sun "<<endl;
	for(int i=1;i <=month1[month];i++)//i表示这个月的几号 
	{
		if(i==1)
		{
			for(int j=1;j<day;j++){ //在这个月一号是星期几前均为空格 
					cout<<"     ";
			}
		}
		if(i <10) cout<<"   "<< i <<" ";
		else cout <<"  "<< i <<" ";   //10之后的数比10之前的数多一位,所以少一个空格 
		if ((i+day-1)%7==0) cout <<endl;//七天换一次行,包括纯空格 
	}
	cout <<endl;
}
	int main()
	{
		int year,month;
		cout <<"Please enter the year and month:"<<endl;
		cin>>year>>month;
		printMonth(year,month);
		return 0;
	}	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值