C语言实现指定日期星期计算函数遇类型错误及结果异常求解
C语言日期结构体计算星期几的问题排查与修复
问题场景
我用自定义结构体存储日期数据,定义如下:
typedef enum {So, Mo, Di, Mi, Do, Fr, Sa} eDayofTheWeek; typedef struct{ int Day; int Month; int Year; eDayofTheWeek WeekDay; } sDate;
最初编写了计算星期几的dayOfWeek函数:
void dayOfWeek(sDate date){ if(date.Month > 3) date.Year = date.Year - 1; date.WeekDay = ((date.Day + floor (2.6 * ((date.Month + 9) % 12 + 1) - 0.2) + date.Year % 100 + floor (date.Year % 100 / 4) + floor (date.Year / 400) - 2 * floor (date.Year / 100) - 1) % 7 + 7) % 7 + 1; }
运行时触发错误:expression must have integral type。尝试将公式拆分到int变量w中计算:
int w; w = ((date.Day + floor (2.6 * ((date.Month + 9) % 12 + 1) - 0.2) + date.Year % 100 + floor (date.Year % 100 / 4) + floor (date.Year / 400) - 2 * floor (date.Year / 100) - 1); date.Weekday =( w % 7 + 7) % 7 + 1;
但此时WeekDay的值始终为0,换其他公式也得到相同结果。
错误根源
- 传参方式错误:原函数采用值传递,函数内修改的是传入
sDate结构体的副本,不会影响外部的原结构体变量,这是导致WeekDay始终无正确值的核心原因。 - 浮点运算类型问题:
floor函数返回double类型,直接与整数混合运算后赋值给整数变量,会触发隐式类型转换,可能带来精度损失,进而引发“expression must have integral type”编译错误。
修复方案
改用指针传参直接修改原结构体,同时替换为纯整数运算的公式(避免浮点精度问题),修复后的代码如下:
sAppointment Calendar[MAXAPPOINTMENTS]; int dayOfWeek(sDate *date){ static int jMonth[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; int d = date->Day; int m = date->Month; int y = date->Year; if(m < 3) y--; return(y + (y/4) - (y/100) + (y/400) + jMonth[m - 1] + d) % 7; }
这个方案中:
- 指针传参确保函数能直接修改外部传入的
sDate结构体; - 纯整数运算的公式基于Zeller一致性公式的变种,通过预定义的月份偏移数组
jMonth简化计算,避免了浮点运算带来的类型和精度问题。
内容的提问来源于stack exchange,提问作者Angargedon
相关产品推荐
相关产品推荐

