C++课程设计报告
- 格式:doc
- 大小:55.00 KB
- 文档页数:12
(一)、设计题目及简介编写程序,随机出20道100以内的算术题,每题5分,加减乘除随机,每出一道题,用户答一次,并统计当前得分,最后显示总分及准确率,并把错误题目列出。
(二)、设计说明首先定义一个运算类enump,包涵随机生成的函数和用到的各类函数,如判断值范围、判断计算结果、运算符号随机生成等。
后再用主函数进行各个函数的调用,达到最后的效果。
(三)、程序流程图(四)、程序清单源程序如下:// 3.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#include <ctime>#include <conio.h>using namespace std;//计算式数量int const Num = 20;//计算式中最大数int const MaxNum = 100;//每题分数int const PerMark = 5;//计算结果最大值int const MaxResult = 100;//计算结果最小值int const MinResult = 0;enum enum_1{Add,Subtract,Multiply,Divide};class enump{public:char enum_2(enum_1 op);int Result(int left,int right,enum_1 op);bool check(int left,int right,enum_1 op);void getFormula(int* left,int*right,enum_1 op); enum_1 op;//操作符左值int left[Num];//操作符右值int right[Num];//用户输入计算结果int result[Num],result_error[Num][4];//操作符 +-*/enum_1 oper[Num];//正确答案个数float answerRight;};//将枚举类型转换为字符类型,以便输出。
char enump::enum_2(enum_1 op){switch (op){case Add:return '+';case Subtract:return '-';case Multiply:return 'x';case Divide:return '/';}return ' ';}//计算生成表达式的正确结果。
int enump::Result(int left,int right,enum_1 op) {switch (op)case Add:return left+right;case Subtract:return left-right;case Multiply:return left *right;case Divide:return left/ right;}return 0;}//检查生成计算式的正确与否。
其中减法结果不能为负数,除法结果不能为小数。
bool enump::check(int left,int right,enum_1 op){switch (op){case Add:return true;}case Subtract:{if(left < right)return false;return true;}case Multiply:{return true;}case Divide:{if(right == 0)return false;if(double(left/right) != double(double(left)/double(right)))return false;return true;}return false;}//依据给定操作符,生成符合条件的表达式。
void enump::getFormula(int* left,int*right,enum_1 op){//srand(time(NULL));for(;;){*left = 1 + rand() % MaxNum; //得出1到100其中的一个整数*right = 1 + rand() % MaxNum;if(check(*left,*right,op) && Result(*left,*right,op)<= MaxResult && Result(*left,*right,op)>= MinResult)break;}}int main(){enump p;p.answerRight=0;int k=0,h=0;cout<<" 100以内的算术题 "<<endl<<endl;//随机种子srand(time(NULL)); //根据系统时间设置随机数种子//开始生成计算表达式。
for(int i = 0;i<Num;i++){//操作符p.oper[i] = enum_1(rand()%4); //取得区间[0,4)的整数,从而得到不同符号p.getFormula(&p.left[i],&p.right[i],p.oper[i]);}cout<<"生成计算式完成,开始答题!"<<endl;//输出表达式,让用户答题for(int j = 0;j<Num;j++){//输出表达式cout<<"第 "<<j+1<<" 题: \n";cout<<p.left[j]<<' '<<p.enum_2(p.oper[j])<<' '<<p.right[j]<< " = ";//获取用户答案cin>>p.result[j];//比对用户答案是否正确,正确输出right,answerRigth加一,否则输出not correct。
if(p.result[j] == p.Result(p.left[j],p.right[j],p.oper[j])){cout<<"答案正确。
";p.answerRight++;cout<<"当前得分"<<" "<<p.answerRight*PerMark<<endl;}else{ p.result_error[k][0]=p.left[j];p.result_error[k][1]=p.enum_2(p.oper[j]);p.result_error[k][2]=p.right[j];p.result_error[k][3]=p.result[j];k++;h++;cout<<"答案错误。
";cout<<"当前得分"<<" "<<p.answerRight*PerMark<<endl;}}//全部答题完毕,输出正确答案个数及得分。
cout<<"---------------------------------------------------------------------"<<endl;cout<<"终止答题,共 "<<Num<<" 题,每题 "<<PerMark<<" 分,答对 "<<p.answerRight<<" 题,得分:"<<p.answerRight*PerMark<<" 分。
"<<"正确率"<<p.answerRight/Num*100<<"%"<<endl;cout<<"---------------------------------------------------------------------"<<endl<<endl;cout<<"错误的题目:"<<endl<<endl;for(int m=0;m<h;m++){if(p.result_error[m][1]==47)cout<<p.result_error[m][0]<<" / "<<p.result_error[m][2]<<" = "<<p.result_error[m][3]<<" (错误)"<<endl;else if(p.result_error[m][1]==120)cout<<p.result_error[m][0]<<" x "<<p.result_error[m][2]<<" = "<<p.result_error[m][3]<<" (错误)"<<endl;else if(p.result_error[m][1]==43)cout<<p.result_error[m][0]<<" + "<<p.result_error[m][2]<<" = "<<p.result_error[m][3]<<" (错误)"<<endl;elsecout<<p.result_error[m][0]<<" - "<<p.result_error[m][2]<<" = "<<p.result_error[m][3]<<" (错误)"<<endl;}//屏幕停止。