20165336 结对编程——四则运算(一)
20165336 结对编程——四则运算(一)
一、需求分析(描述自己对需求的理解,以及后续扩展的可能性)
- 实现整数加、减、乘、除运算。(通过堆栈运用后缀表达式实现结果)
- 扩展:实现分数的加减乘除运算。题目去重、支持多语言、处理生成题目并输出到文件、完成题目后从文件读入并判题。
二、设计思路(同时输出UML类图)
通过对堆栈的学习运用压栈和弹栈进行计算。
- 如果遇到数字,我们就直接将其输出。
- 如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。
- 如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈。
- 如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈。
- 如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
思路图如下:
三、实现过程中的关键代码解释
import java.util.*;
import java.lang.*;
public class S {
public static void main(String args[]) {
Stack<Integer> stack=new Stack<Integer>();//创建堆栈
String z =args.toString();
int n = z.length();
int k;
for(int i=0;i<n;i++){
k=Integer.parseInt(args[i]);
if(k=='+'){//加运算
Integer F1=stack.pop();
int f1=F1.intValue();
Integer F2=stack.pop();
int f2=F2.intValue();
Integer temp=new Integer(f1+f2);
stack.push(temp);
}
else if(k=='-'){//减运算
Integer F1=stack.pop();
int f1=F1.intValue();
Integer F2=stack.pop();
int f2=F2.intValue();
Integer temp=new Integer(f1-f2);
stack.push(temp);
}
else if(k=='*'){//乘运算
Integer F1=stack.pop();
int f1=F1.intValue();
Integer F2=stack.pop();
int f2=F2.intValue();
Integer temp=new Integer(f1*f2);
stack.push(temp);
}
else if(k=='/'){//除运算
Integer F1=stack.pop();
int f1=F1.intValue();
Integer F2=stack.pop();
int f2=F2.intValue();
Integer temp=new Integer(f1/f2);
stack.push(temp);
}
else{
stack.push(new Integer(Integer.parseInt(args[i])));
}
}
Integer F1=stack.pop();
int f1=F1.intValue();
System.out.println(f1); //输出结果
}
}
四、遇到的困难及解决方法
这次实验我们小组有了思考的方向,两个人的结对学习提升了默契,两个人一个指挥一个掌舵,不断杨帆向前,虽然代码仍有bug,但是我们也依旧再完善,根据设计思路不断的修改,另一方面,依然有bug体现出来知识熟练度的欠缺,需要继续钻研,本周的进度就是这样,根据代码的完善,博客会更新,我相信在结对学习的努力下,我的Java学习会有所突破,不断进步。