C语言中的12个月日历

C语言中的12个月日历,c,C,我正在用C语言制作一个12个月的日历。这个程序显示特定年份的12个月日历。程序会提示用户打印年份,并计算出a是否为闰年,b所选年份从星期几开始 说明: •main提示用户输入,调用自己设计的函数以确定输入年份的起始日期。然后调用函数printCalendar来实际打印12个月的日历 •printCalendar有两个参数,年份号和开始日期。然后,它在一年中循环并调用函数printMonth十二次,每个月一次 •printMonth接受三个参数,年份号、月份号和特定月份的开始日期,并返回下一个月开

我正在用C语言制作一个12个月的日历。这个程序显示特定年份的12个月日历。程序会提示用户打印年份,并计算出a是否为闰年,b所选年份从星期几开始

说明:

•main提示用户输入,调用自己设计的函数以确定输入年份的起始日期。然后调用函数printCalendar来实际打印12个月的日历

•printCalendar有两个参数,年份号和开始日期。然后,它在一年中循环并调用函数printMonth十二次,每个月一次

•printMonth接受三个参数,年份号、月份号和特定月份的开始日期,并返回下一个月开始的日期。Print month必须首先调用函数printMonthName,然后以日历格式打印当月的日期

•printMonthName将年份号和月份号作为参数,打印出标识月份的行,并返回该月份的天数,同时考虑闰年

我按照这些指示走了这么远:

#include <stdio.h>
#include <stdlib.h>
int daysInMonth;
int getDayCode(int year);
void printCalendar(int year, int dayCode);
int getYear(void);

int getYear(void){
  int year;
  printf("Please enter a year: ");
  scanf("%i", &year);
  printf("\n");
  return year;
}

int getDayCode(int year){
  int dayCode;
  int x1, x2, x3;
          x1 = (year - 1.)/ 4.0;
          x2 = (year - 1.)/ 100.;
          x3 = (year - 1.)/ 400.;
  dayCode = (year + x1 - x2 + x3) %7;
  return dayCode;
}

main(){
  int year, dayCode;
  year = getYear();
  dayCode = getDayCode(year);
  printCalendar(year, dayCode);

}

void printCalendar(int year, int dayCode){
   int month;
   printf("        %d Monthly Calendar\n", year);
   printf(" \n");
   printf(" \n");
   for (month = 1; month <= 12; month++){
     printMonth(year, month, dayCode);
   }
}

int printMonthName(int year, int month){
  switch (month){
  case 1:
       printf("\n\nJanuary %i", year);
       daysInMonth = 31;
       return daysInMonth;
       break;
  case 2:
       printf("\n\nFebruary %i", year);
       if (year%4 == 0 && year%100 != 0 || year%400 == 0){
         //printf("This is a leap year.\n");
         daysInMonth = 29;
         return daysInMonth;
       }
      else{
        //printf("This is not a leap year.\n");
        daysInMonth = 28;
        return daysInMonth;
      }
      break;
 case 3:
      printf("\n\nMarch %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 case 4:
      printf("\n\nApril %i", year);
      daysInMonth = 30;
      return daysInMonth;
      break;
 case 5:
      printf("\n\nMay %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 case 6:
      printf("\n\nJune %i", year);
      daysInMonth = 30;
      return daysInMonth;
      break;
 case 7:
      printf("\n\nJuly %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 case 8:
      printf("\n\nAugust %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 case 9:
      printf("\n\nSeptember %i", year);
      daysInMonth = 30;
      return daysInMonth;
      break;
 case 10:
      printf("\n\nOctober %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 case 11:
      printf("\n\nNovember %i", year);
      daysInMonth = 30;
      return daysInMonth;
      break;
 case 12:
      printf("\n\nDecember %i", year);
      daysInMonth = 31;
      return daysInMonth;
      break;
 default:
      printf("Invalid input! Please try again!\n");
      break;
    }
}

int printMonth(int year, int month, int dayCode){
 int day;
 printMonthName(year, month);
 printf("\n\nSun  Mon  Tue  Wed  Thu  Fri  Sat\n" );
 /* advance printer to correct position for first date */
 for (day = 1; day <= 1 + dayCode * 5; day++)
 printf(" ");
 /* print the dates for one month */
 for (day = 1; day <= daysInMonth; day++){
   printf("%2d", day);
   if ((day + dayCode) % 7 > 0) /* before Sat? */
     /* move to next day in same week */
     printf("   ");
   else  /* skip to next line to start with Sun */
     printf("\n ");
   }
   /* set day_code for next month to begin */
   dayCode = (dayCode + daysInMonth % 7);
   return dayCode;
}
我把2013年作为输入年,我的代码从1月1日星期二开始,这是正确的。但这12个月也将从周二开始,问题是:

请帮忙。很久以来我一直在努力让它发挥作用

看起来好像在printMonth函数中返回dayCode。但是,在printCalendar函数中,您从未使用该值执行任何操作。通过更改printCalendar中的for循环,可以轻松解决此问题


我用的是Atom,它不会调试吗?我相信。我会再次检查。printMonth返回dayCode,但您从未在printCalendar中使用它。其中有一些非常奇怪的双精度值,例如x1=年份-1./4.0@心脏杀手如果你的问题没有涉及到一个特定的问题,那么它在这里是离题的。此外,未能调试和报告结果也会让你落选。不要从根本上改变问题,尤其是在得到答案后。问题退了回来。如果需要,从这篇文章中学习,尽可能多地修改,完成这篇文章,然后发布一个新问题,并添加一个链接回这篇文章。是的,我更改了代码,但现在格式有问题。我编辑了这篇文章并附上了一张新图片。哦,这是因为当你在printMonth中计算新的日期代码时,%的优先级高于+号。因此dayCode=dayCode+daysInMonth%7;与dayCode=dayCode+daysInMonth%7相同@HeartKiller添加文本而不是文本图片是好的。文字图片吸引了反对票。这都是因为括号放错了位置。非常感谢@mageliz。现在一切都好了。
for (month = 1; month <= 12; month++){
    dayCode = printMonth(year, month, dayCode);
}