前三次作业

现在仍然由于特殊原因只能在手机上写一些文字,在此之前首先要感谢kiwi老铁,在我最需要帮助的时候帮我排版,调整码了以下博。

 

由于时间和进度落后,今后会继续完善这两周的作业并实时更新。

 个人情况介绍

本人毕业于东北大学计算机科学与技术专业,经过大学四年认真努力的学习有一定的编程基础,参加过数学建模,acm初赛,在大学的暑期小学期竞赛集训班学过一定的python相关知识,软件工程也在大学修过,但主要侧重于软件开发过程,软件开发需求,软件开发计划的必要掌握的知识点如用例图,过程图,甘特图,软件功能设计,迭代,黑白盒测试等等。以小组合作的形式设计的上课签到系统在当时老师的引荐下在东软进一步完善后在新校区投入使用。

我找到了之前本科的一些笔记,自认为还不错,所以贴上几张。

前三次作业_第1张图片

 

 

 前三次作业_第2张图片

 

 前三次作业_第3张图片

 

 前三次作业_第4张图片

 

 前三次作业_第5张图片

 

本人从小对计算机有着浓厚的兴趣,小时候在父亲的引导下接触过计算机的一些书籍以及“动手”了一些当时比较先进的零件,在高考后就毫不犹豫的选择成为一名程序员,刚开始的时候有了很浓厚的兴趣,随着学的知识越多,越理解了小时候的一些难题和疑惑,也经历过“痛不欲生”的代码调bug阶段,但每次程序运行成功的那一刻就十分自豪和快乐。

软件工程这门课在开课前我已经有了一些基本认识和了解,但我认为本科只是皮毛,真正难以理解的知识在这个阶段需要继续认真学习。

 

二 计算器

 

在本科做过类似的计算器,当时是一个Java的计算器课程设计,在之前我拿Python又把基本功能实现了一遍,一些科学计算器的范畴由于时间原因和特殊情况没有时间做了,基本功能的逻辑基本相同,直接放代码:

 

def change(mark):  #提取"+","-","*","/"的通用功能

 

    global Sum

 

    m=d.index(mark)

 

    if mark=="*":

 

        Sum = k[m] * k[m+1]

 

    elif mark=="/":

 

        Sum = k[m] / k[m+1]

 

    elif mark=="+":

 

        Sum = k[m] + k[m+1]

 

    elif mark=="-":

 

        Sum = k[m] - k[m+1]

 

    k[m]=Sum

 

    del k[m+1]

 

    d.remove(d[m])

 

 

 

def JS(Num):

 

    #k存储数字字符,d存储符号字符

 

    global k

 

    k=[]

 

    global d

 

    d=[]

 

    cba=Num

 

    for item in Num:

 

        if item=="+" or item=="-" or item=="*" or item=="/":

 

            d.append(item)

 

            Num=Num.replace(item,",")

 

    Num=Num.split(",")

 

    if Num[0]=="":

 

        Num[0]=0

 

    for i in Num:

 

            if i=="":

 

                pass

 

            else:

 

                i=float(i)

 

                k.append(i)

 

    count = 0

 

    for i in range(len(cba)):

 

        if cba[i] == "+" or cba[i] == "-" or cba[i] == "*" or cba[i] == "/":

 

            count += 1

 

            if cba[i+1] == "-":

 

                k[count] = -k[count]

 

                del d[count]

 

                count-=1

 

    for i in range(len(d)):

 

        if "*" in d and "/" in d:

 

            m=d.index("*")

 

            n=d.index("/")

 

            if m

 

                change("*")

 

            else:

 

                change("/")

 

        elif "*" in d :

 

            change("*")

 

        elif "/" in d :

 

            change("/")

 

    for i in range(len(d)):

 

        if "+" in d and "-" in d:

 

            m=d.index("+")

 

            n=d.index("-")

 

            if m

 

                change("+")

 

            else:

 

                change("-")

 

        if "+" in d:

 

            change("+")

 

        elif "-" in d:

 

            change("-")

 

def chazhao():

 

    global Nba

 

    global Num

 

    m=Nba.rfind("(")  #从右向左查找第一个左括号即最里层括号中的左括号

 

    n=Nba[m:]  #从这个左括号起把以后的字符赋给N

 

    c=n.find(")")#在N中从左向右查找第一个右括号即最里层括号中的右括号

 

    Num=n[1:c]  #找到括号把里面的字符赋值给Num

 

    JS(Num)   #调用基本的操作函数,并算出结果

 

    j=str(Sum)

 

    Nba=Nba.replace(Nba[m:m+c+1],j)   #将计算出的结果添加进最初的字符串中

 

    #JS(Nba)

 

while True:

 

    Nba=input("请输入计算公式:")

 

    while True:

 

        if "(" in Nba or ")" in Nba:

 

            chazhao()  #有括号时一直循环执行chazhao(),把括号全部替换

 

        else:

 

            JS(Nba)    #字符串中没有括号时直接调用基本运算

 

            print(Sum)

 

            break

 

测试图片如图:

前三次作业_第6张图片

其中,存在的问题还是有很多的,比如没有去写那个输入错误的返回,这个程序输入错误算式会直接退出,浮点数较大时会溢出等问题,在以后几周我会尽可能补充上去做到最好。

三 代码仓库

Github在本科时候自己用的不是很多,大多都是去查一些代码,真正运用也是在入学时候曾学哥推荐我去学习aconda的时候用的比较多,这是这次计算器的上传截图。

前三次作业_第7张图片

四.学堂在线

已经完成前两章的学习和课后作业

前三次作业_第8张图片

 

 

 

前三次作业_第9张图片

 

 

五 英文文献进行分词与分句

搜集了一些资料发现nltk库符合所有要求https://blog.csdn.net/weixin_42023936/article/details/82767959

按照nltk官网的一些教程发现py3.7已经预装了nltk

前三次作业_第10张图片

 

 

 前三次作业_第11张图片

这个all-nltk包含所有英文的分词分句,代码较简单,但是主要是测试和pep-8。

前三次作业_第12张图片

我去博客上搜了一些教程https://blog.csdn.net/kobe_academy/article/details/88139891

首先安装(后发现已经有了环境)

前三次作业_第13张图片

 

 前三次作业_第14张图片

 

检测语句为:py.test --pep8  ccc.py

结果通过。

问题不足:1.第一次试验操作失误把实验用的aconda环境弄坏了,明天开始会重新弄2.由于实验代码依赖环境,而新建的环境没有tensorflow,贴一张错误运行的截图:

前三次作业_第15张图片

 

 

 

由于时间和进度落后,今后会继续完善这两周的作业并实时更新博客。

参考了相关博客,在pcharm专业版(社区版后期缺文件做不了,调试十分麻烦,只有30天)上做的

生命游戏单元测试:

生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。

游戏在一个类似于围棋棋盘一样的,可以无限延伸的二维方格网中进行(在程序实现中,我们采取令左右边界相接、上下边界相接的方法模拟无限棋盘的情况)。例如,设想每个方格中都可放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。图中,用黑色的方格表示该细胞为“死”, 其它颜色表示该细胞为“生” 。游戏开始时, 每个细胞可以随机地(或给定地)被设定为“生”或“死”之一的某个状态, 然后,再根据如下生存定律计算下一代每个细胞的状态:

每个细胞的状态由该细胞及周围8个细胞上一次的状态所决定;
如果一个细胞周围有3个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;
如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。
这里提供四个python文件(下载),分别是main.py、life_game.py、game_timer.py、game_map.py,它可以正确地实现生命游戏的功能(棋盘的左右、上下是相连的),通过python main.py即可启动。本次作业要求针对game_map.py中的接口编写测试用例,测试文件需要命名为test_game_map.py。

首先选中gamemap类,在navigate专业版(社区版后期缺文件做不了,调试十分麻烦,只有30天),选择test选项

 

前三次作业_第16张图片

 

然后选择创建一个新的test

前三次作业_第17张图片

 

 

 以下是测试代码:

from itertools import chain
from itertools import cycle
from unittest import TestCase
from unittest import mock
from game_map import GameMap


class TestGameMap(TestCase):

def setUp(self):
self.game_map = GameMap(4,3)

def test_init(self):
self.assertRaises(TypeError, GameMap, ('a', 3))
self.assertRaises(TypeError, GameMap, (4, 'b'))

def test_rows(self):
self.assertEqual(4,self.game_map.rows,"Should get correct rows")

def test_cols(self):
self.assertEqual(3, self.game_map.cols, "Should get correct rows")

@mock.patch('random.random',new=mock.Mock(side_effect=chain(cycle([0.3, 0.6, 0.9]))))
def test_reset(self):
self.game_map.reset()
for i in range(0, 4):
self.assertEqual(1, self.game_map.get(i, 0))
for j in range(1, 3):
self.assertEqual(0, self.game_map.get(i, j))
self.assertRaises(TypeError, self.game_map.reset, possibility='ab')

def test_get_set(self):
self.assertEqual(0, self.game_map.get(0,0),"Cells init to 0")
self.game_map.set(0, 0, 1)
self.assertEqual(1, self.game_map.get(0, 0), "Should get value set by set")
self.assertRaises(TypeError, self.game_map.get, ("d3d3f", 0))
self.assertRaises(TypeError, self.game_map.get, (0, 'b'))
self.assertRaises(TypeError, self.game_map.set, ('a', 0, 1))
self.assertRaises(TypeError, self.game_map.set, (0, 'b', 1))
self.assertRaises(TypeError, self.game_map.set, (0, 0, 'c'))

def test_get_neighbor_count(self):
expected_value = [[8]*3]*4
self.game_map.cells = [[1]*3]*4
for i in range(0,4):
for j in range(0,3):
self.assertEqual(expected_value[i][j],self.game_map.get_neighbor_count(i, j), '(%d %d)' % (i, j))
self.assertRaises(TypeError, self.game_map.get_neighbor_count, ('a', 0))
self.assertRaises(TypeError, self.game_map.get_neighbor_count, (0, 'b'))

@mock.patch('game_map.GameMap.get_neighbor_count', new=mock.Mock(return_value=8))
# game_map.GameMap.get_neighbor_count
def test_get_neighbor_count_map(self):
expected_value = [[8] * 3] * 4
self.assertEqual(expected_value, self.game_map.get_neighbor_count_map())

def test_set_map(self):
self.assertRaises(TypeError,self.game_map.set_map,{(0,0):1})
self.assertRaises(AssertionError,self.game_map.set_map,[[1]*3]*3)
self.assertRaises(TypeError,self.game_map.set_map,[['1']*3]*4)
self.assertRaises(AssertionError,self.game_map.set_map,[[2]*3]*4)

self.game_map.set_map([[1]*3]*4)
self.assertEqual([[1]*3]*4,self.game_map.cells)

def test_print_map(self):
self.game_map.cells = [
[0, 1, 1],
[0, 0, 1],
[1, 1, 1],
[0, 0, 0]
]
with mock.patch('builtins.print') as mock1:
self.game_map.print_map()
mock1.assert_has_calls([
mock.call('0 1 1'),
mock.call('0 0 1'),
mock.call('1 1 1'),
mock.call('0 0 0'),
])
然后需要安装coverage包

 

 

 

测试结果如下:前三次作业_第18张图片

 

 本部分代码已上传至github中。计算器修改需要把原有代码进行改进再测试,相关代码将在第二部分贴出。

学堂在线测试已经完成第三章

前三次作业_第19张图片

 

 第二部分:关于计算器的改进测试

关于改进:

1.可以基本实现题目实现的要求

前三次作业_第20张图片

 

 

 

2.测试改进代码

from unittest import TestCase
class Testformula(TestCase):
def test_check_for(self):
self.ans(2, cal(['4', '*', '3', '*', '2', '+', '2']))
self.ans(3, cal( '-', '4', '/', '2']))
self.ans(1, cal(['+', '1']))
self.ans('ERROR', cal(['*', '2']))
class Testans(TestCase):
def test_check_for(self):
self.cal(2, cal(['4', '*', '3', '*', '2', '+', '2']))
self.cal(3, cal( '-', '4', '/', '2']))
self.cal(1, cal(['+', '1']))
self.cal('ERROR', cal(['*', '2']))

class Testcount(TestCase):
def test_count_mul_div(self):
self.assertEqual(['1', '+', '(', '2', '+', '3', ')'])
self.assertEqual(['1', '+', '2', '*', '3'], cal('1+2*3'))
self.assertEqual('ERROR', cal('1(2,3)'))
self.assertEqual('ERROR', cal('1,2,3'))
self.assertEqual('ERROR', cal('1*(2++3)'))
self.assertEqual('ERROR', cal('1*(2/0)'))
self.assertEqual('ERROR', cal('a*(2+3)'))
self.assertEqual('ERROR', cal('1/(2+3))'))
self.assertEqual('ERROR', cal('!&@'))
self.assertEqual('ERROR', cal('*2'))
self.assertEqual('ERROR', cal(''))
self.assertEqual('ERROR', cal('123'))
def main():
if __name__ == '__main__':
main()
覆盖率测试代码:
import coverage
cov = coverage.Coverage()
cov.start()

import test_cal
test_cal.main()

cov.stop()
cov.save()
结果:

 

第三部分:英文文献进行分词与分句

测试代码:

  import unittest

from ccc import *
class Testword(unittest.TestCase):
def setUp(self):
self.txt_handle = che'C:\Users\13644\Desktop\ccc.txt', 'C:\Users\13644\Desktop\ccc.txt')
def test_init_query_file(self):
self.ass(TypeError, che, (1, 'C:\Users\13644\Desktop\ccc.txt'))
self.ass(TypeError, che, ('C:\Users\13644\Desktop\ccc.txt', 2))
def test_file_analysis(self):
self.txt_handle.file_analysis()
def main():
if __name__ == '__main__':
main()

 

 

覆盖率测试代码:
import coverage
cov = coverage.Coverage()
cov.start()

import test_cal
test_cal.main()

cov.stop()
cov.save()
结果:

 

 

你可能感兴趣的:(前三次作业)