四则运算程序
psp
PSP各个阶段 | 预估时间 | 实际时间 |
计划 | 20 | 20 |
需求分析 | 10 | 10 |
生成设计文档 | 7 | 9 |
设计与复审 | 10 | 15 |
代码规范 | 10 | 12 |
具体设计 | 30 | 30 |
具体编码 | 120 | 150 |
代码复审 | 60 | 60 |
测试 | 10 | 10 |
测试报告 | 7 | 8 |
计算工作量 | 5 | 5 |
事后总结 | 10 | 9 |
时间总计 | 299 | 338 |
具体代码:
登录(Login)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package szys; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.*; public class Login { public static void main(String args[]) { new Login(); } Login(){ JFrame w = new JFrame( "登录界面" ); w.setLayout( null ); w.setBounds( 50 , 50 , 800 , 750 ); //设置标签 JLabel a = new JLabel(); JLabel b = new JLabel(); JLabel c = new JLabel(); JLabel d = new JLabel(); JLabel e = new JLabel(); a.setText( "欢迎使用四则运算" ); b.setText( "账号:" ); c.setText( "密码:" ); d.setText( "注册" ); e.setText( "忘记密码" ); a.setBounds( 120 , 350 , 600 , 50 ); Font font = new Font( "欢迎使用四则运算" ,Font.PLAIN, 30 ); Font font1 = new Font( "账号:" ,Font.LAYOUT_LEFT_TO_RIGHT, 20 ); Font font2 = new Font( "密码:" ,Font.LAYOUT_LEFT_TO_RIGHT, 20 ); Font font3 = new Font( "注册" ,Font.LAYOUT_LEFT_TO_RIGHT, 20 ); Font font4 = new Font( "忘记密码" ,Font.LAYOUT_LEFT_TO_RIGHT, 20 ); a.setFont(font); b.setFont(font1); c.setFont(font2); d.setFont(font3); e.setFont(font4); a.setBounds( 250 , 350 , 300 , 50 ); b.setBounds( 200 , 450 , 100 , 50 ); c.setBounds( 200 , 500 , 100 , 50 ); d.setBounds( 10 , 670 , 50 , 20 ); e.setBounds( 700 , 670 , 100 , 20 ); w.add(a); w.add(b); w.add(c); w.add(d); w.add(e); //设置按钮 JButton jb1 = new JButton(); jb1.setText( "登录" ); jb1.setOpaque( true ); jb1.setBackground(Color.cyan); jb1.setBounds( 250 , 580 , 250 , 50 ); w.add(jb1); //设置图片 java.awt.Dimension dim1= new java.awt.Dimension( 800 , 300 ); //图片大小 java.awt.Dimension dim2= new java.awt.Dimension( 800 , 750 ); javax.swing.ImageIcon icon= new javax.swing.ImageIcon( "E:\\图片3.jpg" ); javax.swing.ImageIcon background = new ImageIcon( "E:\\图片1.png" ); JLabel labpic= new JLabel(icon); //不可以直接把图片加到顶级容器中,需要先将其设置为标签 JLabel labpic1= new JLabel(background); labpic.setBounds( 0 , 0 , 800 , 300 ); labpic1.setBounds( 0 , 0 , 800 , 750 ); labpic.setPreferredSize(dim1); labpic1.setPreferredSize(dim2); labpic1.setOpaque( false ); w.add(labpic); //再将标签加到顶级容器中 w.add(labpic1); //设置文本框 JPasswordField jt1 = new JPasswordField(); JTextField jt2 = new JTextField(); jt2.setBounds( 300 , 460 , 250 , 30 ); jt1.setBounds( 300 , 510 , 250 , 30 ); w.add(jt1); w.add(jt2); w.setVisible( true ); LoginListener ll= new LoginListener(w,jt2,jt1); jb1.addActionListener(ll); //监控按钮 } } //LoginListener的类 //监听事件 class LoginListener implements ActionListener{ private javax.swing.JTextField jt; //账号输入框对象 private javax.swing.JPasswordField jp; //密码输入框对象 private javax.swing.JFrame login; //定义一个窗体对象 public LoginListener(javax.swing.JFrame login,javax.swing.JTextField jt,javax.swing.JPasswordField jp) { this .login=login; //获取登录界面 this .jt=jt; //获取登录界面中的账号输入框对象 this .jp=jp; //获取登录界面中的密码输入框对象 } public void actionPerformed(ActionEvent e) { //利用get方法来获取账号和密码对象的文本信息,并用equal方法进行判断。最好不要用==,用==这个地方验证不过去。 if (jt.getText().equals( "2019310143029" )&&jp.getText().equals( "123" )) { new GuiDesign(); // 通过我们获取的登录界面对象,用dispose方法关闭它 login.dispose(); } else { } } } |
GuiDesign.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 | package szys; import java.awt.*; import java.awt.event.*; import javax.swing.*; import szys.Operation; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class GuiDesign { private JFrame mainWindow = new JFrame( "四则运算练习软件" ); //面板 private JPanel selectPanel = new JPanel(); private JPanel mainPanel = new JPanel(); private JPanel commandP = new JPanel(); private JButton JBRedo = new JButton( "重做" ); private JButton JBStart = new JButton( "开始做题" ); private JLabel JLUsersName = new JLabel( "请输入你的用户名:" ); private JLabel JLChooseOp = new JLabel( "请选择运算类型:" ); private JLabel JLNumberDigit = new JLabel( "请选择运算位数:" ); private JLabel JLBAnsTip = new JLabel( "输入答案" ); private JLabel JLBRemainTip = new JLabel( "余数" ); private JTextField JTFUserName = new JTextField( 8 ); //10的单位不是px 而是指定列数 private String[] operationType = { "+" , "-" , "*" , "/" , "混合" }; private String[] numberOfDigitType = { "1" , "2" , "3" , "4" }; private JComboBox<String> JCBOperationSelect = new JComboBox<String>(operationType); //JComboBox 泛型 需要加上<E> private JComboBox<String> JCBNumberOfDigit = new JComboBox<String>(numberOfDigitType); //显示题目的JLabel private JLabel[] JLBQuestions= new JLabel[ 10 ]; //显示正确答案的JLabel private JLabel[] JLBAnswers = new JLabel[ 10 ]; //显示用户答案是否正确的JLabel private JLabel[] JLBIsTrue = new JLabel[ 10 ]; private JTextField[] JTFUsersAnswer = new JTextField[ 10 ]; //定义变量时需要赋初值,不然会出现空指针异常问题 private JTextField[] JTFRemainder = new JTextField[ 10 ]; //设置Font private Font buttonFont = new Font( "微软雅黑" ,Font.PLAIN, 16 ); private Font JLBFont = new Font( "微软雅黑" ,Font.BOLD, 18 ); private Font JTFFont = new Font( "微软雅黑" ,Font.PLAIN, 18 ); private Font JLBAnsFont = new Font( "微软雅黑" ,Font.PLAIN, 16 ); //类型为Operation的questions数组,只有这个才和Operation类等等那些类关联起来 private Operation[] questions = new Operation[ 10 ]; //用户答案数组 private int [] userAnswer = new int [ 10 ]; //用户余数数组 private int [] remainder = new int [ 10 ]; private int scores ,n = 1 ; private JLabel JLBScores = new JLabel( "你的成绩为:" ); private JButton JBOpenFile = new JButton( "查看记录" ); private String chara = "+" ; private File pFile = new File( "四则运算记录" ); private int usedTime; boolean runFlag = false ; //runFlag默认为false private JPanel PTime = new JPanel(); private JLabel JLBRemainTime = new JLabel( "剩余时间:" ); private JTextField JTFWtime = new JTextField( "120" ); private JLabel JLBTime = new JLabel( "用时:" ); //LimitTime t = new LimitTime();//线程不可以在这里new //倒计时线程 class LimitTime extends Thread{ public void run() { runFlag = true ; int i = 120 ; usedTime = 0 ; while (runFlag && i >= 0 ) { JTFWtime.setText( "" +i); try { sleep( 1000 ); usedTime++; } catch (InterruptedException e) { JFrame jf = new JFrame(); JOptionPane.showMessageDialog(jf, "出现了未知问题,请重启程序" ); } i--; } //runFlag = false; for ( int j = 0 ;j < 10 ;j++) { if (JTFUsersAnswer[j].getText().equals( "" )) { JTFUsersAnswer[j].setText( "0" ); } } printAnswer(); //倒计时结束,则调用printAnswer()方法 JBStart.setText( "开始做题" ); JLBTime.setText( "用时:" +usedTime); } } public GuiDesign(){ //布局用户名&选择面板 selectPanel.setPreferredSize( new Dimension( 700 , 50 )); //selectPanel.setLayout(new GridLayout(1,6,25,20)); JLUsersName.setFont(JLBFont); selectPanel.add(JLUsersName); JTFUserName.setFont(JLBFont); selectPanel.add(JTFUserName); JLChooseOp.setFont(JLBFont); selectPanel.add(JLChooseOp); JCBOperationSelect.setPreferredSize( new Dimension( 50 , 25 )); //当selectPanel.setLayout那句存在时,这里的设置无效 selectPanel.add(JCBOperationSelect); JLNumberDigit.setFont(JLBFont); selectPanel.add(JLNumberDigit); JCBNumberOfDigit.setPreferredSize( new Dimension( 50 , 25 )); selectPanel.add(JCBNumberOfDigit); //布局主面板 mainPanel.setPreferredSize( new Dimension( 700 , 400 )); //mainPanel.setLayout(new GridLayout(10,3,5,10)); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints GBC = new GridBagConstraints(); GBC.weightx = 1 ; //加上这两行之后文本框的大小会和不加时不同 因为它描述的是随面板变化的情况 而现在面板的设定值是800*500 因此不同(不以设定大小为默认值) GBC.weighty = 1 ; //GBC.fill = GridBagConstraints.BOTH;//weightx描述的是网格的大小随面板大小变化,组件的大小并不会随之变化 要使组件随之变化需要控制它对所在位置的填充方式 //GBC.insets = new Insets(1,1,2,2); GBC.gridx = 1 ; GBC.gridy = 0 ; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JLBAnsTip, GBC); JLBAnsTip.setFont(JLBFont); mainPanel.add(JLBAnsTip); GBC.gridx = 2 ; gridbag.setConstraints(JLBRemainTip, GBC); JLBRemainTip.setFont(JLBFont); mainPanel.add(JLBRemainTip); GBC.gridx = 4 ; GBC.gridwidth = 2 ; GBC.anchor = GridBagConstraints.CENTER; gridbag.setConstraints(JLBScores, GBC); JLBScores.setFont(JLBFont); mainPanel.add(JLBScores); for ( int i = 0 ;i < 5 ;i++) { JLBQuestions[i] = new JLabel( "点击开始做题显示题目" ); JLBQuestions[i].setFont(JLBFont); JTFUsersAnswer[i] = new JTextField( 5 ); //一定要加这行 不然会出现空指针错误 JTFUsersAnswer[i].setFont(JTFFont); JTFRemainder[i] = new JTextField( 3 ); JTFRemainder[i].setFont(JTFFont); JLBAnswers[i] = new JLabel( "" ); JLBAnswers[i].setFont(JLBAnsFont); JLBIsTrue[i] = new JLabel( "" ); JLBIsTrue[i].setFont(JLBAnsFont); //gridbag.setConstraints(JLBQuestions[i],new GridBagConstraints(i,0,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0)); //gridbag.setConstraints(JTFUsersAnswer[i],new GridBagConstraints(i,1,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0)); //gridbag.setConstraints(JTFRemainder[i],new GridBagConstraints(i,2,5,10,1,1,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(2,2,2,2),0,0)); GBC.gridwidth = 1 ; GBC.gridx = 0 ; GBC.gridy = 2 *i+ 1 ; GBC.anchor = GridBagConstraints.EAST; gridbag.setConstraints(JLBQuestions[i], GBC); mainPanel.add(JLBQuestions[i]); GBC.anchor = GridBagConstraints.CENTER; GBC.gridy = 2 *i+ 2 ; GBC.gridwidth = 2 ; gridbag.setConstraints(JLBAnswers[i], GBC); mainPanel.add(JLBAnswers[i]); GBC.gridwidth = 1 ; GBC.gridx = 1 ; GBC.gridy = 2 *i+ 1 ; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JTFUsersAnswer[i],GBC); mainPanel.add(JTFUsersAnswer[i]); GBC.gridx = 2 ; gridbag.setConstraints(JTFRemainder[i],GBC); mainPanel.add(JTFRemainder[i]); GBC.gridy = 2 *i+ 2 ; gridbag.setConstraints(JLBIsTrue[i], GBC); mainPanel.add(JLBIsTrue[i]); } for ( int i = 5 ;i < 10 ;i++) { JLBQuestions[i] = new JLabel( "点击开始做题显示题目" ); JLBQuestions[i].setFont(JLBFont); JTFUsersAnswer[i] = new JTextField( 5 ); //一定要加这行 不然会出现空指针错误 JTFUsersAnswer[i].setFont(JTFFont); JTFRemainder[i] = new JTextField( 3 ); JTFRemainder[i].setFont(JTFFont); JLBAnswers[i] = new JLabel( "" ); JLBAnswers[i].setFont(JLBAnsFont); JLBIsTrue[i] = new JLabel( "" ); JLBIsTrue[i].setFont(JLBAnsFont); GBC.gridx = 4 ; GBC.gridy = 2 *i- 9 ; GBC.anchor = GridBagConstraints.EAST; gridbag.setConstraints(JLBQuestions[i], GBC); mainPanel.add(JLBQuestions[i]); GBC.anchor = GridBagConstraints.CENTER; GBC.gridy = 2 *i- 8 ; GBC.gridwidth = 2 ; gridbag.setConstraints(JLBAnswers[i], GBC); mainPanel.add(JLBAnswers[i]); GBC.gridwidth = 1 ; GBC.gridx = 5 ; GBC.gridy = 2 *i- 9 ; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JTFUsersAnswer[i],GBC); mainPanel.add(JTFUsersAnswer[i]); GBC.gridx = 6 ; gridbag.setConstraints(JTFRemainder[i],GBC); mainPanel.add(JTFRemainder[i]); GBC.gridy = 2 *i- 8 ; gridbag.setConstraints(JLBIsTrue[i], GBC); mainPanel.add(JLBIsTrue[i]); } mainPanel.setLayout(gridbag); //布局命令面板 commandP.setLayout( new FlowLayout(FlowLayout.CENTER, 60 , 20 )); JLBRemainTime.setFont(JLBFont); JLBTime.setFont(JLBFont); JTFWtime.setFont(JTFFont); PTime.setLayout( new FlowLayout(FlowLayout.LEFT, 10 , 20 )); PTime.add(JLBRemainTime); PTime.add(JTFWtime); PTime.add(JLBTime); commandP.add(PTime); JBStart.setFont(buttonFont); commandP.add(JBStart); JBRedo.setFont(buttonFont); commandP.add(JBRedo); JBOpenFile.setFont(buttonFont); commandP.add(JBOpenFile); //使用匿名嵌套类的方式注册开始按钮的事件处理监听器对象 JBStart.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (JBStart.getText().equals( "开始做题" )) { if (JTFUserName.getText().trim().equals( "" )) { JFrame nullNameWarning = new JFrame(); JOptionPane.showMessageDialog(nullNameWarning, "请输入用户名" ); //确保用户输入用户名 } else { start(); //如果按钮上面的文字是"开始做题",则调用start()方法出题 JBStart.setText( "提交答案" ); //倒计时线程开始 LimitTime t = new LimitTime(); t.start(); } } else { for ( int i = 0 ;i < 10 ;i++) { if (JTFUsersAnswer[i].getText().equals( "" )) { JTFUsersAnswer[i].setText( "0" ); } } runFlag = false ; //将runFlag设置为false(线程就会不再执行while循环里的内容) //printAnswer();//这里不用再调用printWriter方法了,因为线程那边结束的时候会对它进行调用。 JLBTime.setText( "用时:" +usedTime); JBStart.setText( "开始做题" ); } } } ); //监听重做按钮 JBRedo.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ if (JBStart.getText().equals( "开始做题" )) //若已提交答案 则可以进行重做 { for ( int i = 0 ;i < 10 ;i++) { JTFUsersAnswer[i].setText( "" ); JTFRemainder[i].setText( "" ); JLBAnswers[i].setText( "" ); JLBIsTrue[i].setText( "" ); JLBScores.setText( "" ); } JLBTime.setText( "用时:" ); LimitTime t = new LimitTime(); t.start(); JBStart.setText( "提交答案" ); } else //答案未提交 不能重做 { JFrame notSubmit = new JFrame(); JOptionPane.showMessageDialog(notSubmit, "提交后才可以重做!提交前可以直接更改答案!" ); } } }); //查看以往做题记录的按钮监听器 JBOpenFile.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ if (JTFUserName.getText().trim().equals( "" )) { JFrame nullNameWarning = new JFrame(); JOptionPane.showMessageDialog(nullNameWarning, "请输入用户名" ); //确保用户输入用户名 } else { //一般不能实例化一个Runtime对象,应用程序也不能创建自己的Runtime 类实例,但可以通过getRuntime 方法获取当前Runtime运行时对象的引用。一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为。 Runtime ce=Runtime.getRuntime(); pFile.mkdirs(); String filename = JTFUserName.getText()+ ".his" ; File aUserRec = new File(pFile,filename); if (aUserRec.exists()) { try { //ce.exec("cmd /c start "+aUserRec.getAbsolutePath());//这样是不能打开的 因为没有东西能打开.his文件 会跳出来搜索应用商店 ce.exec( "notepad.exe " +aUserRec.getAbsolutePath()); } catch (IOException exc){ exc.printStackTrace(); } } else { JFrame nullFileWarning = new JFrame(); JOptionPane.showMessageDialog(nullFileWarning, "该用户暂无记录!" ); } } } }); //尽量把主窗体的设置都放到最后 mainWindow.add(selectPanel,BorderLayout.NORTH); mainWindow.add(mainPanel,BorderLayout.CENTER); mainWindow.add(commandP, BorderLayout.SOUTH); mainWindow.pack(); mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWindow.setSize( 800 , 500 ); //设置窗体大小 mainWindow.setLocationRelativeTo( null ); //将窗口置于屏幕中间 mainWindow.setVisible( true ); //设置为可见 要放在最后 放在前面则只能看见用户名和选择面板 主面板等需要拖动窗口大小才能看见 } public void start(){ //清除TextField和答案标签的内容 for ( int i = 0 ;i < 10 ;i++) { JTFUsersAnswer[i].setText( "" ); JTFRemainder[i].setText( "" ); JLBAnswers[i].setText( "" ); JLBIsTrue[i].setText( "" ); JLBScores.setText( "" ); JLBTime.setText( "用时:" ); } //获取ComboBox的选中值 chara = (String) JCBOperationSelect.getSelectedItem(); n = Integer.valueOf((String)JCBNumberOfDigit.getSelectedItem()); //根据选择的运算出题 int flag = 0 ; if (chara.equals( "混合" )) flag = 1 ; for ( int i = 0 ;i < 10 ;i++) { if (flag == 1 ) { int tempCh = ( int )(Math.random()* 4 + 1 ); switch (tempCh) { case 1 : chara = "+" ; break ; case 2 : chara = "-" ; break ; case 3 : chara = "*" ; break ; case 4 : chara = "/" ; break ; } } switch (chara) { case "+" : questions[i] = new Addition(n); JLBQuestions[i].setText(questions[i].printQuestion()); break ; case "-" : questions[i] = new Subtraction(n); JLBQuestions[i].setText(questions[i].printQuestion()); break ; case "*" : questions[i] = new Multiplication(n); JLBQuestions[i].setText(questions[i].printQuestion()); break ; case "/" : questions[i] = new Division(n); JLBQuestions[i].setText(questions[i].printQuestion()); break ; default : JFrame jf = new JFrame(); JOptionPane.showMessageDialog(jf, "出现未知错误,请重启程序。" ); } } } //在面板上显示每题的正确答案、得分和用时,并且将每次做题的记录写入文件 public void printAnswer() { //成绩初始值为100 scores = 100 ; //对于每道题 for ( int i = 0 ; i < 10 ;i++) { //给用户的答案这一数组赋值(getText的结果为String) userAnswer[i] = Integer.valueOf(JTFUsersAnswer[i].getText()); //如果没有填余数,则默认用户认为余数为0,并给余数数组赋值 if (JTFRemainder[i].getText().equals( "" )) { remainder[i] = 0 ; } //否则用用户填的余数给余数数组赋值 else { remainder[i] = Integer.valueOf(JTFRemainder[i].getText()); } //questions的类型是operation,用答案和余数这两个数组给questions这个数组赋值 questions[i].setUsersAnswer(userAnswer[i],remainder[i]); //使正确答案显示在面板上 JLBAnswers[i].setText(questions[i].ptintQA()); //在面板上显示答案是否正确 JLBIsTrue[i].setText(questions[i].isCorrect()); //如果错误则将答案和是否正确两个标签的字体颜色设置为红色 if (JLBIsTrue[i].getText().equals( "回答错误" )) { JLBAnswers[i].setForeground(Color.RED); JLBIsTrue[i].setForeground(Color.RED); scores-= 10 ; } //正确为黑色 else { JLBAnswers[i].setForeground(Color.BLACK); JLBIsTrue[i].setForeground(Color.BLACK); } } //显示成绩 JLBScores.setText( "你的成绩为:" + scores); //创建用户文件 pFile.mkdirs(); String filename = JTFUserName.getText()+ ".his" ; File aUserRec = new File(pFile,filename); if (! (aUserRec.exists())) { try { aUserRec.createNewFile(); } catch (Exception e){ e.printStackTrace(); JFrame jf = new JFrame(); JOptionPane.showMessageDialog(jf, "用户文件创建失败" ); } } //将每道题的正确答案和用户答案写入文件 for ( int i = 0 ;i < 10 ;i++) { questions[i].writeToFile(aUserRec); } //将得分和用时写入文件 try { PrintWriter out = new PrintWriter( new FileWriter(aUserRec, true )); out.println( "" ); out.println( "你此次的得分是:" +scores+ " " + "所用时间为:" +usedTime+ "秒" ); out.println( "" ); out.println( "" ); out.close(); } catch (FileNotFoundException e){ System.err.println( "File not found!" ); } catch (IOException e2){ e2.printStackTrace(); } } } |
Operation.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public abstract class Operation { protected int op1,op2,remainder,usersRemainder,n,correctAnswer,usersAnswer,maxInt= 1 ; protected String ch; protected long minRange,maxRange; public Operation(String ch, int n) { super (); this .ch = ch; this .n = n; } public abstract void operation(); public abstract void isNumRight(); public abstract void setRange(); protected void getRanNum() { op1 = ( int )(Math.random()*Math.pow( 10 ,n)); op2 = ( int )(Math.random()*Math.pow( 10 ,n)); } public void setUsersAnswer( int usersAnswer, int usersRemainder) //throws Exception { /*setRange(); if(usersAnswer < minRange || usersAnswer > maxRange) throw new NumberTooBigException("答案范围应为"+minRange+"到"+maxRange);*/ this .usersAnswer = usersAnswer; this .usersRemainder = usersRemainder; } public void setUsersAnswer( int usersAnswer) //throws Exception { setUsersAnswer(usersAnswer, 0 ); } public String isCorrect() { if (usersAnswer == correctAnswer) return "回答正确" ; else return "回答错误" ; } public String printQuestion() { getRanNum(); isNumRight(); return op1+ " " +ch+ " " +op2+ " =" ; } public String ptintQA() { operation(); return "答案:" +op1+ " " +ch+ " " +op2+ " = " +correctAnswer; } public void writeToFile(File aFile) { try { PrintWriter out = new PrintWriter( new FileWriter(aFile, true )); out.println( "题目:" +op1+ " " +ch+ " " +op2); out.println( "你的答案:" +usersAnswer + " " + "正确答案:" +correctAnswer); out.close(); } catch (FileNotFoundException e){ System.err.println( "File not found!" ); } catch (IOException e2){ e2.printStackTrace(); } } } |
Addition.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import szys.Operation; public class Addition extends Operation { static String ch = "+" ; public Addition( int n) { super (ch,n); } @Override public void operation() { correctAnswer = op1 + op2; } public void isNumRight(){} public void setRange(){ minRange = 0 ; maxRange = maxInt + maxInt; } } |
Division.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import szys.Operation; public class Division extends Operation { static String ch = "/" ; public Division( int n) { super (ch,n); } @Override public void operation() { // TODO Auto-generated method stub correctAnswer = op1 / op2; remainder = op1 % op2; } public String isCorrect() { if (usersAnswer == correctAnswer && remainder == usersRemainder) return "回答正确" ; else return "回答错误" ; } public String ptintQA() { operation(); return "答案:" +op1+ " " +ch+ " " +op2+ " = " +correctAnswer+ " " +remainder; } @Override public void isNumRight() { while (op2 == 0 ) getRanNum(); } public void setRange(){ minRange = 0 ; maxRange = maxInt; } public void writeToFile(File aFile) { try { PrintWriter out = new PrintWriter( new FileWriter(aFile, true )); out.println( "题目:" +op1+ " " +ch+ " " +op2); out.println( "你的答案:" +usersAnswer+ " " +usersRemainder + " " + "正确答案:" +correctAnswer+ " " +remainder); out.close(); } catch (FileNotFoundException e){ System.err.println( "File not found!" ); } catch (IOException e2){ e2.printStackTrace(); } } } |
Multiplication.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import szys.Operation; public class Multiplication extends Operation { static String ch = "X" ; public Multiplication( int n) { super (ch,n); } @Override public void operation() { correctAnswer = op1 * op2; } @Override public void isNumRight() {} public void setRange(){ minRange = 0 ; maxRange = maxInt * maxInt; } } |
Subtraction.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import szys.Operation; public class Subtraction extends Operation{ static String ch = "-" ; public Subtraction( int n) { super (ch,n); } public void operation() { correctAnswer = op1 - op2; } public void isNumRight(){ while (op1 == op2) getRanNum(); if (op1 < op2) { int temp = op1; op1 = op2; op2 = temp; } } public void setRange(){ minRange = -maxInt; maxRange = maxInt; } } |
运行结果:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步