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

C 打印给定年份和月份的日历,c,C,我正试图建立一个程序,将打印出用户输入的月份和年份。到目前为止,我得到的结果是今年有5位数字,并在28天内输入2月份的“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

我正试图建立一个程序,将打印出用户输入的月份和年份。到目前为止,我得到的结果是今年有5位数字,并在28天内输入2月份的“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");
}
#包括
#包括
整年是一年(整年)
{
如果((y%100==0&&y%100!=0)| | y%400==0)
返回1;
其他的
返回0;
}
int main()
{
int i,j,年,月;
printf(“请输入年份和月份:”);
scanf(“%d”和“年”);
scanf(“%d”和“月”);
int a[13]={0,31,28,31,30,31,31,31,30,31,31};
int la[13]={0,31,29,31,30,31,31,31,30,31,31};
int c=1;
int标志=0;
如果(是年)
flag=1;
对于(i=0;iOP的
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;
}


更深层次:.

世纪检查您的isleapyear()

是有缺陷的。它检查年份是否可以被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
它处理空格、前导零和新行,只需一次调用,或者只需一次调用

printf("Calendar   %.4d %.2d\n", year, month);

要同时处理这三个部分,我希望
is_leapyear()
中的
4
is_leapyear()
。您可以使用
printf(“%4d%02d\n”,year,month”)打印年份和月份;
您正确地诊断了为什么输出为
20200 2
。最好使用
printf(“%.2d\n”,month)
printf(“%02d\n”,month);
程序中没有条件;这两个都要求输出中有两位数字,必要时前导零。并且不需要额外调用
printf()
。实际上,只要调用
printf()
printf,就可以轻松打印这一行(“日历%.4d%.2d\n”,年,月);
printf(" %.2d\n", month);
printf("Calendar   %.4d %.2d\n", year, month);