2017《面向对象程序设计》课程作业一
2017《面向对象程序设计》课程作业一
林燊 031602325 https://www.cnblogs.com/linshen/
github链接:https://github.com/Travaill/arithmetic.git
1.设计思路
2.程序功能
能对0--10之间的整数进行四则运算(加减乘除)
能实现选择中文,英文,德语法语,日语五种语言
程序能接收用户输入的整数答案,并判断对错
程序结束时,统计出答对、答错的题目数量
3.算法分析
- 类generate 实现随机算式的生成
- 类calculate 计算算式的结果
- 类control 控制题目生成的数量 控制生成符合要求的算式 控制程序的退出 控制程序的语言
- 类printf 输出算式、判断结果、统计答题情况
4.代码规范
- 函数的命名必须使用英文单词,不使用拼音缩写
- 函数的命名如果一个单词的必须首字母大写,如果多个单词的用下划线隔开
- 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。
- 要随意定义全局变量,尽量使用局部变量。
- 函数的旁边必须注释上本函数的功能
- 禁止GOTO语句。
5.代码展示
类"generate"
int Generate::randomNumber(int low,int high) //生成[low,high]随机数
{
return (rand()% (high - low+1) + low);
}
string Generate::randomOperation(int rand) //生成四则运算符
{
string ope;
switch(rand)
{
case 1:ope='+'; break;
case 2:ope='-'; break;
case 3:ope='*'; break;
case 4:ope='/'; break;
}
return ope;
}
string Generate::generatePolynomial(int rand1,int rand2,string ope,int mode) //生成多项式
{
stringstream ss;
if(mode==1)
{
ss << '(' << rand1<<ope<<rand2<<')';
}
if(mode==2)
{
ss<<rand1<<ope<<rand2;
}
if(mode==3)
{
if(rand1!=0)
{
ss<<rand1;
}
}
string str = ss.str();
ss.str("");
return str;
}
string Generate::generateExpression() //生成算式
{
stringstream ss;
int rand1=randomNumber(1,10);
int rand2=randomNumber(1,10);
int mode =randomNumber(1,3);
string ope=randomOperation(randomNumber(1,4));
ss<<generatePolynomial(rand1,rand2,ope,mode);
for(int i=1;i<randomNumber(2,4);i++)
{
int rand1=randomNumber(1,10);
int rand2=randomNumber(1,10);
int mode =randomNumber(1,3);
string ope=randomOperation(randomNumber(1,4));
ss<<generatePolynomial(rand1,rand2,ope,mode);
ss<<randomOperation(randomNumber(1,4)<<generatePolynomial(rand1,rand2,ope,mode);
}
string str = ss.str();
ss.str("");
return str;
return str;
}
main
int main(void)
{
srand((unsigned)time(NULL)); //重置种子
Printf().ShowLanguageList(); //展示可选择语言列表
cout<<endl<<endl;
Printf().printfNeedWhat();
char language[20];
gets(language); //获取用户所选择的语言
while(!Control().JudgeIfGet(language)){ //判断语言资源文件是否载入成功
Printf().printfNeedWhat();
gets(language);
}
string Resource[30];
Control().GetResource(Resource,language); //将语言资源导入resouce数组
int wrong=0;
int right=0;
cout<<Resource[0];
int counts;
cin>>counts;
for (int i=0;i<counts;i++){
string exp = Generate().generateExpression(); //生成表达式
cout << exp << "="<<endl;
double res=Calculate().calculateResult(exp); //计算表达式结果
cout << Resource[1]<<i+1<<Resource[2];
double number;
cin >> number;
if((Control()).getKeyAndExit()) { //输出e退出循环并统计答题情况
if(number==res) {
cout <<Resource[3]<<endl;
right++;
}
else {
cout << Resource[4]<<res<<endl;
wrong++;
}
}
else break;
}
cout <<Resource[5]<< right << Resource[6] << wrong <<Resource[7]<<endl;
system("pause");
return 0;
}
6.提交日志证明
7.程序测试
9.个人感受
本次的代码版本更迭,我主要把目标放在打造高内聚低耦合上面,减弱每个模块内部在这里我们可以看做每个类之间的联系,加强模块与模块间的联系。
以上述的generate类作为例子,之前下一个函数都会调用前一个函数,这样很不利于程序的维护,所以,对于这些功能比较单一,较为底层的函数,我运用参数的方法,减少其与其他函数的联系。同时,在最后一个函数中引用前面所有的函数,加强了模块的内部的联系。
同时,在其他类中,我基本做到了,不引用另外类中的函数,可见,类与类的联系是很低的,这就是所谓的低耦合。