第五周作业
一、理论学习
1、学习慕课第九、十章节。


2、学习软件工程讲义“需求”章节。
学习体会:
(1)需求分析主要通过小组讨论、面谈、问卷调查等方式完成,是开发软件的一个前提,在本门课程的学习过程中,我们主要采用小组讨论并结合网上查资料的方式来进行需求的分析。
(2)在不完全确定软件功能时,可以先写个软件的最初版本,发布出去让用户体验,指定一个反馈窗口,用户在使用过程中觉得缺少哪些功能或者对哪些功能有什么不满意的就可以通过反馈窗口反馈给开发人员,然后对其进行改进,这样比较合理,就像微信一样,最初的功能很简单,后面通过用户反馈就产生了更多的需求,并合理选择进行了开发。
(3)根据慕课上面讲的软件配置和项目管理,在Tower上进行了相关尝试,这个工具比较简单,用起来也比较方便。
二、实践学习(成员:曹宇轩,刘昕昕)
1、熟悉Tower上相关项目管理工作。
(1)建立了诗词大赛项目。
(2)在项目中安排了相应的任务,并进行了分工,见下图。
小组目前采用两人合作轮流编程形式,每周由一人主要负责编写相关程序,另一人编写辅助性程序,并对所有代码提出修改意见,通过微信语音交流进行讨论,找出功能上的不足以及一些bug,最后对其进行修改。

2、编写代码实现诗词大赛基本功能,代码见:https://github.com/lxxlccly/rjgc4。
本周主要是完成诗词大赛基本功能代码,编写过程如下:
(1)首先是生成题目,先在相应文件中随机选取一句诗(可以从简单的唐诗三百首里选取,也可以从复杂的58000首诗里选取),然后随机产生几个对这句诗进行干扰的中文字符,将它们组合成包含12个字的题目,并打乱字符顺序,使代码如下:
def get_sentence(self):
'''获得一个诗句
#从58000首诗里随机获取题目的代码
while 1:
random_poet0 = random.randint(0, 57999)
if random_poet0 not in self.poet_number:
self.poet_number.append(random_poet0)
break
random_poet = self.poet_number[len(self.poet_number) - 1]
address = './poet/poet.song.' + str(int(random_poet // 1000 * 1000)) + '.json'
with open(address, 'r', encoding='utf-8') as load_f:
load_dict = json.load(load_f)
sentence_amount = len(load_dict[int(random_poet % 1000)]['paragraphs'])
random_sentence = random.randint(0, sentence_amount - 1)
sentences = re.findall(r'[\u4E00-\u9FA5]+',
load_dict[int(random_poet % 1000)]['paragraphs'][random_sentence])
random_sentence = random.randint(0, len(sentences) - 1)
sentence = sentences[random_sentence]
self.right_answer.append(sentence)
words = re.findall(r'[\u4E00-\u9FA5]', sentence)
self.questions.append(words)
'''
#从唐诗三百首里随机获取题目的代码
address = './poet/tangshisanbaishou.json'
with open(address, 'r', encoding='utf-8') as load_f:
load_dict = json.load(load_f)
all_poet = []
for i in range(len(load_dict['content'])):
all_poet = all_poet + load_dict['content'][i]['content']
while 1:
random_poet = random.randint(0, len(all_poet) - 1)
if random_poet not in self.poet_number:
self.poet_number.append(random_poet)
break
sentence_amount = len(all_poet[random_poet]['paragraphs'])
random_sentence = random.randint(0, sentence_amount - 1)
sentences = re.findall(r'[\u4E00-\u9FA5]+',
all_poet[self.poet_number[len(self.poet_number) - 1]]['paragraphs'][random_sentence])
if len(sentences) == 0:
random_sentence = 0
else:
random_sentence = random.randint(0, len(sentences) - 1)
sentence = sentences[random_sentence]
sentence = langconv.Converter('zh-hans').convert(sentence)
self.right_answer.append(sentence)
words = re.findall(r'[\u4E00-\u9FA5]', sentence)
self.questions.append(words)
def get_disturb(self, number, len_sentence):
'''获得对诗句进行干扰的汉字'''
len_disturb = 12 - len_sentence
i = 0
while i < len_disturb:
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xfe)
val = f'{head:x} {body:x}'
word = bytes.fromhex(val).decode('gb2312', errors='ignore') #或者用decode('gbk')
self.questions[number].append(word)
i += 1
def get_question(self, number):
'''获得题目'''
print('第%u题:' % int(number + 1))
print('请从以下十二个字中拼凑出一句诗:')
self.get_sentence()
self.get_disturb(number, len(self.right_answer[number]))
random.shuffle(self.questions[number])
print(self.questions[number])
(2)通过键盘输入来进行回答,并限制回答时间,超过60秒自动跳到下一题(计时器主要通过多线程的方式来完成,涉及多线程的相关代码见time_limit.py文件),每次做完一个题后自动判断回答是否正确,并显示当前得分,代码如下:
def start(self):
'''开始游戏'''
for i in range(self.question_amount):
print('当前得分:%u' % self.grade)
self.get_question(i)
a_threading = time_limit.MyThread(target=self.answer_question)
a_threading.start()
#time.sleep(LIMIT_TIME) 这两句做界面的时候用
#a_threading.stop()
a_threading.join()
if a_threading.get_result() == 0:
self.answers.append('')
if self.answers[i] == self.right_answer[i]:
print('回答正确')
self.grade += 100/self.question_amount
else:
print('回答错误,正确答案为:' + self.right_answer[i])
self.print_grade()
@time_limit.limit_decor(LIMIT_TIME) # 超时设置(s)
def answer_question(self):
'''回答问题'''
print('请输入答案:')
answer = input()
self.answers.append(answer)
return 1
(3)代码中题目总数设置为10,做完10个题后对做题结果进行打印,代码如下:
def print_grade(self):
'''打印成绩'''
print('总结:')
for i in range(len(self.right_answer)):
if self.answers[i] == self.right_answer[i]:
print('{0:>2}、回答正确。您的回答:{1};正确答案:{2}'
.format(i + 1, self.answers[i], self.right_answer[i]))
else:
print('{0:>2}、回答错误。您的回答:{1};正确答案:{2}'
.format(i + 1, self.answers[i], self.right_answer[i]))
print('您的总得分为:%s分' % str(self.grade))
(4)最终程序见 https://github.com/lxxlccly/rjgc4 下的scdh.py文件,最后对代码规范进行了检查,结果如下,逐项对其进行了修正。

(5)对测试代码进行了编写,见test_PoetGame.py文件,test_start测试函数暂时未编写,其它测试均通过。

工作总结:
(1)对Tower上的大部分功能都有了一定了解,能够正常运用此软件对项目进行管理,所有成员能够及时掌握项目进度情况。
(2)代码编写的时候,仍有很多不规范的地方没有发现,编程意识还不够强,有待提高。
(3)由于回答问题的时候涉及键盘输入,通过查找资料,可以用多线程、信号等方法来实现,但是在windows环境下,“信号”方法中有一个函数无法运行,所以最后进行定时的时候,采用的时多线程方式,使用多线程时也有一个缺点,当超时未回答时,系统会结束上一个线程并自动跳到下一题,但此时如果在键盘上输入,系统会将输入内容默认为是上一次的输入,如果超时了进行下一题回答时需要先按一下enter键才能正确进行下一题的回答。这是现阶段存在的一个bug,当然在后面编写完界面之后,不需要键盘进行输入,只需要进行点击就可答题,所以后面就不存在这个问题了。
三、学习记录
| 学习时间 | 学习内容 |
| 3.16 18:00-21:00 | 慕课第九、十章节 |
| 3.17 13:00-14:00 | 讲义“需求”章节 |
|
3.17 14:00-16:00 3.18 8:00-12:00 3.20 14:00-16:00 |
编写程序相关功能,包括题目生成,回答、计时计分以及代码规范性分析 |

浙公网安备 33010602011771号