我现在正在做一个超过3个月的程序,在今天的某个时候,我决定程序在某个时候应该打印当前给定的日历。
日历应该是这样的:
苏茂图我们公司Sa 1 2 3 4 5 6 7 8 10 11 12 13 14 16 16 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
我们发言的月份是9月(2015年),应如下所示:
苏茂图我们公司Sa 1 2 3 4 5 6 7 8 10 11 12 13 14 16 16 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];
}
在某个时候,程序会打印给定数据的第一天和最后一天的日历。
问题是:如何获得以下输出:
苏茂图我们公司Sa 1 2 3 4 5 6 7 8 10 11 12 13 14 16 16 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;
}
发布于 2015-09-01 11:21:01
因此,这是一个常见的问题,数据不完全对齐。
您需要一个“一周中的一天”的柜台,以及一个月份中的日期单独的柜台。
我已将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;
}
https://stackoverflow.com/questions/32338237
复制