2020软件工程作业03

软件工程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/
本作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
本作业目标 实现一个命令行程序,不妨称之为Sudoku
作业正文 https://www.cnblogs.com/yinyinlee/p/12589530.html
其他参考文献 https://www.cnblogs.com/liangmingshen/p/8906148.html https://www.runoob.com/python/python-tutorial.html https://blog.csdn.net/qq_38497266/article/details/89084989

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.设计实现过程

程序分为五个模块:检查模块、定位模块、主模块、起始模块、输入输出模块。
屏幕快照 2020-03-29 下午6.28.41.png

(做完图才发现不是sodoku而是sudoku...)

biao5.jpg

5.改进程序性能

1.性能分析
屏幕快照 2020-03-29 下午5.53.14.png
函数调用和耗时都在表中。
屏幕快照 2020-03-29 下午5.53.35.png
这是函数图表
(第一次用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()

做作业期间改动了无数次,不停地搜百度,不停地搜百度。biao1.jpg
作业要求是命令行输入参数运行程序,我去看了班上大佬的代码,了解到了一个python模块——sys模块(感谢大佬感谢大佬!)。我去看了大佬提供的关于sys的资料,原来sys.argv就可以达到命令行输入参数。改好后,点击运行,报错???!
屏幕快照 2020-03-29 下午5.35.25.png
又开始百度,找到的原因是列表溢出或者是空列表?biao2.gif
我又去找大佬询问了,他说加一句print sys.argv[0]呢,我加了试试,没报错了,我不知道什么原因......
屏幕快照 2020-03-29 下午5.35.35.png
这是命令行运行了一遍,没有出现列表溢出什么的错误了。
可是后续写open()打开文件的时候又报错了,找百度后我还是不知道什么原因......

6.代码说明

运行结果:
屏幕快照 2020-03-29 下午10.02.45.png
屏幕快照 2020-03-29 下午10.03.39.png
目前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.心路历程与收获

baio4.jpg
在这期间我做的最多的事就是搜百度、问大佬,有一天一直坐在电脑前查询各种资料,发现我妈把饭都送到我桌上来了...有时候就是不想停下来...我想快点完成作业。结果我完成的匆匆忙忙,这个不会那个不会,第一次用python语言,我花了一天时间学习,我去找了python教程,学习它的语法什么的。现在已经会用一点pycharm,简单运行,做性能分析,用terminal命令行运行程序。我还是需要花更多心思才能做好作业,作业太难了,我是个编码小白,难到我不想去做......而且我一向只对我感兴趣的事情才充满干劲。这不是理由,以后肯定会更加重视行动起来!
(p.s. Pycharm好用啊,它可以在软件里头用Terminal输入命令行来执行程序,还可以用Profile来做代码分析,不太占我电脑内存这点真的太好了。哈哈Pycharm赛高!)iao3.jpg

8.自我评价

屏幕快照 2020-03-29 下午7.50.49.png

posted @ 2020-03-29 19:57  yinyinlee  阅读(410)  评论(0编辑  收藏  举报