实例:加减法小测验-面向对象
- 格式:doc
- 大小:179.00 KB
- 文档页数:15
面向对象项目案例一、项目背景。
咱们都知道宠物小精灵,那些可爱又厉害的小家伙们可以互相战斗。
所以我们就来创建一个模拟宠物小精灵对战的小项目。
二、类的设计。
1. 小精灵类(Pokemon)属性:名字(name):这个属性用来记录小精灵的名字,像皮卡丘、喷火龙之类的。
比如说,我的皮卡丘叫“小电球”,那这个名字就是“小电球”啦。
生命值(health):小精灵在战斗中能承受多少伤害就靠这个属性啦。
刚出场的时候,一只健康的小精灵生命值可能是100呢。
技能列表(skills):每个小精灵都有自己独特的技能,像皮卡丘的十万伏特。
这个技能列表就是一个小集合,里面装着小精灵会的各种技能。
方法:攻击(attack):这个方法是小精灵用来攻击其他小精灵的。
比如说,皮卡丘使用十万伏特攻击小火龙的时候,这个方法就会被调用。
它会根据技能的威力,对被攻击的小精灵造成一定的伤害。
受伤(beHurt):当小精灵被其他小精灵攻击的时候,这个方法就会被触发。
它会根据受到的伤害量,减少自己的生命值。
比如说,小火龙被皮卡丘的十万伏特击中了,那小火龙的生命值就会通过这个方法减少。
2. 训练师类(Trainer)属性:名字(name):训练师的名字,像小智之类的。
小精灵队伍(pokemonTeam):这是一个列表,里面装着训练师所拥有的小精灵。
小智可能就有皮卡丘、喷火龙等在他的队伍里。
方法:选择小精灵(selectPokemon):在对战开始的时候,训练师要从自己的小精灵队伍里选择一个出战的小精灵。
这个方法就是干这个事儿的。
指挥攻击(commandAttack):当战斗开始后,训练师要指挥自己的小精灵攻击对方的小精灵。
这个方法就会调用小精灵的攻击方法,让小精灵发动攻击。
三、项目逻辑。
1. 我们创建几个小精灵对象。
比如说:`pikachu = Pokemon("小电球", 100, ["十万伏特", "电光一闪"])`。
单元测试用例案例
假设我们有一个名为Calculator的类,其中包含了四个基本的数学运算方法:加法(add)、减法(subtract)、乘法(multiply)和除法(divide)。
下面是一些基本的单元测试用例案例:
1. 加法:
输入:2, 3
预期输出:5
2. 减法:
输入:5, 3
预期输出:2
3. 乘法:
输入:4, 2
预期输出:8
4. 除法:
输入:10, 2
预期输出:5
5. 除法(分母为0):
输入:10, 0
预期输出:抛出异常或返回特定的错误码
注意:这些只是基本的单元测试用例案例,实际上应该考虑更
多的边界情况,例如输入为负数、小数等。
同时,还可以使用参数化测试或数据驱动测试来覆盖更多的情况。
面向对象设计原则实验报告1.1实验目的1. 通过实例深入理解和掌握所学的面向对象设计原则。
2.熟练使用面向对象设计原则对系统进行重构。
3.熟练绘制重构后的结构图(类图)。
1.2实验内容1.在某绘图软件中提供了多种大小不同的画笔(Pen),并且可以给画笔指定不同颜色,某设计人员针对画笔的结构设计了如图1-1所示的初始类图。
通过仔细分析,设计人员发现该类图存在非常严重的问题,即如果需要增加一种新的大小或颜色的笔,就需要增加很多子类,例如增加一种绿色的笔,则对应每一种大小的笔都需要增加一支绿色笔,系统中类的个数急剧增加。
试根据依赖倒转原则和合成复用原则对该设计方案进行重构,使得增加新的大小或颜色的笔都较为方便,请绘制重构之后的结构图(类图)。
2.在某公司财务系统的初始设计方案中存在如图1-2所示的Employee类, 该类包含员工编号(ID),姓名(name),年龄(age).性别(gender)、薪水(salary)、每月工作时数( workHoursPerMonth),每月请假天数(leaveDaysPerMonth)等属性。
该公司的员工包括全职和兼职两类,其中每月工作时数用于存储兼职员工每个月工作的小时数,每月请假天数用于存储全职员工每个月请假的天数。
系统中两类员工计算工资的万法也不一样,全职员工按照工作日数计算工资﹐兼职员工按照工.作时数计算上资﹐内此在 Employee 类中提供了两个方法calculateSalaryByDays()和calculateSalaryByHours(),分别用于按照大数和时数计算工资,此外,还提供了方法displaySalary()用于显示工资。
试采用所学面向对象设计原则分析图1-2中Employee类存在的问题并对其进行重构绘制重构之后的类图。
3.在某图形界面中存在如下代码片段,组件类之间有较为复杂的相互引用关系:如果在上述系统中增加一个新的组件类,则必须修改与之交互的其他组件类的源代码,将导致多个类的源代码需要修改。
【练习题】 01. 类的成员变量:猜数字游戏:一个类 A 有一个成员变量 v,有一个初值 100。
定义一个类,对 A 类的成员变量 v 进行猜。
如果大了则提示大了,小了则提示小了。
等于则提示猜测成功。
import .*;class A{int v = 100;A(){=v;}}public class b01{public static void main(String args[]){A a = new A();Scanner intput = new Scanner;int intputvalue = ();if(intputvalue>"你的输入大于这个值 ");if(intputvalue<"你的输入小于这个值 ");if(intputvalue=="猜测成功 ");}}【练习题】 02. 类的成员变量:请定义一个交通工具 (Vehicle)的类,其中有:属性:速度 (speed) ,体积 (size)等等方法:移动 (move()) ,设置速度 (setSpeed(int speed)),加速speedUp(),减速speedDown()等等 .最后在测试类Vehicle 它初始化 speed,size 对速度进行改变。
中的 main() 中实例化一个交通工具对象,并通过方法给的值,并且通过打印出来。
另外,调用加速,减速的方法class Vehicle{int speed;int size;void move(){};void setSpeed(int speed){ = speed;}void speedUp(){speed = speed+1;=speed;}void speedDown(){speed = speed-1;=speed;}}public class b01{ public static void main(String args[]){Vehicle a = new Vehicle();(55);=80;();"Speed:"++"\nsize:"+;}}【练习题】 03. 类的成员变量与方法、构造方法在程序中,经常要对时间进行操作,但是并没有时间类型的数据。
1.项目设计题目及要求题目:加减法小测验。
面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。
功能要求:电脑随机出10道题,每题10分,程序结束时显示学生得分;确保算式没有超出1~2年级的水平,只允许进行100以内的加减法,不允许两数之和或之差超出0~100的范围,负数更是不允许的;每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”变化扩展:1)允许用户初始选择题目类型:加法,减法,还是加减法都有。
2)评判完成后,显示答错的题,并给出正确答案。
3)若是一组题,可以重复使用,怎样处理?4)界面与应用逻辑分离5) 可以设置参数2. 项目的面向对象设计2.1 需求分析1)分析系统的功能需求:出题:随机出题。
每题要求:确保算式没有超出1~2年级的水平,只允许进行100以内的加减法,不允许两数之和或之差超出0~100的范围,负数更是不允许的。
答题:每道题学生有三次机会输入答案,每输入一次答案,进行评价,若正确显示正确,若错误,显示错误,并提醒学生重新输入答案。
若是第三次错误,则不再给机会输入答案。
答题评分:每道题,学生一次做对得10分,二次做对得7分,三次做对得5分,其余不得分;总评分:每个测试出10题,10题做完过后给出总评分。
总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”2)系统流程:先出完10题,然后按顺序做题。
首先显示一个题目,用户给出答案,进行评判。
若做题结束,进入下一题,若没有结束,用户继续给出答案进行评判。
面向对象组装技术中的构造法时间加减乘除四则运算面向对象组装技术中的构造法时间加减乘除四则运算随着信息化的发展,各行各业都在追求更高效,更方便的管理方式。
作为一种广泛应用的编程思想和方法,面向对象编程已经成为众多企业软件开发的标准。
组装技术作为一种面向对象编程模式的延伸,其以构造方法为核心,对对象的调用进行组装,实现原有对象的功能扩展或修改。
其中最基础、最常见的组装方式之一就是时间加减乘除四则运算,下面我们将会分别进行讲解。
一、时间类加减乘除四则运算时间是各种软件或系统中经常用到的数据类型之一,尤其是涉及到时序、推理等问题时,时间的运算意义更加突显。
在组装技术中,我们可以通过构造法来实现时间的加减乘除四则运算。
例如,我们可以通过对时间类的构造方法进行调用,来实现时间的加法运算。
假设现在我们有一个时间形如“2022-01-01 00:00:00”,我们想要将其加一天,可以通过在构造方法中获取现有时间值,再进行加减计算来实现。
这种时间加法运算方式不仅能够快速、精确地实现时间的计算,而且还具有良好的可维护性和可扩展性。
二、复合类加减乘除四则运算复合类是指由多种基本数据类型组合而成的自定义数据类型,它既可以理解为一种交叉类型,也可以理解为一种组合类型。
在组装技术中,我们可以通过构造方法来实现复合类的加减乘除四则运算。
例如,我们可以定义一个复合类X,包括两个基本数据类型,如下所示:```public class X {int a;int b;public X(int a, int b) {this.a = a;this.b = b;}}```以复合类X为例,在组装技术中,我们可以通过在构造方法中获取复合数据类型X中的a、b值,再进行加减乘除计算来实现四则运算。
这种方式利用了面向对象编程中的封装思想,使代码更加具有可读性和可维护性。
三、公共接口加减乘除四则运算除了时间类型和复合类型,还有一种数据类型,就是公共接口类型。
面向对象程序设计大作业------小学生四则运算测验1.系统简介该系统开发平台为Windows 7,程序设计语言采用Visual C++6.0,程序运行平台为Windows XP,程序通过调试运行,初步实现了设计目标。
(1)利用C++语言实现简易小学生四则运算测试系统的程序设计;(2)利用结构图和自行定义的函数进行相关的功能设计;(3)测试系统能随机产生数据进行测试.2.基本要求根据C++语言,将具体实现某个功能的函数设成小学生四则运算测试系统的公有函数成员,将数据利用自行定义的函数进行计算.随机选择两个整数进行加减乘除运算,给出算式要求学生作答。
基本要求如下:(1)电脑随机出20道题,每题5分,程序结束时显示学生得分;(2)允许随机给出的数在10以内。
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案,该题不计入学生得分(4)对于每道题目,学生第一次输入正确答案得5分,第二次输入正确答案得4分,第三次输入正确答案得3分,否则不得分;(5)20道题全部答完以后,电脑给出学生总分,并将学生得分为0的题目以及相应的正确答案再次输出。
3. 总体设计4. 详细设计表格 15.关键技术说明选择判断结构、循环结构、类、继承与派生、构造函数的应用。
6.源代码#include<iostream>#include<ctime>#include<cstdlib> //标准库头文件using namespace std;#define N 10 //十以内的算数题目#define NUMBER 20 //题目个数//int send=0;class RandShu{private:int shu;public:RandShu(){shu=rand()%N;}int getShu(){return shu;}void setShu(float d){shu=d;}};class RandFu{private:int fu;public:RandFu(){fu=rand()%4;}int getFu(){return fu;} };class ShiTi :public RandShu,RandFu {private:RandShu s1,s2;RandFu f;double r;char t[6];public:ShiTi(){r=solve();}double solve();double getResult();void display();};void ShiTi::display(){cout<<s1.getShu();switch(this->f.getFu()){case 0:cout<<"+";break;case 1:cout<<"-";break;case 2:cout<<"*";break;case 3:cout<<"/";break;}cout<<s2.getShu()<<"=";}double ShiTi::getResult(){double q=r*100;int w=q/1;double a=r*1000;int d=a/1;int c=d%10;double e=q-w;r=r-0.01*e;if(c>=5){r=r+0.01;}return r;}double ShiTi::solve(){switch(this->f.getFu()){case 0:r=s1.getShu()+s2.getShu();break;case 1:r=s1.getShu()-s2.getShu();break;case 2:r=s1.getShu()*s2.getShu();break;case 3:if(s2.getShu()==0)s2.setShu(1);r=(double)s1.getShu()/s2.getShu();break;}return r;}void head(){cout<<endl;cout<<"==================欢迎使用小学生四则运算测试系统======================"<<endl;cout<<"\t系统说明:";cout<<"\n\t本系统为十以内的四则运算测试系统"<<endl;cout<<"\t注意事项:";cout<<"\n\t除法结果若小数位多余两位的,四舍五入保留小数点后两位\n\n";cout<<"按任意键,进入答题"<<endl;system("pause");system("cls");}int main(){srand((unsigned)time(NULL));ShiTi t[NUMBER];double nResult[NUMBER];int fenShu=0;int count=0;int countRight=0;head();for(int i=0;i<NUMBER;i++){count=0;cout<<"第"<<i+1<<"题:";t[i].display();do{if(count!=0&&count<3)cout<<"结果错误,还有"<<3-count<<"次机会!"<<endl<<"请重新输入:"<<endl;cin>>nResult[i];count++;}while(nResult[i]!=t[i].getResult()&&count<3);if(count==3){cout<<"\n正确结果:"<<t[i].getResult()<<endl;}if(nResult[i]==t[i].getResult()){countRight++;fenShu=fenShu+5-count+1;}cout<<"*************************当前得分:"<<fenShu<<"**************************"<<endl;}cout<<"按任意键,进入测试成绩结果查看"<<endl;system("pause");system("cls");cout<<"测试成绩结果:"<<endl;for( i=0;i<NUMBER;i++){cout<<"第"<<i+1<<"题:";t[i].display();cout<<nResult[i];if(nResult[i]==t[i].getResult()){cout<<" √"<<endl;}else cout<<" ×"<<endl;}cout<<"答对题数:"<<countRight<<" 总得分:"<<fenShu<<endl;if(countRight!=NUMBER)cout<<"\t错误题目及答案:\n";for( i=0;i<NUMBER;i++){if(nResult[i]!=t[i].getResult()){cout<<"第"<<i+1<<"题:";t[i].display();cout<<t[i].getResult()<<endl;}}return 0;}7.测试(主界面及各功能模块的运行图及说明)1)初始界面2)错误结果及其处理3)测试界面4)测试成绩结果显示界面8.系统评价及展望本系统可以实现基本的试题产生及对输入结果的处理,程序运行较为完善,系统运作流畅,界面相对友好,能很容易使操作者操作自如。
一、问答题1.值类型和引用类型的区别?值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
值类型变量直接把变量的值保存在栈中,引用类型的变量把实际数据的地址保存在栈中,而实际数据则保存在堆中。
注意,堆和栈是两个不同的概念,在内存中的存储位置也不相同。
堆(Heap)一般用于存储可变长度的数据,如字符串类型堆中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除;栈(Stack)则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节),栈由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除。
由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。
在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。
(1) 值类型包括:简单类型、结构类型、枚举类型。
其中,简单类型又分为:整型、布尔型、字符型、浮点型、小数型。
(2) 引用类型包括:对象类型、类类型、接口、元数据、字符串类型、数组。
//值类型与引用类型的例子static void Main(string[] args){//=====值类型,操作的是值========int i1 = 10;int i2 = i1;i2 = 88;Console.WriteLine(i1 + " " + i2);//10 88 [由于值类型直接操作值,所以不会发生改变]//=====引用类型,操作的是引用,所谓的引用可以看作是指向内存的地址,地址再对应着内容=====int[] intArr1 = new int[] { 1, 2, 3 };int[] intArr2 = intArr1;intArr2[0] = 9;intArr2[2] = 0;foreach (int i in intArr1){Console.Write(i);//结果:920[由于引用类型intArr1的引用赋值给了intArr2,所以他们是持有同一个引用,当intArr2的引用发生改变的时候,intArr1的引用也将发生变化]}foreach (int j in intArr2){Console.Write(j);//结果:9 2 0}Console.Read();下面代码的输出结果是什么?class Program{static void Main(string[] args){string b;b = "old";Func1(ref b);Console.WriteLine(b);int c;c = 3;Func1(ref c);Console.WriteLine( c);}public static void Func1(ref string a){a = "new";}public static void Func1(ref int a){a = 6;}}答案:new6题目2:下面代码的输出结果是什么?class Program{static void Main(string[] args){string b;b = "old";Func1( b);Console.WriteLine(b);int c;c = 3;Func1( c);Console.WriteLine( c);}public static void Func1( string a){a = "new";}public static void Func1( int a){a = 6;}}答案:old32.简述装箱和拆箱的过程。
《C++语言程序课程设计》班级:11电信1班姓名:谢远忠学号:110703***指导老师:胡珏第一类题目应用类:题目2:小学生测验面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。
功能要求:(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;(2)确保算式没有超出1~2年级的水平,只允许进行50以内的加减法,不允许两数之和或之差超出0~50的范围,负数更是不允许的;(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;(5)总成绩90以上显示“SMART(优秀!)”,80-90显示“GOOD(良好!)”,70-80显示“OK(中等!)”,60-70显示“PASS(及格!)”,60以下“TRY AGAIN (不及格!重测!)”。
I.设计思路:由系统函数产生两个随机数a、b并计算两数之和为t ,显示两个随机数a、b的加减法运算,学生通过键盘输入答案num与t进行匹配,第1次匹配正确给10分;第2次匹配正确给7分;第3次匹配正确给5分,每道题至多3次输入机会,3次机会用尽后仍未匹配成功由系统输出正确答案t ,累计得分score并进入下一道题。
以此类推,直至10道题答完止输出总得分score,判断等级SMART、GOOD、OK、PASS还是TRY AGAIN。
II.流程图:III.C++(含class类,面向对象)程序代码:#include<iostream.h>#include<time.h>#include<stdlib.h> //标准库头文件class Display_biaoti //Display_biaoti[标题]类,标题显示{public:Display_biaoti(){cout<<"===============欢迎使用小学生整数50以内加减法测验评测系统==============="<<endl<<endl;cout<<"*************************************************************************"<<endl ;cout<<"* ********************************************************************* *"<<endl;cout<<"* * 共10道题,每道题3次作答机会* *"<<endl;cout<<"* *第1次作答正确——10分;第2次作答正确——7分;第3次作答正确——5分;* *"<<endl;cout<<"* * 三次作答不正确——此题得分:0分,进入下一题* *"<<endl;cout<<"* ********************************************************************* *"<<endl;cout<<"*************************************************************************"<<endl <<endl;}~Display_biaoti(){}};/******************************************************************************************/ class Suijishu //Suijishu[随机数]类,产生两个运算数{public:int a,b,n,t;Suijishu(){a=rand()%50; //rand()是一个随机函数,a=rand()%50是在0-50内取随机值赋给ab=rand()%50; //b=rand()%50是在0-50内取随机值赋给bn=rand()%6; //n的范围大些出现加法和减法的概率就越接近(加法:减法=5:5),故n取6if((n==0||n==1||n==2)&&(a+b)>50) //如果产生随机数a、b之和大于50时{if(a>25&&b>25) //a、b同时大于25时{ a=a-25;b=b-25;} //a、b同时减小25if(a>25) //仅是a大于25时a=a-25; //a减小25if(b>25) //仅是b大于25时b=b-25;} //b减小25}~Suijishu(){}};/*******************************************************************************************/ class Display_timu:public Suijishu //Display_timu[题目]类,对单一道题目显示给学生{public:int i,t;Display_timu(){}void xianshi(){switch(n){case 0: //n为0、1、2时进行加法运算case 1:case 2:cout<<"##########"<<i<<"题##########"<<endl;cout<<a<<"+"<<b<<"=";t=a+b; i++;break;case 3: //n为3、4、5时进行减法运算case 4:case 5:cout<<"##########第"<<i<<"题##########"<<endl;if(a>b){cout<<a<<"-"<<b<<"="; t=a-b; i++;}else {cout<<b<<"-"<<a<<"="; t=b-a; i++;}//使用if...else...语句,以防出现负数break;}}~Display_timu(){}};/********************************************************************************/class Ceshi:public Display_timu{public:int num,cnt,score; //测试者输入答案次数cntCeshi(){cnt=1;score=0;}int xunhuan(){do{cin>>num; //测试者输入答案numif (num==t) //答案正确时{cout<<"正确!o(≧v≦)o~~好棒~"<<endl;}else{if (cnt<3) //答案输入少于3次cout<<"答案不正确?在试试吧!"<<endl;cout<<"你还有"<<3-cnt<<"次答题机会"<<endl;++cnt;}}while(cnt<=3&&num!=t); //答案输入少于3次且输入答案不正确时继续输入(3次答题机会)if (num!=t) //3次为输入正确答案,由系统给出正确答案cout<<"答案不正确!正确答案是:"<<t<<endl;switch (cnt) //累计答题得分情况{case 1:score+=10;break; //第1次答对得10分case 2:score+=7;break; //第2次答对得7分case 3:score+=5;break; //第3次答对得5分}return score;}~Ceshi(){}};/********************************************************************************/class Display_zongping:public Ceshi //Display_zongping[总评]类,对答完10道题给出总评{public:int score;Display_zongping(){}void pandduan(){if (score>90) //如果总分大于90{cout<<"优秀!"<<endl; //输出优秀!}else if (score>80) //如果总分大于80{cout<<"良好!"<<endl; //输出良好!}else if (score>70) //如果总分大于70{cout<<"中等!"<<endl; //输出中等!}else if (score>=60) //如果总分大于60{cout<<"及格!"<<endl; //输出及格!}else cout<<"不及格!重测!"<<endl; //低于60分时,输出不及格!重测!cout<<"\n";}~Display_zongping(){}};/********************************************************************************/void main(){int all_score=0;Display_biaoti aa; //定义Display_biaoti[标题]类对象aa,标题显示srand(time(NULL)); //srand函数是以现在系统时间作为时间种子产生随机数int j; //定义整形j计数10道题for(j=1;j<11;j++){Suijishu bb; //定义随机数Suijishu类对象bbDisplay_timu cc; //定义Display_timu类对象cccc.i=j;cc.xianshi(); //调用对象cc的方法xianshi()Ceshi dd; // 定义Ceshi类对象dddd.t=cc.t; //对象cc的数据t赋值给对象dd的数据tall_score+=dd.xunhuan(); //调用对象dd的方法xunhuan()cout<<"-------------------------当前分数为"<<all_score<<endl; //输出当前的得分}Display_zongping ee; //定义Display_zongping类对象eeee.score=all_score;cout<<"最后得分为"<<ee.score<<" ";ee.pandduan(); //调用对象ee的方法pandduan()}IV.运行结果:①(良好!)②(优秀!)③(不及格!重测!)④(及格!)⑤(中等!)IV.C++(不含class类)程序代码:#include<iostream.h>#include<time.h>#include<stdlib.h> //标准库头文件void main(){int t, num, a,n, i, b; //定义变量t(系统正确答案),num(测试者输入答案),a(参与运算的数),//n(决定加法还是减法运算),i(题号),b(参与运算的另一个数)int score=0; //定义变量score存放得分cout<<"==============欢迎使用小学生整数50以内加减法测验评测系统=============="<<endl;srand(time(NULL)); //srand函数是以现在系统时间作为时间种子产生随机数for(i=1;i<=10;i++){loop: a=rand()%50; //rand()是一个随机函数,a=rand()%50是在0-50内取随机值赋给a b=rand()%50; //b=rand()%50是在0-50内取随机值赋给bn=rand()%6; //n的范围大些出现加法和减法的概率就越接近(加法:减法=5:5),故n取6if((n==0||n==1||n==2)&&(a+b)>50) //如果产生随机数a、b之和大于50时{if(a>25&&b>25) //a、b同时大于25时{ a=a-25;b=b-25;} //a、b同时减小25if(a>25) //仅是a大于25时a=a-25; //a减小25if(b>25) //仅是b大于25时b=b-25;} //b减小25switch(n){case 0: //n为0、1、2时进行加法运算case 1:case 2:cout<<"*********第"<<i<<"题*********"<<endl;cout<<a<<"+"<<b<<"=";t=a+b;break;case 3: //n为3、4、5时进行减法运算case 4:case 5:cout<<"*********第"<<i<<"题*********"<<endl;if(a>b){cout<<a<<"-"<<b<<"="; t=a-b;}else {cout<<b<<"-"<<a<<"="; t=b-a;}//使用if...else...语句,以防结果出现负数break;goto loop;}int cnt=1; //测试者输入答案次数cntdo{cin>>num; //测试者输入答案numif (num==t) //答案正确时{cout<<"正确!o(≧v≦)o~~好棒~"<<endl;}else{if (cnt<3) //答案输入少于3次cout<<"答案不正确?在试试吧!"<<endl;cout<<"你还有"<<3-cnt<<"次答题机会"<<endl;++cnt;}}while(cnt<=3&&num!=t); //答案输入少于3次且输入答案不正确时继续输入(3次答题机会)if (num!=t) //3次为输入正确答案,由系统给出正确答案cout<<"答案不正确!正确答案是:"<<t<<endl;switch (cnt) //累计答题得分情况{case 1:score+=10;break; //第1次答对得10分case 2:score+=7;break; //第2次答对得7分case 3:score+=5;break; //第3次答对得5分}cout<<"-------------------------当前分数为"<<score<<endl; //输出当前的得分}cout<<"最后得分为"<<score<<" ";if (score>90) //如果总分大于90{cout<<"SMART!"<<endl; //输出SMART!}else if (score>80) //如果总分大于80{cout<<"GOOD!"<<endl; //输出GOOD!}else if (score>70) //如果总分大于70{cout<<"OK!"<<endl; //输出OK!}else if (score>=60) //如果总分大于60{cout<<"PASS!"<<endl; //输出PASS!}else cout<<"TRY AGAIN!"<<endl; //低于60分时,输出TRY AGAIN!cout<<"\n";}VI.运行结果:①(SMART!)②(GOOD!)⑤(TRY AGAIN!)。
1.项目设计题目及要求题目:加减法小测验。
面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。
功能要求:电脑随机出10道题,每题10分,程序结束时显示学生得分;确保算式没有超出1~2年级的水平,只允许进行100以内的加减法,不允许两数之和或之差超出0~100的范围,负数更是不允许的;每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则输出正确答案;对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”变化扩展:1)允许用户初始选择题目类型:加法,减法,还是加减法都有。
2)评判完成后,显示答错的题,并给出正确答案。
3)若是一组题,可以重复使用,怎样处理?4)界面与应用逻辑分离5) 可以设置参数2. 项目的面向对象设计2.1 需求分析1)分析系统的功能需求:出题:随机出题。
每题要求:确保算式没有超出1~2年级的水平,只允许进行100以内的加减法,不允许两数之和或之差超出0~100的范围,负数更是不允许的。
答题:每道题学生有三次机会输入答案,每输入一次答案,进行评价,若正确显示正确,若错误,显示错误,并提醒学生重新输入答案。
若是第三次错误,则不再给机会输入答案。
答题评分:每道题,学生一次做对得10分,二次做对得7分,三次做对得5分,其余不得分;总评分:每个测试出10题,10题做完过后给出总评分。
总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”2)系统流程:先出完10题,然后按顺序做题。
首先显示一个题目,用户给出答案,进行评判。
若做题结束,进入下一题,若没有结束,用户继续给出答案进行评判。
做完10题,计算总评分,并分等级给出评价。
流程如图1所示。
2.2 总体设计方案一:1)识别类问题中出现了题目,解答,测试等事物。
将题目和解答的数据及功能合并,作为题目类。
将测试作为一个类。
题目类:表示一个题目,及相关的解答状况。
测试类:对一次测试做一个包装,其中包括10个题目,以及测试的总分评价。
测试类和题目类之间是个1对多的包含关系。
2)详细设计Question类设计数据成员:两个操作数,运算符,运算结果;本题得分,答题次数,是否答对。
功能:负责出一道题并让用户做题,并评价。
接口:●生成题目。
●答题(显示题目,支持做题,支持得分)。
●返回成绩。
私有成员函数●生成题目数据。
(私有)●判断题目是否符合要求。
(私有)Test类设计数据成员:多个Question类对象(用数组组织数据,用vector组织数据),题目数目,总分,等级,评价。
功能:创建测试题目,启动测试,总评价。
接口为:●创建题目(或放在构造函数中)●启动测试●返回总分●返回评判结果(获得评判)方案一:实现#include<iostream>#include<cstdlib>#include<ctime>#include<conio.h>using namespace std;char type[2]={'+','-'};int grade[3]={10,7,5};char* evaluation[5]={"SMART","GOOD","OK","PASS","TRY AGAIN"};const int MAX_TIMES=3;int getACount(int a,int b){return rand()%(b-a)+a;}class Question{private:int a;int b;char c;int result;//int score;int times;int state;int results[MAX_TIMES];void AQuestion(){a=getACount(0,100);b=getACount(0,100);c=type[getACount(0,2)];if(c=='+')result=a+b;elseresult=a-b;}bool testAQuestion(){if((result<0)||(result>100))return false;elsereturn true;}bool doOnceTest(){cout<<a<<c<<b<<"=";cin>>results[times];if(results[times]==result)state=1;elsestate=0;times++;return state;}public:Question():a(0),b(0),c('+'),result(0),times(0),state(0),score(0) {}void createQuestion(){while(true){AQuestion();if(testAQuestion())break;}}void doATest(){for(int i=0;i<MAX_TIMES;i++){if(doOnceTest()){score=grade[times-1];break;}else{if(i<2)cout<<"答错了,请继续回答:";elsecout<<"答错了,你没有机会了"<<endl;}}}int getScore(){return score;}};class Test{private:Question *q;int count;int score;int level(){int level=4;switch(score/10){case 10:case 9:level=0;break;case 8:level=1;break;case 7:level=2;break;case 6:level=3;break;case 5:level=4;}return level;}public:Test(int c=10):count(c),score(0){q=new Question[c];}int getScore(){return score;}char* getEvaluation(){return evaluation[level()];}void runTest(){for(int i=0;i<count;i++){q[i].createQuestion();q[i].doATest();score=score+q[i].getScore();}}};int main(){srand((unsigned)time(NULL));Test aTest;aTest.runTest();cout<<"你的成绩为"<<aTest.getScore()<<","<<aTest.getEvaluation()<<endl;getch();} ————————————————————————————————————————————————方案二:1)识别类将题目独立出来。
从概念上来说题目是独立于解答存在的,将其独立出来作为题目类Question。
将一个题目的测试作为一个独立的类Answer,记录做题的相关数据,支持相关功能。
将一个学生的完整测试作为一个类Test,包装整个测试,以对外界提供更高层的抽象。
类结构如图所示。
Answer类与Question类是单向关联关系(使用关系)。
Test类与Question类是一对多的关联关系,与Answer类是一对多关联关系。
2)详细设计设计时考虑1)可以设置测试题目类型(加法、减法、加减混合),可以设置其它参数(总题目数,每个题目的最大答题次数,总分,每个题目的每次解答的分数);2)界面与应用分离。
Question类:数据成员:两个操作数,运算符,运算结果。
定义一个静态成员type表示测试的类型,来决定出题的算法。
功能:出题。
接口为:●出题●获得结果:为Answer提供服务,获得结果。
●获得题目(字符串):为了做到与界面分离,只负责业务逻辑,不负责输入输出,因此需要返回题目。
Answer类:数据成员:本题得分,答题次数,是否答对,各次的答题结果。
指向当前题目的指针。
定义静态数据成员作为答题参数:最大答题次数,每次答题的分数。
功能:提供答题判断,并给分。
接口为:●setQuestion:关联题目。
●setResult:得到学生的答案并评价:通过与question的关联获得正确结果,并判断是否作对。
设置相关参数(答题次数,答题状态,得分)●返回本次答题评价●返回获得分数Test类数据成员:本次测试的一组Question(用数组或vector组织),本次测试的解答一组Answer(用数组或vector组织)。
为类描述测试的进行状态,增加两个数据成员:当前题目,是否进入下个题目。
以及测试的所有相关参数。
功能:对全部测试提供对外包装,描述测试状态。
接口为:●设置参数●出题●返回题目信息●学生给出一个结果●是否还有题方案二:实现#include"stdafx.h"#include<iostream>#include<strstream>#include<cstdlib>#include<ctime>#include<string>#include<vector>#include<conio.h>using namespace std;char type[2]={'+','-'};int grade[3]={10,7,5};char* evaluation[5]={"SMART","GOOD","OK","PASS","TRY AGAIN"};int getANumber(int a,int b){return rand()%(b-a)+a;}class Question{private:int a;int b;char c;int result;static int style;public:static void setParam(int s){style=s;}Question():a(0),b(0),c(type[0]),result(0) {}~Question(){}void create(){while(true){createQuestion();if(testQuestion())break;}}int getResult(){return result;}string getQuestion(){char str[100];sprintf_s(str,"%d%c%d=",a,c,b);return string(str);}private:void createQuestion(){a=getANumber(0,100);b=getANumber(0,100);c=getType();if(c=='+')result=a+b;elseresult=a-b;}char getType() //返回题目的运算符(根据要求的测试类型,产生不同的运算符){switch(style){case 1:return'+';break;case 2:return'-';break;case 0:return type[getANumber(0,1)];break;}}bool testQuestion(){if((result<0)||(result>100))return false;elsereturn true;}};int Question::style=0;class Answer{private:int times; //做题次数vector<int> result;bool state; //是否作对int score; //本题得分Question *que;static int maxTimes; //最大做题次数static int *grade; //不同次数得分public:static void setParam(int mT,int* g){maxTimes=mT;grade=g;}Answer():times(0),state(0),score(0),que(NULL){result.reserve(10);}~Answer(){}void setQuestion(Question* q){que=q;}bool setResult(int r) //返回值表示本题答题是否结束{result.push_back(r);if(r==que->getResult()){state=true;score=grade[times];}times++;if((state==true)||(times==3))return true; //本题结束elsereturn false; //本题还有机会}string getString(){string s1="答对了";string s2="答错了,请继续回答";string s3="答错了,你没有机会了";if(state)return s1;if(times<3)return s2;elsereturn s3;}int getScore(){return score;}};int Answer::maxTimes=0;int* Answer::grade=NULL;{private:Question *q;Answer *ans;int count; //本次测试的题目数int style; //本次测试的题目类型,0:混合,1:加,2:减int maxA; //本次测试的每题答题次数int *sDistribution; //不同次数的成绩分配int totalScore;//最后得分int currentQ; //当前题bool nextQ; //是否进入下一题public:Test():q(NULL),ans(NULL),totalScore(0),currentQ(0),nextQ(false),count(0),maxA(0), style(0){}~Test(){delete[] q;delete[] ans;delete[] sDistribution;}void setParam(int c,int mA, int t, int *sd)//设置参数{count=c;style=t;maxA=mA;sDistribution=new int[maxA];for(int i=0;i<maxA;i++)sDistribution[i]=sd[i];Question::setParam(style);Answer::setParam(maxA,sDistribution);if(q!=NULL)delete[] q;if(ans!=NULL)delete[] ans;q=new Question[count];ans=new Answer[count];for(int i=0;i<count;i++)ans[i].setQuestion(&q[i]);}}void setTest()//出题{for(int i=0;i<count;i++)q[i].create();}int hasQuestion() //当前测试,还有题吗?{return currentQ<count-1;}string getCurrentQ() //返回当前题目字符串{if(nextQ)currentQ++;return q[currentQ].getQuestion();}bool doCurrentQ(int re) //当前题目,设置一次结果,返回是否正确{if(ans[currentQ].setResult(re)){nextQ=true;return true;}elsereturn false;}string getCurrentAS(){return ans[currentQ].getString();}void computeScore(){for(int i=0;i<count;i++)totalScore+=ans[i].getScore();}int getScore(){return totalScore;}string level(){int level=4;double t=totalScore*100/(sDistribution[0]*count);switch(t/10){case 10:case 9:level=0;break;case 8:level=1;break;case 7:level=2;break;case 6:level=3;break;case 5:level=4;}return evaluation[level];}};class Uinterface{public:Test t;void run(){int i=1,result=-1;int *p=new int[3];p[0]=10; p[1]=7; p[2]=5;t.setParam(10,3,0,p);delete p;t.setTest();while(t.hasQuestion()){cout<<i<<")"<<t.getCurrentQ();while(true){cin>>result;bool b=t.doCurrentQ(result);cout<<t.getCurrentAS()<<endl;if(b){i++;break;}}}puteScore();cout<<"总分:"<<t.getScore()<<" "<<t.level()<<endl;}};int main(int argc, _TCHAR* argv[]){srand(time(NULL));Uinterface ui;ui.run();return 0;}。