软件工程结对项目-四则运算题目生成

软件工程结对项目-四则运算题目生成

一.项目的Github地址链接:

https://github.com/guangyezhao/the_sec_se_porject

二.选题、小组讨论及分工:

我们仔细看了三道题目,都是有一定的难度,在讨论之后,我们决定选择第二个,四则运算生成。打算做第三阶段的图形界面。
我们大致讨论了一下这个程序该如何写。因为以前有做过四则运算的题目,知道运算过程可以直接用逆波兰表达式,进栈,出栈还是比较方便。生成题目也可以设定一些随机数,随机数的个数、符号和括号的位置。第一阶段最麻烦的还是如何判断重复,在小组讨论时,我们还没有解决这个问题。
因为我的编程能力较弱,最终决定由赵广烨来编写功能部分,即如何生成题目和解题目。我来编写图形界面的部分。所以以下的部分主要是对于图形界面编写的说明。

三.psp预估耗时表格(对于图形界面时间的预估):

在这里插入图片描述

四.设计实现过程:

根据题目的要求,因为要计时,所以应该一道一道题显示。所以一道题对应一个答题页面。对于答题页面建立一个类QuestionWindow。本次的答题结果对应一个页面,建立有一个类ResultWindow。历史记录对应一个页面,建立一个类HistoryWindow

类的调用关系大致如下:
在这里插入图片描述

倒计时功能:
我考虑到出的四则运算的题目还是比较复杂的,并且还要输入。所以将一道题的答题时间从老师说的20s改为80s。
具体实现我百度了倒计时器。大致原理就是让标签显示数字,然后程序睡1s(time.sleep(1)),
数字-1,然后用update更新。

历史记录功能:
为了在历史记录中知道在哪个时间点(年月日小时分钟)做的题,本程序首先在调用time函数获取当前时间。
将本次做题的时间点、总题数、正确题数、正确率都写入到一个叫history.txt的文件中。
注意写入的方式是追加,这样可以保证以前记录的答题历史不会被清除。每做一次题就会新增一个记录。
如果需要展示历史记录,点击show history按钮。它会读入所有的历史记录,并展现在历史记录窗口中。

五.问题与解决:

其实我之前从来也没用过python。所以这次很多时间都是花在搜索python的语法和tkinter的用法上了。不过好在二者都比较简单。

一开始我没有定义类,很多点击的交互我都是直接用函数来创建的。即先定义一个主窗口window,所有功能都是基于这个窗口实现的。新的一页直接覆盖旧的一页。但是因为结果页面不需要倒计时,可是因为倒计时需要自动更新,无法覆盖。于是我想到每一次点击后,如果要生成新的页面,那就先把旧页面摧毁,再建立新页面。与此同时我增加了类的创建。

但是,无论是第一种还是第二种,运行程序后都会出现函数调用的错误。这个问题一直困扰了我三天。因为界面比较特殊,报错不会显示在哪里出错。于是仔细分析,是如果我点了下一题,它会出现这种错误。所以应该是倒计时部分出现的问题。就是点击按钮后虽然会摧毁本页面,但是倒计时部分的程序还会运行,但是本页面已经不存在了,倒计时的标签不存在,所以出现错误。我想了很多办法,但是因为每一个答题界面都要开启一个新的倒计时器。因为我用的全局变量控制所有的倒计时器。所以不可能让旧页面的倒计时停止,同时新页面的运行。大概尝试了四五种无效的方法,最后想到了可以把倒计时用到的int型数据变成,这个类的一个成员,而不是全局变量。即在名称前加self. ,这样子,每个倒计时器就只能有本页面来控制了。当点击“next question”时,首先将self.total_time改为-1,这样子本次倒计时的循环无法进行,接着把本页面摧毁。用这种方法果然不会报错了。

六.代码说明:

1. 主函数:

在这里插入图片描述
首先获取当前时间点(即本次做题的时间)。
读入由c++程序生成的问题。
读入所有问题的答案。
打开一个页面,开始答题。

2. QuestionWindow类:在这里插入图片描述在这里插入图片描述在这里插入图片描述

类中的属性:
self.root,即窗口,question显示题目,answerbox用户输入答案的空白框,hind对于输入的格式说明,nextq下一道题的按钮,close_button关闭按钮,time_label显示倒计时的秒数。

类的成员函数:
OnNext():点击按钮调到下一道题,或者倒计时时间到了自动跳到下一道题。要把total_time改为-1,并摧毁原页面。再建立新页面。这个页面是答题页面或结果页面。
close():关闭本页面。

注意倒计时器的写法:

count是已经过去的时间,total_time是总时间,在label上显示remain_time剩余时间。用update来每次更新标签上的秒数。time.sleep(1),程序睡1s是为了记录1s的时间,1s过去count+1。这个循环在count>total_time时结束,或者在点击了“next question”后,将total_time赋值-1,循环也无法继续进行。

3. ResultWindow类:

在这里插入图片描述
在这里插入图片描述
类中的属性:
self.root,即窗口,line1显示本次的总题数,line2显示用户答对的题数,line3显示正确率,show_history_button点击后展示历史记录,close_button点击后关闭本窗口。

类的成员函数:
show_history():摧毁本页面,跳转到历史记录页面。
quit_window():关闭本页面。

注意:

要将时间点、总题数、正确的题数、正确率存入history.txt,即历史记录文件。

4. HistoryWindow类:在这里插入图片描述在这里插入图片描述

类中的属性:
self.root,即窗口,scroll滚动条,list显示历史记录的listbox,close_button点击后关闭本窗口。

类的成员函数:
quit_window():关闭本页面。

七.操作说明:

首先在cmd命令行输入下列语句之一

  1. 结对项目.exe normal + GUI (只有加法的题)
  2. 结对项目.exe normal - GUI (只有减法的题)
  3. 结对项目.exe normal * GUI (只有乘法的题)
  4. 结对项目.exe normal ** GUI (有加减乘除和乘方,并且乘方是用**表示)
  5. 结对项目.exe normal ^^ GUI (有加减乘除和乘方,并且乘方是用^^表示)

输入完后,再输入python gui.py
就可以开始答题了。
在空白框中输入答案,点击“next question”按钮或者时间到0,都会跳到下一道题。
直到做完,会显示结果页面。在结果页面可以点击“show history”按钮查看所有历史记录。
在所有页面都可以点击“close”按钮来关闭页面,结束本次答题。

八.实际使用时间和预估时间对比psp表格:在这里插入图片描述

九.心路历程与收获:

这个结对项目我感觉自己不管和谁一起做都会拖别人后腿。还好赵广烨不嫌弃我。因为后半学期我选了三门专选加英语,所以考试周非常忙。这个时间赵广烨已经把c++的功能部分写完了。于是在考完试后,由我来编写图形界面的部分。
其实python和tkinter都挺简单的,问题是我以前都没用过,于是碰到一个问题查一个。花费在编写代码的时间上不算多。主要是搜索python的语法和tkinter的用法。做完之后挺开心的。毕竟学会了python的一些简单用法和tkinter的用法。不得不说,python要比c方便多了。
接着是那个一直困扰着我的问题,最终还是自己用类的思想解决了,这是我觉得最开心的事。
最后如何把python和c++结合起来,用c++调用python,我和赵广烨百度了好多,试验了好多方法,都不成功,最后只好用最简单的方式。输入两次cmd命令。
这次我使用的时间比上次少多了,大致是因为赵广烨已经把难的部分解决了。不过我自己还是对于项目有一些贡献的。
最后感谢网上各位大神和我周围同学尤其是赵广烨对我的帮助,如果不是他们,我觉得自己绝对做不下来这个项目。前路还长,我知道我还有很多东西要学,很多事情要经历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值