C语言试编写一个程序来帮助小学生学习四则运算。参考本章介绍的猜数游戏(例6.7、例6.11和例6.12)程序,按下列任务要求以循序渐进的方式编程。 任务1:程序首先显示菜单,选择做加减乘除哪一种运算。根据用户选择的运算类型,随机产生两个1~10之间的正整数,在屏幕上打印出问题,例如: 6 * 7 = 然后让学生输入答案。程序检查学生输入的答案是否正确。若学生回答正确,则显示“Right!”,否则显示“Wrong!”。 任务2:10道题全部做完后,按每题10分统计并输出总分,同时为了记录学生能力提高的过程,再输出学生的回答正确率,根据准确率输出不同的评价。 任务3:在任务2的基础上,为使学生通过反复练习熟练掌握所学内容,在学生完成10道运算题后,若回答正确率低于75%,则重新做10道题,直到回答正确率高于75%时才退出程序。 任务4:错题本功能记录做错的题目,选择该选项可以重做之前做过的错题。(最多记录20道)。
时间: 2023-06-14 22:05:39 浏览: 130
以下是一个可供参考的代码实现,实现了任务1、任务2和任务4:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_WRONG_PROBLEMS 20 // 最多记录错题数
#define MAX_WRONG_ANS_LEN 20 // 最长错答案长度
// 用于记录一个错题的结构体
typedef struct {
int a; // 第一个数
int b; // 第二个数
char op; // 运算符
char wrong_ans[MAX_WRONG_ANS_LEN]; // 错误答案
} Problem;
void print_menu();
char get_user_choice();
void generate_problem(int *a, int *b, char *op);
void print_problem(int a, int b, char op);
int get_user_answer();
int check_answer(int a, int b, char op, int answer);
void print_result(int num_problems, int num_right);
void print_evaluation(float accuracy);
void print_wrong_problems(Problem *wrong_problems, int num_wrong_problems);
void add_wrong_problem(Problem *wrong_problems, int *num_wrong_problems, int a, int b, char op, char *wrong_ans);
int main() {
srand(time(NULL)); // 随机数种子初始化
char choice;
int num_problems = 0; // 题目总数
int num_right = 0; // 答对的题目数
int num_wrong_problems = 0; // 错题数
Problem wrong_problems[MAX_WRONG_PROBLEMS]; // 存储错题的数组
do {
print_menu();
choice = get_user_choice();
switch (choice) {
case '1': // 加法
case '2': // 减法
case '3': // 乘法
case '4': // 除法
while (1) {
int a, b, answer;
char op = choice == '1' ? '+' : choice == '2' ? '-' : choice == '3' ? '*' : '/';
generate_problem(&a, &b, &op);
print_problem(a, b, op);
answer = get_user_answer();
if (check_answer(a, b, op, answer)) {
printf("Right!\n");
num_right++;
} else {
printf("Wrong!\n");
add_wrong_problem(wrong_problems, &num_wrong_problems, a, b, op, "N/A");
}
num_problems++;
if (num_problems == 10) { // 做够10道题目
print_result(num_problems, num_right);
float accuracy = (float)num_right / num_problems;
print_evaluation(accuracy);
if (accuracy < 0.75) { // 回答正确率低于75%,重新做10道题
printf("Your accuracy is too low, please redo the problems.\n");
num_problems = num_right = 0;
num_wrong_problems = 0;
continue;
} else {
// 退出程序
printf("Thanks for using! Goodbye.\n");
return 0;
}
}
}
case '5': // 错题本
print_wrong_problems(wrong_problems, num_wrong_problems);
break;
case '6': // 退出程序
printf("Thanks for using! Goodbye.\n");
break;
default:
printf("Invalid input, please try again.\n");
}
} while (choice != '6');
return 0;
}
void print_menu() {
printf("***************************\n");
printf(" Math Practice \n");
printf("***************************\n");
printf("1. Addition\n");
printf("2. Subtraction\n");
printf("3. Multiplication\n");
printf("4. Division\n");
printf("5. Wrong Problems\n");
printf("6. Exit\n");
}
char get_user_choice() {
char choice;
printf("Please enter your choice: ");
scanf(" %c", &choice);
return choice;
}
void generate_problem(int *a, int *b, char *op) {
*a = rand() % 10 + 1;
*b = rand() % 10 + 1;
*op = rand() % 4 == 0 ? '/' : rand() % 3 == 0 ? '*' : rand() % 2 == 0 ? '+' : '-';
if (*op == '-' && *a < *b) { // 减法时保证结果非负
int temp = *a;
*a = *b;
*b = temp;
}
if (*op == '/') { // 除法时保证除数不为0
while (*a % *b != 0) {
*a = rand() % 10 + 1;
*b = rand() % 10 + 1;
}
}
}
void print_problem(int a, int b, char op) {
printf("%d %c %d = ", a, op, b);
}
int get_user_answer() {
int answer;
printf("Please enter your answer: ");
scanf("%d", &answer);
return answer;
}
int check_answer(int a, int b, char op, int answer) {
switch (op) {
case '+':
return answer == a + b;
case '-':
return answer == a - b;
case '*':
return answer == a * b;
case '/':
return answer == a / b;
default:
return 0;
}
}
void print_result(int num_problems, int num_right) {
printf("You have finished %d problems, and got %d right.\n", num_problems, num_right);
printf("Your score is: %d.\n", num_right * 10);
}
void print_evaluation(float accuracy) {
printf("Your accuracy is: %.2f%%.\n", accuracy * 100);
if (accuracy >= 0.9)
printf("Excellent job!\n");
else if (accuracy >= 0.8)
printf("Good job!\n");
else if (accuracy >= 0.7)
printf("Not bad!\n");
else
printf("Keep practicing!\n");
}
void add_wrong_problem(Problem *wrong_problems, int *num_wrong_problems, int a, int b, char op, char *wrong_ans) {
if (*num_wrong_problems == MAX_WRONG_PROBLEMS) { // 超过最大记录数,丢弃最旧的一条记录
for (int i = 0; i < MAX_WRONG_PROBLEMS - 1; i++) {
wrong_problems[i] = wrong_problems[i + 1];
}
(*num_wrong_problems)--;
}
Problem p = {a, b, op, ""};
sprintf(p.wrong_ans, "%d", wrong_ans);
wrong_problems[*num_wrong_problems] = p;
(*num_wrong_problems)++;
}
void print_wrong_problems(Problem *wrong_problems, int num_wrong_problems) {
if (num_wrong_problems == 0) {
printf("You have no wrong problems yet.\n");
} else {
printf("You have %d wrong problems:\n", num_wrong_problems);
for (int i = 0; i < num_wrong_problems; i++) {
printf("%d %c %d = %s\n", wrong_problems[i].a, wrong_problems[i].op, wrong_problems[i].b, wrong_problems[i].wrong_ans);
}
}
}
```
代码思路:
1. 定义一个 `Problem` 结构体来记录每个错题的内容和错误答案。
2. 实现 `print_menu()` 函数和 `get_user_choice()` 函数来显示菜单和获取用户选择。
3. 实现 `generate_problem()` 函数来随机生成两个数和一个运算符。
4. 实现 `print_problem()` 函数和 `get_user_answer()` 函数来打印问题和获取用户答案。
5. 实现 `check_answer()` 函数来检查用户答案是否正确。
6. 在主函数中,根据用户选择的运算类型循环做题,同时记录总题数和答对的题目数,并将做错的题目加入错题本中。
7. 当做够10道题目后,统计总分和回答正确率,并输出评价。如果回答正确率低于75%,重新做10道题目。
8. 实现 `print_wrong_problems()` 函数来打印错题本中的错题。
注意事项:
1. 除法时需要保证除数不为0,减法时需要保证结果非负。
2. 错题本中需要记录错误答案,因为用户可能会输入多种答案,而我们只能记录其中一种。
3. 在添加新的错题记录时,如果已经记录了最大数量的错题,则需要丢弃最早的一条记录。
阅读全文