ELIAUK,., 2022-09-04 16:35 采纳率: 66.7%
浏览 42
已结题

这个程序怎么写?初学者等

本来写了一个,但是运行有问题,所以重新求一个,月份之间老是少一天,然后改程序之后,月份第一天是0,但是其他日期是对的,不太理解

img

  • 写回答

3条回答 默认 最新

  • a5156520 2022-09-04 18:06
    关注

    参考下面的链接,修改了了一下,可以打印出题目所需要的日历。
    参考链接:
    c语言编写程序“输入任意一个年份和月份,打印当月日历。”_zhao_miao的博客-CSDN博客

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    //https://ask.csdn.net/questions/7782335?spm=1005.2025.3001.5141
    int mon[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
    { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
    //判断闰年
    int isleap(int year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
            return 1;
        else
            return 0;
    }
    //年份的第一天
    int first_day_of_year(int year)
    {
        int base_year = 2000;  //定义一个基准年2000年
        int first_day = 6;     //基准天:200011号是星期6
        int i = 2000;
        int total = 0;          //天数总和
        for (i = base_year; i < year; i++)
        {
            total = total + 365 + isleap(i);  //isleap函数用于判断年份是否是闰年,如果是返回1,不是返回0
        }
        return (total+first_day)%7;
    }
    //月份第一天
    int first_day_of_month(int year, int month, int first_year)
    {
        int total = 0;  //天数和
        int i = 0;
        for(i = 1; i < month; i++)
        {
            total = total + mon[isleap(year)][i];
        }
        return (total + first_year) % 7;
    }
    //展示日历
    void show(int year,int  month, int first_month)
    {
        int i = 0;
        printf("SUN  MON  TUE  WED  THU  FRI  SAT\n");  //修改了这里 
        for (i = 0; i < first_month; i++)   //修改了这里 
        {
            printf("     ");     //月份第一天是从first_month开始的,所以首先打印first_month-1个空格
        }
        
       // int firstLine = 0;
        for (i = 1; i <= mon[isleap(year)][month]; i++) //修改了这里 
        {
            printf("%-5d", i);
            if ((first_month+i) % 7 ==0) //如果(数字+空格数)%7==0,则换行
            {
                //printf("i=%d,first_month=%d,mon[isleap(year)][month]=%d\n",i,first_month,mon[isleap(year)][month]);
                printf("\n");
            //    firstLine=1;
            }
            
    //        if(i==mon[isleap(year)][month]-1){
    //            
    //        }
    //        if(firstLine==1&&((first_month-1+i) % 7 ==0)){
    //            printf("\n");
    //        }
                
        }
        printf("\n");
    }
    int main()
    {
        int year, month;
        printf("年-月:");  //输入你想打印的年份
        scanf("%d-%d", &year, &month);
        int first_year = first_day_of_year(year);//年份第一天
        int first_month = first_day_of_month(year, month, first_year);//月份第一天
        show(year, month, first_month);
        system("pause");
        return 0;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 9月4日

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题