软件工程的课上老师布置了一个题目,要求实现一个四则运算程序,可以从txt文件中读取算式并运算结果(要支持分数),判断用户输入的结果是否正确并给出正确答案。
完成这个题目我用到了之前数据结构上机题的程序,在那个上机题中实现了中缀表达式转后缀表达式并运算。我这次的作业程序是以那个为基础改的。要实现这次题目的功能要解决的问题主要有以下几点:
1.要读取算式并运算,需要将读取的中缀表达式转换为后缀表达式才可以运算。
2.需要支持分数运算,要定义一个分数类来存储分数的分子和分母。
由于之前的程序结构并不是很好,接口定义也不好可重用性不强。所以这次对代码做了很大修改,这也从一方面体现了软件工程的意义,之前的代码只是为了完成要求而实现的,结构设计不好并且不规范导致其易用性、可移植性不强,这次又花了很多功夫大量修改之前的代码来满足这次的题目。
下面是我分数类的代码
1 class num { 2 public: 3 int numerator; //分子 4 int denominator; //分母 5 };
下面是我对分数运算的实现
1 void compute(char op, num a, num b) { 2 switch (op) { 3 num result; 4 case'+':result.denominator = a.denominator*b.denominator; 5 result.numerator = b.denominator*a.numerator + b.numerator*a.denominator; 6 s.push(result); 7 break; 8 case'-':result.denominator = a.denominator*b.denominator; 9 result.numerator = b.numerator*a.denominator - a.numerator*b.denominator; 10 s.push(result); 11 break; 12 case'*':result.denominator = a.denominator*b.denominator; 13 result.numerator = a.numerator*b.numerator; 14 s.push(result); 15 break; 16 case'/':if (a.numerator == 0.0) { 17 cerr << "除数为0!" << endl; 18 clear(); 19 } 20 else { 21 result.numerator = b.numerator*a.denominator; 22 result.denominator = b.denominator*a.numerator; 23 s.push(result); 24 } 25 break; 26 } 27 }
运行效果如图,左方为txt文档内容
小结:完成了分数运算的基本功能,不过还有很多功能不完善。比如结果只能全部输入为分数形式要不不识别,没有约分功能等。会在之后添加完善这些功能。