软件工程概论作业-03
1.题目要求:
2.设计思想:
先将表达式求得的值放入数组,然后将用户输入的值与数组中的值进行比较,确定结果是否正确。在有多个运算符和括号的时候,可用用栈确定运算的优先级。用递归的思想计算表达式的值1.在进行不加括号的运算时,可以通过产生的表达式直接求得正确值,然后跟用户输入的值进行比较;2.有括号的运算时,我们可以通过循环求得每次循环所得值,并放入数组中;再通过判断循环后的运算符,来决定数组值之间的加减乘除,以求得最后正确值,然后跟用户输入的值进行比较。
3.程序代码:
package demo; import java.util.Scanner; import java.util.ArrayList; public class Test { public static void main(String[] args){ int N,i,N1,N2; int sum=0; String str; String hh; Scanner in=new Scanner(System.in); change fra=new change(); System.out.println("请输入运算题的数目:"); N=in.nextInt(); System.out.println("请选择是否需要分数运算(Y/N):"); hh=in.next(); if(hh.equals("Y"))//分数运算 { for(i=0;i<N;i++) { int a,b,c,d; int s1,s2; a=(int) (Math.random()*100); b=(int) (Math.random()*99+1); //分母不等于0 c=(int) (Math.random()*100); d=(int) (Math.random()*99+1); int h=(int)(Math.random()*4); int aa=0,bb=0,cc=0,dd=0; //为了产生分数,分子也不可为零 if(a==0) a=(int) (Math.random()*99+1); if(c==0) c=(int) (Math.random()*99+1); //化简分数 int j; j=fra.change_(a,b); aa=a/j; bb=b/j; //化简分数 int p; p=fra.change_(c,d); cc=c/p; dd=d/p; int j1; int s11,s22; String str1; if(h==0) { //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" + "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" + "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" + "+cc+"="); else System.out.println(aa+"+"+cc+"="); //分数加法计算 s1=aa*dd+bb*cc; s2=bb*dd; j1=fra.change_(s1,s2); s11=s1/j1; s22=s2/j1; str1=s11+"/"+s22; str=in.next(); if(fra.judge_FRA(str1,str)==1) { sum++; } } else if(h==1) { //不能产生负数 int t1,t2; if((a/b-c/d)<0) { t1=aa; aa=cc; cc=t1; t2=bb; bb=dd; dd=t2; } //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" - "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" - "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" - "+cc+"="); else System.out.println(aa+"-"+cc+"="); //分数减法计算 s1=aa*dd-bb*cc; s2=bb*dd; j1=fra.change_(s1,s2); s11=s1/j1; s22=s2/j1; str1=s11+"/"+s22; str=in.next(); if(fra.judge_FRA(str1,str)==1) { sum++; } } else if(h==2) { //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println(aa+"/"+bb+" * "+cc+"/"+dd+"="); else if(bb==1&&dd!=1) System.out.println(aa+" * "+cc+"/"+dd+"="); else if(bb!=1&&dd==1) System.out.println(aa+"/"+bb+" * "+cc+"="); else System.out.println(aa+"*"+cc+"="); //分数乘法计算 s1=aa*cc; s2=bb*dd; j1=fra.change_(s1,s2); s11=s1/j1; s22=s2/j1; str1=s11+"/"+s22; str=in.next(); if(fra.judge_FRA(str1,str)==1) { sum++; } } else { //化简后,分母等于1时,直接输出分子 if(bb!=1&&dd!=1) System.out.println("("+aa+"/"+bb+")"+" / "+"("+cc+"/"+dd+")"+"="); else if(bb==1&&dd!=1) System.out.println(aa+" / "+"("+cc+"/"+dd+")"+"="); else if(bb!=1&&dd==1) System.out.println("("+aa+"/"+bb+")"+" / "+cc+"="); else System.out.println(aa+"/"+cc+"="); //分数除法计算 s1=aa*dd; s2=bb*cc; j1=fra.change_(s1,s2); s11=s1/j1; s22=s2/j1; str1=s11+"/"+s22; str=in.next(); if(fra.judge_FRA(str1,str)==1) { sum++; } } } } else if(hh.equals("N"))//整数运算 { System.out.println("请选择是否需要产生括号的运算题(Y/N):"); String str1,str2,str3; double strr2; str=in.next(); double strr1=0; double ss; if(str.equals("Y")) { } else if(str.equals("N"))//不需要产生括号 { System.out.println("请输入数值范围:"); N2=in.nextInt(); System.out.println("请选择是否有无乘除法的运算题(Y/N):"); str1=in.next(); if(str1.equals("Y"))//有乘除法 { System.out.println("请选择是否有无余数的运算题(Y/N):"); str2=in.next(); if(str2.equals("Y"))//需要有余数 { System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { int a,b,c,c1,h,h2; a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*4); //控制加减运算符 c=(int) (Math.random()*(N2-1)+1); c1=(int) (Math.random()*10+1); //控制倍数 if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"+"+b+"="); double s; s=-a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } if(h==1)//减法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"-"+b+"="); double s; s=-a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } if(h==1) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } if(h==2) { System.out.println(a+"*"+b+"="); double s; s=a*b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } if(h==3) { int d,k; k=(int) (Math.random()*(c-1)+1); //必须产生余数 d=c*c1+k; System.out.println(d+"/"+c+"="); double s; s=d/c; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } else if(str2.equals("N"))//不需要产生余数 { System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { int a,b,c,c1,h,h2; a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*4); //控制加减运算符 c=(int) (Math.random()*(N2-1)+1); c1=(int) (Math.random()*10+1); //控制倍数 if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"+"+b+"="); double s; s=-a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } if(h==1)//减法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"-"+b+"="); double s; s=-a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } if(h==1) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } if(h==2)//乘法 { System.out.println(a+"*"+b+"="); double s; s=a*b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } if(h==3)//除法,不产生余数 { int d; //不能产生余数 d=c*c1; System.out.println(d+"/"+c+"="); double s; s=d/c; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } } else if(str1.equals("N"))//没有乘除法 { int a,b,h,h2; System.out.println("请选择是否有负数(Y/N):"); str3=in.next(); for(i=0;i<N;i++) { a=(int) (Math.random()*N2); b=(int) (Math.random()*N2); h=(int) (Math.random()*2); //控制运算符 if(str3.equals("Y"))//有负数 { if(h==0)//加法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"+"+b+"="); double s; s=-a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } if(h==1)//减法 { h2=(int) (Math.random()*2); //控制有无负数 if(h2==0) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } else if(h2==1) { System.out.println("-"+a+"-"+b+"="); double s; s=-a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } else if(str3.equals("N"))//无负数 { if(h==0) { System.out.println(a+"+"+b+"="); double s; s=a+b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } if(h==1) { System.out.println(a+"-"+b+"="); double s; s=a-b; strr2=in.nextDouble(); if(fra.judge(s,strr2)==1) { sum++; } } } } } } } in.close(); } } class change{ Scanner in=new Scanner(System.in); int change_(int a,int b)//化简分数 { int r1; if(a>b) { r1=b; } else r1=a; int k=0; for(int j=1;j<=r1;j++) { if(a%j==0&&b%j==0) { k=j; } } return k; } int judge_FRA(String str1,String str)//分数运算判断对错,计算正确次数 { int ju; if(str.equals(str1)) { System.out.println("正确"); ju=1; } else { System.out.println("错误"); ju=0; } return ju; } int judge(double s,double ss)//整数判断对错,计算正确次数 { int ju; if(s==ss) { System.out.println("正确"); ju=1; } else { System.out.println("错误"); ju=0; } return ju; } }
4.运行结果截图:
psp表格:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
计划 |
|
· Estimate |
· 估计这个任务需要多少时间 |
8小时 |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
栈的应用 用过栈来确定运算的优先级 |
· Design Spec |
· 生成设计文档 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
|
· Design |
· 具体设计 |
|
· Coding |
· 具体编码 |
|
· Code Review |
· 代码复审 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
|
Reporting |
报告 |
|
· Test Report |
· 测试报告 |
|
· Size Measurement |
· 计算工作量 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
对于栈还不是很熟悉 |
|
合计 |
|
项目计划总结:
任务 日期 |
上课 |
编写程序 |
阅读书籍 |
3.13 |
2小时课程 |
|
|
3.14 |
|
思考如何输入结果和连接数据库,以及如何连接数据库 |
|
3.15 |
|
思考如何输入结果和连接数据库,以及如何连接数据库 |
|
3.16 |
|
|
阅读《梦断代码》 |
3.17 |
|
|
时间记录日志:
日期 |
开始时间 |
结束时间 |
中断时间 |
活动 |
备注 |
3.13 |
14:00 |
15:50 |
10min |
上课 |
|
3.14 |
|
|
|
|
|
3.15 |
19:00 |
20:30 |
|
编程 |
|
3.16 |
|
|
|
阅读 |
|
3.17 |
19:00 |
|
|
编程 |
|
3.18 |
|
|
|
写博客 |
缺陷记录日志:
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
描述 |
3.15 |
1 |
思维逻辑 |
设计 |
设计 |
5min |
|
对于结果对错,先将表达式结果算出来存入数组,然后与输入的结果比较 |
|
|
|
|
|
|
|