主要功能:运算小学四则运算,可以选择加减乘除以及混合运算。
除了整数以外,还要支持真分数的四则运算。 (例如: 1/6 + 1/8 = 7/24)
思考:
1.支持整数和分数,基本数据类型难以满足,考虑新建一个封装的类number,含有numerator和denominator,表示分子分母,整数的分母为1;
2.随机生成题目,考虑调用库函数中的随机数生成数字和符号和题目长度;
3.考虑到JAVA在处理字符串方面使用更为简便,本次程序采用JAVA语言编写。
代码核心:
number部分只显示了框架,对功能进行了封装,可能有些冗余写的比较长,所有代码在
https://github.com/Victorianuonuo/projects-for-Software-Engineering
上进行了开源,开源部分多包含了Question2.java 和 Test.java ,Question2.java 是开始写的不能处理真分数的一个生成程序的框架,Test.java是对numer类进行测试的代码,只保留了最后一次测试的代码。
测试:
在测试代码完善功能的过程中,对程序进行了微小的修改,主要是对随机数范围进行修改(因为感觉题太难了==),最后设置在25题,每道题长度(number个数)在【3,5】之间,数的取值范围不超过20,每道题答题后会立即显示正确答案和正确与否的判定,正确答案将以整数或分数形式显示,所有题做完后会显示正确率。答题时按回车被视为放弃回答,被判为错误,结果支持整数,分数和小数形式,小数形式误差不超过1e-5被视为正确答案,输入格式错误被判定为错误如“233..”,“2/2/e”,“2 / 3 3”等,数字之间不能用空格隔开,“22/”被视为等同于“22”。每次答题情况都会被追加在文件里,第一行会先记录答题开始的时刻,默认存储文件是"out.txt",也可以在命令行指定新的文件名进行存储。
1 package calc; 2 3 public class number { 4 private int numerator,denominator; 5 6 public number() { 7 } 8 9 public number (String str) { 10 } 11 12 13 public number(int a) { 14 } 15 16 public number(int a, int b){ 17 } 18 19 public void set(int a) { 20 } 21 22 public void set(int a,int b) { 23 } 24 25 public String toString() { 26 } 27 28 public void check(){ 29 } 30 31 32 public boolean equals(number n2) { 33 } 34 35 public number yuefen() { 36 } 37 38 39 public number add(number n2){ 40 } 41 42 private int gcd(int n1,int n2){ 43 } 44 45 public double ParseDouble(){ 46 } 47 48 public number sub(number n2){ 49 } 50 51 public number mul(number n2){ 52 } 53 54 public number div(number n2) { 55 } 56 57 }
1 package calc; 2 3 /*支持分数和随机长度,并可以将每次答题情况记录到文件里 */ 4 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.PrintStream; 8 import java.util.Date; 9 import java.util.Scanner; 10 11 public class Question { 12 13 public static String str = "";//题目 14 public static int num = 4;//每题中数的个数 15 public static int num_i = 0;//题目中已有数的个数 16 public static int numberRange = 20;//运算中数的最大取值 17 public static number sum = new number();//结果 18 19 public static void main(String[] args) { 20 21 System.out.println(); 22 System.out.println("Please finish the following 25 questions!"); 23 System.out.println("Note: don't seperate your answer with space, "); 24 System.out.println("or you will be considered wrong!"); 25 System.out.println(); 26 27 Scanner input=new Scanner(System.in); 28 29 String file="out.txt"; 30 31 int right=0; 32 PrintStream out = null; 33 34 35 if(args.length>=1) 36 file=args[0]; 37 38 try { 39 out=new PrintStream(new FileOutputStream(file)); 40 } catch (FileNotFoundException e1) { 41 // TODO Auto-generated catch block 42 e1.printStackTrace(); 43 input.close(); 44 return ; 45 } 46 47 out.println(" "+new Date()+" "); 48 49 for (int i = 0; i < 25; i++) { 50 51 GetQuestion(); 52 System.out.print(i+1); 53 System.out.print(". " + str +" Your answer: "); 54 String answer=""; 55 try{ 56 answer=input.nextLine(); 57 }catch(Exception e){ 58 } 59 System.out.print("true answer: "+sum.toString()+" "); 60 number re=sum.add(new number(10)); 61 try{ 62 re=new number(answer); 63 if(re.equals(sum)) 64 { 65 System.out.println("You are right!"); 66 right=right+1; 67 }else { 68 System.out.println("You are wrong!"); 69 } 70 }catch(Exception e){ 71 if(answer.indexOf('.')!=-1) 72 { 73 try{ 74 double ant=Double.parseDouble(answer); 75 if(Math.abs(ant-sum.ParseDouble())<1e-5) 76 { 77 System.out.println("You are right!"); 78 right=right+1; 79 }else { 80 System.out.println("You are wrong!"); 81 } 82 }catch(Exception ex){ 83 System.out.println("You are wrong!"); 84 } 85 }else{ 86 System.out.println("You are wrong!"); 87 } 88 } 89 out.print(i+1); 90 out.println(". " + str ); 91 out.println("Your answer: "+answer); 92 out.println("True answer: "+sum.toString()); 93 } 94 System.out.println(right+" / 25, So your accuracy is "+right/25.0); 95 out.println(right+" / 25, So your accuracy is "+right/25.0); 96 out.println(); 97 input.close(); 98 out.close(); 99 System.out.println(); 100 } 101 102 private static void GetQuestion() { 103 104 str = ""; 105 sum.set(0);; 106 num_i = (int) (Math.random()*3)+3; 107 quesGrow(); 108 } 109 110 private static void quesGrow() { 111 if( num_i > 1 ) { 112 int j = num_i; 113 num_i--; 114 quesGrow(); 115 116 int ck=(int)(Math.random()*4); 117 number w; 118 if(ck!=0) 119 w=new number(1+(int)(Math.random()*numberRange)); 120 else w=new number(1+(int)(Math.random()*numberRange),1+(int)(Math.random()*numberRange)); 121 int t=(int)(Math.random()*2); 122 int f=(int)(Math.random()*4); 123 124 if(t == 0) 125 { 126 if( f == 0 ) { 127 sum = sum.add(w); 128 str = str + "+" + w.toString(); 129 } 130 if( f == 1 ) { 131 sum = sum.sub(w); 132 str = str + "-" +w.toString(); 133 } 134 if( f == 2 ) { 135 if( j < 3 ) { 136 sum = sum.mul(w); 137 str = str + "*" + w.toString(); 138 } 139 else { 140 sum = sum.mul(w); 141 str = "(" +str+ ")" + "*" + w.toString(); 142 } 143 } 144 if ( f == 3 ) { 145 146 if( j < 3 ) { 147 sum = sum.div(w); 148 str = str + " / " + w.toString(); 149 } 150 else { 151 sum = sum.div(w); 152 str = "(" +str+ ")" + " / " + w.toString(); 153 } 154 } 155 } 156 else 157 { 158 if( f == 0 ) { 159 sum = sum.add(w); 160 str = w.toString() + "+" + str; 161 } 162 if( f == 1 ) { 163 if( j < 3 ) { 164 sum = w.sub(sum); 165 str = w.toString() + "-" + str; 166 } 167 else { 168 sum = w.sub(sum); 169 str = w.toString() + "-" + "(" +str+ ")"; 170 } 171 } 172 if( f == 2 ) { 173 if( j < 3 ) { 174 sum = sum.mul(w); 175 str = w.toString()+ "*" + str; 176 } 177 else { 178 sum = sum.mul(w); 179 str = w.toString() + "*" + "(" +str+ ")"; 180 } 181 } 182 if( f == 3) { 183 if( j < 3 ) { 184 sum = w.div(sum); 185 str = w.toString() + " / " + str; 186 } 187 else { 188 sum = w.div(sum); 189 str = w.toString()+ " / " + "(" +str+ ")"; 190 } 191 } 192 } 193 } 194 else if( num_i == 1 ) { 195 int ck=(int)(Math.random()*4); 196 number w; 197 if(ck!=0) 198 w=new number(1+(int)(Math.random()*numberRange)); 199 else w=new number(1+(int)(Math.random()*numberRange),1+(int)(Math.random()*numberRange)); 200 sum = sum.add(w); 201 str = str + w.toString(); 202 } 203 } 204 }