四则运算题目生成程序(基于控制台)2.0

码市地址:https://git.coding.net/qwx_hh/java-szys.git

需求分析:

  为了做一个小学生四则运算题目生成程序,根据小学生的计算水平,我以100以内的整数二元四则运算和真分数的二元四则运算为出题范围,因为是命令行程序,小学生做题,界面要求简易,输出数值不能有错误。判断正确与否,在答题结束后得出正确率。

基本功能:

  1.除了整数以外,还支持真分数的四则运算,真分数的运算

  2.运算符为 +, −, ×, ÷

  3.并且要求能处理用户的输入,并判断对错,打分统计正确率

  4.要求能处理用户输入的真分数

  5.使用 -n 参数控制生成题目的个数

扩展功能:

  1.在开始程序前先验证命令行传入参数是否正确

  2.使用人性化的提示方式

  3.当答案错误时提示错误并输出正确答案

高级功能:

      1.在d盘创建文件夹Myapp并形成一个histroy.txt文件储存有答题错误的题目与答案

  2.在正常完成题目并出现正确率后会提示是否复习之前错误的题目

设计实现:

Java类有:

  1.Test

  2.Arithmetic

  3.Histroy

  Test类负责代码的运行和调用Arithmetic和Histroy中的方法,验证答案并输出正确率。Arithmetic类负责出题以及运算并输出结果。Histroy类负责错误题目的读取与保存。Test类:输出方法。Arithmetic类有方法:整数运算方法,分数运算方法,公约数方法,输出字符串。Histroy类:创建文件方法,更新文件方法,读取文件方法。

代码说明:

Test类:

 1 package szys;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.util.Random;
 5 import java.util.Scanner;
 6 
 7 public class Test {
 8     static int rn=0;
 9     static int wn=0;
10     public static void main(String[] args) throws FileNotFoundException {
11         // TODO Auto-generated method stub
12         if(args[0].equals("-n")&&args[1].matches("\\d*"))
13         {
14             System.out.printf("%n");
15             System.out.println("要开始了哦,试试看(。_。):");
16             System.out.printf("%n");
17             int i = Integer.parseInt(args[1]);
18             Histroy hs = new Histroy();
19             hs.Histroy_create();
20             for(int a=0;a<i;a++)
21             {
22                 boolean x= new Random().nextBoolean();
23                 Arithmetic hh = new Arithmetic(x);
24                 String int_str = hh.int_operation();
25                 String fra_str = hh.fra_operation();
26                 if(x==true)
27                     print(hh.toString(),int_str,hs);
28                 if(x==false)
29                     print(hh.toString(),fra_str,hs);
30             }
31             double tru=rn;
32             double tot=i;
33             System.out.printf("%n正确率:%f",tru/tot*100);
34             System.out.println("%");
35             rn=0;wn=0;
36             System.out.println("复习?(N/Y)");
37             Scanner scanner = new Scanner(System.in);
38             String a2 = scanner.next();
39             if(a2.equals("Y"))
40                 review();
41             else
42                 System.exit(0); 
43         }
44         else
45         {
46             System.out.println("别调皮,参数有问题");
47             System.exit(0); 
48         }
49     }
50     public static void print(String toString,String str,Histroy hs){
51         hs.scan(str,toString);
52         System.out.printf(toString);
53         Scanner scanner = new Scanner(System.in);
54         String a1 = scanner.next();
55         if(str.equals(a1))
56         {
57             rn++;
58             System.out.println("        (≧▽≦)正确");
59         }
60         else
61         {
62             hs.Histroy_save();
63             wn++;
64             System.out.printf("        (>﹏<)错误%n        答案%s%n",str);
65         }
66     }
67     public static void review() throws FileNotFoundException {
68         Histroy hs = new Histroy();
69         hs.Histroy_read();
70         System.out.printf("题量多少?");
71         System.out.printf("(最高%d题)",hs.astrlist.size());
72         Scanner scanner = new Scanner(System.in);
73         int n = scanner.nextInt();
74         for(int i=0;i<n;i++)
75         {
76             int b = new Random().nextInt(hs.astrlist.size())%(hs.astrlist.size()-1+1) + 1;
77             Histroy hs2 = new Histroy();
78             print(hs.qstrlist.get(b-1), hs.astrlist.get(b-1),hs2);
79         }
80             double tru=rn;
81             double tot=n;
82             System.out.printf("%n正确率:%f",tru/tot*100);
83             System.out.println("%");
84             System.out.println("再来?(Y/N)");
85             Scanner scanner2 = new Scanner(System.in);
86             String a2 = scanner.next();
87             if(a2.equals("Y"))
88                 review();
89             else
90                 System.exit(0);
91     }
92 }

 

Arithmetic类:

  1 package szys;
  2 
  3 import java.util.Random;
  4 
  5 public class Arithmetic {
  6     int a = new Random().nextInt(4);
  7     int b = new Random().nextInt(10)%(10-1+1) + 1;
  8     int c = new Random().nextInt(10)%(10-2+1) + 2;
  9     int d = new Random().nextInt(10)%(10-1+1) + 1;
 10     int e = new Random().nextInt(10)%(10-2+1) + 2;
 11     int f = new Random().nextInt(100);
 12     int g = new Random().nextInt(100);
 13     String astr="";
 14     String qstr="";
 15     boolean x;
 16     public Arithmetic(boolean x) {
 17         this.x=x;
 18     }
 19     public String int_operation()
 20     {
 21         int result = 0;
 22         if(a==0)
 23             result=f+g;
 24         if(a==1)
 25             result=f-g;
 26         if(a==2)
 27             result=f*g;
 28         astr = String.valueOf( result);
 29         if(a==3)
 30         {
 31             if(g==0)
 32             {
 33                 astr=int_operation();
 34                 return astr;
 35             }
 36             else
 37             {
 38                 if(g!=0&&g!=1){
 39                     int d=common_divisor(f,g);
 40                     f=f/d;
 41                     g=g/d;
 42                     astr = (f+"/"+g);
 43                 }
 44                 if(g==1)
 45                     astr=(""+f);
 46             }
 47             
 48         }
 49         return astr;
 50     }
 51     public String fra_operation(){
 52         this.b = new Random().nextInt(10)%(10-1+1) + 1;
 53         this.c = new Random().nextInt(10)%(10-2+1) + 2;
 54         this.d = new Random().nextInt(10)%(10-1+1) + 1;
 55         this.e = new Random().nextInt(10)%(10-2+1) + 2;
 56         if(c<b||e<d||c%b==0||e%d==0)
 57         {
 58             astr=fra_operation();
 59             return astr;
 60         }
 61             
 62         int fz=1,fm=c*e;
 63         if(a==0)
 64             fz=b*e+c*d;
 65         if(a==1){
 66             fz=b*e-c*d;
 67             if(fz==0)
 68             {
 69                 return astr=("0");
 70             }
 71         }
 72             
 73         if(a==2)
 74             fz=b*d;
 75         if(a==3)
 76         {
 77             fz=b*e;
 78             fm=c*d;
 79         }
 80         int f=common_divisor(fm,fz);
 81         if(f>0){
 82             fm=fm/f;
 83             fz=fz/f;
 84         }
 85         if(f<0){
 86             fm=-fm/f;
 87             fz=-fz/f;
 88         }
 89         astr = (fz+"/"+fm);
 90         return astr;
 91         
 92     }
 93     public static int common_divisor(int m,int n)
 94     {
 95         while(m%n!=0){
 96             int t=m%n;
 97             m=n;
 98             n=t;
 99         }
100         return n;
101     }
102     public String toString(){
103         if(x==true){
104             if(a==0)
105                 qstr=(f+"+"+g+"=");
106             if(a==1)
107                 qstr=(f+"-"+g+"=");
108             if(a==2)
109                 qstr=(f+"×"+g+"=");
110             if(a==3)
111                 qstr=(f+"÷"+g+"=");
112         }
113         if(x==false){
114             if(a==0)
115                 qstr=(b+"/"+c+"+"+d+"/"+e+"=");
116             if(a==1)
117                 qstr=(b+"/"+c+"-"+d+"/"+e+"=");
118             if(a==2)
119                 qstr=(b+"/"+c+"×"+d+"/"+e+"=");
120             if(a==3)
121                 qstr=(b+"/"+c+"÷"+d+"/"+e+"=");
122         }
123         return qstr;
124     }
125     
126 }

Histroy类

 

 1 package szys;
 2 
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileWriter;
 6 import java.io.IOException;
 7 import java.util.ArrayList;
 8 import java.util.List;
 9 import java.util.Scanner;
10 
11 public class Histroy {
12     String qstr;
13     String astr;
14     String str;
15     public List<String> qstrlist = new ArrayList<String>();
16     public List<String> astrlist = new ArrayList<String>();
17     public void scan(String qstr,String astr){
18         str=(astr+" "+qstr);
19     }
20     public void Histroy_create(){
21         String path = "d:\\Myapp";
22         File f = new File(path);
23         if(!f.exists()){
24             f.mkdirs();
25             String fileName="histroy.txt";
26             File file = new File(f,fileName);
27             if(!file.exists()){
28                 try {
29                 file.createNewFile();
30                 } catch (IOException e) {
31                 // TODO Auto-generated catch block
32                 e.printStackTrace();
33                 }
34             }
35         }
36         
37     }
38     public void Histroy_save(){
39          FileWriter writer;
40          String fileName = ("d:\\Myapp\\histroy.txt");
41         try {
42             writer = new FileWriter(fileName, true);
43             writer.write(str);
44             writer.write("\r\n");
45             writer.close();
46         } catch (IOException e) {
47             // TODO Auto-generated catch block
48             e.printStackTrace();
49         }
50     }
51     public void Histroy_read()  throws FileNotFoundException{
52         Scanner in = new Scanner(new File("d:\\Myapp\\histroy.txt"));//为历史信息.tit这个File创建一个扫描器in
53         while(in.hasNextLine()){
54             String line = in.nextLine();//读出历史信息.txt的下一行
55             Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
56             lineScanner.useDelimiter(" ");//使用空格作为分隔符
57             qstr = lineScanner.next();//问题
58             astr = lineScanner.next();//答案
59             qstrlist.add(qstr);
60             astrlist.add(astr);
61         }
62         in.close();
63     }
64 }

 

测试运行:

命令行参数错误:

存储文件

psp:

Personal Software Process Stages

Time (%) Senior Student

Time (%)

计划

5

5

估计这个任务需要多少时间

5

5

开发

85

70

需求分析 (包括学习新技术)

10

10

生成设计文档

0

0

设计复审

0

0

代码规范

10

5

具体设计

15

15

具体编码

40

30

代码复审

10

10

测试(自我测试,修改代码,提交修改)

15

25

报告

10

15

测试报告

2

2

计算工作量

1

1

并提出过程改进计划

2

2

小结:通过此次项目实践我又丰富了我的Java编程经验,还锻炼了我的写报告的能力(笑),今后会为认真地完成每一次项目而努力。我觉得在代码规范方面2.0相比初代来说有了很大的提高。

 

posted @ 2017-03-02 14:02  qwx_hh  阅读(396)  评论(8编辑  收藏  举报