20172333 2017-2018-2 《程序设计与数据结构》实验2报告(2)
1.结对成员
严域俊20172333
2.小组结对合作图片
3.项目中自己负责的部分
package ddaadada;
import java.util.*;
public class LT {
public char[] op = {\'+\',\'-\',\'*\',\'/\',\'(\',\')\'};
public String[] strOp = {"+","-","*","/","(",")"};
public boolean isDigit(char c){
if(c>=\'0\'&&c<=\'9\'){
return true;
}
return false;
}
public boolean isOp(char c){
for(int i=0;i<op.length;i++){
if(op[i]==c){
return true;
}
}
return false;
}
public boolean isOp(String s){
for(int i=0;i<strOp.length;i++){
if(strOp[i].equals(s)){
return true;
}
}
return false;
}
/**
* 处理输入的计算式
* @param str
* @return
*/
public List<String> work(String str){
List<String> list = new ArrayList<String>();
char c;
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
c = str.charAt(i);
if(isDigit(c)){
sb.append(c);
}
if(isOp(c)){
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
list.add(c+"");
}
}
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
return list;
}
public void printList(List<String> list){
for(String o:list){
System.out.print(o+" ");
}
}
/**
* 中缀表达式转化为后缀表达式
* 1,遇到数字输出
* 2,遇到高优先级的全部出栈
* 3,最后全部出栈
*/
public List<String> InfixToPostfix(List<String> list){
List<String> Postfixlist = new ArrayList<String>();//存放后缀表达式
Stack<String> stack = new Stack<String>();//暂存操作符
//stack.push(\'#\');
for(int i=0;i<list.size();i++){
String s = list.get(i);
if(s.equals("(")){
stack.push(s);
}else if(s.equals("*")||s.equals("÷")){
stack.push(s);
}else if(s.equals("+")||s.equals("-")){
if(!stack.empty()){
while(!(stack.peek().equals("("))){
Postfixlist.add(stack.pop());
if(stack.empty()){
break;
}
}
stack.push(s);
}else{
stack.push(s);
}
}else if(s.equals(")")){
while(!(stack.peek().equals("("))){
Postfixlist.add(stack.pop());
}
stack.pop();
}else{
Postfixlist.add(s);
}
if(i==list.size()-1){
while(!stack.empty()){
Postfixlist.add(stack.pop());
}
}
}
return Postfixlist;
}
/**
* 后缀表达式计算
*/
public int doCal(List<String> list){
Stack<Integer> stack = new Stack<Integer>();
for(int i=0;i<list.size();i++){
String s = list.get(i);
int t=0;
if(!isOp(s)){
t = Integer.parseInt(s);
stack.push(t);
}else{
if(s.equals("+")){
int a1 = stack.pop();
int a2 = stack.pop();
int v = a2+a1;
stack.push(v);
}else if(s.equals("-")){
int a1 = stack.pop();
int a2 = stack.pop();
int v = a2-a1;
stack.push(v);
}else if(s.equals("*")){
int a1 = stack.pop();
int a2 = stack.pop();
int v = a2*a1;
stack.push(v);
}else if(s.equals("÷")){
int a1 = stack.pop();
int a2 = stack.pop();
int v = a2/a1;
stack.push(v);
}
}
}
return stack.pop();
}
4.个人贡献度划分
可以说应该算是各自百分之五十吧,因为我们组内就两个人,所以分工很明确的,由他完成题目输出而我则是中缀转后缀,但是现在面临合并的问题,然后我两共同思考编写方法,所以没有说谁偷懒之类的,大家都很努力编写,也希望尽快完成吧。
5.相关代码截图
1.生成题目(一共四级题目+-*/,每一级都可能含有分数随机的)
2.中缀转后缀加计算 图1234
3.判断答案及其正确率 图1
6.关键代码
1.生成题目(代码上一部分有)
- [x] 思路解释:我们原本是要用符号个数来代表题目等级的,后来涉及到中缀转后缀不方便,就换了一个思路,那就是分为0,1,2,3四个等级,每一个等级都只有两个数进行+——*/等运算,在这个运算中随机可能会含有分数形式的一个输出题目。
2.中缀转后缀(代码备注中有)
- [x] 思路解释:第一步处理题目,第二步
中缀表达式转化为后缀表达式 1遇到数字输出 2遇到高优先级的全部出栈 3最后全部出栈,第三步后缀表达式计算。
3.判断结果并输出正确率
- [x] 思路解释:就是单纯的布鲁型If判断语句,最后在输出正确答案,至于输出正确率则是在生成题目中含有。
7.遇到的困难及解决方法
-
[x] 1.最最严重的问题:由于之前刚开始的单独作战,导致了一个非常严重的问题,我做的题目输出是一次性多次题目出现,而李楠的中缀转后缀是只接受一个题目,就会导致我们现在完全对接不上,导致这个四则运算没有完成。
解决方法:目前尚未解决。