您的位置:首页 > 其它

课堂练习之四则运算加强版

2015-03-15 13:43 190 查看
一、程序设计题目要求和设计思想

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、如果大于则返回该数,否则就通过循环产生另一个随机数,重复判断。

二、程序源代码

/*
需求:每天出30道四则运算题目给小学生做
*/
import java.util.*;
class Rand
{
public static void sop(Object obj)
{
System.out.print(obj);
}
public static int random_1(int n)//随机产生一个0--n之间的数
{
return new Random().nextInt(n);
}

public static int random_2(int n1,int n2)//产生n1--n2随机数的方法
{
int temp = 0,b = 0;
while((temp=new Random().nextInt(n2))>=n1)//如果产生的随机数大于n1,就将其返回,否则就继续
{
b = temp;
}
if(b==0)
b = b + 2*n1;
return b;
}

public static void main(String[] args)
{
sop("<---小学生二年级课后作业,每天30道四则运算练习--->");

System.out.print("\r\n1、请输入今日想完成的题目数量:");

Scanner sc = new Scanner(System.in);
int num = sc.nextInt();

System.out.print("\r\n2、请选择是否有乘除运算:(有/否:1/0):");

Scanner sc1 = new Scanner(System.in);
int num1 = sc1.nextInt();

System.out.print("\r\n3、请选择是否需要真分数运算:(有/否:1/0):");

Scanner sc2 = new Scanner(System.in);
int num2 = sc2.nextInt();

System.out.print("\r\n4、请输入每行打印的个数:");

Scanner sc4 = new Scanner(System.in);
int num4 = sc4.nextInt();

System.out.print("\r\n5、请选择需要几位数的运算:(请输入大于1的位数,\r\n如不需要定制,输入1,随机产生不大于1000的运算):");

Scanner sc3 = new Scanner(System.in);
int num3 = sc3.nextInt() - 1;

int count = 0,d1,d2,k1,k2,k3,k4;//计数器

for (int i=0;i<num ;i++ )
{
if(num3==0)//如果输入为1,就将随机产生不大于1000的数
{
d1 = random_1(1000);
d2 = random_1(1000);
k1 = random_1(1000);
k2 = random_1(1000);
k3 = random_1(1000);
k4 = random_1(1000);
}
else
{
d1 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);//自定义的产生随机数
d2 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);
k1 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);
k2 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);
k3 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);
k4 = random_2((int)Math.pow(10,num3),(int)Math.pow(10,num3+1)-1);
}

int k = 0,r = 0;//声明两个变量
if(num1==0 && num2==0)//都没有
{
r = random_1(4);
if(r%2!=0)//将产生的奇数随机数取出
k=r;
if(k==0)//即使已经将k判断为奇数了,但还是会等于0,所以就再判断一次,如果为0,就将其+1;
++k;
}

else if(num1==0 && num2==1)//没乘除,有分数
k = random_1(4);
else if(num1==1 && num2==0)//有乘除,没分数
{
r = random_1(8);
if(r%2!=0)
k=r;
if(k==0)
++k;
}
else//都有
k = random_1(8);

switch(k)//前两个是加法,2,3是减法,4,5是乘法,6,7是除法
{
case 0:
sop(zhenfenshu(k1,k2)+" + "+zhenfenshu(k3,k4)+" = \t");
break;
case 1:
sop(d1+" + "+d2+" = \t");
break;
case 2:
sop(zhenfenshu(k1,k2)+" - "+zhenfenshu(k3,k4)+" = \t");
break;
case 3:
jianfa(d1,d2);
break;
case 4:
sop(zhenfenshu(k1,k2)+" * "+zhenfenshu(k3,k4)+" = \t");
break;
case 5:
sop(d1+" * "+d2+" = \t");
break;
case 6:
sop(zhenfenshu(k1,k2)+" ÷ "+zhenfenshu(k3,k4)+" = \t");
break;
case 7:
chufa(d1,d2);
break;

default:
sop("duang,duang,daung");
break;
}
count++;
if(count%num4==0)
System.out.println();
}

sop("以上共有:"+count+"道题。");

}
public static void jianfa(int a,int b)//因为小学二年级没有学负数,所以相减不能为负数
{
if(a>=b)
sop(a+" - "+b+" = \t");
else
{
sop(b+" - "+a+" = \t");
}

}

public static void chufa(int a,int b)//为了使除法有意义,除数不能为零,
{
if(b>0)
sop(a+" ÷ "+b+" = \t");
//如果除数为零,就将其加上10,再进行运算
else
{
b = b + 10;
sop(a+" ÷ "+b+" = \t");
}

}
public static String zhenfenshu(int a,int b)//产生真分数的方法
{
if(a<=b)
return a+"/"+b;
else
return b+"/"+a;
}
}


三、运算结果截图

(只有加减法,没有分数,所有的数都是四位的)

[b]

[/b]

(有乘除,没分数,两位数运算)



(有乘除,也有分数,两位数)



(在自定义数的位数,输入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

在今天晚上,我继续想昨天的这个没有解决的问题,经过将近一个小时的思考和调试,最终我给设了一个中间变量,将该数给返回出来,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: