首先把代码放在前
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;
// 函数printMonth:按要求的格式打印某年某月的日历
// 参数:year-年,month-月
// 返回值:无
void printMonth(int year, int month);
// leapYear:判断闰年
// 参数:y-年
// 返回值:1-是闰年,0-不是闰年
int leapYear(int y)
{
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
return 1;
return 0;
}
// 函数whatDay:计算某年某月的1号是星期几
// 参数:year-年,month-月
// 返回值:1到7--星期1到星期日
int whatDay(int year, int month)
{
// 1年月日是星期一
int w = 1;
int i;
// 1到year-1都是全年
for(i = 1; i < year; i++)
{
if(leapYear(i))
w += 366;
else
w += 365;
}
switch(month)
{
case 12: // 加月的
w += 30;
case 11: // 加月的
w += 31;
case 10: // 加月的
w += 30;
case 9: // 加月的
w += 31;
case 8: // 加月的
w += 31;
case 7: // 加月的
w += 30;
case 6: // 加月的
w += 31;
case 5: // 加月的
w += 30;
case 4: // 加月的
w += 31;
case 3: // 加月的
if(leapYear(year))
w += 29;
else
w += 28;
case 2: // 加月的天
w += 31;
case 1: // 1月不加了
;
}
// 得到-6,其中为星期天
w = w % 7;
// 调整星期天
if(w == 0)
w = 7;
return w;
}
// 请在下面补充代码,实现函数printMonth
/*************** Begin **************/---------------------------------------------------
void printMonth(int year,int month){
cout<<" 一 二 三 四 五 六 日"<<endl;
int day=whatDay( year, month);
for (int i=1;i<=(3+4*(day-1));i++){
cout<<" ";
}
cout<<"1";
for (int j=2;j<=(7-day)+1;j++){
cout<<" "<<j;
}
cout<<endl;//第一行
if (month==1 || month==3 ||month==5 || month==7||month==8||month==10||month==12){
int m=0;
for(int i=(9-day);i<=31;i++){
if (i<=9){
cout<<" "<<i;
}
if (i>=10){
cout<<" "<<i;
}
m++;
if (m==7){
cout<<endl;
m=0;
}
}
}
if (month==4 || month==6 ||month==9|| month==11){
int m=0;
for(int i=(9-day);i<=30;i++){
if (i<=9){
cout<<" "<<i;
}
if (i>=10){
cout<<" "<<i;
}
m++;
if (m==7){
cout<<endl;
m=0;
}
}
}
if(month==2){
if(leapYear( year)){
int m=0;
for(int i=(9-day);i<=29;i++){
if (i<=9){
cout<<" "<<i;
}
if (i>=10){
cout<<" "<<i;
}
m++;
if (m==7){
cout<<endl;
m=0;
}
}
}else{
int m=0;
for(int i=(9-day);i<=28;i++){
if (i<=9){
cout<<" "<<i;
}
if (i>=10){
cout<<" "<<i;
}
m++;
if (m==7){
cout<<endl;
m=0;
}
}
}
}
}
/*************** End **************/-----------------------------------------------------
int main()
{
// 年、月
int y, m;
// 输入年月
cin >> y >> m;
// 输出该年月的日历
printMonth(y,m);
return 0;
}
我的思路是对要打印的日历逐行进行分析,每一块是四个字节的宽度,一个数字是一个字节,两个数字是两个字节,这是一个注意点,对于不同的数字有不同的输出。还要注意第三行开始数字的判定,经列举发现,开头数字与星期几的判定数字和恰为9,以此我们可以开始对第三行的打印。里面的if else比较多,注意花括号位置规范作用域。
将打印部分进行封住,这样也许会更美观一些。
void print(year,month)//月份 年份
{
cout<<" 一 二 三 四 五 六 日"<<endl;
int day=whatDay( year, month);
for (int i=1;i<=(3+4*(day-1));i++){
cout<<" ";
}
cout<<"1";
for (int j=2;j<=(7-day)+1;j++){
cout<<" "<<j;
}
cout<<endl;//第一行
//其余行
int days;//相应月份的天数
------------ //此行代码为判断月份的天数
int m=0;
for(int i=(9-day);i<=days;i++){
if (i<=9){
cout<<" "<<i;
}
if (i>=10){
cout<<" "<<i;
}
m++;
if (m==7){
cout<<endl;
m=0;
}
}
}