2020软件工程作业03
1.Github项目地址:https://github.com/yinyinlee7/nothing/tree/master/20177610
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 60 |
Estimate | 估计这个任务需要多少时间 | 900 | 780 |
Development | 开发 | 180 | 180 |
Analysis | 需求分析 (包括学习新技术) | 180 | 240 |
Design Spec | 生成设计文档 | 50 | 40 |
Design Review | 设计复审 | 20 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 15 |
Design | 具体设计 | 60 | 40 |
Coding | 具体代码 | 120 | 120 |
Code Review | 代码复审 | 60 | 90 |
Test | 测试(自我测试,修改代码,提交修改) | 80 | 90 |
Reporting | 报告 | 50 | 30 |
Test Repor | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 30 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 20 |
合计 | 1880 | 1755 |
3.思路描述
我前几天还在手机上下载数独玩了几把,没想到作业就是数独问题...我解数独游戏都要花上一些时间,要我用程序解数独...我石化了。
数独嘛九个宫格,每个宫格里有九个格,合起来八十一个格。每个格子里的数字在该行、该列、该宫格里不能重复出现,填满所有格子就解完了。用我的脑子解很简单,用程序解就无从下手。起先应该想,程序的话从第一行的空格子开始填数,从1开始尝试填,如果有重复就轮到2,以此类推,总能找到一个合适的数字,接着找到下一个空格,按同样的方法填,如果在填某个空格子的时候没有数字不重复的话,就应该是前面填的格子中有填错的,返回去,从没填过的数字又开始尝试填,直到解决。
4.设计实现过程
程序分为五个模块:检查模块、定位模块、主模块、起始模块、输入输出模块。
(做完图才发现不是sodoku而是sudoku...)
5.改进程序性能
1.性能分析
函数调用和耗时都在表中。
这是函数图表
(第一次用pycharm我还真不太熟悉......)
2.单元测试
import unittest
from sodoku1 import sodoku
class MyTest(unittest.TestCase):
def setUp(self):
print("Begin...")
# Run after each test case execution
def tearDown(self):
print("End...")
def test_1(self):
test_name=sodoku(8,0)
self.assertEqual(test_name,(0,0))
if __name__ == '__main__':unittest.main()
做作业期间改动了无数次,不停地搜百度,不停地搜百度。
作业要求是命令行输入参数运行程序,我去看了班上大佬的代码,了解到了一个python模块——sys模块(感谢大佬感谢大佬!)。我去看了大佬提供的关于sys的资料,原来sys.argv就可以达到命令行输入参数。改好后,点击运行,报错???!
又开始百度,找到的原因是列表溢出或者是空列表?
我又去找大佬询问了,他说加一句print sys.argv[0]呢,我加了试试,没报错了,我不知道什么原因......
这是命令行运行了一遍,没有出现列表溢出什么的错误了。
可是后续写open()打开文件的时候又报错了,找百度后我还是不知道什么原因......
6.代码说明
运行结果:
目前3-8的数独宫格还没有实践出来,我尝试过,只有4,6,8,9需要对宫格内进行检查重复,而3和5宫格的不需要,利用这个我有更改过代码,但是不可行。以后会尝试做一做。
1.检查模块
def check(self,x,y,value):
for row_item in self.b[x]:
if row_item == value:# 检查行中是否有重复数字
return False
for row_all in self.b:
if row_all[y] == value:# 检查列中是否有重复数字
return False
row,col=x/3*3,y/3*3
row3col3 = self.b[row][col:col + 3] + self.b[row + 1][col:col + 3] + self.b[row + 2][col:col + 3] # 以下是检查9宫格内是否有重复数字
for row3col3_item in row3col3:
if row3col3_item == value:
return False
return True
分三种情况检查:整行、整列、整个宫格。
2.定位模块
def get_next(self,x,y):# 得到下一个未填项
for next_solu in range(y+1,9):
if self.b[x][next_solu] == 0:
return x,next_solu
for row_n in range(x+1,9):
for col_n in range(0,9):
if self.b[row_n][col_n] == 0:
return row_n,col_n
return -1,-1
如果没有下一项了,就返回-1。
3.主模块
def solution(self,x,y):
if self.b[x][y] == 0:
for i in range(1,10):# 从1到9尝试
if self.check(x,y,i):
self.b[x][y]=i
next_x,next_y=self.get_next(x,y)
if next_x == -1:
return True
else: # 如果有下一个0格,递归判断下一个0格直到填满数独
end=self.solution(next_x,next_y)
if not end:
self.b[x][y] = 0#如果没有可填的数字就回溯到上一次继续
else:
return True
4.起始模块
def start(self):# 起始模块,从第一个格[0][0]开始
if self.b[0][0] == 0:
self.solution(0,0)
else:
x,y=self.get_next(0,0)
self.solution(x,y)
for i in self.b:
print i
return
7.心路历程与收获
在这期间我做的最多的事就是搜百度、问大佬,有一天一直坐在电脑前查询各种资料,发现我妈把饭都送到我桌上来了...有时候就是不想停下来...我想快点完成作业。结果我完成的匆匆忙忙,这个不会那个不会,第一次用python语言,我花了一天时间学习,我去找了python教程,学习它的语法什么的。现在已经会用一点pycharm,简单运行,做性能分析,用terminal命令行运行程序。我还是需要花更多心思才能做好作业,作业太难了,我是个编码小白,难到我不想去做......而且我一向只对我感兴趣的事情才充满干劲。这不是理由,以后肯定会更加重视行动起来!
(p.s. Pycharm好用啊,它可以在软件里头用Terminal输入命令行来执行程序,还可以用Profile来做代码分析,不太占我电脑内存这点真的太好了。哈哈Pycharm赛高!)