中小学生试卷自动生成程序--jialin大佬代码分析
结对编程代码评价
有幸和小jialin结对编程。拿到jialin的代码后。
我先是尝试用idea运行。结果报了如下错误。


无法加载主类,再尝试用eclipse运行。


好的,可以运行,那为什么用idea跑不了呢?
度娘了一下,发现是环境变量设置的问题。
接下来步入正题,开始看代码。
打开工程,发现在只有一个class文件,头大,这样的架构肯定不够好。一个一个函数看下来吧。
第一个函数是 CheckNameAndPassword(),用于检测账号密码是否正确
boolean CheckNameAndPassword(User []user,User indata) {
for(int i=0;i<9;i++) {
if(indata.name.equals(user[i].name) && indata.password.equals(user[i].password)) {
indata.grade=user[i].grade;
return true;
}
}
return false;
}
可以看出来jialin大佬这里是把用户写死了的,先产生了满足需求的9个User,这样写的好处是执行的效率比较高,缺点是添加用户比较麻烦,要对代码进行改动。
接下来是TestDemo,小jialin把所有的逻辑都写在了这里面。看第一段我发现了一个代码风格上的问题。代码如下:
if(xx!=0) indata=Login();
grade=ChooseGrade(indata);
xx=PaperProduce(indata.name,grade);
在符号如“=”两边最好空格一下,这样代码看起来会更清晰。改后的如下:
if(xx != 0) indata = Login();
grade = ChooseGrade(indata);
xx = PaperProduce(indata.name, grade);
改了之后是不是好看了一点点,继续往下看。
接下来分别是选择出题难度,保存试卷,产生试卷,产生题目,判断是否重复的函数。
重点看一下查重函数itemIsExist()
static boolean itemIsExist(String problem, String username,String grade) {
String file_path= "papers\\"+username+"\\"+grade;
File folder = new File(file_path);
String all = "";
File files[] = folder.listFiles();
for(File f : files) {
InputStream is = null;
try {
is = new FileInputStream(f);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
byte content[] = new byte[1024];
try {
is.read(content);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
try {
all += new String((content),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(all.indexOf(problem) == -1) {
return false;
}else {
return true;
}
}
可以看到每次查重都要去读文件。将已经产生的题目全部读出,再一一对比。每次读文件都会使用比较多的资源,我觉得可以把产生的题目先存入字符串组,新产生题目与字符串组内题目对比,若重复则重新产生一道,最后将整字符串组写入,这样可以减少读写文件带来的消耗。
jialin大佬的产生题目的逻辑写得很好,可以随机的产生符合需求的各种形式的题目,还可以给题目加上括号。同时防止了不合理括号产生。
接下来实际运行体验一下。


基本满足需求,试卷也成功产生了。接下来输入一些奇怪的东西测试一下程序的稳定性。


发现了一点不稳定的地方,当要求输入试卷数量时如果没有输入数字,随意输入一个字符串,程序就会终止。这是因为在该逻辑中使用了Scanne输入的nextInt(),当输入非整数时,会抛出类型不匹配的异常,可以在这里进行一下异常处理,当输入不为整数的时候要求重新输入。
总结
总体来看,jialin大佬代码很好的完成了题目的各项需求,只是在代码风格上还有一些地方可以提高,整个工程的架构也可以做的更好,一个class写到底的方式调试的时候实在是太不友善了,jialin大佬凭着清晰的逻辑能力完成了工程,但是我看起来的时候就有点头疼了。看了jialin的代码之后,再反思一下我自己写的,发现自己写的一些东西其实是有些多余的,命令提示也可以做的更友好一些,整个工程的耦合程度也可以进一步降低。
中小学生试卷自动生成程序--jialin大佬代码分析的更多相关文章
- ExtJS6的中sencha cmd中自动创建案例项目代码分析
在之前的博文中,我们按照sencha cmd的指点,在自己win7虚拟机上创建了一个案例项目,相当于创建了一个固定格式的文档目录结构,然后里面自动创建了一系列js代码.这是使用sencha cmd自动 ...
- 中小学数学卷子自动生成程序--对G同学的代码分析
前几天,在课程要求下完成了个人项目的项目工程编写,即一个中小学数学卷子自动生成程序. 程序主要功能是用户预设账户登录后可以选择等级进行对应的小中高的数学卷子对应出题生成txt文本. 本文针对partn ...
- EF自动生成的模型edmx代码分析
edmx代码分析 本文分析Entity Framework从数据库自动生成的模型文件代码(扩展名为edmx). 1. 概述 本文使用的数据库结构尽量简单,只有2个表,一个用户表和一个分公司表(相当于部 ...
- Demo005 小学四则运算自动生成程序
目录 小学四则运算自动生成程序 0.传送门 1.题目要求 2.功能实现 2.1 总体设计 2.2 用户欢迎界面 2.3 用户功能界面 2.4 屏幕输出 2.5 文本输出 2.6 获取时间 2.7 用户 ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(3)
这个系列已经写了5篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...
- JavaBean 基础概念、使用实例及代码分析
JavaBean 基础概念.使用实例及代码分析 JavaBean的概念 JavaBean是一种可重复使用的.且跨平台的软件组件. JavaBean可分为两种:一种是有用户界面的(有UI的):另一种是没 ...
随机推荐
- java实现有道翻译爬虫
我的博文地址 https://www.cnblogs.com/lingdurebing/p/11618902.html 使用的库 1.commons-codec 主要是为了加密,可以直接用java原生 ...
- 3D漫游的分类 3D Navigation Taxonomy
在2001年CHI发表的论文中1,Tan等人提出了一种对3D漫游的分类方法. 当时关于3D漫游(3D Navigation)的研究主要分为两种:一种是发掘有关漫游的认知原则,一种是开发一些具体的漫游技 ...
- CSS技巧 (2) · 多列等高布局
前言 最近,面试的时候都碰到一些关于利用CSS实现多列等高布局或者一侧宽度固定,另一侧宽度自适应的问题,下面稍微总结一下: 先看一道题目 巧妙的多列等高布局 规定下面的布局,实现多列等高布局,要求两 ...
- JVM(三)初始化
字节码指令和符号引用.直接引用 1.主动引用和被动引用 主动引用:虚拟机规定只有满足四个情况的的情况下,才会进行主动引用. 被动引用:除过四种情况的引用是被动引用. 只有主动引用才会初始 ...
- Android_布局
<该文章参考各大博客以及书籍总结而来,如有问题欢迎指出^ ^> 一.五大传统布局+新布局 线性布局——LinearLayout 相对布局——RelativeLayout 帧布局——Fram ...
- (4)一起来看下mybatis框架的缓存原理吧
本文是作者原创,版权归作者所有.若要转载,请注明出处.本文只贴我觉得比较重要的源码,其他不重要非关键的就不贴了 我们知道.使用缓存可以更快的获取数据,避免频繁直接查询数据库,节省资源. MyBatis ...
- redis在mac上的下载安装
redis官网下载压缩包: 在终端进入下载后的目录,然后: 解压:tar zxvf redis-5.0.5.tar.gz 移动到:sudo mv redis-5.0.5 /usr/local 切换到: ...
- mpvue 页面预加载,新增preLoad生命周期
存在的必要性:mpvue开发微信小程序,在页面跳转到新页面的过程中会有200ms左右的延迟,这个200ms如果用来请求新页面的接口,那么跳转到新页面或许已经渲染好了页面. 就是两种方式: 1.新页面跳 ...
- ef core实现软删除
很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...
- 二次函数,为什么a>0就可以知道开口向上.
最近自考. 学习高等数学. 学习高等数学过程中发现高中数学不会,,于是乎开始补高中数学. 学习高中数学过程中又发现初中数学有的不会,,于是乎开始补初中数学.. 可怕(→_→). 今天遇到一个二次函数, ...