我现在正在制作一个项目超过3个月,今天我决定在某个时候该程序应该打印当前给定的日历。
日历应如下所示:
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
所以我创建了以下函数:
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 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 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;
}
答案 0 :(得分:4)
您知道本月的第一天 - 2月,本月 - 所以您需要做的就是在输出printWeek
函数中的第一天数字之前打印正确的空格数:
for (i=0; i<weekday; i++)
printf ("-- ");
(为清楚起见,我使用破折号)。这将正确抵消一周的第一天:
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
但是由于您在日期索引上进行测试,第一行将会突出显示,下一行将不正确。因此,请再次添加工作日来调整行调整:
if((i + firstDay + weekday - 1)%7 ==0)
完整例程,包括传递一周的第一天变量,然后变为
void printWeek (int weekday, int firstDay,int lastDay){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for (i=0; i<weekday; i++)
printf ("-- ");
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay + weekday - 1)%7 ==0){
printf("\n");
}
}
}
并按预期输出:
The day of the Week is 2
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
答案 1 :(得分:2)
所以这是一个常见问题,数据不完全一致。
您需要一个“星期几”的计数器,以及该月份日期的单独计数器。
我已将printWeek
重命名为printMonth
。在一周的第一天发送(firstWeekDay
)(0 - 6)。然后在打印标题后,为初始日期位置创建空格。
最后,周末基于i
和firstWeekDay
,因此修改新行的时间将被修改。
void printMonth(int firstDay,int lastDay, int firstWeekDay ){
int i;
printf("Su Mo Tu We Th Fr Sa\n");
for(i = 0; i < firstWeekDay ; i ++ ) {
printf(" ");
}
for(i = 1; i <= lastDay; i++) {
printf("%2d ", i);
if((i + firstDay + firstWeekDay - 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);
printMonth(day,30, weekDay);
return 0;
}