中小学自动试卷生成程序优缺点分析

一.项目的需求分析:

1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

二.优点分析:

1.熟悉java API,用较少的代码实现了删除不合法算式的功能。

Pattern pattern1=Pattern.compile("\\(\\d+\\)") ;  Pattern pattern2=Pattern.compile("^\\([^()]+\\)=$") ;
        Matcher matcher1=pattern1.matcher(question) ; Matcher matcher2=pattern2.matcher(question) ;
        if(matcher1.find()==false && matcher2.find()==false)
        {
            if(result==(int)result && result<1000 && result>=0)
            {
                answerList.add((int)result) ; return true ;
            }
            else return false ;
        }
        else return false ;

使用正则表达式,将不合法算式删除。

2.有效地将功能优化。考虑到实际情况,将小学试卷中算式结果超过1000或小于0的算式删除。

if(result==(int)result && result<1000 && result>=0)
{
    answerList.add((int)result) ; return true ;
}
else return false ;

3.撰写了实验文档,让阅读者更快地理解代码设计思路。

4.能够学以致用。计算机系统所学到的代码优化方法,运用到了代码中。

protected void CreateQuestion()
    {
        for(int r=0 ; r<questionAmount ; r++)
        {
            String question="" ; int length ; int left=0 ; int right=0 ; 
            do
            {
                length=(int)(1+Math.random()*(5-1+1)) ;//代码优化,减少计算次数
            }while(length==1) ;
            for(int i=0 ; i<length ; i++)
            {
                if(i==length-1) 
                {
                    question+=Integer.toString((int)(1+Math.random()*(100-1+1))) ;
                    if(left!=right)
                    {
                        for( ; ; )
                        {
                            question+=")" ; right++ ;
                            if(right==left) break ;
                        }
                    }
                    question+="=" ;
                }
                else
                {
                    if(Math.random()*(100-1+1)<20)
                    {
                        question+="(" ; left++ ; 
                    }
                    question+=Integer.toString((int)(1+Math.random()*(100-1+1))) ;
                    if(Math.random()*(100-1+1)<20 && right<left)
                    {
                        question+=")" ; right++ ; 
                    }
                    question+=operatorChar[(int)(1+Math.random()*(7-1+1))] ;
                }
            }
            AddOperator(question) ;
            question=Temp ;
            if(TestQuestion(question))
                questionList.add(question) ;
            else r-- ;
        }
    }

5.变量名简单易懂,代码思路清楚。

缺点:

我觉得唯一的缺点就是将所有的类写在了同一个文件里,虽然容易查看,但是破坏了java的面向对象特性。

看到了别人的代码后,我才发现自己好菜。原来一直以来不是我们菜,而是我自己菜。虽然住在同一间宿舍下,但是代码差距也太大了。我的代码就是java包装下的C++代码,我对于java API完全不了解,也忽视了java的面向对象特性。差距很大,还剩半年,要好好加油了。

猜你喜欢

转载自www.cnblogs.com/jimmy-xue/p/11553171.html