SparKgod1 2021-10-03 09:18 采纳率: 100%
浏览 43
已结题

找了三天bug硬是找不出来(c语言日历)

不知道为啥输出的日历就是对不上
作业条件有:1800年一月一日星期三
好像是从1800到之后的天数的问题
我算了一下1800.1.1到2021.9.1一共80962天
但我的程序运行的是80880天
找不到问题
帮帮孩子吧大神!!!
#include <stdio.h>
#include<stdlib.h>
int confirmlp(y);
int leapyear(y);
int eng(m);
int check(d,m,y,r);
int confirmday(m,y,d,r);
int printhead(m,y);
int num(m,y,r,numlpyear);
int printbody(m,y,d,blanknum);
int main(void)
{
int m,y,d,numlpyear,r,blanknum;
printf("Print month and year(m,y):");
scanf("%d,%d",m,y);
r=confirmlp(y);
numlpyear=leapyear(y);
eng(m);
printhead(m,y);
check(m,y);
d=confirmday(m,y,d);
blanknum=num(m,y,numlpyear,r);
printbody(m,y);
return 0;
}
int confirmlp(y)//判断该年是否为闰年
{
int r=0;
if((y%4==0&&y%100!=0)||y%400==0)
{
r=1;
}
return r;
}
int leapyear(y)//算该年之前的闰年数
{
int i,count=0;
for(i=0;i<y-1800;i++)
{
if((i%4==0)&&(i%100!=0)||i%400==0)
{
count++;
}
}
return count;
}
int eng(m)//把月份数字变英文
{
switch(m)
{
case 1:return "January";break;
case 2:return "February";break;
case 3:return "Match";break;
case 4:return "April";break;
case 5:return "May";break;
case 6:return "June";break;
case 7:return "July";break;
case 8:return "August";break;
case 9:return "September";break;
case 10:return "October";break;
case 11:return "November";break;
case 12:return "December";break;
}
return 0;
}
int check(d,m,y,r)//检查输入是否正确
{
if((d<1||d>31||y<1800||m>12||m<1)||(r==1&&m==2&&d>29)||(r==0&&m==2&&d>28)||((m==4||m==6||m==9||m==11)&&d>30))
{
printf("error");
exit(0);
}
return 0;
}
int confirmday(m,y,d,r)//判断该月天数
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
d=31;
}
if(m==4||m==6||m==9||m==11)
{
d=30;
}
if(r==0&&m==2)
{
d=28;
}
if(r==1&&m==2)
{
d=29;
}
return d;
}
int printhead(m,y)//打印表头
{
printf("%s %d",eng(m),y);
printf("-----------------------------");
printf("SUN MON TUE WEN THU FRI SAT ");
return 0;
}
int num(m,y,r,numlpyear)//算第一天前面的空白格数
{
int i,d1,d2=0,num,bnum;
d1=((y-1800-numlpyear)365+numlpyear366);
for(i=1;i<=m;i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
{
d2+=31;
}
if(i==4||i==6||i==9||i==11)
{
d2+=30;
}
if(r==0&&i==2)
{
d2+=28;
}
if(r==1&&i==2)
{
d2+=29;
}
}
num=d1+d2;
bnum=num%7+3;
return bnum;
}
int printbody(m,y,d,blanknum)//打印主体
{
int i;
for(i=1;i<=d+blanknum;i++)
{
if(i<=blanknum)
{
printf(" ",i);
}
else
{
if(i<=9)
{
printf(" %d ",i);
}
else
{
printf(" %d ",i);
}
}
if(i==7||i==14||i==21||i==28||i==35||i==42)
printf("\n");
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • 关注

    你这个写的也太麻烦了,这么写,有帮助请点一下我回答右上方的采纳

    #include <stdio.h>
    #include <stdlib.h>
    
    int day_diff(int year_start, int month_start, int day_start
                , int year_end, int month_end, int day_end)
    {
        int y2, m2, d2;
        int y1, m1, d1;
    
        m1 = (month_start + 9) % 12;
        y1 = year_start - m1/10;
        d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
    
        m2 = (month_end + 9) % 12;
        y2 = year_end - m2/10;
        d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);
    
        return (d2 - d1);
    }
    
    int main(void)
    {
        printf("%d\n", day_diff(1800, 1, 1, 2021, 9, 1));
        return 0;
    }
    

    img

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

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题