组内成员:张雪晴
设计思想(基于作业01):
题目避免重复:将随机生成的表达式以string类型存储在数组中,遍历数组以避免新产生的表达式与前面重复。
数值范围、可定制数量与打印方式:用户输入运算数数值范围、题目个数与打印方式即几行几列。
函数部分:定义三个函数,分别是MultiAndDiv()有无乘除法、Bracket()有无括号(最多支持10个数的运算)、Minus()加减法有无负数(包括减法结果有无负数)。用户可在程序开始定义这些功能的有无。
具体实现:
1. 使用无限循环实现不同功能的输出以满足用户的需求。
2. 输出语句,让用户输入数值范围Range,题目个数SumNum,打印方式:m行n列;输入有无乘除法,有Mu=1,无Mu=0;输入有无括号,有B=1,无B=0;输入加减法有无负数,有Mi=1,无Mi=0;输入除法有无余数,有D=1,无D=0。
3. MultiAndDiv():在规定的数值范围内,随机产生temp(2-10)个随机数与运算结合成表达式,并考虑除法有无余数,即判断除号两边的数取余是否为0,如果没有余数,则从新生成取余不为0的两个数。若有余数,随机输出即可。
4. Bracket()(最多支持10个数的运算):未能很好的实现。
5. Minus():如果没有负数,则去除减数大于被减数的情况;如果有负数,则产生负随机数(每个负的随机数都要加括号),进行输出。
6. 进行SumNum次循环,并根据Mu、Mi、D的值调用函数MultiAndDiv()、Bracket()、Minus(),遍历数组以避免新产生的表达式与前面重复,如果重复则继续生成表达式,直到不重复为止。
7.考虑含负数情况下也有无负数的表达式。
源代码:
package pkg;
import java.util.Random;
import java.util.Scanner;
class Calculate {
public String AddAndSub(int range,int Mi){//定义有加减法时的各种情况
Random random =new Random();
String output="";
int temp1=2+random.nextInt(7);
for(int i=0;i<temp1;i++) //控制运算数个数
{
int m=random.nextInt(2); //控制加减号的随机输出
int n=random.nextInt(2); //控制有无分数
int l=random.nextInt(10); //控制有负数的情况下包含无负数的输出
int first=random.nextInt(range)+1;
int second=random.nextInt(range)+2;
char f=' '; //随机输出加减法
if(m==0) f='+';
if(m==1) f='-';
if(n==0) //没有分数
{
if(Mi==1) //有负数
{
if(l>=4) //有负数
{
first=-1*(random.nextInt(range)+1);
output+="("+first+")";
}
if(l<4) //不含负数运算
output+=first;
if(i!=temp1-1){output+=f;}//配合输出运算符
}
if(Mi==0) //无负数
{
output+=first;
if(i!=temp1-1){output+=f;}
}
}
if(n==1) //有分数
{
if(first>=second){ //化简
for(int a=second;a>0;a--)
{
if(first%a==0&&second%a==0)
{
first=first/a;
second=second/a;
}
}
}
else
{
for(int a=first;a>0;a--)
{
if(first%a==0&&second%a==0)
{
first=first/a;
second=second/a;
}
}
}
if(Mi==1) //有负数
{
if(l>=4){
first=-1*(random.nextInt(range)+1);
output+="( ("+first+")"+"/"+second+" )";}
if(l<4) //有负数的情况下也会产生无负数的情况
output+=first+"/"+second;
}
if(Mi==0)
output+=first+"/"+second;
if(i!=temp1-1)
output+=f;
}
}
output+="=";
return output;
}
public String MultiAndDiv(int range,int D,int Mi){ //定义有乘除法时的各种情况
Random random =new Random();
int temp1=2+random.nextInt(8);
int l=random.nextInt(10); //控制有负数的情况下包含无负数的输出
String output="";
for(int i=0;i<temp1;i++) //控制运算数个数
{
int first=random.nextInt(range)+1;
int second=random.nextInt(range)+1;
char f=' ';
int temp2=random.nextInt(2);
if(temp2==0) f='+';
if(temp2==1) f='-';
if(D==0) //没有余数
{
for(int c=0;;)
{
if(first%second!=0||second%first!=0) //判断是否能整除,否重新生成,并直到能整除为止
{
first=random.nextInt(range)+1;
second=random.nextInt(range)+1;
}
else
break;
}
if(Mi==1) //有负数
{
if(l>=4)
{
first=-1*(random.nextInt(range)+1);
output+="("+first+")";
}
if(l<4) //有负数的情况下也会产生无负数的情况
output+=first;
}
if(Mi==0)
output+=first;
if(i!=temp1-1)
{
int temp3=random.nextInt(2);
if(temp3==0)
output+="*"+second+f;
if(temp3==1)
output+="/"+second+f;
}
}
if(D==1) //有余数
{
output+=first;
if(i!=temp1-1)
{
int temp4=random.nextInt(4);
if(temp4==0)
output+="*";
if(temp4==1)
output+="/";
if(temp4==2)
output+="+";
if(temp4==3)
output+="-";
}
}
}
output+="=";
return output;
}
public String Bracket(String E){ //多项式加括号
Random random =new Random();
int t=E.indexOf("+")+1;
E=E.substring(0,t)+'('+E.substring(t+1,E.length());
E=E.substring(0,t+4)+')'+E.substring(t+5,E.length());
return E;
}
}
public class CalculateTwo extends Calculate{ //继承Calculate
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
Random random =new Random();
int D=0;
Calculate C;C=new Calculate();
for(int j=0;;) //输出需要用户定义的要求
{
System.out.println("Please input the number's range of this calculation:");
int Range=in.nextInt();
System.out.println("Please input the number of this calculation:");
int SumNum=in.nextInt();
System.out.println("Please input the lines of this calculation:");
int m=in.nextInt();
System.out.println("Is there multiplication and division in this calculation?Yes,prress 1 No,press 0:");
int Mu=in.nextInt();
if(Mu==1){
System.out.println("Is there reminder in division?Yes,prress 1 No,press 0:");
D=in.nextInt();}
System.out.println("Is there minus in this calculation?Yes,prress 1 No,press 0:");
int Mi=in.nextInt();
System.out.println("Is there parenthese in this calculation?Yes,prress 1 No,press 0:");
int B=in.nextInt();
int l=random.nextInt(10); //控制有负数的情况下有无负数的输出
String []Expre=new String[SumNum+1];
for(int i=0;i<SumNum;i++)
{
if(Mu==0) //无乘除法
{
boolean s=false; //查询是否有重复
if(i==0)
Expre[i]=C.AddAndSub(Range, Mi);
else
{
Expre[i]=C.AddAndSub(Range, Mi);
for(int d=0;;) //如果有重复则继续生成,直到无重复为止
{
int c;
for(c=0;c<i;c++)
{
s=Expre[i].equals(Expre[c]);
if(s==true) break;
}
if(c<=i-1) //如果循环跳出时的c值小于i-1说明有重复
{
Expre[i]=C.AddAndSub(Range, Mi);
}
else
break;
}
}
}
if(Mu==1) //有乘除
{
boolean s=false; //查询是否有重复
if(i==0)
{
if(l>=4)
Expre[i]=C.MultiAndDiv(Range,D,Mi);
if(l<4)
Expre[i]=C.AddAndSub(Range, Mi);
}
else
{
if(l>=4)
Expre[i]=C.MultiAndDiv(Range,D,Mi);
if(l<4)
Expre[i]=C.AddAndSub(Range, Mi);
for(int d=0;;) //如果有重复则继续生成,直到无重复为止
{
int c;
for(c=0;c<i;c++)
{
s=Expre[i].equals(Expre[c]);
if(s==true) break;
}
if(c<=i-1) //如果循环跳出时的c值小于i-1说明有重复
{
if(l>=4)
Expre[i]=C.MultiAndDiv(Range,D,Mi);
if(l<4)
Expre[i]=C.AddAndSub(Range, Mi);
}
else
break;
}
}
}
}
if(B==1) //有括号
{
for(int i=0;i<SumNum;i++)
{
if(Expre[i].length()>8)
C.Bracket(Expre[i]);
}
}
for(int i=0;i<SumNum;i++) //输出字符串数组
{
System.out.print(Expre[i]+" ");
if((i+1)%m==0)
System.out.println();
}
System.out.println();
System.out.print("Try again press:1 Quit press:0");
int g=in.nextInt();
if(g==1)
continue;
if(g==0)
break;
}
}
}
运行结果截图:
无乘除 有负数
有乘除 无负数 有余数
有乘除 有负数 有余数
程序总结
存在的问题:括号输出功能实现的不够全面。感觉有无余数功能应该是对的,但输出不对 ,不知道为什么。
先写出程序大框,再逐步加入细节,考虑问题需要全面,然后以后要尽量缩短编程时间。Java语言基础不够扎实,还需要多加训练。
结组编程时从对方身上学到很多。
周活动总结表
姓名:尤凯丽 日期 2016/3/18
听 课 |
编写代码 |
阅读课本 |
准备考试 |
日总计 |
|
周日 |
|||||
周一 |
100分钟 |
20 |
构建之法1-4章 |
讨论程序 |
100分钟 |
周二 |
60 |
||||
周三 |
70 |
||||
周四 |
50 |
||||
周五 |
70 |
||||
周六 |
|||||
周总计 |
100分钟 |
270 |
100分钟 |
时间记录日志
学生:尤凯丽 日期:2016/3/18
教师:王建民 课程:软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
C |
U |
3.14 |
8:00 |
9:50 |
8:50-9:00 |
100 |
听课 |
4个 小时(1-4章) |
✔ |
|
16:00 |
17:30 |
90 |
阅读笔记 |
✔ |
||||
20:00 |
21:00 |
20:30-20:40 |
50 |
讨论程序 |
✔ |
|||
3.15 |
15:00 |
16:50 |
110 |
写设计思想 |
2个小时 |
✔ |
||
21:40 |
22:30 |
50 |
编程序 |
✔ |
||||
3.16 |
21:40 |
22:30 |
50 |
编程序 |
50 |
✔ |
||
3.17 |
17:20 |
18:20 |
17:30-17-40 |
50 |
编程序 |
2个小时 |
✔ |
|
21:40 |
23:00 |
22:00-22:10 |
70 |
✔ |
||||
3.18 |
17:00- |
21:00 |
18:00-18:20 |
220 |
编程序 博客 |
3小时40 |
✔ |
|
3.19 |
9:50-9:55 |
✔ |
缺陷记录日志
学生:尤凯丽 日期:2016/3/18
教员:王建民 程序号:四则运算第二季
日期 |
编 号 |
类 型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3.16 |
1 |
20 |
编程 |
编程 |
1min |
|
描述:创建对象方法错误 |
||||||
3.17 |
2 |
10 |
编程 |
编译 |
2min |
|
描述:未考虑有负数情况下也包含无负数的运算式 |
||||||
3 |
80 |
编程 |
编译 |
1min |
||
描述:当用户输入无乘除法时还会提示除法有无余数 |
||||||
3.18 |
4 |
10 |
编程 |
编译 |
2min |
|
描述:循环体错误,删掉output+=“+”等 |
||||||
5 |
20 |
编程 |
编译 |
3min |
||
描述:循环变量错误,把d改为i |