248&258--高级软件工程第三次作业

0 小组成员

马帅 / 2017202110248

齐爽爽 / 2017282110258

1 项目 GitHub 地址

GitHub:https://github.com/whumashuai/QTcalgen

2 预估耗时与实际耗时

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning 计划 10  5
· Estimate · 估计这个任务需要多少时间   10     5
Development 开发 1060   1160
· Analysis · 需求分析 (包括学习新技术)   30     120
· Design Spec · 生成设计文档   10     30
· Design Review · 设计复审 (和同事审核设计文档)   30     60 
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)   30     60
· Design · 具体设计   60     70
· Coding · 具体编码   600    600
· Code Review · 代码复审   180     180
· Test · 测试(自我测试,修改代码,提交修改)   120     40
Reporting 报告 90   180
· Test Report · 测试报告   50     130
· Size Measurement · 计算工作量   20     20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划   20    30
合计   1160  1345

3 解题思路

3.1 前期准备

        因为我的partner马帅第二次完成的比我好,所以我们决定第三次作业,在他的代码基础上进行改进与升级,在这个基础上建立前台交互界面。在之前,项目只有math.h和calgen.cpp两个文件。我们意识到要实现接下来的功能,我们必须分模块,将代码分装。当拿到需求,需要建立前台界面,我们小组就很惆怅,因为C++在自己的印象中,C++是需要自己写很多东西的,但是吧又一想,现在发展的多块啊,肯定什么东西网上都已经实现了。于是就搜索,直接出来的QT,于是就确定下来,咱们用QT!简单粗暴。

3.2 前端

        使用QT disigner设计简单界面;参考博客等等等。

        实现功能:

        (1)多语言:虽然一开始就看到老师要求,不是简单的if、else而是要体现低耦合。也看了博客其他人的解决办法,似乎他们都觉得这个功能很难实现。或许是我们第一次使用QT,很多东西都第一次知道,在知道有信号与槽的功能后,我们很兴奋,觉得这个好像框架,直接用就OK。但是在最后整理反思的时候,我们还是建立了不同语言的界面,在用户选择语言后,后台接收到不同信号,从而反馈不同的语言界面,似乎和if、else相仿。        

        (2)计时,实现比较容易,使用QTime类实例化一个对象,然后加一个信号与槽作为每秒更新,然后调用start和stop函数控制开始与结束即可。

3.3后端

        使用马帅的代码,在原来基础上分装、修改。

3.4 流程图

 

3.5 分歧解决

        我们两个都是比较好商量事情的人,所以任何一方提出一个问题,基本都是赞同的,所以没有分歧。尽管最后觉得页面很简陋,并且也有点不符合平时用户的习惯,但是在最开始,只想先实现每一个功能,最后再来修改,总觉得时间还够,以至于后面也来不及修改。包括前期,达成一致,先实现计时和多语言,后面再增加计数功能,发现也来不及了。

4 代码说明

        因为关键代码基本和上次的差不多,就展示新加入的关键代码。

        (1)多语言选择功能:语言切换功能通过信号与槽机制实现,在主界面(w表示),发送信号signaltra(),signalsim(),signalEng()分别由繁体,简体,英文界面的receiveshow()槽接受以显示该界面。具体代码如下:

QObject::connect(&w,SIGNAL(signaltra()),&tn,SLOT(receiveshow()));
    QObject::connect(&tn,SIGNAL(tranumshowmain()),&w,SLOT(receivereturn()));
    QObject::connect(&tn,SIGNAL(trashow()),&t,SLOT(receiveshow()));
    QObject::connect(&t,SIGNAL(trashownum()),&tn,SLOT(receivereturn()));
    QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit()));
    QObject::connect(&t,SIGNAL(quit()),&a,SLOT(quit()));

    QObject::connect(&w,SIGNAL(signalsim()),&sn,SLOT(receiveshow()));
    QObject::connect(&sn,SIGNAL(simnumshowmain()),&w,SLOT(receivereturn()));
    QObject::connect(&sn,SIGNAL(simshow()),&s,SLOT(receiveshow()));
    QObject::connect(&s,SIGNAL(simshownum()),&sn,SLOT(receivereturn()));
    QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit()));
    QObject::connect(&s,SIGNAL(quit()),&a,SLOT(quit()));

    QObject::connect(&w,SIGNAL(signalEng()),&en,SLOT(receiveshow()));
    QObject::connect(&en,SIGNAL(engnumshowmain()),&w,SLOT(receivereturn()));
    QObject::connect(&en,SIGNAL(engshow()),&e,SLOT(receiveshow()));
    QObject::connect(&e,SIGNAL(engshownum()),&en,SLOT(receivereturn()));
    QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit()));
QObject::connect(&e,SIGNAL(quit()),&a,SLOT(quit()));

        (2)计时:在界面添加LCDnumber控件,使用QTimer类实例化一个时钟对象,用start和stop函数控制时钟的开始与暂停并给一个信号给timeUpdate开始时间的计时。使用QTime类实例化一个时间对象,初试化时间为0,调用addSecs函数并赋值参数为1,表示计时操作增加一秒,然后给出具体的输出形式(如“hh:mm:ss”),调用LCDnumber控件的display函数显示出计时。

.h文件

 QTimer *engtimer;
 QTime *engTimeRecord;//record time

.cpp文件

engtimer = new QTimer(this);//new Timer()
    engTimeRecord =new QTime(0,0,0);
QObject::connect(engtimer,SIGNAL(timeout()),this,SLOT(timeUpdate()));

timeUpdate()函数

*engTimeRecord = engTimeRecord->addSecs(1);
    QString strTime = engTimeRecord->toString("hh:mm:ss");
    ui->lcdNumber->display(strTime);

5 测试运行

        由于后台代码没有怎么改动,所以单元测试用例情况和第二次相同。以下页面为进入之后每一步操作流程的页面。

模拟用户正确操作

        (1)语言选择

        后面以中文简体为例。

        (2)自主选择表达式数量

        (3)做题页面

         当进入页面开始计时,中间反馈框会反馈正确性与正确答案。当做到最后一题时,显示得分与总耗时。

用户可能的错误操作及应对

        除了表达式数量框与结果框,其他显示框,限制只能显示。

6 合作与总结

马帅

   这是我第一次接触到结对编程,确实不知道如何去分配任务,还要考虑编程的方式,编程环境等,刚开始觉得很麻烦,慢慢接触后,和partner一起交流学习,碰到问题一起解决。帮助修改代码,效率大大提高,代码的质量也提高不少。
         本项目需要一个UI界面,由于使用的是C++编写该项目,也一直没用过C++写界面,在网上查找一些资料后,并且和partner商议后决定采用QT实现。由于第一次使用QT也确实遇到了一些问题,最开始是QT运行环境的问题,这个问题困扰了很久,也导致项目进展不顺,后来还是和partner交流过程中提到这个问题,在partner的帮助下终于解决了这个问题。后来在项目的编写过程中也遇到了一些问题,比如在多项目文件中使用全局变量,采用extern关键字来实现,但一直无法再其他文件中使用,在CSDN上查找N篇博客后依然没解决,后来和partner交流后再知道是我自己声明出错。在实现时钟的过程中,获取时钟显示值一直为0,在网上查找相关的一些资料后采用QTime的实例对象调用addSecs函数去刷新时钟,停止后直接把该实例按照“hh:mm:ss"表示为QString类型显示出来。等等。
         本次项目让我学到了很多,不但学习到了如何用QT对编写UI,更重要是学到如何和partner合作编程,去处理合作过程中出现的各种各样的问题。以后我会和partner继续合作,共同学习,提高自己的能力。   

齐爽爽

         很荣幸能在这次课上有结对编程的体验,也能有一个好的partner,合作至今,并没有出现老师之前提到的合作中的问题。1+1确实大于2,特别是对于我这种选择困难,并且也不知道到底怎么解决问题的人来说,有一个和你一起的小伙伴,多一个人可以交流,有什么想法都能立马说出来,不管最后我们达成的共识是否正确,但是至少能得到小伙伴的肯定还在赞同,还是能在项目里树立信心的。并且在结对编程中,有一个人在那里监督,少了懒散,并且有问题也能及时指出,提高效率。但是在这中间,肯定也会有不足,我和小伙伴的合作,正是我俩都是那种太好相处的伙伴,所以很多问题上面很容易就满足,没有过高要求自己,所以和其他团队的项目比起来会显得简陋。但是不管最后结果如何,这个合作过程是不可替代的。

7 结对照片

        虽然一个在街道口一个在工学部,但是还是碰了三次面的,中间一些卡着的问题的解决。到最后一次才想起来拍照。

原文地址:https://www.cnblogs.com/shuangshuangblog/p/7651691.html