初版
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
// 函数printYear:按要求的格式打印某年的日历
// 参数:year-年
// 返回值:无
void printYear(int year);
// 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;
}
// 请在下面补充代码,实现函数printYear
/*************** Begin **************/
void printTwoMonths(int year, int month1, int month2)
{
//1.获得month1和month2分别多少天以及第一天是星期几
int first = whatDay(year, month1);
int second = whatDay(year, month2);
int day1, day2;
switch (month1)
{
case 1:day1 = 31; break;
case 2:
if (leapYear(year))
day1 = 29;
else
day1 = 28; break;
case 3:day1 = 31; break;
case 4:day1 = 30; break;
case 5:day1 = 31; break;
case 6:day1 = 30; break;
case 7:day1 = 31; break;
case 8:day1 = 31; break;
case 9:day1 = 30; break;
case 10:day1 = 31; break;
case 11:day1 = 30; break;
case 12:day1 = 31; break;
}
switch (month2)
{
case 1:day2 = 31; break;
case 2:
if (leapYear(year))
day2 = 29;
else
day2 = 28; break;
case 3:day2 = 31; break;
case 4:day2 = 30; break;
case 5:day2 = 31; break;
case 6:day2 = 30; break;
case 7:day2 = 31; break;
case 8:day2 = 31; break;
case 9:day2 = 30; break;
case 10:day2 = 31; break;
case 11:day2 = 30; break;
case 12:day2 = 31; break;
}
std::cout << " ";
printf(" %2d", day1);
printf(" %2d", day2);
std::cout << " ";
std::cout << std::endl;
//2.分别打印month1和month2的第一行
int i1 = first;
int i2 = second;
std::cout << " 一 二 三 四 五 六 日 一 二 三 四 五 六 日" << std::endl;
for (int i = 1; i < first; i++) {
std::cout << " ";
}
for (i1; i1 <= 7; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (int i = 1; i < second; i++) {
std::cout << " ";
}
for (i2; i2 <= 7; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//3.打印剩余的行,考虑:month1和month2中的换行问题和填充空格问题
//第二行
for (i1; i1 <= 14; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 14; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第三行
for (i1; i1 <= 21; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 21; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第四行
for (i1; i1 <= 28; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 28; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第五行
if ((day1 - (i1 - first + 1)) >= 7) {
for (i1; i1 <= 35; i1++) {
printf(" %2d", i1 - first + 1);
}
}
else if (0 <= day1 - (i1 - first) && day1 - (i1 - first) <= 7) {
for (i1; i1 <= day1 + first - 1; i1++) {
printf(" %2d", i1 - first + 1);
}
for (i1; i1 <= 35; i1++) {
std::cout << " ";
}
}
else {
for (i1; i1 <= 35; i1++) {
std::cout << " ";
}
}
std::cout << " ";
if (day2 - (i2 - second) <= 7) {
for (i2; i2 <= day2 + second - 1; i2++) {
printf(" %2d", i2 - second + 1);
}
std::cout << std::endl;
}
else {
for (i2; i2 <= 35; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
}
//第六行
if ( i1 - first + 1 <= day1) {
for (i1; i1 <= day1 + first - 1; i1++) {
printf(" %2d", i1 - first + 1);
}
for (i1; i1 <= 42; i1++) {
std::cout << " ";
}
}
else if ((i1 - first + 1) > day1) {
for (i1; i1 <= 42; i1++) {
std::cout << " ";
}
}
std::cout << " ";
if (day2 - (i2 - second) <= 7) {
for (i2; i2 <= day2 + second - 1; i2++) {
printf(" %2d", i2 - second + 1);
}
std::cout << std::endl;
}
}
void printYear(int year)
{
printTwoMonths(year, 1, 2);
printTwoMonths(year, 3, 4);
printTwoMonths(year, 5, 6);
printTwoMonths(year, 7, 8);
printTwoMonths(year, 9, 10);
printTwoMonths(year, 11, 12);
}
/*************** End **************/
int main()
{
// 年
int y;
// 输入年
cin >> y;
// 输出该年的日历
printYear(y);
system("pause");
return 0;
}
最终版本
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
// 函数printYear:按要求的格式打印某年的日历
// 参数:year-年
// 返回值:无
void printYear(int year);
// 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;
}
void printYearnumber(int year){
int y1=year/1000;
int y2=year/100%10;
int y3=year/10%10;
int y4=year%10;
const char number[][8][4]={
{{' ','*','*',' '}, //0
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{' ','*','*',' '}
},
{{' ','*','*',' '}, //1
{' ','*','*',' '},
{'*','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '}
},
{{'*','*','*','*'}, //2
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'},
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //3
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
},
{{'*',' ','*',' '}, //4
{'*',' ','*',' '},
{'*',' ','*',' '},
{'*','*','*','*'},
{' ',' ','*',' '},
{' ',' ','*',' '},
{' ',' ','*',' '},
{' ',' ','*',' '}
},
{{'*','*','*','*'}, //5
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //6
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //7
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'}
},
{{'*','*','*','*'}, //8
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //9
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
},
};
for(int i=0; i<8; i++)
{
for(int j=0; j<4; j++)
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y1][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y2][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y3][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y4][i][j];
cout<<" ";
cout<<endl;
}
cout<<endl;
}
// 请在下面补充代码,实现函数printYear
/*************** Begin **************/
void printTwoMonths(int year, int month1, int month2)
{
//1.获得month1和month2分别多少天以及第一天是星期几
int first = whatDay(year, month1);
int second = whatDay(year, month2);
int day1, day2;
switch (month1)
{
case 1:day1 = 31; break;
case 2:
if (leapYear(year))
day1 = 29;
else
day1 = 28; break;
case 3:day1 = 31; break;
case 4:day1 = 30; break;
case 5:day1 = 31; break;
case 6:day1 = 30; break;
case 7:day1 = 31; break;
case 8:day1 = 31; break;
case 9:day1 = 30; break;
case 10:day1 = 31; break;
case 11:day1 = 30; break;
case 12:day1 = 31; break;
}
switch (month2)
{
case 1:day2 = 31; break;
case 2:
if (leapYear(year))
day2 = 29;
else
day2 = 28; break;
case 3:day2 = 31; break;
case 4:day2 = 30; break;
case 5:day2 = 31; break;
case 6:day2 = 30; break;
case 7:day2 = 31; break;
case 8:day2 = 31; break;
case 9:day2 = 30; break;
case 10:day2 = 31; break;
case 11:day2 = 30; break;
case 12:day2 = 31; break;
}
std::cout << " ";
printf(" %2d 月 (%2d天)",month1, day1);
std::cout << " ";
printf("%2d 月 (%2d天)",month2, day2);
std::cout << " ";
std::cout << std::endl;
//2.分别打印month1和month2的第一行
int i1 = first;
int i2 = second;
std::cout << " 一 二 三 四 五 六 日 一 二 三 四 五 六 日" << std::endl;
std::cout << " —————————————— ——————————————" << std::endl;
for (int i = 1; i < first; i++) {
std::cout << " ";
}
for (i1; i1 <= 7; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (int i = 1; i < second; i++) {
std::cout << " ";
}
for (i2; i2 <= 7; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//3.打印剩余的行,考虑:month1和month2中的换行问题和填充空格问题
//第二行
for (i1; i1 <= 14; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 14; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第三行
for (i1; i1 <= 21; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 21; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第四行
for (i1; i1 <= 28; i1++) {
printf(" %2d", i1 - first + 1);
}
std::cout << " ";
for (i2; i2 <= 28; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
//第五行
if ((day1 - (i1 - first + 1)) >= 7) {
for (i1; i1 <= 35; i1++) {
printf(" %2d", i1 - first + 1);
}
}
else if (0 <= day1 - (i1 - first) && day1 - (i1 - first) <= 7) {
for (i1; i1 <= day1 + first - 1; i1++) {
printf(" %2d", i1 - first + 1);
}
for (i1; i1 <= 35; i1++) {
std::cout << " ";
}
}
else {
for (i1; i1 <= 35; i1++) {
std::cout << " ";
}
}
std::cout << " ";
if (day2 - (i2 - second) <= 7) {
for (i2; i2 <= day2 + second - 1; i2++) {
printf(" %2d", i2 - second + 1);
}
std::cout << std::endl;
}
else {
for (i2; i2 <= 35; i2++) {
printf(" %2d", i2 - second + 1);
if (i2 % 7 == 0) {
std::cout << std::endl;
}
}
}
//第六行
if ( i1 - first + 1 <= day1) {
for (i1; i1 <= day1 + first - 1; i1++) {
printf(" %2d", i1 - first + 1);
}
for (i1; i1 <= 42; i1++) {
std::cout << " ";
}
}
else if ((i1 - first + 1) > day1) {
for (i1; i1 <= 42; i1++) {
std::cout << " ";
}
}
std::cout << " ";
if (day2 - (i2 - second) <= 7) {
for (i2; i2 <= day2 + second - 1; i2++) {
printf(" %2d", i2 - second + 1);
}
std::cout << std::endl;
}
std::cout << std::endl;
}
void printYear(int year)
{
printTwoMonths(year, 1, 2);
printTwoMonths(year, 3, 4);
printTwoMonths(year, 5, 6);
printTwoMonths(year, 7, 8);
printTwoMonths(year, 9, 10);
printTwoMonths(year, 11, 12);
}
/*************** End **************/
int main()
{
// 年
int y;
// 输入年
cin >> y;
// 输出该年的日历
std::cout << std::endl;
printYearnumber(y);
std::cout << std::endl;
printYear(y);
system("pause");
return 0;
}
附带打印年份数字的代码
#include <iostream>
using namespace std;
void printS();
void printS(int year){
int y1=year/1000;
int y2=year/100%10;
int y3=year/10%10;
int y4=year%10;
const char number[][8][4]={
{{' ','*','*',' '}, //0
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{' ','*','*',' '}
},
{{' ','*','*',' '}, //1
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '},
{' ','*','*',' '}
},
{{'*','*','*','*'}, //2
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'},
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //3
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
},
{{'*',' ','*',' '}, //4
{'*',' ','*',' '},
{'*',' ','*',' '},
{'*','*','*','*'},
{' ',' ','*',' '},
{' ',' ','*',' '},
{' ',' ','*',' '},
{' ',' ','*',' '}
},
{{'*','*','*','*'}, //5
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //6
{'*',' ',' ',' '},
{'*',' ',' ',' '},
{'*','*','*','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //7
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'}
},
{{'*','*','*','*'}, //8
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'}
},
{{'*','*','*','*'}, //8
{'*',' ',' ','*'},
{'*',' ',' ','*'},
{'*','*','*','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{' ',' ',' ','*'},
{'*','*','*','*'}
}
};
for(int i=0; i<8; i++)
{
for(int j=0; j<4; j++)
cout<<number[y1][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y2][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y3][i][j];
cout<<" ";
for(int j=0; j<4; j++)
cout<<number[y4][i][j];
cout<<" ";
cout<<endl;
}
cout<<endl;
}
int main()
{
int y;
// 输入年
cin >> y;
printS(y);
cout<<endl;
return 0;
}