第一次作业——四则运算

本文介绍了一个基于Java实现的分数运算题目生成器,能够生成包含加减乘除的随机分数运算题,并通过逆波兰式计算得出结果。此外,还包括了用户答案验证的功能。

需求分析

   1、控制运算表达式题目数量,控制题目中数值的大小

   2、题目中存在分数形式要进行约分

   3、运算符个数不能超过3个

   4、不能出现重复题目,即两个运算表达式的计算步骤不能完全相同

   5、程序同时支持计算生成的每道题目,并对结果进行约分

   6、对用户所做答案进行判断,并且输出正确答案或错误答案

功能设计

   基本功能 

       1、根据控制台输入的数字随机生成指定运算元个数和算式数目的运算符

          2、基本的四则运算功能

          3、式子中的分数和最终计算结果均约分到最简

设计实现

  环境

    windows10+java

  程序结构设计

      

程序设计

 

  • 功能点1:生成随机数

    随机数生成方法:
        public Num createNum(int range)

  

 1 package method;
 2 
 3 import java.util.Random;
 4 import method.Num;
 5 
 6 public class randomNum {
 7     public Num createNum(int range) {
 8         Num num = new Num();
 9         Random rand = new Random();
10         int numerator = rand.nextInt(range + 1);
11         int denominator = rand.nextInt(10) + 1;
12         if (rand.nextInt(1) == 1) {
13             num.setNumerator(numerator);
14             num.setDenominator(1);
15         } else {
16             num.setNumerator(numerator);
17             num.setDenominator(denominator);
18         }
19         num = reduction(num);
20         return num;
21     }
22 
23     public Num reduction(Num num) {
24         int numerator = num.getNumerator();
25         int denominator = num.getDenominator();
26         if (numerator == 0) {
27             num.setDenominator(1);
28             return num;
29         }
30         int divisor = getMaxDivisor(numerator, denominator);
31         if (divisor == 1) {
32             return num;
33         } else {
34             num.setNumerator(num.getNumerator() / divisor);
35             num.setDenominator(num.getDenominator() / divisor);
36             return num;
37         }
38     }
39 
40     public int getMaxDivisor(int numerator, int denominator) {
41         if (denominator == 0) {
42             return numerator;
43         } else {
44             return getMaxDivisor(denominator, numerator % denominator);
45         }
46     }
47 }

 

  • 功能点2:生成随机运算符

    随机运算符生成方法:
        public String createOperator()
 1 package method;
 2 
 3 import java.util.Random;
 4 
 5 public class randomOperator {
 6     public String createoperator() {
 7         String operator = null;
 8         Random rand = new Random();
 9         int n = rand.nextInt(4);
10         switch (n) {
11         case 0:
12             operator = "+";
13             break;
14         case 1:
15             operator = "-";
16             break;
17         case 2:
18             operator = "*";
19             break;
20         case 3:
21             operator = "÷";
22             break;
23         default:
24             operator = "+";
25             break;
26         }
27         return operator;
28     }
29 }

 

  • 功能点3:组成算数表达式

    表达式表示:
        类型:ArrayList
    组成方法:
        public ArrayList<Object> createArithmetic(int range)
  • 功能点4:计算表达式结果并输出文档

    逆波兰式转换:
        public ArrayList<Object> toRPN(ArrayList<Object> list)
    逆波兰式计算
        public Num countRPN(ArrayList<Object> right)
        private Num twoResult(String is, Num op1, Num op2)
  1 package method;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Iterator;
  5 import method.Num;
  6 import method.Stacks;
  7 
  8 public class RPN {
  9     public ArrayList<Object> toRPN(ArrayList<Object> list) {
 10         ArrayList<Object> right = new ArrayList<Object>();// 存储右序表达式
 11         Stacks aStack = new Stacks();//
 12         String operator;
 13         int position = 0;// 当前指针位置
 14         while (true) {
 15             // 当前指针为符号
 16             if (isOperator(list.get(position).toString())) {
 17                 // 栈为空,或指针为(,直接进栈
 18                 if (aStack.top == -1
 19                         || ((String) list.get(position)).equals("(")) {
 20                     aStack.push(list.get(position));
 21                 } else {
 22                     // 指针为)
 23                     if (((String) list.get(position)).equals(")")) {
 24                         // 将栈内(后的运算符出栈
 25                         while (true) {
 26                             if (aStack.top != -1
 27                                     && !((String) aStack.top()).equals("(")) {
 28                                 operator = (String) aStack.pop();
 29                                 right.add(operator);
 30                             } else {
 31                                 if (aStack.top != -1)
 32                                     aStack.pop();
 33                                 break;
 34                             }
 35                         }
 36                     } else {
 37                         while (true) {
 38                             // 栈不为空,判断优先级
 39                             if (aStack.top != -1
 40                                     && priority((String) list.get(position),
 41                                             (String) aStack.top())) {
 42                                 operator = (String) aStack.pop();
 43                                 if (!operator.equals("("))
 44                                     right.add(operator);
 45                             } else {
 46                                 break;
 47                             }
 48 
 49                         }
 50                         aStack.push(list.get(position));
 51                     }
 52                 }
 53             }
 54             // 数字入栈
 55             else {
 56                 right.add(list.get(position));
 57             }
 58             position++;
 59             if (position >= list.size())
 60                 break;
 61         }
 62         // 栈内剩余运算符出栈
 63         while (aStack.top != -1) {
 64             operator = (String) aStack.pop();
 65             if (!operator.equals("("))
 66                 right.add(operator);
 67         }
 68         return right;
 69     }
 70 
 71     // 判断是否为运算符
 72     public static boolean isOperator(String operator) {
 73         if (operator.equals("+") || operator.equals("-")
 74                 || operator.equals("*") || operator.equals("÷")
 75                 || operator.equals("(") || operator.equals(")"))
 76             return true;
 77         else
 78             return false;
 79     }
 80 
 81     // 设置操作符号的优先级别
 82     public static boolean priority(String operatorout, String operatorin) {
 83         int m = 0, n = 0;
 84         String addop[][] = { { "+", "-", "*", "÷", "(", ")" },
 85                 { "+", "-", "*", "÷", "(", ")" } };
 86         int first[][] = { { 1, 1, 2, 2, 2, 0 }, { 1, 1, 2, 2, 2, 0 },
 87                 { 1, 1, 1, 1, 2, 0 }, { 1, 1, 1, 1, 2, 0 },
 88                 { 2, 2, 2, 2, 2, 0 }, { 2, 2, 2, 2, 2, 2 } };
 89         for (int i = 0; i < 6; i++) {
 90             if (operatorin.equalsIgnoreCase(addop[0][i]))
 91                 m = i;
 92         }
 93         for (int i = 0; i < 6; i++) {
 94             if (operatorout.equalsIgnoreCase(addop[1][i]))
 95                 n = i;
 96         }
 97         if (first[m][n] == 1) {
 98             return true;
 99         } else
100             return false;
101     }
102 
103     // 逆波兰式计算
104     public Num countRPN(ArrayList<Object> right) {
105         //
106         Stacks aStack = new Stacks();
107         Num op1, op2, result = null;
108         String is = null;
109         Iterator<Object> it = right.iterator();
110 
111         while (it.hasNext()) {
112             Object ob = it.next();
113             is = ob.toString();
114             if (isOperator(is)) {
115                 op2 = (Num) aStack.pop();
116                 op1 = (Num) aStack.pop();
117                 Num do_0 = twoResult(is, op1, op2);
118                 if (do_0.getDenominator() == 0) {
119                     return (new Num(-1, 1));
120                 }
121                 aStack.push(do_0);
122             } else
123                 aStack.push(ob);
124         }
125         result = (Num) aStack.pop();
126         return result;
127     }
128 
129     // 计算两个数
130     private Num twoResult(String is, Num op1, Num op2) {
131         // 结果数
132         Num result = new Num();
133         randomNum f1 = new randomNum();
134         // 获取分子分母
135         int n1 = op1.getNumerator();
136         int d1 = op1.getDenominator();
137         int n2 = op2.getNumerator();
138         int d2 = op2.getDenominator();
139         // 判断运算符
140         switch (is) {
141         case "+":
142             if (d1 != d2) {
143                 n1 = n1 * d2;
144                 n2 = n2 * d1;
145                 d1 = d1 * d2;
146                 d2 = d1;
147                 result.setNumerator(n1 + n2);
148                 result.setDenominator(d1);
149                 result = f1.reduction(result);
150             } else {
151                 result.setNumerator(n1 + n2);
152                 result.setDenominator(d1);
153                 result = f1.reduction(result);
154             }
155             break;
156         case "-":
157             if (d1 != d2) {
158                 n1 = n1 * d2;
159                 n2 = n2 * d1;
160                 d1 = d1 * d2;
161                 d2 = d1;
162                 result.setNumerator(n1 - n2);
163                 result.setDenominator(d1);
164                 result = f1.reduction(result);
165             } else {
166                 result.setNumerator(n1 - n2);
167                 result.setDenominator(d1);
168                 result = f1.reduction(result);
169             }
170             break;
171         case "*":
172             result.setNumerator(n1 * n2);
173             result.setDenominator(d1 * d2);
174             result = f1.reduction(result);
175             break;
176         case "÷":
177             if (n2 == 0) {
178                 result = new Num(0, 0);
179                 break;
180             }
181             result.setNumerator(n1 * d2);
182             result.setDenominator(d1 * n2);
183             result = f1.reduction(result);
184             break;
185         default:
186             break;
187         }
188         return result;
189     }
190 }

 

  • 功能点5:比较答案
 1 package method;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Scanner;
 5 
 6 import method.Arithmetic;
 7 import method.RPN;
 8 
 9 public class Main {
10     public static void main(String[] args){
11         Arithmetic arithmetic = new Arithmetic();
12         ArrayList<Object> list = arithmetic.createarithmetic(3);
13         for (int i = 0; i < list.size(); i++) {  
14             System.out.print(list.get(i));  
15         }
16         RPN rpn = new RPN();
17         ArrayList<Object> right = rpn.toRPN(list);
18         Num num = new Num();
19         num = rpn.countRPN(right);
20         String a = num.toString();
21         Scanner answer = new Scanner(System.in);  
22         System.out.println(); 
23         System.out.print("输入答案:");   
24         String name = answer.nextLine(); 
25         if(name.equals(a)){
26             System.out.println("正确 ");
27         }else{
28             System.out.println("错误 ");
29             System.out.print("正确答案:" + a);
30         }
31     }
32 }

CODING地址:https://coding.net/u/hydralwz/p/size/git

PSP记录表

PSP2.1Personal Software Process StagesTime Senior StudentTime
Planning计划1010
· Estimate估计这个任务需要多少时间108
Development开发158324
· Analysis需求分析 (包括学习新技术)137
· Design Spec生成设计文档178
· Design Review设计复审53
· Coding Standard代码规范1021
· Design具体设计2050
· Coding具体编码60150
· Code Review代码复审1030
· Test测试(自我测试,修改代码,提交修改)2020
Reporting报告10NaN
·测试报告10NaN
·计算工作量10NaN
·并提出过程改进计划20NaN

转载于:https://www.cnblogs.com/hydralwz/p/7586651.html

### 关于北京航空航天大学数据结构与程序设计课程第一次作业的要求 在北京航空航天大学的数据结构与程序设计课程中,首次作业通常旨在评估学生的基础编程技能以及对基本概念的理解程度。虽然具体的题目每年可能会有所不同,但是这类作业往往侧重考察以下几个方面: - 编程基础:包括但不限于变量定义、控制流语句(如条件判断if...else, 循环for/while)、函数编写等[^1]。 - 数据类型的掌握情况:熟悉常用数值型(int 和 float),了解它们之间的转换规则及其运算特性,比如加减乘除四则运算、取模操作%n用于获取余数、整除//得到商去除小数部分等功能的应用场景[^3]。 针对上述知识点,一份典型的第一份作业可能涉及如下任务之一或组合形式的任务: - 设计小型应用程序模拟实际生活中的某些流程; - 或者像提到过的二叉搜索树(BST)那样更复杂一点的数据结构练习题目的简化版本[^2]。 为了更好地准备这份作业,建议复习课堂笔记并参考教材对应章节的内容,同时可以查阅公开的教学资源网站寻找相似案例学习借鉴。如果遇到困难的地方,积极向老师提问或是参与同学间的讨论交流也是很有帮助的方式。 ```python # 示例代码片段展示如何实现一个简单的功能——计算两个整数的最大公约数(GCD) def gcd(a, b): while b != 0: a, b = b, a % b return abs(a) print(gcd(-48, 18)) # 输出应为6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值