一、程序设计题目要求和设计思想
1、题目
(1)、题目避免重复;
(2)、可定制(数量/打印方式);
(3)、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
2、设计思想
1、题目避免重复; 2、可定制(数量/打印方式): 3、可以控制下列参数(是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数、是否支持分数(真分数,假分数)):
设计思路:
1、(任意自定义题目个数)通过输入的数字对应for循环的次数,
2、(是否有乘除法)
3、(是否支持分数)(有/否:1/0):
这两个放在一起实现,两个组合一起可以有四种方式,00,01,10,11
分别对应case语句中的选项,在选则时,0、1是加法,2、3是减法,4、5是乘法,6、7是除法,
奇数是可以产生分数的,
当00时,选择0和2,
当01时,选择1,2,3,4;
当10时,选择0,2,4,6;
当11时,选择全部。
4、(数值的范围) 将传进来的数num3直接当作指数进行运算,产生该数位的最大和最小两个数字,
并通过random_2方法,产生两数之间的随机数。
自定义两数之间的随机数方法random_2思路:
1、先随机产生小于较大数的随机数, 2、判断该随机数是否大于较小数, 3、如果大于则返回该数,否则就通过循环产生另一个随机数,重复判断。
二、程序源代码
1 /* 2 需求:每天出30道四则运算题目给小学生做 3 */ 4 import java.util.*; 5 class Rand 6 { 7 public static void sop(Object obj) 8 { 9 System.out.print(obj); 10 } 11 public static int random_1(int n)//随机产生一个0--n之间的数 12 { 13 return new Random().nextInt(n); 14 } 15 16 public static int random_2(int n1,int n2)//产生n1--n2随机数的方法 17 { 18 int temp = 0,b = 0; 19 while((temp=new Random().nextInt(n2))>=n1)//如果产生的随机数大于n1,就将其返回,否则就继续 20 { 21 b = temp; 22 } 23 if(b==0) 24 b = b + 2*n1; 25 return b; 26 } 27 28 public static void main(String[] args) 29 { 30 sop("<---小学生二年级课后作业,每天30道四则运算练习--->"); 31 32 System.out.print("\r\n1、请输入今日想完成的题目数量:"); 33 34 Scanner sc = new Scanner(System.in); 35 int num = sc.nextInt(); 36 37 System.out.print("\r\n2、请选择是否有乘除运算:(有/否:1/0):"); 38 39 Scanner sc1 = new Scanner(System.in); 40 int num1 = sc1.nextInt(); 41 42 System.out.print("\r\n3、请选择是否需要真分数运算:(有/否:1/0):"); 43 44 Scanner sc2 = new Scanner(System.in); 45 int num2 = sc2.nextInt(); 46 47 System.out.print("\r\n4、请输入每行打印的个数:"); 48 49 Scanner sc4 = new Scanner(System.in); 50 int num4 = sc4.nextInt(); 51 52 System.out.print("\r\n5、请选择需要几位数的运算:(请输入大于1的位数,\r\n如不需要定制,输入1,随机产生不大于1000的运算):"); 53 54 Scanner sc3 = new Scanner(System.in); 55 int num3 = sc3.nextInt() - 1; 56 57 int count = 0,d1,d2,k1,k2,k3,k4;//计数器 58 59 for (int i=0;i<num ;i++ ) 60 { 61 if(num3==0)//如果输入为1,就将随机产生不大于1000的数 62 { 63 d1 = random_1(1000); 64 d2 = random_1(1000); 65 k1 = random_1(1000); 66 k2 = random_1(1000); 67 k3 = random_1(1000); 68 k4 = random_1(1000); 69 } 70 else 71 { 72 d1 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);//自定义的产生随机数 73 d2 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1); 74 k1 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1); 75 k2 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1); 76 k3 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1); 77 k4 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1); 78 } 79 80 81 int k = 0,r = 0;//声明两个变量 82 if(num1==0 && num2==0)//都没有 83 { 84 r = random_1(4); 85 if(r%2!=0)//将产生的奇数随机数取出 86 k=r; 87 if(k==0)//即使已经将k判断为奇数了,但还是会等于0,所以就再判断一次,如果为0,就将其+1; 88 ++k; 89 } 90 91 else if(num1==0 && num2==1)//没乘除,有分数 92 k = random_1(4); 93 else if(num1==1 && num2==0)//有乘除,没分数 94 { 95 r = random_1(8); 96 if(r%2!=0) 97 k=r; 98 if(k==0) 99 ++k; 100 } 101 else//都有 102 k = random_1(8); 103 104 switch(k)//前两个是加法,2,3是减法,4,5是乘法,6,7是除法 105 { 106 case 0: 107 sop(zhenfenshu(k1,k2)+" + "+zhenfenshu(k3,k4)+" = \t"); 108 break; 109 case 1: 110 sop(d1+" + "+d2+" = \t"); 111 break; 112 case 2: 113 sop(zhenfenshu(k1,k2)+" - "+zhenfenshu(k3,k4)+" = \t"); 114 break; 115 case 3: 116 jianfa(d1,d2); 117 break; 118 case 4: 119 sop(zhenfenshu(k1,k2)+" * "+zhenfenshu(k3,k4)+" = \t"); 120 break; 121 case 5: 122 sop(d1+" * "+d2+" = \t"); 123 break; 124 case 6: 125 sop(zhenfenshu(k1,k2)+" ÷ "+zhenfenshu(k3,k4)+" = \t"); 126 break; 127 case 7: 128 chufa(d1,d2); 129 break; 130 131 132 default: 133 sop("duang,duang,daung"); 134 break; 135 } 136 count++; 137 if(count%num4==0) 138 System.out.println(); 139 } 140 141 sop("以上共有:"+count+"道题。"); 142 143 } 144 public static void jianfa(int a,int b)//因为小学二年级没有学负数,所以相减不能为负数 145 { 146 if(a>=b) 147 sop(a+" - "+b+" = \t"); 148 else 149 { 150 sop(b+" - "+a+" = \t"); 151 } 152 153 } 154 155 public static void chufa(int a,int b)//为了使除法有意义,除数不能为零, 156 { 157 if(b>0) 158 sop(a+" ÷ "+b+" = \t"); 159 //如果除数为零,就将其加上10,再进行运算 160 else 161 { 162 b = b + 10; 163 sop(a+" ÷ "+b+" = \t"); 164 } 165 166 } 167 public static String zhenfenshu(int a,int b)//产生真分数的方法 168 { 169 if(a<=b) 170 return a+"/"+b; 171 else 172 return b+"/"+a; 173 } 174 }
三、运算结果截图
(只有加减法,没有分数,所有的数都是四位的)
(有乘除,没分数,两位数运算)
(有乘除,也有分数,两位数)
(在自定义数的位数,输入1,就是产生小于1000的随机数)
四、总结
在对该程序进行修改的过程中,只实现了一部分的功能,虽然可以做一些简单的定制功能,
还存在不少的缺陷和bug,比如没有实现小数的运算,但是我感觉比较好的就是,
可以自定义两个数,产生这两个数之间的随机数,希望在下面可以继续将本程序
再加改进,功能更加完善。
时间安排:
一、项目计划总结:
周活动总结表
姓名: 日期:
日期 任务 |
听课 |
编写程序 |
阅读课本 |
准备考试 |
日总计 |
||
周日 |
|||||||
周一 |
|||||||
周二 |
100 |
30 |
30 |
160 |
|||
周三 |
150 |
30 |
180 |
||||
周四 |
120 |
40 |
160 |
||||
周五 |
100 |
120 |
40 |
160 |
|||
周六 |
180 |
40 |
220 |
||||
周总结 |
200 |
600 |
180 |
980 |
阶段时间和效率 周数(上一次周活动表的周数+1):
不包括上一周在内的累计时间
总计 |
200 |
600 |
180 |
980 |
|||
平均 |
200 |
600 |
180 |
980 |
|||
最大 |
200 |
600 |
180 |
980 |
|||
最小 |
200 |
600 |
180 |
989 |
以前各周的累计时间
总计 |
|||||||
平均 |
|||||||
最大 |
|||||||
最小 |
二、时间记录表:
学生 郭健豪 日期 2015.3.15
教师 王建民 课程 PSP
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3.10 |
19:20 |
20:00 |
10 |
30 |
编程 |
|
3.11 |
15:00 |
18:20 |
50 |
150 |
编程、看书 |
|
3.12 |
18:30 |
21:30 |
20 |
160 |
编程、看书 |
|
3.13 |
19:00 |
21:30 |
20 |
130 |
编程、看书 |
|
3.14 |
9:00 |
11:20 |
30 |
180 |
编程。看书 |
|
三、缺陷记录日志:
学生 郭健豪
日期 2015.3.15
教员 王建民
程序号
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3.11 |
||||||
想自定义一个方法,可以随机输入两个数,产生这两个数之间的随机数,但是不能将得到的这个数返回,这个问题一直困扰着我。 |
||||||
3.12 |
||||||
在今天晚上,我继续想昨天的这个没有解决的问题,经过将近一个小时的思考和调试,最终我给设了一个中间变量,将该数给返回出来, |