c语言算数训练系统:提供菜单供用户选择训练项目能随机出题,能接收用,大于300行代码
时间: 2024-02-06 08:12:20 浏览: 28
以下是一个更为复杂的算数训练系统的代码,共计约500行。它提供了多种运算类型和难度等级,支持自定义题目数量和时间限制,并且有良好的交互界面和错误处理机制。此外,它还支持导入和导出题目,方便用户进行备份和恢复。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <Windows.h>
#define MAX_NUM 1000 // 最大题目数量
#define MAX_LEVEL 5 // 最大难度等级
#define OP_ADD 1 // 加法
#define OP_SUB 2 // 减法
#define OP_MUL 3 // 乘法
#define OP_DIV 4 // 除法
#define MAX_FILENAME 64 // 最大文件名长度
// 题目结构体
typedef struct {
int a; // 第一个数
int b; // 第二个数
int op; // 运算符
int ans; // 答案
} Problem;
// 题目列表结构体
typedef struct {
Problem* data; // 题目数组
int size; // 题目数量
int index; // 当前题目索引
} ProblemList;
// 菜单选项
enum {
MENU_START = 1, // 开始训练
MENU_IMPORT, // 导入题目
MENU_EXPORT, // 导出题目
MENU_HELP, // 帮助
MENU_EXIT // 退出程序
};
// 显示菜单选项
void show_menu() {
system("cls");
printf("=====================\n");
printf("= 算数训练系统 v1.0 =\n");
printf("=====================\n");
printf("[1] 开始训练\n");
printf("[2] 导入题目\n");
printf("[3] 导出题目\n");
printf("[4] 帮助\n");
printf("[5] 退出程序\n");
}
// 获取用户输入的整数,如果输入错误则返回默认值
int get_int(int def) {
char buf[32];
scanf("%s", buf);
if (buf[0] == '\0' || !isdigit(buf[0])) {
return def;
}
return atoi(buf);
}
// 获取用户输入的浮点数,如果输入错误则返回默认值
float get_float(float def) {
char buf[32];
scanf("%s", buf);
if (buf[0] == '\0' || !isdigit(buf[0])) {
return def;
}
return atof(buf);
}
// 生成随机数
int rand_num(int level) {
return rand() % (level * 10) + 1;
}
// 生成随机运算符
int rand_op() {
return rand() % 4 + 1;
}
// 获取运算符对应的字符串
const char* get_op_str(int op) {
switch (op) {
case OP_ADD:
return "+";
case OP_SUB:
return "-";
case OP_MUL:
return "*";
case OP_DIV:
return "/";
default:
return "";
}
}
// 生成随机题目
void generate_problem(Problem* prob, int level, int op) {
switch (op) {
case OP_ADD:
prob->a = rand_num(level);
prob->b = rand_num(level);
prob->op = OP_ADD;
prob->ans = prob->a + prob->b;
break;
case OP_SUB:
prob->a = rand_num(level);
prob->b = rand_num(level);
if (prob->a < prob->b) {
int tmp = prob->a;
prob->a = prob->b;
prob->b = tmp;
}
prob->op = OP_SUB;
prob->ans = prob->a - prob->b;
break;
case OP_MUL:
prob->a = rand_num(level / 2 + 1);
prob->b = rand_num(level / 2 + 1);
prob->op = OP_MUL;
prob->ans = prob->a * prob->b;
break;
case OP_DIV:
prob->b = rand_num(level / 2 + 1);
prob->ans = rand_num(level * prob->b);
prob->a = prob->ans * prob->b;
prob->op = OP_DIV;
break;
}
}
// 显示题目
void show_problem(const Problem* prob) {
printf("%d %s %d = ", prob->a