/******************************************
*
* Copyright by NJU_SE_SirX
* 2006.2.2
******************************************/
/*
为了帮助小学生学好四则运算,我们来开发一个无纸考试程序。功能如下:
用户从命令行输入想要考的题目数。
每道题都由计算机随机生成,可以是加减乘除中的任一种,参与运算的两个数的范围在0-10之间(包括0和10)。
不要出结果是小数的除法折磨小学生,
依次打印每道题,并让用户输入每题的答案。
所有题目做完后,打印用户的正确率。
然后,把每道做错的题都拿出来重做,直到每题都做对。
其他的自由发挥。
*/
#include <iostream>
#include <iomanip> //setw()
#include <conio.h> //getch()
using namespace std;
const int MAX_NUM=50; //最大题量
class Operation {
int opNum; //题量
int range; //数的范围:0--range
int *opL,*opR,*oper,*result;
bool *isRight;
int compute(int oprt,int i); //计算1题的正确结果
static char getOper(int i); //由i得出运算符
void makeOp(); //初始化所有题目
static void printMsg(int total,int right); //输出做题结果
public:
Operation(int num=0,int level=1);
~Operation();
void test();
};
Operation::Operation(int num,int level) :opNum(num) {
switch(level) {
case 1:range=10;break;
case 2:range=100;break;
default :range=1000;
}
//分配空间
opL=new int[num];
opR=new int[num];
oper=new int[num];
result=new int[num];
isRight=new bool[num];
//初始化
for(int i=0;i<num;i++)
isRight[i]=false;
makeOp();
}
Operation::~Operation() {
delete []opL;
delete []opR;
delete []oper;
delete []result;
delete []isRight;
cout<<"■测验结束...\n"<<endl;
system("pause");
}
inline char Operation::getOper(int i) {
switch(i) {
case 0:return '+';
case 1:return '-';
case 2:return '*';
case 3:return '/';
}
return 0;
}
int Operation::compute(int oprt/*运算符*/,int i/*题号*/) {
switch(oprt) {
case 0:return opL[i]+opR[i];
case 1:return opL[i]-opR[i];
case 2:return opL[i]*opR[i];
case 3:return opL[i]/opR[i];
default :return -1;
}
}
void Operation::makeOp() {
for(int i=0;i<opNum;i++) {
oper[i]=rand()%4;
//除法比较特殊,要求能除尽且除数不为0
if(3==oper[i]) {
while(true) {
opR[i]=rand()%range; //0--range
if(!opR[i])
continue; //除数不能为0
opL[i]=rand()%range;
if(!(opL[i]%opR[i]))
break; //能除尽则跳出循环
}
}
//减法要求不能产生负数
else if(1==oper[i]) {
while(true) {
opL[i]=rand()%range;
opR[i]=rand()%range;
if(opL[i]>=opR[i])
break;
}
}
//加 乘
else {
opL[i]=rand()%range;
opR[i]=rand()%range;
}
result[i]=compute(oper[i],i);
}
}
void Operation::printMsg(int total,int right) {
int rate=right*100/total;
cout<<"\n 〓〓〓 统计结果 〓〓〓"<<endl;
cout<<"--------------------------------------------------------------------------------"<<endl;
cout<<"■这次你一共做了"<<setw(3)<<total<<" 题,对了"<<setw(3)<<right<<" 题,错了"<<setw(3)<<total-right<<" 题。"<<endl;
cout<<"■你的得分(正确率) :"<<setw(3)<<rate<<",";
if(100==rate)
cout<<"满分!你太厉害了,佩服!!!Perfect~~~";
else if(rate>89)
cout<<"做得真好,差一点就满分了,继续努力 ^_^";
else if(rate>79)
cout<<"做得不错,继续努力吧!";
else if(rate>69)
cout<<"做得还行,再加油啊!";
else if(rate>59)
cout<<"过关了,好险,再加油吧!";
else
cout<<"……,不及格!好好学习,天天向上,一定要继续努力啊 ^_^";
cout<<"\n\n--------------------------------------------------------------------------------"<<endl;
cout<<endl;
}
void Operation::test() {
int tmpRes=0, //临时结果
total=opNum, //总题量
rightNum=0; //正确的题量
char sign;
while(true) {
for(int i=0;i<opNum;i++) {
if(isRight[i]) continue;
//else
cout<<"□第"<<setw(3)<<i+1<<" 题 : "
<<opL[i]<<" "<<getOper(oper[i])<<" "<<opR[i]<<" = ";
cin>>tmpRes;
if(tmpRes==result[i]) {
cout<<" 恭喜你,答对了! ^_^";
rightNum++;
isRight[i]=true;
}
else cout<<" 不好意思,你错啦~ T_T";
if(i!=opNum-1)
cout<<",继续下一题 :";
cout<<endl;
cout<<"----------------------------------------"<<endl;
}
printMsg(total,rightNum);
total-=rightNum;
rightNum=0;
if(total) //不是全对
cout<<"■是否要重做做错的题目?(Y/N)"<<"\n 推荐'Y' : ";
else break;
sign=getch();
cout<<endl;
if('n'==sign || 'N'==sign)
break;
else cout<<"OK,让我们来继续学习!"<<endl<<endl;
system("cls"); //清屏
}
}
int main() {
int num=0,level=0;
while(true) {
cout<<"■请输入题目的难度(1~3) : ";
cin>>level;
if(level>0 && level<4)
break;
}
while(true) {
cout<<"■请输入题目的数量(0~"<<MAX_NUM<<") : ";
cin>>num;
if(num>0 && num<=MAX_NUM)
break;
}
cout<<"--------------------------------------------------------------------------------";
Operation exc(num,level);
exc.test();
return 0;
}
[此贴子已经被作者于2006-2-3 22:10:38编辑过]