我正在尝试构建一个程序,以打印出用户输入的月份和年份。到目前为止,我得到的是5位数字的年份,并在2月份的28天内输入了“ 2020 2”结果。
到目前为止,我在此作业中拥有的代码:
#include <stdio.h>
#include<stdlib.h>
int is_leapyear(int y)
{
if ((y % 100 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;
else
return 0;
}
int main()
{
int i, j, year, month;
printf("Please enter the year and month:");
scanf("%d", &year);
scanf("%d", &month);
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int la[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
int c = 1;
int flag = 0;
if (is_leapyear(year))
flag = 1;
for (i = 0; i<month; i++)
{
if (flag == 1)
c += la[i];
else
c += a[i];
}
int s = (year - 1) + ((year - 1) / 4) + ((year - 1) / 400) - ((year - 1) / 100) + c;
int week = s % 7;
printf("Calendar " );
printf("%-d", year);
if (month < 10)
printf("0");
printf(" %d\n", month);
printf("----------------------\n");
printf("Su Mo Tu We Th Fr Sa \n");
printf("----------------------\n");
if (flag == 1) {
for (j = 0; j < week; j++)
{
printf(" ");
}
for (i = 1; i <= la[month]; i++)
{
if ((week + i - 1) % 7 == 0)
{
printf("\n");
}
if (i < 10)
{
printf(" ");
}
printf("%d", i);
printf(" ");
}
}
else {
for (j = 0; j < week; j++)
{
printf(" ");
}
for (i = 1; i <= a[month]; i++)
{
if ((week + i - 1) % 7 == 0)
{
printf("\n");
}
if (i < 10)
{
printf(" ");
}
printf("%d", i);
printf(" ");
}
}
printf("\n");
printf("---------------------\n");
}
任何帮助将不胜感激。
编辑:似乎我在检查代码时太粗心,发现了小错误并解决了问题!
答案 0 :(得分:1)
OP的is_leapyear(int y)
以4的各种倍数失败。
相反:
// Alternative for Gregorian calendar
int is_leapyear(int y) {
if (y % 4 == 0) {
if (y % 100 == 0) { // A century year?
return (y % 400 == 0);
}
return 1;
}
return 0;
}
更深:Leap year。
答案 1 :(得分:1)
isleapyear()的世纪检查
if ((y % 100 == 0 && y % 100 != 0) || y % 400 == 0)
是有缺陷的。它检查年份是否可以被100 整除和不能被100整除,这在逻辑上是不可能的。我认为你的意思是
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
因此请检查年份是否可以被 4 整除而不是被100整除。
对于20200,这是因为在打印空格之前先打印了当月的前导零。只需将其更改为
printf("%-d", year);
printf(" "); //put space right away
if (month < 10)
printf("0");
printf("%d\n", month); //no need to print space here
甚至更好,如@JonathanLeffler在评论中指出的
printf(" %.2d\n", month);
它只用一次调用或仅处理一次空格,前导零和换行
printf("Calendar %.4d %.2d\n", year, month);
一次处理这三个部分