我正在研究一个项目超过3个月,今天我决定在某个时候该程序应该打印当前给定的日历 .
日历应如下所示:
Su Mo Tu We Th Th Fr Sa.
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
所以我创建了以下功能:
void printWeek(int firstDay,int lastDay){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay - 1)%7 ==0){
printf("\n");
}
}
}
并打印以下内容:
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
我们发言的月份是九月(2015年),应该是这样的:
Su Mo Tu We Th Th Fr Sa.
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
因为2015年9月开始周二而不是周日,我创建了另一个函数,它返回日期编号( Sunday == 0
, Monday == 1
... Saturday == 6
):
int dayWeek(int d, int m, int y){
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[] = {0, 1, 2, 3, 4, 5, 6};
int i;
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
month[1] = 29;
}
if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
printf("This is an invalid date.\n");
exit(1);
}
for (i = 1900; i < y; i++){
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
d += 366;
}else{
d += 365;
}
}
for (i = 0; i < m - 1; i++){
d += month[i];
}
return day[d % 7];
}
在某些时候,程序从给定数据的第一天和最后一天打印日历 .
问题是:我怎样才能得到以下输出:
Su Mo Tu We Th Th Fr Sa.
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
我已经知道函数 dayWeek()
返回2是星期二(从2015年9月起的第一个星期)但我不知道如何更改函数 printWeek()
;打印9月1日星期二而不是星期天 . 希望你能理解我的英语不好 .
这是我现在的代码:
#include<stdio.h>
#include<stdlib.h>
int dayWeek(int d, int m, int y){
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[] = {0, 1, 2, 3, 4, 5, 6};
int i;
if (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){
month[1] = 29;
}
if (y < 1900 || m < 1 || m > 12 || d < 1 || d > month[m - 1]) {
printf("This is an invalid date.\n");
exit(1);
}
for (i = 1900; i < y; i++){
if (i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)){
d += 366;
}else{
d += 365;
}
}
for (i = 0; i < m - 1; i++){
d += month[i];
}
return day[d % 7];
}
void printWeek(int firstDay,int lastDay){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay - 1)%7 ==0){
printf("\n");
}
}
}
int main(void){
int day = 1;
int month = 9;
int year = 2015;
int weekDay = dayWeek(day,month,year);
printf("The day of the Week is\t%d\n\n",weekDay);
printWeek(day,30);
return 0;
}
2 回答
您知道本月第一天的日期 - 本月的2日 - 所以您需要做的就是在输出
printWeek
函数中的第一天数字之前打印正确的空格数:(为清楚起见,我使用破折号) . 这将正确抵消一周的第一天:
但是由于您在日期索引上进行测试,第一行将会突出显示,下一行将不正确 . 因此,请再次添加工作日来调整行调整:
完整的例程,包括传递一周的第一天变量,然后变成
并按预期输出:
所以这是一个常见问题,数据不完全一致 .
您需要一个“星期几”的计数器,以及该月份日期的单独计数器 .
我已将
printWeek
重命名为printMonth
. 在一周的第一天发送(firstWeekDay
)(0 - 6) . 然后在打印 Headers 后,为初始日期位置创建空格 .最后,周结束基于
i
和firstWeekDay
所以何时添加新行被修改 .