蓝桥杯第十一届省赛(第一次)代码错误总结

蓝桥杯第十一届省赛(第一次)代码错误总结

错误列表

1. :cross_mark: S7减法unsigned char下溢问题

错误代码:

case 7:
    if(Seg_Mode==1)
    {
        Temperature_Set[Temperature_Index]--;  // ❌ 先执行减法
        if(Temperature_Set[Temperature_Index] == 0)  // ❌ 永远检测不到0
            Temperature_Set[Temperature_Index] = 0;
    }
break;

错误原因:

  • Temperature_Setunsigned char类型(取值范围0-255)
  • 当值为0时执行--操作,不会变成-1,而是下溢变成255
  • 之后检查if(Temperature_Set[Temperature_Index] == 0)永远为假(255 != 0)
  • 导致数码管显示"55"(255/10%10=5, 255%10=5)而不是卡在0

C语言知识点:

  • 无符号整数的运算按照模2^n进行(unsigned char是8位,模256)
  • 0 - 1 ≡ -1 (mod 256) = 255
  • 这是C语言标准规定的行为,不是bug

正确代码(方案1 - 推荐):

case 7:
    if(Seg_Mode==1)
    {
        if(Temperature_Set[Temperature_Index] > 0)  // ✓ 先检查边界
            Temperature_Set[Temperature_Index]--;   // ✓ 在安全范围内再减
    }
break;

正确代码(方案2 - 检测下溢):

case 7:
    if(Seg_Mode==1)
    {
        Temperature_Set[Temperature_Index]--;
        if(Temperature_Set[Temperature_Index] == 255)  // ✓ 检测下溢结果
            Temperature_Set[Temperature_Index] = 0;    // ✓ 修正回0
    }
break;

最终采用方案: 方案2(检测255)

影响程度: :red_circle: 严重 - 功能错误,参数无法正确减到0


2. :cross_mark: 参数不合理时未立即恢复旧值

错误代码:

case 4:  // S4按键
    if(Seg_Mode==1)
    {
        if(Temperature_Set[0]>=Temperature_Set[1])  // TMAX >= TMIN
        {
            Seg_Mode=0;
            Temperature_Real[0]=Temperature_Set[0];
            Temperature_Real[1]=Temperature_Set[1];
        }
        else  // ❌ TMAX < TMIN,参数不合理
        {
            Seg_Mode=0;  // 只切换界面
            // ❌ 没有恢复Temperature_Set为Temperature_Real!
        }
    }
break;

题目要求:

“通过S4按键,从参数设置界面退出,进入数据显示界面时,需要进行必要的参数合理性检查(TMAX≥TMIN);若设置的参数合理,参数生效,进入数据界面;反之,自动恢复进入参数设置界面前的有效参数,进入数据界面。”

错误原因:

  • 当参数不合理时,只切换了界面,但Temperature_Set保留了不合理的值
  • 下次进入参数界面时,会显示上次设置失败的不合理值
  • 虽然下次进入时会恢复(第88-89行),但题目要求的是"立即恢复"

正确代码:

else  // 参数不合理
{
    Seg_Mode=0;
    Set_Flag=1;  // 标记参数错误
    Temperature_Set[0]=Temperature_Real[0];  // ✓ 立即恢复
    Temperature_Set[1]=Temperature_Real[1];  // ✓ 立即恢复
}

影响程度: :yellow_circle: 中等 - 功能基本正常,但不完全符合题目要求


3. :cross_mark: 每次进入参数界面未重置Temperature_Index

错误代码:

case 4:
    if(Seg_Mode==1)
    {
        // 退出参数界面...
    }
    else  // 从数据界面进入参数界面
    {
        Seg_Mode=1;
        Temperature_Set[0]=Temperature_Real[0];
        Temperature_Set[1]=Temperature_Real[1];
        // ❌ 缺少:Temperature_Index = 1;
    }
break;

题目要求:

“每次从数据界面切换到参数界面,默认当前选择的参数是温度下限参数TMIN。”

错误原因:

  • Temperature_Index初始值为1(TMIN),第一次进入是对的
  • 但当用户按S5切换到TMAX(Index=0),退出后再次进入
  • Temperature_Index会保留上次的值(0),而不是默认的1
  • 不符合题目"每次进入默认选择TMIN"的要求

正确代码:

else
{
    Seg_Mode=1;
    Temperature_Set[0]=Temperature_Real[0];
    Temperature_Set[1]=Temperature_Real[1];
    Temperature_Index=1;  // ✓ 默认选择TMIN
}

影响程度: :yellow_circle: 中等 - 第一次正确,后续不符合要求


总结

最严重的错误(会导致功能完全无法工作):

  1. :cross_mark: S7减法下溢问题 - 参数无法减到0,显示"55"

中等错误(功能不完整或不符合要求):

  1. :warning: 参数不合理时未立即恢复 - 不完全符合题目要求
  2. :warning: Temperature_Index未重置 - 第一次正确,后续不符合要求

学到的经验

1. unsigned类型下溢是经典陷阱

  • unsigned类型永远不会小于0,下溢会绕回最大值
  • unsigned char:0 - 1 = 255
  • unsigned int:0 - 1 = 65535
  • 防范方法:先检查边界,再执行操作

2. 题目要求要仔细读

  • “每次进入默认选择TMIN” - 必须每次重置
  • “自动恢复有效参数” - 必须立即恢复,不能延迟

3. 边界检查的两种模式

// 模式1:先检查后操作(推荐)
if(value > 0)
    value--;

// 模式2:先操作后修正(检测特殊值)
value--;
if(value == 255)  // unsigned char下溢
    value = 0;

4. 参数合理性检查模式

// 检查-应用-恢复模式
if(检查通过)
{
    应用新参数;
}
else
{
    恢复旧参数;  // ← 关键!不能遗漏
    标记错误;
}

5. 状态变量的重置很重要

  • 每次进入某个状态/界面时,要检查是否需要重置相关变量
  • 不能依赖初始值,因为状态可能反复进入


生成时间:2026-02-05
蓝桥杯第十一届省赛(第一次)代码调试总结

标题打错了,应该是十一届第二次