目录
1.进行平方和开方运算时其保存在历史记录中的表达式会出现两个等号及两个结果。
2.输入界面和历史记录栏皆可实现不断字自动换行功能以及滚动条功能
项目准备
需求分析
1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;
2.保存和浏览历史运算记录;
3.能够检验算术表达式的合法性;
4.能够实现四则混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
5.要求交互界面友好,程序健壮。
重点
1.算法部分:中缀表达式转为后缀表达式;后缀表达式的计算;判断表达式是否合法
2.GUI界面:JAVA swing 各组件的混合运用;按钮的监听;界面的设计
编程语言及开发工具
JAVA,IDEA
算法部分的代码
//将中缀表达式转换为后缀表达式 private String[] houzhui(String str) { String s = "";// 用于承接多位数的字符串 char opStack[] = new char[100];// 静态栈,对用户输入的操作符进行处理,用于存储运算符 String postQueue[] = new String[100];// 后缀表达式字符串数组,为了将多位数存储为独立的字符串 int top = -1, j = 0;// 静态指针top,控制变量j for (int i = 0; i < str.length(); i++)// 遍历中缀表达式 // indexof函数,返回字串首次出现的位置;charAt函数返回index位置处的字符; { if ("0123456789.".indexOf(str.charAt(i)) >= 0) // 遇到数字字符的情况 { s = "";// 作为承接字符,每次开始时都要清空 for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) { s = s + str.charAt(i); } i--; postQueue[j] = s;// 数字字符直接加入后缀表达式 j++; } else if ("(".indexOf(str.charAt(i)) >= 0) {// 遇到左括号 top++; opStack[top] = str.charAt(i);// 左括号入栈 } else if (")".indexOf(str.charAt(i)) >= 0) {// 遇到右括号 for (;;)// 栈顶元素循环出栈,直到遇到左括号为止 { if (opStack[top] != '(') {// 栈顶元素不是左括号 postQueue[j] = opStack[top] + "";// 栈顶元素出栈 j++; top--; } else { // 找到栈顶元素是左括号 top--;// 删除栈顶左括号 break;// 循环结束 } } } if ("*%/".indexOf(str.charAt(i)) >= 0)// 遇到高优先级运算符 { if (top == -1) {// 若栈为空则直接入栈 top++; opStack[top] = str.charAt(i); } else {// 栈不为空,把栈中弹出的元素入队,直到栈顶元素优先级小于x或者栈为空 if ("*%/".indexOf(opStack[top]) >= 0) { // 栈顶元素也为高优先级运算符 postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后缀表达式 j++; opStack[top] = str.charAt(i);// 当前运算符入栈 } else if ("(".indexOf(opStack[top]) >= 0) {// 栈顶元素为左括号,当前运算符入栈 top++; opStack[top] = str.charAt(i); } else if ("+-".indexOf(str.charAt(i)) >= 0) {// 遇到低优先级运算符 postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后最表达式 j++; opStack[top] = str.charAt(i);// 当前元素入栈 } } } else if ("+-".indexOf(str.charAt(i)) >= 0) { if (top == -1) { top++; opStack[top] = str.charAt(i); } else { if ("*%/".indexOf(opStack[top]) >= 0) { // 栈顶元素也为高优先级运算符 postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后缀表达式 j++; opStack[top] = str.charAt(i);// 当前运算符入栈 } else if ("(".indexOf(opStack[top]) >= 0) {// 栈顶元素为左括号,当前运算符入栈 top++; opStack[top] = str.charAt(i); } else if ("+-".indexOf(str.charAt(i)) >= 0) {// 遇到低优先级运算符 postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后最表达式 j++; opStack[top] = str.charAt(i);// 当前元素入栈 } } } } for (; top != -1;) {// 遍历结束后将栈中剩余元素依次出栈进入后缀表达式 postQueue[j] = opStack[top] + ""; j++;