第二次博客

随机数学题生成器
2352830 牛恩冰 2352831 张林夕
这段C语言代码是一个生成随机数学运算题的程序,可以生成包含两个运算符和三个操作数的数学表达式。
功能演示:

主要功能:生成300道随机的数学运算题且每道题包含三个数字和两个运算符(+、-、*、/),同时确保题目有效且符合数学规则并且避免生成重复的题目
(张林夕完成)
辅助函数:generateRandomNumber(int min, int max)
生成指定范围内的随机整数

generateRandomOperator()
随机返回四种运算符之一(+、-、*、/)

calculate(int a, char op1, int b, char op2, int c)
计算形如 a op1 b op2 c 的表达式结果,先计算 a op1 b,然后将结果与 c 进行 op2 运算

waitForEnter() 函数,用于等待用户按回车键,在显示题目后调用 waitForEnter(),然后显示答案

isExpressionValid(int a, int b, int c, char op1, char op2)
检查表达式是否有效,规则包括:除数不能为0;减法结果不能为负数;除法必须能整除;不能连续使用两个除法运算符

(牛恩冰完成)

核心函数 generateQuestion()
生成一个有效的数学题目;确保题目不重复;将生成的题目存储在字符数组中

主函数 main();初始化随机数种子;创建存储题目的数组;循环生成指定数量的题目并打印

增加功能:计时功能:每道题都会记录用户答题所用的时间
最后统计平均答题时间

答题判断功能:用户可以输入自己的答案,程序会自动判断答案是否正确记录用户的答题情况

统计功能:显示总题数、答对题数、答错题数;计算并显示正确率;显示平均答题时间;提供错题回顾功能

改进:数据结构改进:使用QuestionRecord结构体保存每道题的完整信息
包括题目、正确答案、用户答案、用时和正确与否

代码如下:#include <stdio.h>

include <stdlib.h>

include <time.h>

include <string.h>

include <ctype.h>

define NUM_QUESTIONS 300

define MAX_NUMBER 100

define MAX_RESULT 1000

typedef struct {
char question[50];
int answer;
int userAnswer;
double timeSpent;
int isCorrect;
} QuestionRecord;

int generateRandomNumber(int min,int max){
return rand()%(max-min+1)+min;
}

char generateRandomOperator(){
int op = rand()%4;
switch(op){
case 0 : return '+';
case 1 : return '-';
case 2 : return '*';
case 3 : return '/';
}
return '?';
}

int calculate(int a,char op1,int b,char op2,int c){
int result;
switch(op1){
case '+' : result = a+b;break;
case '-' : result = a-b;break;
case '' : result = ab;break;
case '/' : result = a/b;break;
default : break;
}
switch(op2){
case '+' : result += c;break;
case '-' : result -= c;break;
case '*' : result *= c;break;
case '/' : result /= c;break;
default : break;
}
return result;
}

int isExpressionValid(int a,int b,int c,char op1,char op2){
if((op1'/' && b0) || (op2'/' && c0))return 0;
if((op1'-' && a<b) || (op2'-' && calculate(a,op1,b,'+',0)<c))return 0;
if((op1'/' && a%b!=0) || (op2'/' && calculate(a,op1,b,'+',0)%c!=0))return 0;
if(op1'/' && op2'/')return 0;

return 1;

}

void generateQuestion(int *a,int *b,int *c,char *op1,char *op2,QuestionRecord *records,int *count){
int i;
do{
*a = generateRandomNumber(1,MAX_NUMBER);
*b = generateRandomNumber(1,MAX_NUMBER);
*c = generateRandomNumber(1,MAX_NUMBER);
*op1 = generateRandomOperator();
*op2 = generateRandomOperator();

    if(!isExpressionValid(*a,*b,*c,*op1,*op2))continue;
    int result = calculate(*a,*op1,*b,*op2,*c);
    if(result<0 || result>MAX_RESULT)continue;
    
    char question[50];
    sprintf(question,"%d%c%d%c%d",*a,*op1,*b,*op2,*c);
    for(i=0;i<*count;i++){
        if(strcmp(question,records[i].question)==0)break;
    }
    if(i!=*count)continue;
    
    strcpy(records[*count].question,question);
    records[*count].answer = result;
    (*count)++;
    break;
}while(1);

}

int getUserAnswer() {
char input[20];
int number;
while(1) {
if(fgets(input, sizeof(input), stdin)) {
if(sscanf(input, "%d", &number) == 1) {
return number;
}
}
printf("输入无效,请输入一个整数: ");
}
}

void displayStats(QuestionRecord *records, int count) {
int correct = 0;
double totalTime = 0;

for(int i = 0; i < count; i++) {
    if(records[i].isCorrect) correct++;
    totalTime += records[i].timeSpent;
}

printf("\n=== 练习统计 ===\n");
printf("总题数: %d\n", count);
printf("答对: %d\n", correct);
printf("答错: %d\n", count - correct);
printf("正确率: %.1f%%\n", (double)correct/count*100);
printf("平均答题时间: %.1f秒\n", totalTime/count);

printf("\n=== 错题回顾 ===\n");
for(int i = 0; i < count; i++) {
    if(!records[i].isCorrect) {
        printf("%d. %s=?\n", i+1, records[i].question);
        printf("你的答案: %d\n", records[i].userAnswer);
        printf("正确答案: %d\n\n", records[i].answer);
    }
}

}

int main(int argc, char *argv[]) {
int i, questionsToAsk;
srand(time(NULL));
QuestionRecord records[NUM_QUESTIONS];
int count=0;

printf("数学练习程序\n");
printf("请输入要练习的题目数量(1-%d): ", NUM_QUESTIONS);
scanf("%d", &questionsToAsk);
while(getchar() != '\n'); 

if(questionsToAsk < 1 || questionsToAsk > NUM_QUESTIONS) {
    questionsToAsk = 10;
    printf("输入无效,默认设置为10题\n");
}

for(i=0; i<questionsToAsk; i++){
    int a,b,c;
    char op1,op2;
    generateQuestion(&a,&b,&c,&op1,&op2,records,&count);
}

time_t start, end;
for(i=0; i<questionsToAsk; i++){
    printf("\n%d. %s=?\n", i+1, records[i].question);
    
    time(&start); 
    printf("你的答案: ");
    records[i].userAnswer = getUserAnswer();
    time(&end); 
    
    records[i].timeSpent = difftime(end, start);
    records[i].isCorrect = (records[i].userAnswer == records[i].answer);
    
    if(records[i].isCorrect) {
        printf("? 正确! (用时 %.1f秒)\n", records[i].timeSpent);
    } else {
        printf("? 错误! 正确答案是 %d (用时 %.1f秒)\n", 
              records[i].answer, records[i].timeSpent);
    }
}

displayStats(records, questionsToAsk);

return 0;

}

posted @ 2025-04-17 22:22  kyomizu  阅读(31)  评论(0)    收藏  举报