0 小组成员

马帅 / 2017202110248

齐爽爽 / 2017282110258

1 项目 GitHub 地址

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

2 预估耗时与实际耗时

PSP2.1 Personal 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 =,,);
QObject::connect(engtimer,SIGNAL(timeout()),this,SLOT(timeUpdate()));

timeUpdate()函数

*engTimeRecord = engTimeRecord->addSecs();
    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 结对照片

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

248&258--高级软件工程第三次作业的更多相关文章

  1. 高级软件工程第三次作业 赵坤&黄亦薇

    0.小组成员 赵坤2017282110261 黄亦薇201728210260 1.项目Github地址  https://github.com/zkself/homework3 PS:建议使用chro ...

  2. 高级软件工程第四次作业(C++)

    1 团队组成和选题情况说明 1.1 Git链接:https://github.com/WHUSE2017/C-team 1.2 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(26 ...

  3. 软件工程第三次作业-结对作业NO.1

    第一次结对作业 结对人员: 潘伟靖 170320077 张 松 170320079 方案分析 我们对所供的资料进行分析,如下: 从提供的资料可以看出,需要解决的问题以及满足的需求主要有两类目标用户,各 ...

  4. 软件工程第三次作业(One who wants to wear the crown, Bears the crown.)

    最大连续子数组和 题目 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和 ...

  5. 软件工程(QLGY2015)第三次作业点评(含成绩)

    相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 团队信息 本页点评团队1-22,其他组见:http://www.cnblogs.com/xiaozhi_5638/p/4490764.h ...

  6. 高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告

    高级软件工程2017第6次作业--团队项目:Alpha阶段综合报告 Deadline:2017-10-30(周一)21:00pm (注:以下内容参考集大作业4,集大作业5,集大作业6,集大作业7 一. ...

  7. 软件工程(GZSD2015)第三次作业提交进度

    第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...

  8. 软件工程(GZSD2015) 第三次作业提交进度

    第三次作业题目请查看这里:软件工程(GZSD2015)第三次作业 开始进入第三次作业提交进度记录中,童鞋们,虚位以待哈... 2015年4月19号 徐镇.尚清丽,C语言 2015年4月21号 毛涛.徐 ...

  9. 17秋 软件工程 团队第三次作业 预则立&他山之石

    题目:团队作业-预则立&&他山之石 团队: 我说嘻(xì)哈(hà)你说侠 17秋 软件工程 团队第三次作业 预则立&他山之石 1.确立团队选题,建立和初步熟悉团队git的协作 ...

随机推荐

  1. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  2. struts2中的国际化

    [java] view plaincopy 实现struts2中国际化其实非常简单 首先,struts2中的国际化是通过资源文件来配置的. 资源文件分为:action类级,package类级,还有we ...

  3. Python之路第十二天,高级(5)-Python操作Mysql,SqlAlchemy

    Mysql基础 一.安装 Windows: 1.下载 http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.31-winx64.zip 2.解压 ...

  4. imx:MfgTool

    MfgTool使用方法: MfgTool很妖,写进去的img的名字一定要符合配置文件里面的命名标准. 具体要参见:        MFG_TOOL\Profiles\Linux\OS Firmware ...

  5. TOGAF架构开发方法(ADM)之需求管理阶段

    TOGAF架构开发方法(ADM)之需求管理阶段 1.11 需求管理(Requirements Management) 企业架构开发方法各阶段——需求管理 1.11.1 目标 本阶段的目标是定义一个过程 ...

  6. Hibernate框架--对象的状态,缓存, 映射

    回顾Hibernate第二天: 1.  一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...

  7. mongodb replica set介绍

    近年来,随着大数据越来越火,非关系型数据库的重要性被越来越多的人所认知,越来越多的开发者逐渐加入到NoSQL的阵营中.我们知道NoSQL是Not Only SQL的意思,既然如此,很多关系型数据库所支 ...

  8. HDFS之RPC机制

  9. Spring Cloud Eureka基本概述

    记一次Eureka的进一步学习. 一.Eureka简介 百科描述:Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡 ...

  10. Django admin注册model究竟要怎么写才优雅

    比如在Django admin 注册models时,会用到. 对于APP里自带的models,可以使用这种方式注册. from django.contrib import admin # Regist ...