【发布时间】:2016-05-13 15:45:32
【问题描述】:
我用 C 编写了一个非常简单的日历。它以年份作为输入,然后计算该年的日期和工作日。 这假设日期 0001-01-01 是星期一。 除了在一个地方,我已经让它工作得很好。当它即将打印出所有第 31 个日期的行时。 基本上出了问题的是,当它要检查在 4 月 31 日是否有任何要打印的内容(没有)时,它会排除 weekday 变量。这使得以下 31 日日期错误。 有没有人可以看看我是否做错了什么或者可能想帮助我? :)
编辑 忘了说这是一个需要解决的任务,不需要任何计算日期代码等的公式。唯一允许使用的参考是日期 0001-01-01 是星期一。
这是我的代码。 (是的,atm 有点乱,但我还在学习。)
int isLeapYear(int year){
if(((year%4==0) && (year%100!=0)) || (year%400==0)){
return 1;
}
else
return 0;
}
int getYear(){
int year = 0;
while(year==0 || year < 0){
printf("Enter year: ");
scanf("%d", &year);
if(year > 0){
break;
}
printf("Invalid input. Try again.\n\n");
}
return year;
}
void printWeekday(int w){
switch(w){
case 0:
printf("Sun");
break;
case 1:
printf("Mon");
break;
case 2:
printf("Tue");
break;
case 3:
printf("Wed");
break;
case 4:
printf("Thu");
break;
case 5:
printf("Fri");
break;
case 6:
printf("Sat");
break;
}
}
void printMonth(int m){
switch(m){
case 1:
printf("Jan");
break;
case 2:
printf(" Feb");
break;
case 3:
printf(" Mar");
break;
case 4:
printf(" Apr");
break;
case 5:
printf(" May");
break;
case 6:
printf(" Jun");
break;
case 7:
printf(" Jul");
break;
case 8:
printf(" Aug");
break;
case 9:
printf(" Sep");
break;
case 10:
printf(" Oct");
break;
case 11:
printf(" Nov");
break;
case 12:
printf(" Dec\n");
break;
}
}
void calendar(int year){
int y = 1;
int m = 1;
int d = 1;
int loop = 1;
int day = 1;
int days_in_month[14] = {0,31,28,31,30,31,30,31,31,30,31,30,31,0};
if(isLeapYear(year)){
days_in_month[1] = 29;
}
for(m=1; m<=12; m++){
printMonth(m);
}
while(loop){
int weekday = 1;
for(y=1; y<=year; y++){
for(m=1; m<=12; m++){
for(d=1; d<=31; d++){
if(weekday%7 == 0){
// printf("h");
weekday = 0;
}
if(y==year){
if(day>days_in_month[m]){
printf(" ");
printf("%d", weekday);
break;
}else if(d == day){
//printf("%d", weekday);
if(m == 1){
printf("%02d ", d);
printWeekday(weekday);
}else if(m == 12){
printf(" %02d ", d);
printWeekday(weekday);
printf("\n");
}else{
printf(" %02d ", d);
printWeekday(weekday);
}
}
}
if(d<=days_in_month[m]){
weekday = weekday + 1;
}
}
}
}
day++;
if(day == 32){
break;
}
}
}
int main()
{
int end = 1;
while(end){
int year = getYear();
printf(" %d\n", year);
calendar(year);
printf("\nEnter 0 to quit: ");
scanf("%d", &end);
//system("cls");
}
return 0;
}
【问题讨论】:
-
days_in_month[1] = 29; -> 应该是 days_in_month[2] = 29;
-
哦,对了,我测试的时候忘记改了,虽然这只适用于闰年,但遗憾的是这不是问题:)
-
我想你的问题是关于你的代码中的
void calendar(int year)。请您详细说明这个函数的预期输入和相应的输出应该是什么?一个示例(可能显示错误)会有所帮助。 -
是的,没错。它是关于那个功能的。这个函数的输入是用户想要计算日期的年份。 (例如,我可以输入 2016 年,它会显示该年每个月的所有日期和工作日。)这是第 1 年的output screen
标签: c date calendar codeblocks