软件工程作业02

题目:     

二柱子又对自己提出了新的要求:

设计思想:

  • 项目名称、源文件等见软件工程作业01
  • 对于乘除法,其实我们作业01中已经有了除法,别忘了分数就是特殊的除法运算哦!但是我们要的不是只有分数的除法,还要加入对乘法的支持,那么我们在CT.java文件(源码见作业01)中会看到有两个函数是用来生成题目的:只需要对上面两个方法进行改进就行了,但是还有一个问题:什么时候出现乘法、什么时候出现除法呢?在源代码中我们看到了有两个随机数t和f是否超50来控制何时出现加法何时出现减法。那么我们就可以借助这个思想进行改进,加减法的出现是将0-100数轴分成两份,前一段设置出现加法后一段设置出现减法,那么我们可以把0-100数轴分成四份,每份表示一个运算符,这样我们就实现了对加减乘除的控制。
    • quesGrow_int()                 // 用来生成整数之间的运算
    • quesGrow_div()                // 用来生成分数之间的运算
  • 至于括号,我们作业01的运行结果中可以看出是有括号的出现的,所以暂时搁置一下。
  • 对于数值范围,凡是设计分数的运算结果都是保留一位小数,但是对于整数之间的运算,若是限制在一位小数的话,可能会出现结果为0的答案过多,所以暂时搁置了。
  • 此作业用时1个多小时。

源代码:

 我们只对CT.java文件进行了更改,所以如果有需要,请前往软件工程作业01中查看剩余文件源码!

CT.java

package cn.simo;

import java.util.Scanner;
/**
 * 小学生出题系统(30道四则运算题)
 * @author www.cnsimo.cn
 * @since 2017-03-07 21:53:14
 */
public class CT {

	public static String str = "";//保存题目的字符串
    public static int num = 5;//每题中数的个数
    public static int num_i = 0;//题目中已有数的个数    
    public static int numberRange = 100;//运算中数的最大取值    
    public static double sum = 0;//记录结果
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("注意:结果保留1位小数!");
		System.out.println("共30道题目:");
		Scanner in = new Scanner(System.in);
		double answer = 0;
		double result = 0;
		String[] question = new String[30];
		int questionNumber = 0;
		int answerTrue = 0;
		boolean flag;
		for(;;) {
			answer = 0; result = 0; flag = true; str="";
			if((questionNumber + 1)%5 != 0) {
				GetQuestion_int();
			} else {
				GetQuestion_div();
			}
			for(int j = questionNumber-1; j >= 0; j --) {
				if(question[j].equals(str)) {
					flag = false; break;
				}
			}
			if(!flag) continue;
			else {question[questionNumber] = new String(str); questionNumber++;}
			System.out.print("" + questionNumber + ". " + str+" = ");
			answer = in.nextDouble();
			if(!str.isEmpty()) {
				result = Arithmetic.arithmetic(str);
			}
			if(answer == result) {
				System.out.println("   ✔️");
				answerTrue++;
			} else {
				System.out.println("   ❌ " + "  正确答案:" + result);
			}
			
			if(questionNumber == 30) break;         // 满30个跳出
		}
		
		System.out.println("你的正确概率:" + answerTrue + "/30");
		in.close();
	}
	
    private static void GetQuestion_int() {
        //得到问题函数,在这里调用递归函数quesGrow()。
        str = "";
        sum = 0;
        num_i = num;//用前都清零
        quesGrow_int();
    }
    
    private static void GetQuestion_div() {
    	str = "";
        sum = 0;
        num_i = num;//用前都清零
        quesGrow_div();
    }

    private static void quesGrow_int() {
        //
        if( num_i > 1 ) {
            int j = num_i;//记录这是第几层调用。
            num_i--;
            quesGrow_int();//递归
            
            int w=1+(int)(Math.random()*numberRange);//随机生成一个数
            int t=1+(int)(Math.random()*100);//向左生成,还是向右生成,类似于树。
            int f=1+(int)(Math.random()*100);//运算符控制
            
            if(t>50)//新数往右加
            {
                if(f>50) {
                	if(f>75) {
	                    sum = sum + w;
	                    str = str + "+" + String.valueOf( w );
                	} else {
                		sum *= w;
                		str = str + "*" + String.valueOf(w);
                	}
                }
                else {
                	if(f<25) {
	                    sum = sum - w;
	                    str = str + "-" + String.valueOf( w );
                	} else {
                		sum = sum / w;
	                    str = str + "/" + String.valueOf(w);
                	}
                }
            }
            else//否则 新数往左加
            {
                if(f>50) {
                	if(f>50) {
	                    sum = w + sum;
	                    str = String.valueOf( w ) + "+" + str;
                	} else {
                		sum = w * sum;
                		str = String.valueOf(w) + "*" + str; 
                	}
                } else {
                    if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是j=2
                    	if(f<25) {
	                        sum = w - sum;
	                        str = String.valueOf( w ) + "-" + str;
                    	} else {
                    		sum = w / sum;
                    		str = String.valueOf( w ) + "/" + str;
                    	}
                    }
                    else {
                    	if(f<25) {
	                        sum = w - sum;
	                        str = String.valueOf( w ) + "-" + "(" +str+ ")";
	                        //向左添减法的时候加括号,打破顺序计算模式。
                    	} else {
                    		sum = w / sum;
                    		str = String.valueOf(w) + "/" + "(" + str + ")";
                    	}
                    }
                }
            }
        }
        else if( num_i == 1 ) {
            //最后一层,也是输出的第一层
            int w=1+(int)(Math.random()*numberRange);
            sum = sum + w;
            str = str + String.valueOf( w );
        }
    }
    
    private static void quesGrow_div() {
    	if( num_i > 1 ) {
            int j = num_i;//记录这是第几层调用。
            num_i--;
            quesGrow_div();//递归
            
            double w=Math.random();//随机生成一个数
            int t=1+(int)(Math.random()*100);//向左生成,还是向右生成,类似于树。
            int f=1+(int)(Math.random()*100);//运算符控制
            
            if(t>50)//新数往右加
            {
                if(f>50) {
                	if(f>75) {
                		sum = sum + w;
                        str = str + "+" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                                                           // +0.01保证w长度不低于4,并且w需要截取到小数点后2位,防止小数点后字符长度过大不能转化成int型
                	} else {
                		sum *= w;
                		str = str + "*" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                	}
                }
                else {
                	if(f<25) {
	                    sum = sum - w;
	                    str = str + "-" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));    
                	} else {
                		sum = sum / w;
	                    str = str + "/" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
                	}
                }
            }
            else//否则 新数往左加
            {
                if(f>50) {
                	if(f>75){
	                    sum = w + sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "+" + str;    
                	} else{
                		sum = w * sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "*" + str;    
                	}
                }
                else {
                    if( j < 3 ) {//3——摸索出的数,不用给自己套上括号。实际上就是j=2
	                    sum = w - sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + str;
                    }
                    else {
	                    sum = w - sum;
	                    str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + "(" +str+ ")";
	                    //向左添减法的时候加括号,打破顺序计算模式。
                    }
                }
            }
        }
        else if( num_i == 1 ) {
            //最后一层,也是输出的第一层
            double w=Math.random();
            sum = sum + w;
            str = str + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4));
        }
	}
}

运行结果:

总结:

对于本程序,可能会出现栈溢出的异常,但是很少情况才会出现一次,所以问题所在之处并不好找,只能放弃。通过这个作业我们需要掌握PSP项目计划的指定以及把握对时间的掌握!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

【编程题】Java编程题五(10道)

【编程题】Java编程题六(10道) 【程序41】 题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海...

42412
来自专栏.net core新时代

拓扑排序及其实际应用

  最近在做实际项目中遇到了一个问题,如何判断一个层级结构的图是否存在循环引用。刚开始想到了方法是用递归进行判断,后来想到大学学过的拓扑排序可以解决该问题,于是...

1925
来自专栏潇涧技术专栏

Python Data Structures - C3 Data Structures

参考内容: 1.Problem Solving with Python Chapter 2 Algorithm Analysis Chapter 3 Ba...

581
来自专栏Phoenix的Android之旅

Java中的四舍五入

大概在小学的时候我们就学过四舍五入, 不过在编程语言中这个概念跟我们所熟悉的算法有点出入。 如果面试中考察你对Math.round()的用法,不知道能不能准确答...

832
来自专栏小樱的经验随笔

51 Nod 1027 大数乘法【Java大数乱搞】

1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果。 Input 第1行:...

1824
来自专栏前端架构

js随机产生和为s的整数组

随机生成和为S的N个正整数有很多种解法。下面讲解一种比较高效且比较有趣味性的解法——投影法。

612
来自专栏JAVA高级架构开发

Java 程序员必须掌握的 8 道数据结构面试题,你会几道?

瑞士计算机科学家Niklaus Wirth在1976年写了一本书,名为《算法+数据结构=编程》。

1240
来自专栏Script Boy (CN-SIMO)

软件工程个人作业01

题目:      像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确...

1890
来自专栏用户2442861的专栏

2014年网易阿里腾讯 面试问题相关

http://blog.csdn.net/wendy260310/article/details/41039625

482
来自专栏服务端技术杂谈

算出实体箱子之间可以存多少水

出题 ? 下午,群里面有同学出了一个简单的算法题,意思是一个房间内,有多个1立方米的箱子,多个箱子可以垂直落在一起,问:剩下的空间可以存多少立方的水(如图)。 ...

3117

扫码关注云+社区