打印给定年份和月份的日历

时间:2020-10-27 01:00:03

标签: c

我正在尝试构建一个程序,以打印出用户输入的月份和年份。到目前为止,我得到的是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");
}

输出: enter image description here

任何帮助将不胜感激。

编辑:似乎我在检查代码时太粗心,发现了小错误并解决了问题!

2 个答案:

答案 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);

一次处理这三个部分

相关问题