本帖最后由 yuxijian2020 于 2021-4-22 23:00 编辑
我来了 我就是工具人#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0
#define MAX_LEN 50
#define MAX_INT 2147483647
//运算符数组
const char ops[4] = { '+', '-', '*', '/' };
//提示数组
const char* correct[4] = { "Very good!", "Excellent!", "Nice work!", "Keep up the good work!" };
const char* wrong[4] = { "No. Please try again.", "Wrong. Try once more.", "No. Don’t give up!", "Not correct. Keep trying." };
typedef struct _Formula
{
int first; //第一个数
char operator; //操作符
int second; //第二个数
int result; //结果
double fResult; //除法结果
char formula[MAX_LEN]; //整个公式字符串
} Formula;
//生成运算公式,并计算结果保存在结构体中
Formula* CreateFormula()
{
//种子
static unsigned int seed = 1;
int i = 0;
Formula* result = (Formula*)malloc(sizeof(Formula));
if (result == NULL)
printf_s("生成运算失败...\n");
memset(result, 0, sizeof(Formula));
//设置随机数种子
srand(seed + time(0));
//种子变化
seed++;
result->first = rand() % 10;
result->second = rand() % 10;
i = rand() % 4;
result->operator = ops[i];
switch (i)
{
case 0:
result->result = result->first + result->second;
break;
case 1:
result->result = result->first - result->second;
break;
case 2:
result->result = result->first * result->second;
break;
case 3:
//除法时,确保除数不为0
while (result->second == 0)
result->second = rand() % 10;
result->fResult = (double)result->first / (double)result->second;
break;
default:
break;
}
sprintf_s(result->formula, MAX_LEN, "%d %c %d = ", result->first, result->operator, result->second);
return result;
}
//任务一
void TaskOne()
{
Formula* task = CreateFormula();
double result = MAX_INT;
printf_s("请输入下列公式的结果:\n");
while (result != task->result)
{
printf_s("%s ", task->formula);
scanf_s("%lf%*c", &result);
if (task->operator != '/' && result != task->result)
printf_s("答案错误请重新输入!\n");
else if (task->operator == '/' && fabs(result - task->fResult) > 1e-4)//除法计算出4位小数即可
printf_s("答案错误请重新输入!\n");
}
printf_s("答案正确!\n");
free(task);
}
//任务二
void TaskTwo()
{
Formula* task = CreateFormula();
double result = MAX_INT;
int count = 3;
printf_s("请输入下列公式的结果:\n");
printf_s("你有3次尝试的机会,请好好把握!\n");
while (count > 0 && result != task->result)
{
printf_s("%s ", task->formula);
scanf_s("%lf%*c", &result);
count--;
if (task->operator != '/' && result != task->result && count > 0)
printf_s("答案错误请重新输入!\n");
else if(task->operator == '/' && fabs(result - task->fResult) > 1e-4 && count > 0)
printf_s("答案错误请重新输入!\n");
}
if (result != task->result)
printf_s("很遗憾,3次尝试都失败了!游戏结束!\n");
else
printf_s("回答正确!\n");
free(task);
}
//任务三
void TaskThree()
{
Formula* task[10];
double result;
for (int i = 0; i < 10; i++)
task[i] = CreateFormula();
int rightNum = 0;
printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");
for (int i = 0; i < 10; i++)
{
printf_s("(%d) %s", i + 1, task[i]->formula);
scanf_s("%lf%*c", &result);
if (task[i]->operator != '/' && result == task[i]->result)
rightNum += 1;
else if(task[i]->operator == '/' && fabs(result - task[i]->fResult) < 1e-4)
rightNum += 1;
}
//10题 每题10分
printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
//释放空间
for (int i = 0; i < 10; i++)
free(task[i]);
}
//任务四
int TaskFour()
{
Formula* task[10];
double result;
for (int i = 0; i < 10; i++)
task[i] = CreateFormula();
int rightNum = 0;
printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");
for (int i = 0; i < 10; i++)
{
printf_s("(%d) %s", i + 1, task[i]->formula);
scanf_s("%lf%*c", &result);
if (task[i]->operator != '/' && result == task[i]->result)
{
printf_s("答案正确!\n");
rightNum += 1;
}
else if (task[i]->operator == '/' && fabs(result - task[i]->fResult) < 1e-4)
{
printf_s("答案正确!\n");
rightNum += 1;
}
else
{
printf_s("答案错误!\n");
}
}
//10题 每题10分
printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
//释放空间
for (int i = 0; i < 10; i++)
free(task[i]);
return rightNum * 10;
}
//任务五
void TaskFive()
{
while (TaskFour() < 75)
{
printf_s("正确率低于75%%, 请重新做题!\n");
printf_s("-------------------------------------\n");
}
}
//任务六
//人机回复 参数为回答正确或错误
void RobotReply(BOOL isCorrect)
{
//种子
static unsigned int seed = 0;
//设置随机数种子
srand(seed + time(0));
int i = rand() % 4;
if (isCorrect)
printf_s("%s\n", correct[i]);
else
printf_s("%s\n", wrong[i]);
//种子变化
seed++;
}
//设置问题并要求用户输入回复 -- 基本同TaskFour 只是改了回复
int MakeQuestion()
{
Formula* task[10];
double result;
for (int i = 0; i < 10; i++)
task[i] = CreateFormula();
int rightNum = 0;
printf_s("一共10道题目,只有一次机会!请谨慎填写!\n");
for (int i = 0; i < 10; i++)
{
printf_s("(%d) %s", i + 1, task[i]->formula);
scanf_s("%lf%*c", &result);
if (task[i]->operator != '/' && result == task[i]->result)
{
RobotReply(TRUE);
rightNum += 1;
}
else if (task[i]->operator == '/' && fabs(result - task[i]->fResult) < 1e-4)
{
RobotReply(TRUE);
rightNum += 1;
}
else
{
RobotReply(FALSE);
}
}
//10题 每题10分
printf_s(" 你的总分为: %d\n 正确率为: %d%%", rightNum * 10, rightNum * 10);
//释放空间
for (int i = 0; i < 10; i++)
free(task[i]);
return rightNum * 10;
}
void TaskSix()
{
while (MakeQuestion() < 75)
{
printf_s("正确率低于75%%, 请重新做题!\n");
printf_s("-------------------------------------\n");
}
}
//自定义功能
void TaskCustom()
{
//自定义功能自己写吧...
}
int main()
{
//TaskOne();
//TaskTwo();
//TaskThree();
//TaskFour();
//TaskFive();
TaskSix();
return 0;
}
|