个人项目分析
作者:互联网
个人项目要求:
用户:
小学、初中和高中数学老师。
功能:
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 public static void Create(int a, int level) { //产生整张卷子 2 String paper = ""; 3 System.out.println("请输入10~30的整数来生成题目或-1退出登录或0进行难度选择"); 4 Scanner in = new Scanner(System.in); 5 String num = in.next(); 6 if (num.equals("0")) { //进入难度选择 7 ChangeLevel(); 8 } else { 9 if (num.equals("-1")) { //退出登录 10 System.out.println("您已退出当前用户"); 11 int change = ValidUser(); 12 Login(change); 13 } else { 14 int test1 = 0; 15 try { 16 test1 = Integer.parseInt(num); //输入的字符串如果可以转化为int 17 } catch (Exception e) { 18 } 19 if (test1 >= 10 && test1 <= 30) { 20 int nu = Integer.parseInt(num); 21 if (a > 0 && a < 4) { 22 //创建文件夹 23 Date date = new Date(); 24 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); 25 String time = dateFormat.format(date); //获得当前时间 26 File file = new File("src/张三" + Integer.toString(a)); 27 String str2 = "张三" + Integer.toString(a); 28 if (file.mkdirs()) //判断是否已经生成文件夹 29 { 30 System.out.println("成功创建文件夹" + str2); 31 } else { 32 System.out.println("文件夹" + str2 + "已存在,将继续存放在该文件夹中"); 33 } 34 String pro = ""; 35 for (int i = 0; i < nu; i++) { //根据当前难度选择出题 36 if (level == 1) { 37 pro = GenerateProblem.CreateAPri(i); 38 } else { 39 if (level == 2) { 40 pro = GenerateProblem.CreateAMid(i); 41 } else { 42 pro = GenerateProblem.CreateAHig(i); 43 } 44 } 45 boolean FindFlag = true; 46 String[] FilesName = file.list(); 47 for (String str : FilesName) { //对于题目进行查重 48 try { 49 FileReader fileReader = new FileReader("src/" + str2 + "/" + str); 50 BufferedReader bufferedReader = new BufferedReader(fileReader); 51 String ComStr1 = ""; 52 String ComStr2 = ""; 53 ComStr1 = bufferedReader.readLine(); 54 ComStr2 = pro.substring(3); 55 if (ComStr1.substring(3).equals(ComStr2)) { 56 FindFlag = false; 57 } 58 bufferedReader.close(); 59 fileReader.close(); 60 } catch (IOException e) { 61 e.printStackTrace(); 62 } 63 if (FindFlag == false) { 64 break; 65 } 66 } 67 if (FindFlag == true) { 68 paper = paper + pro + '\n' + '\n'; 69 } else { 70 i--; 71 } 72 } 73 try { //生成文件 74 FileWriter fileWriter = new FileWriter("src/" + str2 + "/" + time + ".txt"); 75 fileWriter.write(paper); 76 fileWriter.close(); 77 System.out.println("成功生成试卷!"); 78 } catch (IOException e) { 79 e.printStackTrace(); 80 } 81 } 82 83 if (a > 3 && a < 7) { 84 //创建文件夹 85 Date date = new Date(); 86 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); 87 String time = dateFormat.format(date); //获得当前时间 88 File file = new File("src/李四" + Integer.toString(a - 3)); 89 file.mkdir(); 90 String str2 = "李四" + Integer.toString(a - 3); 91 if (file.mkdirs()) { 92 System.out.println("成功创建文件夹" + str2); 93 } else { 94 System.out.println("文件夹" + str2 + "已存在,将继续存放在该文件夹中"); 95 } 96 String pro = ""; 97 for (int i = 0; i < nu; i++) { 98 if (level == 1) { 99 pro = GenerateProblem.CreateAPri(i); 100 } else { 101 if (level == 2) { 102 pro = GenerateProblem.CreateAMid(i); 103 } else { 104 pro = GenerateProblem.CreateAHig(i); 105 } 106 } 107 boolean FindFlag = true; 108 String FilesName[] = file.list(); 109 for (String str : FilesName) { 110 try { 111 FileReader fileReader = new FileReader("src/" + str2 + "/" + str); 112 BufferedReader bufferedReader = new BufferedReader(fileReader); 113 String ComStr1 = ""; 114 String ComStr2 = ""; 115 ComStr1 = bufferedReader.readLine(); 116 ComStr2 = pro.substring(3); 117 if (ComStr1.substring(3).equals(ComStr2)) { 118 FindFlag = false; 119 } 120 bufferedReader.close(); 121 fileReader.close(); 122 } catch (IOException e) { 123 e.printStackTrace(); 124 } 125 if (FindFlag == false) { 126 break; 127 } 128 } 129 if (FindFlag == true) { 130 paper = paper + pro + '\n' + '\n'; 131 } else { 132 i--; 133 } 134 } 135 try { 136 FileWriter fileWriter = new FileWriter("src/" + str2 + "/" + time + ".txt"); 137 fileWriter.write(paper); 138 fileWriter.close(); 139 System.out.println("成功生成试卷!"); 140 } catch (IOException e) { 141 e.printStackTrace(); 142 } 143 } 144 145 if (a > 6 && a < 10) { 146 //创建文件夹 147 Date date = new Date(); 148 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss"); 149 String time = dateFormat.format(date); //获得当前时间 150 File file = new File("src/王五" + Integer.toString(a - 6)); 151 file.mkdir(); 152 String str2 = "王五" + Integer.toString(a - 6); 153 if (file.mkdirs()) { 154 System.out.println("成功创建文件夹" + str2); 155 } else { 156 System.out.println("文件夹" + str2 + "已存在,将继续存放在该文件夹中"); 157 } 158 String pro = ""; 159 for (int i = 0; i < nu; i++) { 160 if (level == 1) { 161 pro = GenerateProblem.CreateAPri(i); 162 } else { 163 if (level == 2) { 164 pro = GenerateProblem.CreateAMid(i); 165 } else { 166 pro = GenerateProblem.CreateAHig(i); 167 } 168 } 169 boolean FindFlag = true; 170 String FilesName[] = file.list(); 171 for (String str : FilesName) { 172 try { 173 FileReader fileReader = new FileReader("src/" + str2 + "/" + str); 174 BufferedReader bufferedReader = new BufferedReader(fileReader); 175 String ComStr1 = ""; 176 String ComStr2 = ""; 177 ComStr1 = bufferedReader.readLine(); 178 ComStr2 = pro.substring(3); 179 if (ComStr1.substring(3).equals(ComStr2)) { 180 FindFlag = false; 181 } 182 bufferedReader.close(); 183 fileReader.close(); 184 } catch (IOException e) { 185 e.printStackTrace(); 186 } 187 if (FindFlag == false) { 188 break; 189 } 190 } 191 if (FindFlag == true) { 192 paper = paper + pro + '\n' + '\n'; 193 } else { 194 i--; 195 } 196 } 197 try { 198 FileWriter fileWriter = new FileWriter("src/" + str2 + "/" + time + ".txt"); 199 fileWriter.write(paper); 200 fileWriter.close(); 201 System.out.println("成功生成试卷!"); 202 } catch (IOException e) { 203 e.printStackTrace(); 204 } 205 } 206 } else { 207 Create(a, level); //重新进入Create函数 208 } 209 } 210 } 211 }
改变难度的函数:
1 public static void ChangeLevel() { //改变难度的函数 2 System.out.println("现在进行难度选择,输入格式为:切换为XX(小学,初中,高中)"); 3 Scanner input = new Scanner(System.in); 4 String str = input.nextLine(); 5 if (str.equals("切换为小学")) { 6 level = 1; 7 System.out.println("准备生成小学题目,请输入题目数量"); 8 Create(ID, level); 9 } else { 10 if (str.equals("切换为初中")) { 11 level = 2; 12 System.out.println("准备生成初中题目,请输入题目数量"); 13 Create(ID, level); 14 } else { 15 if (str.equals("切换为高中")) { 16 level = 3; 17 System.out.println("准备生成高中题目,请输入题目数量"); 18 Create(ID, level); 19 } else { 20 System.out.println("请输入小学、初中和高中三个选项中的一个"); 21 ChangeLevel(); 22 } 23 } 24 } 25 }
登陆界面函数:
1 public static void Login(int a) { //登录界面 2 if (a == 1 || a == 2 || a == 3) { 3 level = 1; 4 ID = a; 5 System.out.println("恭喜您!登陆成功!"); 6 System.out.println("当前选择为小学出题"); 7 System.out.println("准备生成小学数学题目,请输入生成题目数量,题目数量的有效范围为[10.30],(输入-1将退出当前用户,重新登录)(输入0将进入难度选择界面)"); 8 Create(a, level); 9 } 10 if (a == 4 || a == 5 || a == 6) { 11 level = 2; 12 ID = a; 13 System.out.println("恭喜您!登陆成功!"); 14 System.out.println("当前选择为初中出题"); 15 System.out.println("准备生成初中数学题目,请输入生成题目数量,题目数量的有效范围为[10.30],(输入-1将退出当前用户,重新登录)(输入0将进入难度选择界面)"); 16 Create(a, level); 17 } 18 if (a == 7 || a == 8 || a == 9) { 19 level = 3; 20 ID = a; 21 System.out.println("恭喜您!登陆成功!"); 22 System.out.println("当前选择为高中出题"); 23 System.out.println("准备生成高中数学题目,请输入生成题目数量,题目数量的有效范围为[10.30],(输入-1将退出当前用户,重新登录)(输入0将进入难度选择界面)"); 24 Create(a, level); 25 } 26 }
优点:
1、代码模块结构清晰
李牧宇同学将整个工程总体分为三个类:用户类、题目类和试卷类,实现了用户的数据保存模块,出对应小学/初中/高中难度题目的业务模块,以及生成的整张试卷的核心模块。在每个模块中对各个方法进行封装实现功能。
2、变量命名清晰规范,较好的遵循了编码规则。代码旁的注释简单明了,方便阅读,代码可读性高。
3、文件路径使用相对路径。文件路径具有相对路径和绝对路径两种形式,而绝对路径可能会使得程序的可重用性差,使得在别的终端上不能运行,而在程序中使用相对路径则会变的有极强的适应性,提高了代码健壮性。
4、交互性好
每一步的提示语都清楚明了,让用户即使输错了也会有相应的提示语句,不用担心输错而使程序终止
5、题目类核心逻辑清晰,设计巧妙。题目采用了数值与符号分离的方法来生成题目。先生成随机的操作数和具体的数值,之后以随机的通用符号连接数值。对于初高中的特有字符,选择将例如三角函数等特殊字符与数值绑定,存于数值所在的string数组中。在最后,通过逻辑加上括号运算。代码简单,逻辑清晰。
缺点:
1. UI界面并未单独成为一类,而是在主类试卷类中,高内聚低耦合,可能为后续的修改或迭代增加负担,需要重新编译,同时代码安全性可能得不到保障。
2、一次输出信息较多,但没有对输出的界面内容进行美化处理,例如加边框或居中等,可以采用文件流的方式美化UI
3、账号采用的是直接String[]存储,这就导致如果需要添加用户则需要修改代码,不利于交互与拓宽用户,可以使用数据库进行处理。
总结:
1、队友代码使用了许多静态方法,可以直接被主函数调用,节省空间提高了效率。同时,通过Java语言和自己的设计,在代码的可读性和可维护性还是不错的,但也有一些小问题,例如代码规范上需要再好好学习一下,以及在做设计上进行深度思考。总的来说,虽然本次我们两人选择的代码语言并不一样,但是在互相看代码的过程中,我们彼此都触发了新的思路,新的想法,同时也收获很多,期待结对项目的合作。
标签:题目,String,个人,level,System,项目分析,println,out 来源: https://www.cnblogs.com/eieieiei/p/16692619.html