个人项目:中小学数学卷子自动生成程序

项目需求简要概述:

本项目是要做一个能供老师使用,自动生成适应不同年级难度知识的数学试卷的程序。

附表-1:账户、密码

账户类型

账户

密码

备注

小学

张三1

123

 

张三2

123

 

张三3

123

 

初中

李四1

123

 

李四2

123

 

李四3

123

 

高中

王五1

123

 

王五2

123

 

王五3

123

 

附表-2:小学、初中、高中题目难度要求

 

小学

初中

高中

 

难度要求

+,-,*./

平方,开根号

sin,cos,tan

 

备注

只能有+,-,*./()

题目中至少有一个平方或开根号的运算符

题目中至少有一个sin,costan的运算符

 

 

项目设计:根据需求,搭档设计如下

  • 设计程序的登录模块:以便输入正确的用户名和密码后能登入账户,读取相关信息。
  • 设计登录后用户命令的相应模块:使用户能切换难度,退出登录和生成包含不同题目数量的试卷。
  • 设计试卷产生与保存模块:使试卷符合对应难度标准并按格式存储。

 所用语言 java jre1.8

分块分享:

1:登录的校验。

需要与已存在的数据库,或内建字符数组,文件等交互,来判断是否匹配,本例采用字符数组。

String userlist[] = {"张三1", "张三2", "张三3", "李四1", "李四2", "李四3", "王五1", "王五2", "王五3"};
String psdlist[] = {"123", "123", "123", "123", "123", "123", "123", "123", "123"};
String typelist[] = {"小学", "小学", "小学", "初中", "初中", "初中", "高中", "高中", "高中"};

for (int i = 0; i < m_actnum; i++)
        {
            if (username.equals(m_account[i].GetName()) && password.equals(m_account[i].GetPwd()))
            {
                m_user = m_account[i];
                flag = true;
                System.out.println("当前选择为" + m_user.GetType() + "出题");
                break;
            }
        }
        if (!flag)
        {
            System.out.println("请输入正确的用户名、密码");
        }

 

当两者全部匹配,登录成功,否则需重新输入用户名和密码

 

2:登录后相关操作的响应(利用正则表达式匹配字符串)

我们需要能退出登录,切换难度等,其中命令行切换难度本例使用了正则表达式,即java中的string.matches()方法,

相关推荐链接(来自菜鸟驿站):https://www.runoob.com/java/java-regular-expressions.html

正则表达式作为一种处理识别字符串的极其强大的方法,在许多场景下都能发挥其作用,且大部分高级语言均可使用。(c++11.0 版更新regax库,javastring方法以及pythonre库)

if (cmd.matches("-?\\d+"))
        {
            m_question_num = Integer.parseInt(cmd);
            flag = true;
            if (m_question_num != -1 && (m_question_num < 10 || m_question_num > 30))
                flag = false;
        }
        else
        {
            flag = false;
            if (cmd.length() > 3)
            {
                type = cmd.substring(3);
                if (!type.equals("小学") && !type.equals("初中") && !type.equals("高中"))
                {
                    System.out.println("请输入小学、初中和高中三个选项中的一个");
                }

 

3:题目生成逻辑

四则运算和数字均采用随机数生成来确定算式,不同的是难度分级下三角函数和开方平方的运算。本例对运算符号集整体定义,顺序排列,并根据不同年级取不同的开始值以便各年级能取到对应的符号。

for (int i = 0; i < m_special_num; i++)
                {
                    int special_symbol = rd.nextInt(special_max);  //临时存储特殊符号并判断是否符合要求
                    if (!flag)
                    {
                        if (difficult.equals("初中"))
                        {
                            if (i == m_special_num - 1)
                            {
                                special_symbol = rd.nextInt(special_max - 1) + 1;
                            }
                            if (special_symbol > 0 && special_symbol < 3 )
                            {
                               flag = true;
                            }
                        }
                        else if (difficult.equals("高中"))
                        {
                            if (i == m_special_num - 1)
                            {
                                special_symbol = rd.nextInt(special_max - 3) + 3;
                            }
                            if (special_symbol > 2 && special_symbol < 6 )
                            {
                                flag = true;
                            }
                        }
                    }

                    m_specials[i] = special_symbol;
            }

 

括号则随机插入,并最后检查无意义的括号(如(5)此类),但本例没有排查不改变原运算级的括号。

文件输出采取文件流,要注意的一点是,不同操作系统下字符编码集也许不同,为了使用中文这里推荐编码统一改为utf-8格式。

 1 String filename = dirname + "/" + df.format(new Date())+".txt";
 2
 3         File file = new File(filename);
 4
 5         if (!file.exists())
 6
 7             file.createNewFile();
 8
 9
10
11         FileOutputStream fop = new FileOutputStream(filename);
12
13         OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");

 

 

总结:

小伙伴使用的编程语言是java语言,可以看出,整体使用还是十分熟练的。下面来说一下我对该工程的看法。

优点:

1可扩展性好,突出了java语言的特点即面向对象编程。其对java的面向对象的分块设计使得各个部分相对独立,便于修改。

2代码书写格式规范,严格按照代码规范文档书写,英文释义也比较妥当。

缺点:

1注释很少,可在部分关键处增加注释,达到原代码可读性与帮助释义的平衡。

2:代码长度较长,可部分精简。

3:缺少部分项目未包含的交互提示,如登录无提示,生成试卷后也无提示(测试时会错认为出了bug)

运行效果展示:

01-19 17:06