You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,换其他公式也得到相同结果。

错误根源

  1. 传参方式错误:原函数采用值传递,函数内修改的是传入sDate结构体的副本,不会影响外部的原结构体变量,这是导致WeekDay始终无正确值的核心原因。
  2. 浮点运算类型问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:26:30