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

如何优化我的首个C语言二次表达式因式分解游戏代码?

寻求更简洁的二次因式分解游戏实现方式

我是一名C语言初学者,这是我编写的第一个程序。该程序可正常运行,功能为生成二次表达式并要求用户进行因式分解:用户答对则进入难度更高的下一关卡,答错则停留在当前关卡,也可选择退出。我想了解是否有更简洁的实现方式,以下是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <time.h>
int main() {
    srand(time(0));
    int a, b, c, level=1, randMax=level*5;
    char ch;
    // 生成题目
    int ask(){
        // 生成非零的首项系数(小于关卡等级)
        int nonZeroCoefficient(){
            int n = (rand()%(level+2) - (level));
            if ( n == 0 ){
                n++;
            }
            return n;
        }
        // 生成非零随机数
        int nonZeroRand(){
            int n=(rand()%randMax - (randMax));
            if (n == 0){
                n++;
            }
            return n;
        }
        int f = nonZeroCoefficient();
        int h = nonZeroCoefficient();
        int k = nonZeroRand();
        int g = nonZeroRand();
        a = f*h;
        b = (f*k + g*h);
        c = g*k;
        // 显示关卡
        printf("\n\n\n\n --- Level %d ---", level);
        // 生成题目
        printf("\nfactor the following expression\n%dx^2 %+dx %+d",a ,b, c);
        puts("\n\nEnter your answer in the form of (fX+g)(hX+k)");
        int inputF, inputG, inputH, inputK;
        printf("\nEnter f:");
        scanf("%d", &inputF);
        printf("Enter g:");
        scanf("%d", &inputG);
        printf("Enter h:");
        scanf("%d", &inputH);
        printf("Enter k:");
        scanf("%d", &inputK);
        if (inputF*inputH == a && ((inputF*inputK+inputG*inputH== b) && (inputG*inputK == c))){
            printf("\nRight on!\n");
            level++;
        }else{
            printf("\nSorry! your answer is not correct!\nthe correct answer is:\nf:%d\ng:%d\nh:%d\nk:%d\n \ntry again",f, g, h, k);
        }
    }
    do{
        ask();
        printf("\nDo you want to continue? (Y/N)");
        scanf (" %c", &ch);
    } while(ch == 'y'|| ch == 'Y');
}

嘿,恭喜你写出第一个能正常运行的C程序!这真的是个很棒的开始👍。针对你的代码,我整理了几个可以让它更简洁、更符合C语言规范的优化方向,同时完全保留原有的功能:

1. 去掉嵌套函数,提升可移植性

C语言标准里不允许在函数内部定义函数,虽然像GCC这样的编译器支持这个扩展特性,但会让代码在其他编译器上无法正常编译。我把ask()、nonZeroCoefficient()、nonZeroRand()都移到了main()外面,还把重复的随机数生成逻辑合并成了一个通用函数。

2. 简化随机数生成逻辑

原来的非零数生成逻辑有点绕,改成用do-while循环直接生成符合范围的非零数,代码更直观,也不容易出错:

// 生成[min, max]范围内的非零整数
int getNonZeroInt(int min, int max) {
    int n;
    do {
        n = rand() % (max - min + 1) + min;
    } while (n == 0);
    return n;
}

3. 减少变量耦合,用参数传递替代共享变量

原来的代码里level、a/b/c这些变量在main()和ask()之间共享,容易让逻辑变乱。优化后让generateAndCheck()函数返回是否答对的状态,需要的变量通过指针参数传递,每个函数的职责更清晰,代码也更易读。

4. 优化代码结构,遵循单一职责原则

把题目生成、答案验证的逻辑封装到一个函数里,main()只负责关卡管理和用户交互,后续修改功能(比如加新提示、调整难度规则)会更方便。

优化后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 生成[min, max]范围内的非零整数
int getNonZeroInt(int min, int max) {
    int n;
    do {
        n = rand() % (max - min + 1) + min;
    } while (n == 0);
    return n;
}

// 生成题目并验证答案,返回1表示答对,0表示答错
int generateAndCheck(int level, int *f, int *g, int *h, int *k) {
    int randMax = level * 5;
    *f = getNonZeroInt(-level, level);
    *h = getNonZeroInt(-level, level);
    *g = getNonZeroInt(-randMax, randMax);
    *k = getNonZeroInt(-randMax, randMax);
    
    int a = (*f) * (*h);
    int b = (*f)*(*k) + (*g)*(*h);
    int c = (*g) * (*k);
    
    printf("\n\n\n\n --- Level %d ---", level);
    printf("\nfactor the following expression\n%dx^2 %+dx %+d", a, b, c);
    puts("\n\nEnter your answer in the form of (fX+g)(hX+k)");
    
    int inputF, inputG, inputH, inputK;
    printf("Enter f: "); scanf("%d", &inputF);
    printf("Enter g: "); scanf("%d", &inputG);
    printf("Enter h: "); scanf("%d", &inputH);
    printf("Enter k: "); scanf("%d", &inputK);
    
    if (inputF*inputH == a && inputF*inputK + inputG*inputH == b && inputG*inputK == c) {
        printf("\nRight on!\n");
        return 1;
    } else {
        printf("\nSorry! Your answer is not correct!\nThe correct answer is:\nf:%d\ng:%d\nh:%d\nk:%d\nTry again", *f, *g, *h, *k);
        return 0;
    }
}

int main() {
    srand(time(0));
    int level = 1;
    char ch;
    int f, g, h, k;
    
    do {
        if (generateAndCheck(level, &f, &g, &h, &k)) {
            level++;
        }
        printf("\nDo you want to continue? (Y/N) ");
        scanf(" %c", &ch);
    } while(ch == 'y' || ch == 'Y');
    
    return 0;
}

这个版本的代码不仅更简洁,还更符合C语言规范,后续维护和扩展也会更轻松。继续加油,你已经迈出了很棒的一步!

内容的提问来源于stack exchange,提问作者Ali Tahrei Sh.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:09:51