| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 753 人关注过本帖
标题:[原创]昨天在网上看到可这个题目,觉得挺有意思的,就写了一下,大家还有别 ...
只看楼主 加入收藏
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
收藏
 问题点数:0 回复次数:9 
[原创]昨天在网上看到可这个题目,觉得挺有意思的,就写了一下,大家还有别的思路没

/******************************************
*
* 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编辑过]

搜索更多相关主题的帖子: 计算机 思路 小数 打印 
2006-02-02 20:30
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
收藏
得分:0 

//这是我的程序
/******************************************
*
* Copyright by NJU_SE_SirX
* 2006.2.2
******************************************/
#include <iostream>
#include <iomanip> //setw()
#include <conio.h> //getch()
using namespace std;

const int MAX_NUM=50; //最大题量

class Operation {
public:
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() {
delete []opL;
delete []opR;
delete []oper;
delete []result;
delete []isRight;
}
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();
}

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();
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();
cout<<"■测验结束...\n"<<endl;
system("pause");
return 0;
}


for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-02-02 20:31
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 
if(num>0 && num<=MAX_NUM)??
觉得是if(num>0 || num<=MAX_NUM)
然后另外的话,能不能把除法全排列一下,也不是很多么,然后做成map再抽也行。10以内除法根本没什么好做的,如果除法可以出得难度加高一点,建议换成乘法,再倒成除法题

2006-02-03 15:27
DarkHero
Rank: 1
等 级:新手上路
威 望:2
帖 子:191
专家分:0
注 册:2006-1-14
收藏
得分:0 
if(num>0 && num<=MAX_NUM)没错,就应该 0<num<=MAX_NUM

除法的建议好啊,我这题出来后很少见到除法,见到也是“4/1”弱智型的……

还有,有个问题:
为什么我都重启过了题目还是不编呢?不像随机的的了……

for( ; me.alive() ; ) { 淡泊名利,志存高远 } //Forever
2006-02-03 22:14
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 
这个是因为这是伪随机数,跟时间有关系,然后运算速度是定死的,那就没起到随机的作用

2006-02-04 00:32
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
rand()返回是什么类型?问一下.

2006-02-04 12:55
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
int类型

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-04 13:35
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

int

unsigned int

?


2006-02-04 15:32
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 

范围是 0 ~0x7fff 的int


成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-04 16:11
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
谢谢

2006-02-04 16:20
快速回复:[原创]昨天在网上看到可这个题目,觉得挺有意思的,就写了一下,大家还 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014656 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved