GitHub:https://github.com/zsl1996/UI/commits/master

一、            实验内容

这是交付给最终用户的软件,有一定的界面和必要的辅助功能。完成Windows和Linux电脑图形界面的程序,需实现以下功能:

l  对上述各属性参数(生成题目的数量,操作数的数量,题目及答案中的数值的范围……)进行设置

l  调用Core模块得到题目和运算结果,显示题目,接受输入,并能判断答案是否正确

l  增加“倒计时”功能,每个题目必须在20秒内完成,否则,得0分并进入下一题

l  增加“错题记录”功能,对于答错的题,将其保存下来,当下次进行“复习”时,增大错题在练习题中的概率

l  增加”历史纪录“功能,把用户做题的成绩纪录下来并可以展现历史纪录

l  增加“成绩分享”功能,生成成绩单,想一想成绩单里要展现什么,仅仅是最后的得分吗?错题的类型及数量?帮用户分析其薄弱的环节,提出合理的学习建议?

二、            设计方案

技术选型:

  • C# 是微软收购不成JAVA搞得一套IDE开发框架,高效但封闭,只能在WIN下运行,对跨平台支持不太好,C# WPF不开源,遇到坑只能绕开。
  • QT是一套为了开发C++ 图文界面而作的一套IDE开发框架,、是一款既可以开发UI界面也可以开发非UI界面的工具程序,也可用来开发服务器。QT作为跨平台开发工具,现今支持的系统有:WINDOWS、IOS、OSX、ANDROID、Linux、UNIX 等等;

考虑到需要跨平台,本次选择Qt&C++做开发。

三、            界面细节以及BUG修复

  • 界面首页,设有答题、设定、答题记录、成绩分享及分析四个菜单栏

在一个centerwiget放置4个wiget,利用点击事件与wiget的show(),close()函数实现四个功能界面的无缝切换.

例如点击设定界面,就激发其他三个界面的close(),仅仅让设定界面展示出来:

开发过程的bug:在图形界面开发(拖拽),四个界面很容易相互包括,最终在代码中设定正确的父类解决。

  • 开始答题后界面,在方框中输入答案,确认键和enter均可提交。

使用时候应先点击开始答题计时器启动,减到0自动进入下一题。

增加复习模式,此模式是在代码中增加一个vector保留所有错题,在选择复习模式后,会循环所有错题,直到所有题目都答对。

题目显示框设为不可编辑,避免复制到计算器作弊。

增加平均分功能,注意此为此阶段(即core中的一次产生题目数目)的平均分,成绩分享中的平均分为此次打开软件所有的题目(有可能利用core产生多次题目)的平均分。

计时器是绑定一个1s触发一次的定时器,计时结束会自动跳到下一题。

因为20s事件有时候来不及点击鼠标,加入了了enter快捷键,代表确认。

开发过程的bug:

这个界面是最麻烦的,因为涉及事件最多,最开始每个槽函数我们都单独写处理,后来发现,其实就两件事,一个是正确的保存数据,再一个就是合理的刷新界面,这样分割出void MainWindow::pushvector(),int MainWindow::RefreshUI()后,整个代码的可读性与逻辑都变得清晰了许多。

再就是解决三个按键的点击顺序,最开始乱点会出现bug,后来利用flag进行限制,得到解决。

  • 一组题目回答完毕后显示答题结束

交互中多处利用提示框对下一步操作进行提示或者对不当的操作进行警告

开发过程的bug:

显示中文时候,有些时候会变成乱码,没有解决,部分不得不改为英文。

  • 题目设置菜单,可进行题目个数,运算符种类,最大操作数,是否支持整数、分数、小数、乘方运算设置;确认后保存设置即可,或恢复默认设置。

  可以进行题目要求的所有设定,可以恢复默认选项,设定成功会出现提示框。

  • 查看近期答题记录

在此可以查看回答过的所有题目,包括复习模式中回答的题目,对用时,得分都有显示,实现是用的Qtablewiget实现,自动关联滚动条,非常友好。

开发过程的bug:

:因为储存方式不对,最开始的时候用时以及题目数目都不对,多次样本单步运行debug,多次更改了答题界面逻辑才解决。

  • 勾选方框,进入复习模式,循环做错的题目,遍历结束提示复习完毕。

使用的是一个vector装错题,答对了就去除掉,只有所有问题都答对才会结束此模式。

开发过程的bug:

最开始一开始就选择复习模式,并直接答题,得分会变成100,加了判别vector是否为空。

  • 成绩分享菜单内,对近期成绩做出分析,提供分享。

平均分50以上建议加大难度,50以下建议建议使用复习模式。

Bug解决:依旧是文本框settext()设置中文会乱码,不得不使用中文。

四、            结对开发流程

  1. 各自分析题目,做技术选型,交流讨论,确定方案。
  2. 确立代码风格规范及开发规范。
  3. 学习“三明治”提建议方法。
  4. 采取一小时轮换制。
  5. 驾驶员:选取模块进行开发,做单元测试。
  6. 领航员:监督驾驶员对开发流程的执行,考虑单元测试的覆盖率。

五、            BUG分析

详见三、界面细节部分各功能详情。

六、            经验总结

  1. 结对编程的意义

首先不得不承认,每个在各自独立设计,实现软件的过程中不免要犯各种错误。在结对编程中,因为有随时的复审和交流,每个人都有强项,恰恰与木桶效应相反,最后的结果是各方面两个人的最高水平!这样,错误少了,程序的初始质量就高很多。自然省下很多修改时间。尤其是对于(==写成=)这种低级无脑难以发现的问题。

结对编程的过程也是一个相互督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。这种督促的压力,让双方都变得更有执行力。

磨练了两个人的友谊,如何怼的别人心服口服,还能继续做朋友。

  2.工作后是否选择结对编程

如果可以的话,我选择和女生结对编程。

工作中他一方面可以提高效率:结对编程的主要目的是控制品质和风险,同时建设团队。会给人看的代码和不会给人看的代码品质上有天壤之别。经过讨论的实现也往往比自己独自决定的考虑的更加全面。技术细节掌握在一个人手里对于团队是危险的。而结对既可以让避免这种情况,还能让工程师更快的进步,让团队更多交流,更加融洽。要说效率,两个高度自律的高手结对编程可能在效率上要付出代价。但是即使如此,也是完全值得的。另一方面,好的品质,会让测试更顺利,对应需求变化更快速。也可以说是增加了效率。

结对编程绝对可以大幅度提高工作效率,但同时,他让工程师一分钟都不能走神,每天高强度工作n个小时。结对编程虽然很好,但绝对是大体力劳动,太累人,不是一般人干得来的,实践当中很少有团队能够坚持下来。

  3.学到的经验

规划时间,增加执行力,通过别人监督使自己工作时更专注避免犯错,学会给对方积极的反馈,三明治方法几乎可以适用于左右的情况。团队和睦共进才是生存之道。

  4.关于对接,起初每次对接一个组,我都要修改事件函数,后来想到我自己定义一个接口为myapi.hpp,定义我自己的设定函数,然后对接每个组的core的时候,只需要在myapi中调用他们的设定函数,但是传出我需要的参数,实现view与control的分割(MVC框架思想),大大加快了对接速度。

七、   PSP表格

附、            课程建议

希望能有学习的过程,而不是通过留作业的方式倒逼学习。作业繁重,远远超出两个学分的任务。

结对编程UI的更多相关文章

  1. 结对编程——四则运算器(UI第十组)

    博客目录: 一.问题描述                   二.设计思路                   三.UI开发过程                       四.对接过程       ...

  2. 结对编程项目复盘:带UI的小初高数学学习软件

    实现个人项目时,由于我当时的Java GUI编程基础还比较薄弱,所以我选择通过命令行实现,并将编程开发的重点放到了算法效率上去.没能设计出用户体验更佳的UI成为了我在个人项目阶段最大的遗憾. 在这次结 ...

  3. 结对编程收获——UI真的没有那么简单

    结对编程收获——UI真的没有那么简单                                                      詹元成 初看作业要求,心里还有一点欣喜,不就是做一个UI ...

  4. 结对编程——带UI的小初高数学学习软件

    一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...

  5. 结对编程--基于android平台的黄金点游戏

    游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...

  6. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  7. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  8. 11061160_11061151_Pair Project: Elevator Scheduler软件工程结对编程作业总结

    软件工程结对编程作业总结 11061160  顾泽鹏 11061151  庞梦劼 一.关于结对编程 这次的软工任务既不是单打独斗的个人任务,也不是集思广益的团队项目,而是人数为两人的结对编程.两个人合 ...

  9. 结对编程四则运算gui

    码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...

随机推荐

  1. 关于JS递归函数求斐波那契数列两种实现方法

    百度已经解释的很详细了,但是不写注释还真是看不懂,递归,就直接套公式了,for循坏,我们就用EXCEL看一下规律 可以看到B是A+B的和,A往后就是B的值,所以我们需要第三个变量来保存他们的和,取出B ...

  2. ivew Upload 上传图片组件

    1. 先展示一个效果图 2.代码详解 <!-- 封面缩略图 --> <div class="pop-up-div pic"> <div class=& ...

  3. java漏洞历史

    内容来自以前收集的思维导图,作者不明. 1.JDK漏洞 1.1.CVE-2012-4681 https://www.freebuf.com/vuls/5485.html msf: exploit/mu ...

  4. 在并发Java应用程序中检测可见性错误

    了解什么是可见性错误,为什么会发生,以及如何在并发Java应用程序中查找难以捉摸的可见性错误.这些问题你可能也遇到过,当在优锐课学习了一段时间后,我对这些问题有了一定见解,写下这篇文章和大家分享. 检 ...

  5. php调用系统命令的函数的比较

    了解命令的区别并进行直观的选择 这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择 前言 PHP有众多调用系统命令的函数,大致如下: system() exec() passthru ...

  6. LeetCode Array Easy 88. Merge Sorted Array

    Description Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted ar ...

  7. Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火

    题意:现在有n张卡片(n <= 16), 每一轮你可以执行两种操作中的一种.1:获得一张红色令牌和一张蓝色令牌.2:购买一张卡片(如果可以买的话),购买的时候蓝色卡片可以充当蓝色令牌,红色同理, ...

  8. 解决vue项目打包之后出现源代码的问题

    config/index.js 页面找到productionSourceMap:ture 改为 productionSourceMap:false

  9. vue 学习八 自定义指令

    vue指令注册有两种方式 1 全局注册 在main.js中 使用vue.directive Vue.directive('alert_w', { inserted(el,bin,vn) { conso ...

  10. 【专业的 Markdown 编辑写作软件】MWeb for Mac基本使用教程

    MWeb for Mac是一款专业的 Markdown 编辑写作软件,可以生成MarkDown编辑器和静态博客,在记日记的时候,你可以使用插入图片的功能,使用MWeb软件你可以拖拽或直接粘贴即可插入图 ...