若对相关控件的属性不够熟悉的话,可自行查阅相关文献。 2.设计思想 2.1 整体思想 在整个过程中,首先应该对输入进行容错处理,这样有利于提高用户体验。对于用户的按键输入,需要及时地显示在第一个EditView中。在EditView中显示的是一个字符串,用户每输入一个操作,字符串发生相应改变,然后在EditView中反映出来。 接着便是对第一个EditView中的字符串进行处理。通过程序设计,可以将字符串中的数据和操作符分别存在两个栈中。 然后需要设计算法处理两个栈,通过算法得出字符串表达式的运算结果,再将运算结果反映在第二个EditView中的字符串中。 (注:数据和操作符也可以储存在队列中,实际上储存在队列中更为合理。) 2.2 容错处理 用户在输入过程中,肯定会存在一定的错误,程序设计过程中需要对应用程序进行容错处理。容错设计比如:在输入过程中小数的话只能有一个小数点,操作符不能连续输入,整数数据的开头不能出现0等等。 在设计的应用程序中,设计了几个标记flag,每按下一个按键,若是按键是合理的话,都会引起标记flag的改变。标记flag将会限制接下来的输入是否有效,无效则不做任何处理。 flag0=0:处理0的输出,为1则表示数字的开头有一个0。当flag0=1时,不能再输入0,当再输入数字或者操作符时,flag0重新置0。 flag1=0:处理0的输出,每个数字开头的标志 数值为0表示为数字开头。当flag1=0时,如果先输入0再输入1的话,前面的0自动消除。还有当flag1=0时,不能输入小数点等等。 flag2=0:处理小数点,一个数字最多只能有一个小数点。当数字中有小数点时,flag2变为1,此后不能再输入小数点,输入操作符等操作后,flag2又变为0。 flag3=0:处理运算符的输出。很明显不能连续输入操作符,用此标志,来限制连续操作符的输入。 flag4=0:处理ON/OFF问题。当OFF之后,flag变为1,只有当flag等于1时,ON按钮才能进行操作。 flag5=0:处理等号问题。很明显操作符之后不能按下等号按钮,等号按钮按下之后要在第二个EditView中显示结果、将显示输出的EditView清空。 2.3 数据结构的设计 在程序设计过程中,需要设计数据结构来存储数字、操作符和容错标记,在本文中使用了栈,对这些数据进行了存储。 容错标记flag的存储结构如下所示: class Flag { private int a0; private int a1; private int a2; private int a3; public int a0() { return a0; } public int a1() { return a1; } public int a2() { return a2; } public int a3() { return a3; } public Flag(int a,int b,int c,int d) { a0=a; a1=b; a2=c; a3=d; } public Flag next; } class FlagList { private Flag first; public FlagList(int a,int b,int c,int d) { first=null; } public boolean isEmpty() { return (first==null); } public void insertFirst(int a,int b,int c,int d) { Flag newFlag = new Flag(a,b,c,d); newFlag.next = first; first = newFlag; } public Flag deleteFirst() { Flag temp = first; first = first.next; return temp; } } class FlagStack { private FlagList theFlagList; private int count; public FlagStack() { theFlagList = new FlagList(0,0,0,0); count=0; } public void push(int a,int b,int c,int d) { theFlagList.insertFirst(a,b,c,d); count++; } public Flag pop() { count=count-1; return theFlagList.deleteFirst(); } public boolean isEmpty() { return ( theFlagList.isEmpty() ); } public int count() { return count; } } 数字存储的形式如下所示: class Num { private String s=new String(); public Num(String s1) { s=s1; } public String getNum() { return s; } public Num next; } class NumList { private Num firstNum; public NumList() { firstNum=null; } public boolean isEmpty() { return (firstNum==null); } public void insertFirst(String s1) { Num newNum = new Num(s1); newNum.next = firstNum; firstNum = newNum; } public Num deleteFirst() { Num temp = firstNum; firstNum = firstNum.next; return temp; } } class NumStack { private NumList theNumList; private int countNum; public NumStack() { theNumList = new NumList(); countNum=0; } public void push(String s1) { theNumList.insertFirst(s1); countNum++; } public Num pop() { countNum=countNum-1; return theNumList.deleteFirst(); } public boolean isEmpty() { return ( theNumList.isEmpty() ); } public int countNum() { return countNum; } } 操作符存储的形式如下所示: class Symbol { private char c; private int degree1; public Symbol(char c1) { c=c1; if(c=='×'||c=='÷') degree1=2; else degree1=1; } public int getDegree() { return degree1; } public char getSymbol() { return c; } public Symbol next; }
class SymbolList { private Symbol firstSymbol; public SymbolList() { firstSymbol=null; } public boolean isEmpty() { return (firstSymbol==null); } public void insertFirst(char c1) { Symbol newSymbol = new Symbol(c1); newSymbol.next = firstSymbol; firstSymbol = newSymbol; } public Symbol deleteFirst() { Symbol temp = firstSymbol; firstSymbol = firstSymbol.next; return temp; } }
class SymbolStack { private SymbolList theSymbolList; private int countSymbol; public SymbolStack() { theSymbolList = new SymbolList(); countSymbol=0; } public void push(char c1) { theSymbolList.insertFirst(c1); countSymbol++; } public Symbol pop() { countSymbol=countSymbol-