四则运算器课程作业三
github链接传送:
- caculate.h
- caculate.cpp
- caculater_main.cpp
- caculater.exe
要求:
要求将第一次作业中使用静态变量的方法进行改进,推荐使用传参、定义函数有返回值。
本次作业要求在第一次课程作业的基础上进行迭代,考察文件读写、多参数主函数的知识点。
- 多参数主函数要求:在命令行中输入的参数为:用户要求题目数量的文件路径、最终结果的文件路径。
D:\>a.exe d://in.txt d://out.txt
a.exe为可执行文件,d://in.txt为用户要求的题目数量的文件路径,d://out.txt最终结果的文件路径
要求将程序写成.cpp和.h分离的形式。
主函数的设计如下:
int main(int argc,char *argv[]){
readFile()//读取用户要求的题目数量(请注意参数设置)
scan()//该函数用于与用户交互,获取输入数据
randomNumber()//用于随机生成数字
randomOperation()//用于随机生成运算符
generateExpression()//用于生成运算式
calculateResult()//用于计算生成的运算式的结果
writeFile()//将最终结果写入文件,写入内容包括:用户输入的题目数,每个生成的表达式、正确答案、用户输入的答案,保存到命令行中第二个参数指定的路径。(请注意参数设置)
print()//将统计结果输出给用户
return 0;
}
本次作业的感想:
本次作业中实现了文件读写,c++文件流以及多参数主函数。在以前默认从命令行中输入数据的简单的“带互动的界面”转变到文件流的界面,将这一四则运算器的使用性更提升了一个档次,而主函数main多参数,更打破了以前代码默认主函数不写参数的习惯,了解认识到这些主函数的参数,使调用更加方便。
对于文件读写和多参数主函数学习过程中遇到的问题:
刚开始并不懂c++中的文件流,记得寒假时在随笔中有提到这个(寒假的调查里好像有文件的有关问题),但开始时自己只会固定(同一路径下的文件读写)简单的c中的foreopen,所以实现这个文件的读写也是通过百度查阅然后现学现用的,其中遇到的问题有:文件读写中,一开始用了运算符的重载将输出写入文件,虽然代码简洁很多,但是不符合要求,于是强行写了writefile封装写入,代码就变长了很多。。
主函数参数需要判断,如果使用cmd打开,需要判断主函数参数的个数,否则出错。
string infilepath, outfilepath;
if (argc == 3)
{
infilepath = argv[1];
outfilepath = argv[2];
}
else cin >> infilepath >> outfilepath;
一开始的想法:重载运算输出的代码
template <typename T>
MyFile &operator >>(T &t)
{
_ifs >> t;
return *this;
}
template <typename T>
MyFile &operator <<(T &t)
{
_ofs << t;
return *this;
}
函数分离的体现:
class Problem
{
public:
Problem(string infilepath, string outfilepath);
void init(); //初始化
void scan(); //该函数用于与用户交互,获取输入数据
void DisPlayAnswer(); //输出正确答案
void print(); //将统计结果输出给用户
//生成算式部分----------------------------------------------------------------------
int randomNumber(); //用于随机生成数字
char randomOperation(); //用于随机生成运算符
template<typename T> string Tostring(T i);
void generateExpression(); //用于生成运算式
//----------------------------------------------------------------------------------
//算式计算部分----------------------------------------------------------------------
float calculateResult(); //计算结果
float caculate(float Operand1, float Operand2, char Operator);
//----------------------------------------------------------------------------------
//文件读写
int readFile();
template <typename T> void writeFile(T t);