四则运算生成器功能完善&&界面设计——结对项目
结对成员:何小松 && 李入云
一、对结对编程的认识
优点:
1)程序员互相帮助,互相教对方,可以得到能力上的互补。
2)可以让编程环境有效地贯彻Design。
3)增强代码和产品质量,并有效的减少BUG。
4)降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。
5)在编程中,相互讨论,可能更快更有效地解决问题。
当然,结队编程也会有一些不好的地方:
1)对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。
2)有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
3)两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
4)结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长外,可能会和程序员们在起滋生不良气氛一样快。比如,合伙应付工作,敷衍项目。
二、结对成员简介

下面重点介绍我的结对伙伴何小松~
优点:
- 对事认真,积极完成老师布置的各项学习任务
- 学习能力强,乐于挑战和学习新的知识
- 团结友爱,乐于与同学交流,并伴有萌萌的幽默感~共事很轻松愉快
缺点:
拖延症患者(我们是拖延症组合= =
三、相关概念认识
概念就不在这里赘述,在这里想分享一下我的认识和理解:
- information hiding
软件的功能在于用户体验,因此设计应当优先考虑使用的方便,信息隐藏保证了用户在不了解代码内部实现原理的基础上就可以轻松的使用软件。
在这次项目中,直接将参数形象化为窗体,便于用户根据自己的需求修改输入,保证了代码的模块化和封闭性。
2. interface design
界面设计应当简单易行,突出软件的功能
3. loose coupling
松耦合提高了软件的可拓展性和灵活性,当你能够做到修改一个组件而不需要更改其他的组件时,你就做到了松耦合。对于多人大型系统来说,有很多人参与维护代码,松耦合对于代码可维护性来说至关重要。你绝对希望开发人员在修改某部分代码时不会破坏其他人的代码。
当一个大系统的每个组件的内容有了限制,就做到了松耦合。本质上讲,每个组件需要保持足够瘦身来确保松耦合。组件知道的越少,就越有利于形成整个系统。
在这次项目中我们设计了两个类:管理表达式输出、解析的express.class和管理操作数运算、打印的fraction.class,每一个类、每一个函数都有独立的功能
四、Design by Contract, Code Contract
DbC中,使用者和被调用者地位平等,双方必须彼此履行义务,才可以行驶权利。调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性。双方都有必须履行的义务,也有使用的权利,这样就保证了双方代码的质量,提高了软件工程的效率和质量。
缺点是对于程序语言有一定的要求,契约式编程需要一种机制来验证契约的成立与否。而断言显然是最好的选择,但是并不是所有的程序语言都有断言机制。那么强行使用语言进行模仿就势必造成代码的冗余和不可读性的提高。
五、UML以及unit test


六、算法介绍
生成器:1)设置操作数栈和运算符栈,其中操作数栈保存运算出现的全部操作数,包括中间数
2)操作数两两入栈,遇到加法或者乘法,将较小的数先入栈
解析器:1)根据输入表达式生成逆波兰式,并进行计算
2)将表达式的计算结果输出到string ,与用户输入的答案进行字符串匹配,相同即为right,不同即为wrong
针对用户的不同需求:
1)用户如果选择运算过程中无负数,即将操作数栈中含有负数的表达式删掉
2)表达式不含有括号,将含有括号的表达式删掉
3)表达式中不允许有分数,将表达式和答案中含有‘/’的删掉
4)表达式中不含有乘除法,在生成运算符个数op_num时,op_num = rand(0,1),其中0 = ADD,1 = SUB,2 = MUL,3 = DIV;
七、Bug修复
1、类初始化问题
lass express
{
public:
vector<char*> opnum;
char optype[];
char expression[];
fraction answer;
这里需要注意类属性中char数组的初始化:
1 //方法一
2 memset(optype, 0, sizeof(optype));
3 memset(expression, 0, sizeof(expression));
4 //方法二
5 optype[0] = '\0';
6 expression[0] = '\0';
当然最好的方式为strcpy或者for循环依次给字符数组的各个字符初始化
2、默认构造函数的调用:
1 express *list;
2 list = (express*)malloc(sizeof(express)*(express_num+1));
上述代码中malloc 不会调用构造函数
1 express test;
2 express *list = new express[express_num + 1];
调用express_num+1次构造函数
3、sprintf函数重新认识:
1)参数未进行初始化
int sprintf( char *buffer, const char *format [, argument] … );
请先预测下列代码执行后m.a,m.b,m.c的值:
class mew
{
public:
char a[];
char c[];
char b[];
}; int main()
{
mew m ;
strcpy(m.c, "you");
strcpy(m.b, "me");
sprintf(m.a,"%s%s",m.a,"me");
return ;
}
真实值为:

进入sprintf函数执行的内部,可以发现sprintf在进行字符串拼接的时候以字符串结束符作为标志,也就是说对于sprintf(a,"%s%s“,b,c)而言,他会将字符串b结束符之前的内容和c结束符之前的内容拼接起来。
上述代码中m.a未进行初始化,由于m.a和m.b,m.c的地址连续,m.a所指向的字符串延伸到了m.b,sprintf在m.b中找到了字符串结束符,因此完成了拼接。
2)在字符串前插入不能使用sprintf,可以用str.s_str()+strcat代替
对异常的对象进行监控,找到其出错的具体代码位置
4.解决This function or variable may be unsafe
debug属性中添加一句命令:_CRT_SECURE_NO_WARNINGS
5.一件诡异的事情
express test;
express *list = new express[express_num + ];
调用相同的构造函数,初始化的结果竟然不一样= =,I just want to say,please tell me why

6、在判定表达式重复的时候发现了曾经的设计缺陷

解决方案:将所有运算过程中出现的操作数都保存入栈,两两入栈,遇到加法或者乘法将较小的数先入栈,这样才可以将表达式的信息完整的等价的转化为操作数栈和运算符栈,否则总会出现例外~
四则运算生成器功能完善&&界面设计——结对项目的更多相关文章
- 我用STM32MP1做了个疫情监控平台4—功能完善界面重新设计
目录 前言 界面展示 新增功能 API 接口说明 多个接口数据的获取和解析 FontAwesome字体图标库的使用 代码下载 系列教程 @ 前言 之前我用STM32MP1和Qt实现了疫情监控平台,系列 ...
- 系统分析与设计结对项目——WordCount
结对项目完成WordCount 合作者:201631062507 201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam ...
- WordCount 2.0(结对项目)
序言 合作伙伴 201631062220 201631062120 项目码云地址: https://gitee.com/zhege/WordCount 作业详细要求 系统分析与设计结对项目 ...
- 结对项目:四则运算题目生成器(Java)
目录 一.需求分析 二.开发计划 三.实现方案 3.1 项目结构 3.2 代码说明 3.2.1 出题功能代码 3.2.3 批卷功能代码 3.2.3 四则运算功能代码 四.效能分析 4.1 程序效能 4 ...
- 结对项目:四则运算题目生成器(C)
一.Github项目地址:https://github.com/Spartaright/myapp(合作人:梁天龙.赖佑铭) 二.PSP表格(如下图) 1.项目地址 PSP表格 PSP2.1 Pers ...
- 结对编程1----基于java的四则运算生成器
小组成员:王震(201421123054).王杰(201421123055) Coding地址:https://git.coding.net/a506504661/sssss.git 一.题目描述 我 ...
- 高级软件工程2017第3次作业——结对项目:四则运算题目生成程序(基于GUI)
Deadline:2017-10-11(周三)21:00pm (注:以下内容参考集大作业 ) 前言 想过和别人一起探索世界吗?多么希望,遇到困难时,有人能一起探讨:想要懈怠时,有人推你一把:当你专注于 ...
- 结对项目——四则运算GUI项目
一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...
- 结对项目——图形界面实现与dll动态链接
先来一发软件截图~~~ 生成题目的界面 测评界面 第三块本来准备做一个文件历史记录的界面,但是由于时间不够,暂时还没做完. 图形界面的设计与实现 由于对传统的对话框风格不太满意,所以这次作业的图形界面 ...
随机推荐
- 5.1Python函数(一)
目录 目录 前言 (一)函数的基本知识 (二)函数的基本使用 ==1.函数的简单定义== ==2.传值函数== (3)输出效果 ==3.不定长函数== ==4.缺省函数== ==5.函数的传值过程== ...
- final 关键字的作用及应用案例
final关键字的作用如下: 1.可以修饰成员变量,但不能对该成员变量进行修改: 2.可以修饰局部变量,但不能地该局部变量进行修改: 3.可以修饰成员方法(继承),但不能对父类成员方法进行重写: 4. ...
- 简单Nginx下防跨站、跨目录安全设置,支持PHP 5.3.3以上版本
Nginx下存在跨站和跨目录的问题,跨站和跨目录影响同服务器/VPS上的其他网站. PHP在5.3.3以上已经增加了HOST配置,可以起到防跨站.跨目录的问题. 如果你是PHP 5.3.3以上的版本, ...
- phpize安装php扩展CURL
进入php源码包curl扩展目录 cd php-/ext/curl phpize ./configure --with-php-config=/usr/local/webserver/php/bin/ ...
- ByteArrayInputStream与ByteArrayOutputStream_操作数组的流
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
- python设计模式之单例
""" 单例模式 1.第一种方法 修改__new__方法 2.第二种方法 python import 就是一个单例模式 把要单例的类封装到一个py文件中 "&q ...
- Python高级网络编程系列之终极篇---自己实现一个Web框架
通过前面几个小节的学习,现在我们想要把之前学到的知识点给串联起来,实现一个很小型的Web框架.虽然很小,但是用到的知识点都是比较多的.如Socket编程,装饰器传参在实际项目中如何使用.通过这一节的学 ...
- Spring配置文件中的那些标签意味着什么(持续更新)
前言 在看这边博客时,如果遇到有什么不清楚的地方,可以参考我另外一边博文.Spring标签的探索,根据这边文章自己来深入源码一探究竟.这里自己只是简单记录一下各标签作用,每个人困惑不同,自然需求也不一 ...
- mybatis的批量更新实例
近来批量添加,删除,更新用的比较多,单一的删除和更新,操作无法满足企业某些业务的需求,故通过以下示例分享知识: 今天通过更新的例子来说明 演示环境为jdk8,maven环境,ssm框架 请准备好环境, ...
- squid调整
Squid采用新方案部署的调整步骤一,隔离二,修改三,验证四,波及==============================[1] 把被引用到的待修改对像实例,从前端应用负载nginx的配置中摘出 ...