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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:24:03