小学算术测试系统

 我来答
减肥QQ75545030
推荐于2016-08-23 · TA获得超过1313个赞
知道答主
回答量:105
采纳率:0%
帮助的人:79.1万
展开全部
/*
既然你都用定向求助了,那我就不好意思了。
小学算术测试系统
电脑随机出10道题,每题10分,程序结束时显示学生得分(题目只需含有加减乘除即可)。
每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案。
对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则得0分。
总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。
*/
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
//表示一道算术题目的类
class Question
{
public:
// 静态方法。计算数字 n 的所有因子并返回。
static vector<unsigned int> getFactors(int n);
public:
// 构造函数。初始化试题,并开始答题。
Question(unsigned int,string,int);
// 比较两道题目是否完全相同。
friend bool operator==(Question& q1,Question& q2);
/* 考生对本题进行一次回答。
参数:


返回值:
如果考生能继续答题,返回 true;否则返回 false。

说明:
一般外部连续调用这个函数,知道它返回 false 为止。
*/
bool answer();
// 判断是否正确解出了本题
bool isSolved();
// 如果正确解出了本题,获取使用的回答次数。
unsigned int getTryTimes();
private:
// 随机产生一道试题
void generate();
private:
unsigned int max_try_times;
string available_operators;
int max_available_number;
private:
// 本题使用的运算符号(加减乘除之一)
char op;
// 本题的第一个数n1,第二个数字n2,以及数字他们使用运算符 op 运输后的正确结果result
unsigned int n1,n2,result;

// 保存考生答题过程中的所有输入答案
vector<unsigned int> answers;
// 标记是考生否在 max_try_times 次之内正确回答出本题
bool is_solved;
};
vector<unsigned int> Question::getFactors(int n)
{
vector<unsigned int> factors;
for(int i=1;i<=(int)sqrt(n);i++)
if(n%i == 0)
factors.push_back(i);
return factors;
}
Question::Question(unsigned int max_try_times,string available_operators,int max_available_number)
{
this->max_try_times = max_try_times;
this->available_operators = available_operators;
this->max_available_number = max_available_number;

// 随机产生题目
generate();
is_solved = false;
}
bool operator==(Question& q1,Question& q2)
{
return q1.n1==q2.n1 && q1.n2==q2.n2 && q1.op==q2.op ;
}
bool Question::isSolved()
{
return is_solved;
}
unsigned int Question::getTryTimes()
{
return answers.size();
}
void Question::generate()
{
// 运算符
op = available_operators[rand()%available_operators.length()];
// 如果算术可以使用任意自然数
if(max_available_number < 0)
{
n1 = rand();
switch(op)
{
case '+':
n2 = rand();
result = n1 + n2;
break;
case '-':
// 保证 n2 小于 n1 ,结果才不会出现负数
n2 = rand()%(n1+1);
result = n1 - n2;
break;
case '*':
n2 = rand();
result = n1 * n2;
break;
case '/':
// 保证 n2 是 n1 的一个因子,结果才不会出现小数
vector<unsigned int> factors = getFactors(n1);
n2 = factors[rand()%factors.size()];
result = n1 / n2;
break;

}
}
// 如果算术可以只能使用[0,max_available_number]内的数字
else
{
n1 = rand()%(max_available_number+1);
switch(op)
{
case '+':
n2 = rand()%(max_available_number-n1+1);
result = n1 + n2;
break;
case '-':
// 保证 n2 小于 n1 ,结果才不会出现负数
n2 = rand()%(n1+1);
result = n1 - n2;
break;
case '*':
n2 = rand()%(max_available_number/n1+1);
result = n1 * n2;
break;
case '/':
// 保证 n2 是 n1 的一个因子,结果才不会出现小数
vector<unsigned int> factors = getFactors(n1);
n2 = factors[rand()%factors.size()];
result = n1 / n2;
break;
}
}
}
bool Question::answer()
{
unsigned int a;
// 输出题目
cout << "\t" <<n1 << " " << op << " " << n2 << " = ";
// 考生输入答案
cin >> a;
// 保存考生输入答案
answers.push_back(a);

// 比较考生答案和正确结果
if(a == result)
{
// 标记已经解出本题
is_solved = true;
// 不用继续答题
return false;
}

if(answers.size() == max_try_times)
{
cout << "\tSorry," << n1 << " " << op << " " << n2 << " = " << result << endl;
return false;
}
else
return true;
}
/*----------------------------------------------*/

// 表示一个学生进行一次数学考试的类
class MathExam
{
public:
// 设置一次考生的题目总数
static const unsigned int TOTAL_QUESTIONS
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式