weixin_64237592 2022-01-01 14:21 采纳率: 85.7%
浏览 164
已结题

显示年历,c语言程序改错

//编写一个日历系统
//功能要求:
//1、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在 1940-2040 之间
//2、输入年月,输出该月的日历
//3、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
#include<stdio.h>
#include<time.h>
#define isLeap(x) x%100!=0&&x%4==01|x%400==0?1:0 
int dayOfMonth[13][2] = {
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31
  };
struct Date{ 
    int Year,Month,Day;
    void nextDay(){ 
         Day++;
        if(Day>dayOfMonth[Month][isLeap(Year)]){ 
              Day=1;
              Month++;
              if(Month>12){ 
                    Month=1;
                    Year++;
                }
        }
    }
}; //日期类,方便计算日期的推移
int buf[2040][13][32];
char weekName[7][20]=
{
"星期天",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六"
};
int main()
{
    Date tmp;
    int cnt=0;
    tmp.Year=1940;
    tmp.Month=1;
    tmp.Day=1;
    while (tmp.Year != 2041){
        buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
        tmp.nextDay();
        cnt++;
        }
//预处理出每一天与 1940年1月1日的天数差
    void func1(int i); //输入为年月日时调用 func1
    void func2(int i); //输入为年月时调用 func2
    void func3(int i); //输入为年时调用 func3
    int input, year, month, day;
    printf("请输入 1940年到2040年之间的年,年月或年月日 ,中间不要有空格(如19920218):\n");
    while (scanf("%d", &input) != EOF)
    {
        if (input / 10000000 != 0) func1(input);
        else if (input / 100000 != 0) func2(input);
        else if (input / 1000 != 0) func3(input);
    }//判断输入的是年、年月还是年月日
  }
        void func1 (int i){ 
             bool test_year(int i);
             bool test_month(int i);
             bool test_day(int i);
            // 调用系统时间
            time_t tval;
            struct tm *now;
            tval=time(NULL);
            now = localtime(&tval);
            int today_year=now->tm_year+1900;
            int today_month=now->tm_mon+1;
            int today_day=now->tm_mday;
            // 调用结束
            //把输入的数据拆分成年、月、日
            int input_year=i/10000;
            int input_month=i/100%100;
            int input_day=i%100;
            // 拆分结束
            if(!test_year(input_year)) printf(" 输入的格式有误,请重新输入! \n");
            else if(!test_month(input_month)) printf(" 输入的格式有误,请重新输入! \n");
            else if(!test_day(i)) printf("输入的格式有误,请重新输入! \n");
            else{ 
                 int
        days=buf[input_year][input_month][input_day]-buf[today_year][today_month][today_day]; //计算给点日期与今日日期的天数间隔(可能为负数)
        printf("距今天还有%d天,",days);
        int d=buf[input_year][input_month][input_day]+1; //1940年1月1日为星期一,对应数组下标为 1,则计算 1经过 buf[input_year][input_month][input_day] 天后的下标
        printf("%s",weekName[(d%7+7)%7]); // 将计算后得出的下标用 7对其取模,并且保证其为非负数,则该下标即为答案所对应的下标,输出即可
        if(input_month==1&&input_day==1) printf(" ,元旦节");
        if(input_month==2&&input_day==14) printf(" ,情人节");
        if(input_month==3&&input_day==8) printf(" ,妇女节");
        if(input_month==3&&input_day==12) printf(" ,植树节");
        if(input_month==4&&input_day==1) printf(" ,愚人节");
        if(input_month==5&&input_day==1) printf(" ,劳动节");
        if(input_month==5&&input_day==4) printf(" ,青年节");
        if(input_month==6&&input_day==1) printf(" ,儿童节");
        if(input_month==7&&input_day==1) printf(" ,建党节");
        if(input_month==8&&input_day==1) printf(" ,建军节");
        if(input_month==9&&input_day==10) printf(" ,教师节");
        if(input_month==10&&input_day==1) printf(" ,国庆节");
        if(input_month==12&&input_day==25) printf(" ,圣诞节");
        printf("。\n");
      }
}//输入是年月日时,输出能今天还有多少天,星期几,是否是公历节日
void func2(int i){
      bool test_year(int i);
      bool test_month(int i);
      //把输入的数据拆分成年、月
      int input_year=i/100;
      int input_month=i%100;
      // 拆分结束
      if(!test_year(input_year)) printf(" 输入的格式有误,请重新输入! \n");
      else if(!test_month(input_month)) printf(" 输入的格式有误,请重新输入! In");
      else{
            for(int i=0;i<7;i++) printf("%s\t",weekName[i]);
            printf("\n");
            int days=buf[input_year][input_month][1];
            days+=1;//1940年1月1日为星期一,对应数组下标为 1,则计算 1经过 days天后的下标
            int firstDay=(days%7+7)%7;//计算该月 1号是星期几
            int array[6][7]={0};//设置输出日历的数组,初始化为 0
            array[0][firstDay]=1;
            for (int j = firstDay; j < 6; j++) array[0][j + 1] = array[0][j] + 1;
            array[1][0]=array[0][6]+ 1;
            for(int i=1;i<6;i++){
                  for(int j=0;j<7;j++){
                        if(i==5&&j==6) break;
                        else if(j==6) array[i+ 1][0]=array[i][6]+1;
                        else array[i][j+1]=array[i][j]+1;
                    }
            }
            for(int i=0;i<6;i++){
                  for(int j=0;j<7;j++){ 
                        if(i==0&&j==0&&array[i][j]==0) printf("");
                        else if(i==0&&array[i][j]==0) printf("\t");
                        else         if(i!=0&&array[i][j]>dayOfMonth[input_month][isLeap(input_year)])printf("");//把大于该月天数的数不输出
                        else if(j==0) printf(" %d",array[i][j]);
                        else if(j==6) printf("t %d\n",array[i][j]);
                        else printf("t %d",array[i][j]);
                    }
                }
                printf("n");
        }
} //输入是年月时,输出该月的日历
void func3(int i){ 
      bool test_year(int i);
      if(!test_year(i))printf("输入的格式有误,请重新输入! \n");
      else{ 
          for(int j=0;j<12;j++){ 
                printf("\t \t \t %d   月\n",j+1);
                func2(i*100+j+1);
        }
   }
}   //输入是年时,输出是在屏幕上显示该年的日历,假定输入的年份在 1940-2040 年之间
bool test_year(int i){ 
   if(i>1939 && i<2041) return true;
   else return false;
}
bool test_month(int i) {
       if (i > 0 && i < 13) return true;
       else return false;
   }
   bool test_day(int i) {
       int y = i / 10000;
       int m = i / 100 % 100;
       int d = i % 100;
       if (d > 0 && d < dayOfMonth[m][isLeap(y)] + 1) return true;
       else return false;
   }

img

img

  • 写回答

2条回答 默认 最新

  • 书山客 2022-01-01 17:28
    关注
    
    //编写一个日历系统
    //功能要求:
    //1、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在 1940-2040 之间
    //2、输入年月,输出该月的日历
    //3、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
    #include<stdio.h>
    #include<time.h>
    #define isLeap(x) x%100!=0&&x%4==01|x%400==0?1:0 
    int dayOfMonth[13][2] = {
        0,0,
        31,31,
        28,29,
        31,31,
        30,30,
        31,31,
        30,30,
        31,31,
        31,31,
        30,30,
        31,31,
        30,30,
        31,31
    };
    struct Date {
        int Year, Month, Day;
        void nextDay() {
            Day++;
            if (Day > dayOfMonth[Month][isLeap(Year)]) {
                Day = 1;
                Month++;
                if (Month > 12) {
                    Month = 1;
                    Year++;
                }
            }
        }
    }; //日期类,方便计算日期的推移
    int buf[2040][13][32];
    char weekName[7][20] =
    {
    "星期天",
    "星期一",
    "星期二",
    "星期三",
    "星期四",
    "星期五",
    "星期六"
    };
    int main()
    {
        Date tmp;
        int cnt = 0;
        tmp.Year = 1940;
        tmp.Month = 1;
        tmp.Day = 1;
        while (tmp.Year != 2041) {
            buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
            tmp.nextDay();
            cnt++;
        }
        //预处理出每一天与 1940年1月1日的天数差
        void func1(int i); //输入为年月日时调用 func1
        void func2(int i); //输入为年月时调用 func2
        void func3(int i); //输入为年时调用 func3
        int input, year, month, day;
        printf("请输入 1940年到2040年之间的年,年月或年月日 ,中间不要有空格(如19920218):\n");
        while (scanf("%d", &input) != EOF)
        {
            if (input / 10000000 != 0) func1(input);
            else if (input / 100000 != 0) func2(input);
            else if (input / 1000 != 0) func3(input);
        }//判断输入的是年、年月还是年月日
    }
    void func1(int i) {
        bool test_year(int i);
        bool test_month(int i);
        bool test_day(int i);
        // 调用系统时间
        time_t tval;
        struct tm* now;
        tval = time(NULL);
        now = localtime(&tval);
        int today_year = now->tm_year + 1900;
        int today_month = now->tm_mon + 1;
        int today_day = now->tm_mday;
        // 调用结束
        //把输入的数据拆分成年、月、日
        int input_year = i / 10000;
        int input_month = i / 100 % 100;
        int input_day = i % 100;
        // 拆分结束
        if (!test_year(input_year)) printf(" 输入的格式有误,请重新输入! \n");
        else if (!test_month(input_month)) printf(" 输入的格式有误,请重新输入! \n");
        else if (!test_day(i)) printf("输入的格式有误,请重新输入! \n");
        else {
            int
                days = buf[input_year][input_month][input_day] - buf[today_year][today_month][today_day]; //计算给点日期与今日日期的天数间隔(可能为负数)
            printf("距今天还有%d天,", days);
            int d = buf[input_year][input_month][input_day] + 1; //1940年1月1日为星期一,对应数组下标为 1,则计算 1经过 buf[input_year][input_month][input_day] 天后的下标
            printf("%s", weekName[(d % 7 + 7) % 7]); // 将计算后得出的下标用 7对其取模,并且保证其为非负数,则该下标即为答案所对应的下标,输出即可
            if (input_month == 1 && input_day == 1) printf(" ,元旦节");
            if (input_month == 2 && input_day == 14) printf(" ,情人节");
            if (input_month == 3 && input_day == 8) printf(" ,妇女节");
            if (input_month == 3 && input_day == 12) printf(" ,植树节");
            if (input_month == 4 && input_day == 1) printf(" ,愚人节");
            if (input_month == 5 && input_day == 1) printf(" ,劳动节");
            if (input_month == 5 && input_day == 4) printf(" ,青年节");
            if (input_month == 6 && input_day == 1) printf(" ,儿童节");
            if (input_month == 7 && input_day == 1) printf(" ,建党节");
            if (input_month == 8 && input_day == 1) printf(" ,建军节");
            if (input_month == 9 && input_day == 10) printf(" ,教师节");
            if (input_month == 10 && input_day == 1) printf(" ,国庆节");
            if (input_month == 12 && input_day == 25) printf(" ,圣诞节");
            printf("。\n");
        }
    }//输入是年月日时,输出能今天还有多少天,星期几,是否是公历节日
    void func2(int i) {
        bool test_year(int i);
        bool test_month(int i);
        //把输入的数据拆分成年、月
        int input_year = i / 100;
        int input_month = i % 100;
        // 拆分结束
        if (!test_year(input_year)) printf(" 输入的格式有误,请重新输入! \n");
        else if (!test_month(input_month)) printf(" 输入的格式有误,请重新输入! In");
        else {
            for (int i = 0; i < 7; i++) printf("%s\t", weekName[i]);
            printf("\n");
            int days = buf[input_year][input_month][1];
            days += 1;//1940年1月1日为星期一,对应数组下标为 1,则计算 1经过 days天后的下标
            int firstDay = (days % 7 + 7) % 7;//计算该月 1号是星期几
            int array[6][7] = { 0 };//设置输出日历的数组,初始化为 0
            array[0][firstDay] = 1;
            for (int j = firstDay; j < 6; j++) array[0][j + 1] = array[0][j] + 1;
            array[1][0] = array[0][6] + 1;
            for (int i = 1; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    if (i == 5 && j == 6) break;
                    else if (j == 6) array[i + 1][0] = array[i][6] + 1;
                    else array[i][j + 1] = array[i][j] + 1;
                }
            }
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    if (i == 0 && j == 0 && array[i][j] == 0) printf("");
                    else if (i == 0 && array[i][j] == 0) printf("\t");
                    else         if (i != 0 && array[i][j] > dayOfMonth[input_month][isLeap(input_year)])printf("");//把大于该月天数的数不输出
                    else if (j == 0) printf(" %d", array[i][j]);
                    else if (j == 6) printf("\t %d\n", array[i][j]);
                    else printf("\t %d", array[i][j]);
                }
            }
            printf("\n");
        }
    } //输入是年月时,输出该月的日历
    void func3(int i) {
        bool test_year(int i);
        if (!test_year(i))printf("输入的格式有误,请重新输入! \n");
        else {
            for (int j = 0; j < 12; j++) {
                printf("\t \t \t %d   月\n", j + 1);
                func2(i * 100 + j + 1);
            }
        }
    }   //输入是年时,输出是在屏幕上显示该年的日历,假定输入的年份在 1940-2040 年之间
    bool test_year(int i) {
        if (i > 1939 && i < 2041) return true;
        else return false;
    }
    bool test_month(int i) {
        if (i > 0 && i < 13) return true;
        else return false;
    }
    bool test_day(int i) {
        int y = i / 10000;
        int m = i / 100 % 100;
        int d = i % 100;
        if (d > 0 && d < dayOfMonth[m][isLeap(y)] + 1) return true;
        else return false;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 赞助了问题酬金 1月1日
  • 修改了问题 1月1日
  • 展开全部

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算