蓝桥杯第十一届省赛(第一次)代码错误总结
错误列表
1.
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_Set是unsigned 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)
影响程度:
严重 - 功能错误,参数无法正确减到0
2.
参数不合理时未立即恢复旧值
错误代码:
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]; // ✓ 立即恢复
}
影响程度:
中等 - 功能基本正常,但不完全符合题目要求
3.
每次进入参数界面未重置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
}
影响程度:
中等 - 第一次正确,后续不符合要求
总结
最严重的错误(会导致功能完全无法工作):
S7减法下溢问题 - 参数无法减到0,显示"55"
中等错误(功能不完整或不符合要求):
参数不合理时未立即恢复 - 不完全符合题目要求
Temperature_Index未重置 - 第一次正确,后续不符合要求
学到的经验
1. unsigned类型下溢是经典陷阱
- unsigned类型永远不会小于0,下溢会绕回最大值
unsigned char:0 - 1 = 255unsigned 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
蓝桥杯第十一届省赛(第一次)代码调试总结