课程作业四


类图

  • Number类

Number类是我对逆波兰表达式算法实现以及题目要求保留分数的一种妥协,它服务于Question类。它最主要的目标是重载运算符,其次是结合运算符和数字,最后是把每个数存为分数。

重载运算符主要是为了迎合题目要求——存为分数,编码过程不可能时刻判断是不是分数,所以需要一套针对分数的四则运算,这样得出的结果就是分数

将运算符和数字结合在一起是因为逆波兰的实现需要一个能够同时存放数和运算符的栈,我就干脆合在一起了

  • Question类

Question类代表了算式,主要有两个功能,一个是随机生成算式,一个是求解算式的值,在运行过程中只要有一个Question类就好了。求解的算法就是采用了逆波兰的思路,栈中存放的就是上面讲的Number类。

  • print类

我也不知道为什么要有这么一个类,但我想如果一个可扩展的程序的话就应该将数据和界面分离开来,所以设置一个print类,主要是为了输出各种字符串。如果今后有可视化界面的话这个类就可以升级为一个面板类

  • Controller类

这就是一个控制器类,用来控制软件的进程的,可以说这一整个计算器都放在这里面了,在我看来一个理想的main函数里只需要写下如下两句代码就可以了

Controller c(argc,argv);
c.start();

算法是如何实现的

唯一可以称得上算法的就是如何求解表达式了吧,逆波兰的博客网上有很多,这里就不赘述了,主要的实现难点是如何实现一个可以同时存储运算符和数的栈以及保留分数了,这由上面的Number类解决了。


最后

看到设计软件脑海中第一个蹦出来的是MVC设计模式,但对于MVC我也是处于似懂非懂的状态。只能说一个好的设计模式对于软件后续的扩展是非常有利且高效的。

感觉这次设计的扩展性还是不够好,如果后续再加新的需求的话就要再修改Controller的run函数

原文地址:https://www.cnblogs.com/unbelievablecj/p/6858469.html