C语言编写的Arduino数学测验程序如何减少冗余if-else与switch-case代码
代码精简方案
- 封装重复逻辑为独立函数,消除重复的LED控制、答案校验代码
- 用数组存储所有题目答案、用户作答记录,无需为每道题单独声明变量
- 合并所有题目分支为统一处理逻辑,30道题无需额外新增case语句
精简后完整代码示例
// 常量定义,后续修改参数直接改这里即可 #define TOTAL_QUESTIONS 30 // 总题数,要加题直接改这个数 #define LED_CORRECT 7 // 答对亮的LED引脚 #define LED_WRONG 10 // 答错亮的LED引脚 #define DELAY_COMMON 50 // 通用延迟时间 #define DELAY_LED 1000 // LED点亮时间 // 全局变量 int screen = 0; int score = 0; int buttonState1 = 0; // 按钮1状态,你原来的读取逻辑保留即可 int buttonState2 = 0; // 按钮2状态,你原来的读取逻辑保留即可 bool correctAnswers[TOTAL_QUESTIONS + 1]; // 存储所有题的正确答案,索引对应题号 String userAnswers[TOTAL_QUESTIONS + 1] = {""}; // 存储用户每道题的作答,初始为空 // 初始化的时候设置所有题的正确答案 void setup() { pinMode(LED_CORRECT, OUTPUT); pinMode(LED_WRONG, OUTPUT); // 这里按照你的题目设置正确答案,示例:第1题答案是True,第2题是False,第3题是True correctAnswers[1] = true; correctAnswers[2] = false; correctAnswers[3] = true; // 剩下的4到30题你按需求加就行:correctAnswers[题号] = 正确值 } // 封装LED闪烁逻辑,避免重复写 void blinkLED(int pin) { digitalWrite(pin, HIGH); delay(DELAY_LED); digitalWrite(pin, LOW); delay(DELAY_LED); } // 你的主逻辑里的switch部分替换为下面的代码即可 void loop() { // 这里保留你原来读取按钮状态的代码:buttonState1 = digitalRead(xxx); buttonState2 = digitalRead(xxx); switch (screen) { case 0: // 欢迎页,和原来逻辑一致 if (buttonState1 && buttonState2) { screen = 1; delay(DELAY_COMMON); } break; // 所有1到30题的答题逻辑完全统一,无需单独写case case 1 ... TOTAL_QUESTIONS: int currentQues = screen; // 按钮1按下,选True if(buttonState1 && userAnswers[currentQues] == ""){ userAnswers[currentQues] = "True"; // 校验答案 if((userAnswers[currentQues] == "True" && correctAnswers[currentQues]) || (userAnswers[currentQues] == "False" && !correctAnswers[currentQues])){ score++; blinkLED(LED_CORRECT); } else { blinkLED(LED_WRONG); } // 进入下一题 screen++; delay(DELAY_COMMON); } // 按钮2按下,选False if(buttonState2 && userAnswers[currentQues] == ""){ userAnswers[currentQues] = "False"; // 校验答案 if((userAnswers[currentQues] == "True" && correctAnswers[currentQues]) || (userAnswers[currentQues] == "False" && !correctAnswers[currentQues])){ score++; blinkLED(LED_CORRECT); } else { blinkLED(LED_WRONG); } // 进入下一题 screen++; delay(DELAY_COMMON); } break; case TOTAL_QUESTIONS + 1: // 所有题答完的结束页,你可以自己加显示分数的逻辑 // 你的结束页代码写这里 break; } }
后续扩展说明
- 要新增题目只需要修改
TOTAL_QUESTIONS的数值,然后在setup里加对应题号的正确答案即可,不需要修改其他逻辑 - 要调整LED引脚、延迟时间直接修改开头的常量定义即可,不用挨个改逻辑里的数值
内容的提问来源于stack exchange,提问作者AnaniasOD
相关产品推荐
相关产品推荐

