一、需求分析:
编写一个适合小学生计算的四则运算小程序,程序相关参数可以定制,并把生成的等式存储到外部result.txt文件中。
二、功能实现:
基本功能
(1)自动生成10道100以内的2个操作数的四则运算算式(+ - * /),要求运算结果也在100以内
(2)剔除重复算式。 2 + 3 = 和 2 + 3 = 是重复算式 2 + 3 = 和 3 + 2 = 不属于重复算式
(3)题目数量可定制
(4)相关参数可控制
是否包含乘法和除法
操作数数值范围可控(如操作数 在100以内 还是1000以内)
操作数是否含负数
(5)生成的运算题存储到外部文件result.txt中
三·设计实现
此程序使用Java实现,随机生成count个scope范围的数,随机生成count个scope范围的数,判断用户的要求,当用户做出选择时,进入if语句,来执行判断其他条件的分支。以此来完成程序的实现。
四、测试运行
五、代码片段
public class Operation {
public static void main(String[] args) {
int count=0,scope=0,isMulandchu,complex;
Operation operation = new Operation();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入生成四则运算的数量");
count= scanner.nextInt();
System.out.println("请输入操作数的范围(结果也会小于该值哦)");
scope=scanner.nextInt();
System.out.println("需要有乘除吗? 1代表有 0代表没有");
isMulandchu= scanner.nextInt();
while(isMulandchu!=0&&isMulandchu!=1){
System.out.println("输入有误,重新输入");
isMulandchu= scanner.nextInt();
}
System.out.println("需要有负数吗?1代表有 0代表没有 ");
complex=scanner.nextInt();
while(complex!=0&&complex!=1){
System.out.println("输入有误,重新输入");
complex= scanner.nextInt();
}
operation.randomOperation(count,scope,isMulandchu,complex);
}
/**
* 随机生成count个scope范围的数
* @param count 个数
* @param scope 范围 运算数的绝对值和结果小于该值
*/
public void randomOperation(int count,int scope,int isMulandchu,int complex){
String result;
int operate1=0,operate2=0;
HashSet<String> number = new HashSet<>();
Random random=new Random();
//complex==1 需要生成两个可能产生负数的两个操作符
if(complex==1){
while(number.size()<count){
//生成随机数1
operate1= (random.nextInt(scope)+1)*(Math.random()>0.5?1:-1);
//生成随机数2
operate2= (random.nextInt(scope)+1)*(Math.random()>0.5?1:-1);
//不可以为0
while (operate2==0){
operate2= (random.nextInt(scope)+1)*(Math.random()>0.5?1:-1);
}
result=calculate(operate1,operate2,scope,isMulandchu);
//返回结果为NULL 不添加到集合中
if(result!=null){
number.add(result);
}
}
}else {
while(number.size()<count){
//生成随机数1
operate1= random.nextInt(scope)+1;
//生成随机数2
operate2= random.nextInt(scope)+1;
result=calculate(operate1,operate2,scope,isMulandchu);
//返回结果为NULL 不添加到集合中
if(result!=null){
number.add(result);
}
}
}
//写入文件
writeBook(number);
}
/**
* 随机产生两个运算数 并返回String
* @param operate1
* @param operate2
* @param scope 结果的绝对值小于该值
* @param isMulandchu 是否有 * /运算
* @return
*/
public String calculate(int operate1,int operate2,int scope,int isMulandchu){
char operator[]={'+','-','*','/'};
Random random=new Random();
int result=0,flag=random.nextInt(isMulandchu==0?2:4);
// 0 1 2 3 分别代表 '+','-','*','/'
switch(flag) {
case 0:result = operate1+operate2;break;
case 1:result = operate1-operate2;break;
case 2:result = operate1*operate2;break;
case 3:result = operate1/operate2;break;
}
//结果的绝对值小于给定范围返回该值否则返回空
return Math.abs(result)<=scope? ""+operate1+operator[flag]+operate2+"="+result: null;
}
/**
* 将集合文件
* @param numbers
*/
public void writeBook(Set<String> numbers){
BufferedWriter writer=null;
try {
writer = new BufferedWriter(new FileWriter("D:\\result.txt", true));
for (String number : numbers) {
writer.write(number);
writer.newLine();
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(writer!=null) {
writer.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
六、总结
本次作业对于我来说难度较大,所以是在别人的帮助下一点点完成的,接下来的时间会认真学习,多向其他优秀的同学学习,提升自己。
PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 402 | 620 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 70 | 90 |
Development | 开发 | 100 | 150 |
·· Analysis | 需求分析 (包括学习新技术) | 25 | 50 |
· Design Spec | · 生成设计文档 | 15 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 50 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 25 | 25 |
· Design | 具体设计 | 22 | 28 |
· Coding | 具体编码 | 60 | 70 |
· Code Review | · 代码复审 | 8 | 22 |
· Test | · 测试(自我测试,修改代码,提交修改) | 15 | 25 |
Reporting | 报告 | 5 | 20 |
·· Test Report | · 测试报告 | 15 | 15 |
· Size Measurement | 计算工作量 | 15 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 7 | 20 |