2017《面向对象程序设计》课程作业一
传送门
这次作业思路没有什么好说的,主要是让我们优化代码,优化项目。尽量做到模块化。
主要按照作业要求去完成。
以下是我完成后再main函数中的主要内容
int main()
{
double n,right=0;
char a[4];//随机整数
char oper[3];//随机运算符
char *ex;
double answers;//存储正确结果
n=scanf();//开始界面
for(int i=0;i<n;i++)
{
srand((unsigned)time(NULL));//不出现相同的随机数
for(int j=0;j<4;j++)
{
a[j]=randomNumber();//随机数
}
for(int j=0;j<3;j++)
{
oper[j]=randomOperation();//运算符
}
ex=generateExpression(a,oper);
answers=calculateResult(ex);//储存正确答案
if(answers==(int)answers) //检查是否存在小数 ,结果检验
{
cout << i+1 <<". "<<ex;
right+=scanf2(answers);//不是小数则进行输入答案
}
else//如果答案为小数,则重新进行循环
{
i=i-1;
}
delete [] ex;
}
print(right,n);//结果诊断
return 0;
}
经历:
一开始,我在分离函数的时候,认为,带有参数什么的,太麻烦了,要写很多,有时写了, 还要返回函数值,就投机取巧,把大部分变量变成全局变量。然后自以为完美的完成了,后面去问了一下学长,感觉自己并不是真正做到函数的模块化。(在第一个版本中就是全局变量的情况--那样也间接说明我实际上对于函数运用还很不熟悉)
接着,我就开始进行参数的添加,将大部分全局变量,又变成了在各个函数的局部变量。在这过程中遇到了挺多问题的。主要问题是函数返回一个数组的问题。最后采用了动态内存来存储,将其错误清除了。
最后就敲定了目前在github上的最新版本。
不足之处:
1.这一次,我感觉我还不是很按照作业要求来完成,在main里面我将人机交互方面分成两部分来写。在部分函数使用含义上,有一部分函数可能有功能交叉的情况。
2.写完这个代码后,发现有时题目出现变慢了,我认为原因可能是在于排除计算结果是小数的情况部分。我尝试输出一些东西时,总能发现小数部分出现次数会挺多的。然后就需要每次跳过其情况,重新随机生成表达式。这样最后导致了在计算题出现的表达式中除法的情况变得比较少---其实在第一次写这个作业就出现的情况了。
还有,经过这次修改后,在上次出现的一个bug : @ 该字符的出现,在这次运行中没有出现了--实际上自己还不清楚其原因。TAT。
感想:
通过这次作业,感觉强化了自己对于函数的用法,对于模块化,比较有深入的了解。也发现自己基础还是不够扎实,还需要厚植基础0.0目前这就想到这些了。
后续更新:
昨天因为时间仓促,就直接在自己的本来的源代码上进行修改,我认为,一个源代码文件总不可以和main函数放在一起,直接好几百行吧。于是今天就改成了项目形式0.0(不知道算不算)用一个头文件来去包含哪些我写的函数。一开始也遇到一些,使用头文件错误的信息。后感觉还是有点投机取巧,把函数名称和函数内容都放到了头文件中,没有分成两个文件(一个包含函数名称,一个包含函数内容的形式),这样的话,别人也才能够在我的main中看下去,不然都不知道我的main函数写在哪里。
我修改完之后,运行时出现一个问题弹出:
目前不是很清楚。
下面是我改成项目后,在main文件的源代码:
#include <iostream>
#include "allfunctions.h"
int main()
{
double n,right=0;//题数和正确数
char a[4];//随机整数
char oper[3];//随机运算符
char *ex; //表达式存储
double answers;//存储正确结果
n=scanf();//开始界面
for(int i=0;i<n;i++)
{
srand((unsigned)time(NULL));//不出现相同的随机数
for(int j=0;j<4;j++)
a[j]=randomNumber();//随机数
for(int j=0;j<3;j++)
oper[j]=randomOperation();//运算符
ex=generateExpression(a,oper);//这里面我返回的是动态数组,在网上查了一下,要在末尾将动态数组删除,所以有了最下面那个语句
answers=calculateResult(ex);//储存正确答案
if(answers==(int)answers) //检查是否存在小数 ,结果检验
{
cout << i+1 <<". "<<ex;
right+=scanf2(answers);//不是小数则进行输入答案
}
else//如果答案为小数,则重新进行循环
i=i-1;
delete [] ex;//删除动态数组
}
print(right,n);//结果诊断
return 0;
}