如何优化我的首个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.
相关产品推荐
相关产品推荐

