由于原题所给代码存在一定bug,故本人采用另一种方法实现。
程序运行效果如图,在运行时输入合法的年月,程序将会显示对应月份的日历。
程序源码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void mkCalendar(int week, int day); //输出日历的函数
int calWeek(int year, int month,int day); //用于计算某天星期几的函数
int calDay(int year, int month); //用于计算某年某月天数的函数
int main(int a, char **date) { //
int year=0,month=0,writeMonth=0;
if (a == 1) {
printf("Error!");
exit(0); //当没有输入年月时报错
}
for (int i = 0; date[1][i]; i++) {
if (date[1][i] == '-' || date[1][i] == '.' || date[1][i]== '/') { //新手注意判断是否相等时使用==运算符
writeMonth = 1;
continue;
}
if (!writeMonth) {
year = year * 10 + (date[1][i] - '0');
}
if (writeMonth) {
month = month * 10 + (date[1][i] - '0');
}
}
if (year < 1583 || month>12 || month < 1) {
printf("Unsupported Date"); //处于简便考虑,没有对1582年10月及以前的日期采用另一公式,故不允许输入1583年以前的日期
exit(0);
}
mkCalendar(calWeek(year,month,1),calDay(year,month));
return 0;
}
void mkCalendar(int weeknum, int day) {
int changeline = 0;
printf("***************************\n");
printf("SUN MON TUE WED THU FRI SAT\n");
for (int i = 0; i < weeknum; i++) {
printf(" ");
changeline++;
}
for (int i = 1; i <= day; i++) {
printf("%3d ", i);
changeline++;
if (changeline % 7 == 0&&i!= day) printf("\n");
}
printf("\n***************************\n");
}
int calWeek(int year, int month,int day) {
int c, y, m, d=day,w;
if (month == 1||month==2) {
year -= 1;
m = month + 12;
}
else m = month;
c = year / 100;
y = year % 100;
w = ((c/4)-2*c+y+(y/4)+(13*(m+1)/5)+d-1) % 7;
if (w < 0) w += 7;
return w;
}
int calDay(int year, int month) {
switch (month) {
case 1:case 5:case 7:case 8:case 10:case 12: return 31; break;
case 3:case 4: case 6: case 9: case 11: return 30; break;
case 2:
if(year%400==0||(year%4==0&&year%100!=0)) return 29;
else return 28;
break;
}
} 本程序遵循IPO编程模式,从控制台读取日期,进行计算,并输出日历。 输入部分
int main(int a, char **date) {
int year=0,month=0,writeMonth=0;
if (a == 1) {
printf("Error!");
exit(0);
}
for (int i = 0; date[1][i]; i++) {
if (date[1][i] == '-' || date[1][i] == '.' || date[1][i]== '/') {
writeMonth = 1;
continue;
}
if (!writeMonth) {
year = year * 10 + (date[1][i] - '0');
}
if (writeMonth) {
month = month * 10 + (date[1][i] - '0');
}
}
处理部分
int calWeek(int year, int month,int day) {
int c, y, m, d=day,w;
if (month == 1||month==2) {
year -= 1;
m = month + 12;
}
else m = month;
c = year / 100;
y = year % 100;
w = ((c/4)-2*c+y+(y/4)+(13*(m+1)/5)+d-1) % 7;
if (w < 0) w += 7;
return w;
}
int calDay(int year, int month) {
switch (month) {
case 1:case 5:case 7:case 8:case 10:case 12: return 31; break;
case 3:case 4: case 6: case 9: case 11: return 30; break;
case 2:
if(year%400==0||(year%4==0&&year%100!=0)) return 29;
else return 28;
break;
} 输出部分
void mkCalendar(int weeknum, int day) {
int changeline = 0;
printf("***************************\n");
printf("SUN MON TUE WED THU FRI SAT\n");
for (int i = 0; i < weeknum; i++) {
printf(" ");
changeline++;
}
for (int i = 1; i <= day; i++) {
printf("%3d ", i);
changeline++;
if (changeline % 7 == 0&&i!= day) printf("\n");
}
printf("\n***************************\n");
} 
京公网安备 11010502036488号