一、前言
这篇博客是对软件工程导论的个人项目进行互评,项目要求实现一个简单的中小学数学卷子自动生成程序。我的搭档谢先衍同学使用Python完成了项目,而我则是使用java。尽管语言不同增加了一定的阅读成本,但是接触到另一种新语言并体会编程者发挥语言特性独特的心得,确实是拓展了眼界。一个项目,最终归结到不同问题,无论用什么语言,面临的问题都是一致的,但是语言的特性和编程者的思想却是和而不同,由此给人以启发
二、要求
用户:
小学、初中和高中数学老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
个人项目9月17日晚上10点以前提交至创新课程管理系统。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。迟交2天及以内者扣分,每天扣20%。迟交2天及以上者0分。
附表-1:账号密码
账户类型 | 账户 | 密码 | 备注 |
---|---|---|---|
小学 | 张三1 | 123 | |
张三2 | 123 | ||
张三3 | 123 | ||
初中 | 李四1 | 123 | |
李四2 | 123 | ||
李四3 | 123 | ||
高中 | 王五1 | 123 | |
王五2 | 123 | ||
王五3 | 123 |
附表-2:小学、初中、高中题目难度要求
小学 | 初中 | 高中 | ||
---|---|---|---|---|
难度要求 | +,-,*./ | 平方,开根号 | sin,cos,tan | |
备注 | 只能有+,-,*./和() | 题目中至少有一个平方或开根号的运算符 | 题目中至少有一个sin,cos或tan的运算符 |
?
三、功能检查
背景
环境:Python 3.11.5
软件:VScode
登录
命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码
成功登录的情况
测试:错误的账号密码
?
在错误的情况下,提示“请输入正确的用户名、密码”
测试:不符合格式的账号密码
在输入含多个空格的输入后,判断格式错误
出题
登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复
生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
成功出题
?
?
成功按指定数目出题,并且附带题号,题与题之间空有一行,在对应的用户文件夹之下生成以时间为名的题目文件
退出
成功退出到上一页面
测试:不在范围内的输入
?
不在范围内的输入会提示范围
测试:不规范的输入
?
不和规范的输入会被认为是字符串,进而判断是否是切换选项
测试:间隔少于1s的快速输入
存放生成题目的文件是按时间命名的,最低单位是秒。如果快速输入,1秒中输入多次呢?
?
结果是生成了第一次的文件
?
切换
成功切换
?
?
生成了不同类型的题目,并成功存入对应的目录之下
测试:错误输入
匹配的字符串只有三种,此外的字符串都会触发提示
?
总结
功能的测试完备,符合文档的需求,可以说作者在编写代码的时候非常娴熟精准,落实到了文档的每一个功能实现之中。虽然在一个测试中出现了点小问题,但考虑到并非文档指明的需求,无伤大雅。
?
四、代码分析
代码
account.py
#!/usr/bin/env python3.10.9
# -*- coding: utf-8 -*-
import json
class Account(object):
"""Account class.
Attributes:
account: The account, such as '张三1'.
password: The password of the account.
grade: The corresponding grade of the account, to generate exam with
different difficuty.
"""
def __init__(self, account, password, grade) -> None:
"""Init the account."""
self.account = account
self.password = password
self.grade = grade
class Accounts(object):
"""Accounts class, to manage accounts.
Attributes:
accounts: The accounts list, read from accounts.json.
"""
def __init__(self) -> None:
"""Read accounts from accounts.json to init the accounts list."""
self.accounts = []
with open("accounts.json", "r", encoding="utf-8"