[课程相关]homework-03
零、准备工作
这次的作业是结对编程,因为一些原因我们的队伍一共有三个人,成员为:梁杰、夏天晗、谢祖三。由于大家不在一个班,交流起来也不是特别方便,所以我们经过讨论决定三个人约一个时间在一起完成这次作业。考虑到每个人的空闲时间,我们最后决定在周六的上午完成,地点是我的宿舍。本来准备去自习室的,但是考虑到讨论的时候声音可能会比较大影响到其他同学学习,所以换成了自习室。
周六上午集合之后,我们就开始了讨论。
首先要解决的问题就是用什么语言来写。我和夏天晗使用的是Python,谢祖三使用的是JAVA。仔细察看第3次作业的要求,我们发现第3次作业是要采用第2次作业比较好的那个同学的代码,以此为基础来开发界面。所以我们对比了一下第2次的作业代码,发现夏天晗同学的代码更加简洁,也没有错误,所以决定使用夏天晗同学的代码。决定了这个以后,因为我们大家都不太清楚Python和JAVA的代码如何进行交互配合,所以最后我们决定第3次的开发采用Python语言。
语言决定了,下面就是分工了。因为谢祖三同学使用的是JAVA语言,所以编码的工作就落到了我和夏天晗同学的身上。考虑到谢祖三同学虽然不太熟悉Python语言,但是语言功底很强,所以我们决定让谢祖三同学来做代码复审以及测试的工作。因为我之前开发过Python的应用,对wxpython(一个写Python界面的库)比较熟悉,所以决定由我来开发界面部分,由夏天晗同学开发逻辑部分。
分工之后,我们就正式开始了关于题目的讨论。
一、具体思路
第3次作业乍一看好像和第2次差不多,但是经过仔细分析之后我们发现第3次作业中其实有一些难点。对应每个难点我们又着重讨论,最后确定了一套基本思路:
难点1:第2次作业的代码不能直接使用
解决办法:我们在第2次作业的基础上进行修改,在找最大值的过程中将最优子矩阵也同时记录下来,这样才能画出对应的矩形
难点2:保证只有一个界面在系统中运行,并且还要进行更新
解决办法:这个确实很难做到。我们查看了设计模式中的单例模式,经过研究后发现单例模式适用情景是一个程序中只有一个类实例,而第3次作业其实并不是一个单例模式,只能说是“单界面”。单界面本身并不难做到,只要在程序运行的开头判断一下是否已经有界面即可。但是难点就在于,如果在已经有界面的情况下再次运行命令,不仅要保证单界面,还要使新命令的结果也添加到界面上。这个最主要的问题就是如何使新命令传递给已经存在的界面。经过激烈的讨论,我们最后选定了一个解决方案,就是通过文件的方式来为主界面添加新命令。具体思路就是,我们有一个data文件,文件当中存储的是当前的所有命令。主界面会定期访问data文件,从文件中读取所有命令,如果发现有新命令就刷新界面。如果在已经有一个主界面的情况下再次运行命令,则会将新命令添加到data文件中并退出。这样就变相实现了通信。虽然不是最完美的办法,但是也可以解决问题。
难点3:如何让用户可以移动矩形
解决办法:虽然这个是选做,但是我们还是决定做一下,锻炼一下能力。经过讨论,我们最后的解决方法是,先将当前tab的矩形储存到一个临时数组中,然后再根据用户的移动方向,将临时数组中的矩形移动之后再写回tab中,这样就实现了移动矩形。
二、实际编写
讨论出思路之后,我们就开始了实际编写代码。因为之前思路和分工都已经很明确了,所以编写起来也不是很费力。偶尔遇到一些小问题大家就会马上讨论迅速解决。每写完一个小功能,谢祖三同学就会马上进行代码复审以确定代码没有问题。这当中还有一个小插曲,就是夏天晗同学的编码习惯不是很好,变量总是随便起名,经过谢祖三同学的提醒之后,夏天晗同学马上注意到了这个问题,并在之后的编码过程中进行了改正。总的来说,编写过程比较顺利。
三、测试功能
我们选择的测试方法是人工测试。因为这次作业涉及到运行多条命令,还有界面的操作,所以我们使用人工进行测试。各功能测试截图如下:
运行主界面:
$ python homework03.py \\v \\a \\h input1.txt
可以看到出现了一个tab,显示的是结果。红色代表最优子矩阵。
在已经有主界面的情况下再次运行命令:
$ python homework03.py \\h input1.txt
可以看到界面中出现了新的tab。同时注意到,根据命令行参数不同,矩形可以移动的方向也会不一样。如果只有\\h参数则只能左右移动。因为\\h是代表水平相连。
点击剪头向右移动:
可以看到矩阵向右移动了一列,之前的最后一列移到了第一列。
然后向左移动两次:
关闭tab:
可以看到窗口底部有命令解释,关闭当前正在查看的tab
点击Close之后:
可以看到tab被关掉了
退出程序:
点击之后退出程序
四、总结
这是我们第一次结对编程,虽然大家开始不太习惯,也不太熟练,但是在交流的过程中慢慢掌握了方法,互相之间越来越熟悉对方的思路。总的来说,虽然有一些小地方还有待继续努力,但是总体来说我们已经意识到了结对编程的巨大威力,开阔了视野。
五、老师的问题
你现在使用的代码规范是什么, 和上课前有什么改进?
使用的是PEP8,Python的标准代码规范。上课之前虽然偶尔会用,但是并没有养成习惯。结对编程之后意识到自己的代码如果写的不规范会对别人造成很大的障碍,所以开始严格按照规范编码。
你的同伴有哪些优点 (列出至少三点), 和那些需要改进的地方 (列出至少三点)
优点:有毅力,思维活跃,开朗
缺点:代码不太规范,编程时候不够集中注意力,交流时候还不是很习惯提出自己的看法
你的代码从 作业2 到 作业3 经历了哪些变化? 哪些代码需要重构 (看关于代码重构的资料), 哪些需要重写, 为什么?
主要添加了记录最优子矩阵的代码,重写了返回值,将子矩阵也一起返回,方便主界面调用。
你的设计是如何保证 不同的 maxsum.exe 命令行最后在一个GUI 的界面显示的? (C++ 的设计模式中有 singleton 的概念, 说明一个类的实例如何在一个进程中保持单例, 我们这里谈的是软件如何在操作系统中保持 singleton)
参考“具体思路”中的详细解释,这里不再赘述。
六、时间统计
Personal Software Process Stages |
时间百分比(%) |
实际花费的时间 (分钟) |
原来估计的时间 (分钟) |
计划 |
10% | 24 | 18 |
· 估计这个任务需要多少时间,把工作细化并大致排序 |
10% | 24 | 18 |
开发 |
85% | 204 | 153 |
· 需求分析 (包括学习新技术) |
15% | 36 | 27 |
· 设计复审 (和同事审核设计文档) |
10% | 24 | 18 |
· 代码规范 (制定合适的规范) |
5% | 12 | 9 |
· 具体设计 |
10% | 24 | 18 |
· 具体编码 |
35% | 84 | 63 |
· 代码复审 |
5% | 12 | 9 |
· 测试(自我测试,修改代码,提交修改) |
5% | 12 | 9 |
总结报告 |
5% | 12 | 9 |
总计 | 100% | 总用时 240 |
总估计的用时 180 |
七、补充显示最大值功能
之前忘了显示最大值,现在补上了。
因为实在不想所有图都重新截一遍了。。。所以就截一张展示一下吧。
可以看到右边箭头上方显示了最大值。
[课程相关]homework-03的更多相关文章
- nlp homework 03
NLP Homework 03 --冯煜博 题目描述 (盒子和球模型)假设有3个盒子,每个盒子里装有红白两种颜色的球,盒子里的红白球有下表列出,初始状态分布. 解答 1. 给出HMM模型 \(\mu= ...
- 【学习笔记】B站-2019-NLP(自然语言处理)之 BERT 课程 -- 相关课程笔记
BERT 课程笔记 1. 传统方案遇到的问题 BERT的核心在于Transformer,Transformer就类似seq2seq网络输入输出之间的网络结构. 传统的RNN网络:最大的问题,因为不能并 ...
- Linux及安全课程——相关链接总结
附录:学习笔记链接总结 MOOC课程学习笔记与实验: 第一周:计算机是如何工作的 第二周:操作系统是怎么工作的 -- 一个简单的时间片轮转多道程序内核代码及分析 第三周:构造一个简单的Linux系统M ...
- [课程相关]homework-04
零.准备工作 这次的作业仍然是结对编程,我们队伍的成员为:梁杰.夏天晗.谢祖三.上次我们是选择了一个时间大家聚在一起进行编程,效果不错,所以这次我们还是决定采用这种方式.由于大家平时比较忙,这周六日我 ...
- [课程相关]homework-02
一.如何组织代码 因为这个代码比较简单,用函数就足够了,个人觉得没必要用类,杀鸡不必用牛刀. 代码有点长,主要是加了很多判断参数的部分. 提取了一个公共的递归函数. 用了不少全局变量,可能当做参数传入 ...
- 潭州课堂25班:Ph201805201 django 项目 第四十二课 后台 课程相关,用户组管理 (课堂笔记)
在线课程: 当点击进入页面时,显示所有课程 def get(self, request): courses = Course.objects.select_related('category', 't ...
- HTML中body相关标签-03
今日主要内容: 列表标签 <ul>.<ol>.<dl> 表格标签 <table> 表单标签 <fom> 一.列表标签 列表标签分为三种. 1 ...
- [课程相关]附加题——stack的理解
一.stack的三种解释 stack有三种解释,我个人理解如下. 1.用户自定义的stack 用户自定义的stack就是一般意义上的后进先出队列,从名字上就能理解了,stack由下向上增长,有一个顶指 ...
- [课程相关]homework-09
零.前言 这次的作业比较特殊,有两种做法.由于我对网页很熟悉,所以选择网页. 细节不赘述,下面写一下这次作业的几个亮点. 一.亮点 最大的亮点就是这个页面是纯客户端的,没有服务端.也就是说所有功能都是 ...
- [课程相关]homework-06
一.c++11 lambda /* * File: main.cpp * Author: liangjie * * Created on 2013年11月23日, 下午12:02 */ #includ ...
随机推荐
- MapReducer Counter计数器的使用,Combiner ,Partitioner,Sort,Grop的使用,
一:Counter计数器的使用 hadoop计数器:可以让开发人员以全局的视角来审查程序的运行情况以及各项指标,及时做出错误诊断并进行相应处理. 内置计数器(MapReduce相关.文件系统相关和作业 ...
- Hold住:坚持的智慧
这类励志的书读完时,感觉很激励人,可读完后总觉得空空的.同样这本书读完后没特别的感觉(也许书中的思想已影响了我,只是目前还说不太清楚),只感觉有些句子很有感觉,做个汇总: 1. 荀子有言:“ ...
- Junit。。。
keep the bar green to keep the code clean.
- 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)
本文出自 代码大湿 代码大湿 本系列持续更新,敬请关注. 1 静态工厂 静态工厂介绍: 静态工厂模式可以实现接口封装隔离的原则.在客户端只知接口而不知实现的时候可以使用静态工厂模式. 源码请点击我 角 ...
- redis高级实用特性
1. 安全性 2. 主从复制 3. 事务处理 4. 持久化机制 5. 发布订阅消息 : 可以做一个消息系统 6. 虚拟内存的使用 一 . 安全性 设置客户端连接后进行任何其他指定前需要使用的密码 . ...
- linux高级数据存储
linux内此存储模式由5部分组成,自低向上的顺序: 物理卷,内核块设备驱动,内核文件系统驱动,虚拟文件系统,应用程序数据结构; 系统中所有的文件仅按此模式存储,无论是数据还是元数据,均在此模式下统一 ...
- Spring properties dependency checking
In Spring,you can use dependency checking feature to make sure the required properties have been set ...
- matlab中读取txt数据文件(转)
根据txt文档不同种类介绍不同的读取数据方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为“17.901 -1.111 ...
- hdu 2553 N皇后问题 (经典DFS)
题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...
- AndroidEventBus ( 事件总线 ) 的设计与实现
1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦 ...