ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:85.98KB ,
资源ID:10285154      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10285154.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java实验报告C语言实训支持表达式计算器.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java实验报告C语言实训支持表达式计算器.docx

1、Java实验报告C语言实训支持表达式计算器C语言程序设计实训报告书班级 惠普测试142 学号 1408090213 姓名 闫伟明 指导教师 庞志永 实训项目名称:支持表达式求值的计算器的设计与实现1.实训目的所设计的计算器可以进行简单的表达式求值,并支持括号运算。通过该课程设计,了解数组的使用,学会用函数实现栈等操作。2.实训要求(1)应用所学知识,完成实训目标。(2)程序能够正常运行,运算结果正确,满足设计要求。3.功能描述要求程序具有输入界面,该输入界面至少有一个文本框和一个按钮。用户在文本输入框内输入需要计算的表达式,并单击按钮后,程序可以计算出该表达式的值。用户输入的表达式可能是符合数

2、学规则的表达式,也可能是不符合数学规则的表达式。如果输入的表达式正确,则计算器能够给出正确结果,否则,程序输出错误信息,并尽可能指出错误的位置及错误的类型。4.总体设计5.程序实现及相关描述前缀表达式(前缀记法、波兰式)前缀表达式的运算符位于操作数之前。前缀表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。例如前缀表达式“- + 3 4 5 6”: (1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+

3、运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; (3) 接下来是运算符,因此弹出7和5,计算出75=35,将35入栈; (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 可以看出,用计算机计算前缀表达式的值是很容易的。将中缀表达式转换为前缀表达式:遵循以下步骤: * (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; * (2) 从右至左扫描中缀表达式; * (3) 遇到操作数时,将其压入S2; * (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: * (4-1) 如果S1为空,或栈顶运算符

4、为右括号“)”,则直接将此运算符入栈; * (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; * (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; * (5) 遇到括号时: * (5-1) 如果是右括号“)”,则直接压入S1; * (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃; * (6) 重复步骤(2)至(5),直到表达式的最左边; * (7) 将S1中剩余的运算符依次弹出并压入S2; * (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对

5、应的前缀表达式。例如,将中缀表达式“1+(2+3)4)-5”转换为前缀表达式的过程如下:扫描到的元素S2(栈底-栈顶)S1 (栈底-栈顶)说明55空数字,直接入栈-5-S1为空,运算符直接入栈)5- )右括号直接入栈45 4- )数字直接入栈5 4- ) S1栈顶是右括号,直接入栈)5 4- ) )右括号直接入栈35 4 3- ) )数字+5 4 3- ) ) +S1栈顶是右括号,直接入栈25 4 3 2- ) ) +数字(5 4 3 2 +- ) 左括号,弹出运算符直至遇到右括号(5 4 3 2 + -同上+5 4 3 2 + - +优先级与-相同,入栈15 4 3 2 + 1- +数字到达

6、最左端5 4 3 2 + 1 + -空S1中剩余的运算符运行截图:6.本实训中遇到的关键问题及其解决方法:中缀表达式(中缀记法)中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。7.实训总结:通过一个简单的计算器程序,让我对java编程及栈的操作有了进一步的认识。认识到需要培养团队合作能力。8.附录:程序实现代码:Main

7、Frame.javaimport javax.swing.*;import javax.swing.border.Border;import java.awt.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;/* * 我的计算器。MainFrame 继承于 JFrame,是计算器的界面 */public class MainFrame extends JFrame /*

8、* */ private static final long serialVersionUID = 1L; private Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5); private JTextField textbox = new JTextField(0); private JTextField oldtextbox = new JTextField(0); private JTextField qz_textbox = new JTextField(0); StringBuilder sbBuilder = n

9、ew StringBuilder();/输入缓存 /按下=或回车得到结果 void getResult() if (!sbBuilder.toString().equals(textbox.getText() int end = sbBuilder.length(); sbBuilder = sbBuilder.delete(0,end); sbBuilder.append(textbox.getText(); String string = null; String results = null; try string = sbBuilder.toString(); if (string.m

10、atches(.*=-*/) throw new Exception(运算符格式不正确!); else if (string.matches(+-*/0-9*.*) string=sbBuilder.insert(0, 0).toString(); results = Calculator.toPolishNotation(string); catch (Exception e) string = 0; sbBuilder = new StringBuilder(0); results = new String0,0; JOptionPane.showMessageDialog(this, 表

11、达式格式错误。+e.getMessage(); String oResult = results0 ;/ oldtextbox.setText(string); qz_textbox.setText(results1); textbox.setText(oResult); int end = sbBuilder.length(); /System.out.println(end); sbBuilder.delete(0, end); sbBuilder.append(oResult); return; private ActionListener listener = new ActionLi

12、stener() public void actionPerformed(ActionEvent e) JButton b = (JButton) e.getSource(); String label = b.getText(); if (label.equals(=) getResult(); else if(label.equals(DEL) int end = sbBuilder.length(); sbBuilder = sbBuilder.deleteCharAt(end-1); textbox.setText(sbBuilder.toString(); else if(label

13、.equals(C) int end = sbBuilder.length(); sbBuilder = sbBuilder.delete(0,end); textbox.setText(sbBuilder.toString(); oldtextbox.setText(CLEAR); else sbBuilder.append(label); textbox.setText(sbBuilder.toString(); / ; public MainFrame(String title) throws HeadlessException super(title); / 调用父类构造方法 setu

14、pFrame(); / 调整窗体属性 setupControls(); / 创建控件 private void setupControls() setupDisplayPanel(); / 创建文本面板 setupButtonsPanel(); / 创建按钮面板 / 创建按钮面板并添加按钮 private void setupButtonsPanel() JPanel panel = new JPanel(); panel.setBorder(border); panel.setLayout(new GridLayout(4, 5, 3, 3); createButtons(panel, ne

15、w String 7, 8, 9, +, DEL, 4, 5, 6, -, C, 1, 2, 3, *, (, / 空字符串表示这个位置没有按钮 0, ., =, /, ) ); this.add(panel, BorderLayout.SOUTH); /* * 在指定的面板上创建按钮 * * param panel * 要创建按钮的面板 * param labels * 按钮文字 */ private void createButtons(JPanel panel, String labels) for (String label : labels) / 如果 label 为空,则表示创建一

16、个空面板。否则创建一个按钮。 if (label.equals() panel.add(new JPanel(); else JButton b = new JButton(label); b.setFont(new Font(微软雅黑, Font.PLAIN, 20); b.addActionListener(listener); / 为按钮添加侦听器 panel.add(b); / 设置显示面板,用一个文本框来作为计算器的显示部分。 private void setupDisplayPanel() JPanel panel = new JPanel(); JPanel panel1 = n

17、ew JPanel(); panel.setLayout(new BorderLayout(); panel.setBorder(border); panel1.setLayout(new BorderLayout(); panel1.setBorder(border); setupTextbox(); panel1.add(qz_textbox,BorderLayout.CENTER); panel.add(oldtextbox, BorderLayout.NORTH); panel.add(textbox, BorderLayout.CENTER); this.add(panel1, Bo

18、rderLayout.NORTH); this.add(panel, BorderLayout.CENTER); / 调整文本框 private void setupTextbox() qz_textbox.setHorizontalAlignment(JTextField.RIGHT); / 文本右对齐 qz_textbox.setEditable(false); textbox.setHorizontalAlignment(JTextField.RIGHT); / 文本右对齐 textbox.setEditable(true); / 文本框只读 /按下ENTER键得到结果 textbox.

19、addKeyListener(new KeyAdapter() Override public void keyReleased(KeyEvent e) if (e.getKeyCode()=KeyEvent.VK_ENTER) getResult(); ); textbox.setBackground(Color.white); / 文本框背景色为白色 qz_textbox.setBackground(Color.white); / 文本框背景色为白色 oldtextbox.setHorizontalAlignment(JTextField.RIGHT); / 文本右对齐 oldtextbo

20、x.setEditable(false); / 文本框只读 oldtextbox.setBackground(Color.white); / 文本框背景色为白色 oldtextbox.setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5); textbox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5); qz_textbox.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5); textbox.setFont(new Font

21、(微软雅黑, Font.BOLD, 20); oldtextbox.setFont(new Font(微软雅黑, Font.PLAIN, 16); /TODO 让文本框一进入程序就能获得输入焦点 / 调整窗体 private void setupFrame() this.setDefaultCloseOperation(EXIT_ON_CLOSE); / 当窗体关闭时程序结束 this.setLocation(100, 50); / 设置窗体显示在桌面上的位置 this.setSize(400, 300); / 设置窗体大小 this.setResizable(false); / 窗体大小固定

22、 / 程序入口 public static void main(String args) throws Exception UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); MainFrame frame = new MainFrame(支持表达式求值的计算器的设计与实现); frame.setVisible(true); / 在桌面上显示窗体 Calculator.javaimport java.util.Stack;/* * * 利用栈实现中缀表达式计算 * author * */public class

23、 Calculator /* * 转换成前缀表达式并计算. * * 将中缀表达式转换为前缀表达式: * 遵循以下步骤: * (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; * (2) 从右至左扫描中缀表达式; * (3) 遇到操作数时,将其压入S2; * (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: * (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; * (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; * (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; * (

24、5) 遇到括号时: * (5-1) 如果是右括号“)”,则直接压入S1; * (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃; * (6) 重复步骤(2)至(5),直到表达式的最左边; * (7) 将S1中剩余的运算符依次弹出并压入S2; * (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。 * param 表达式字符串 * return 计算结果Object2 0:Double result 1:String expression * throws IllegalArgumentException *

25、throws NumberFormatException */ public static String toPolishNotation(String input) throws IllegalArgumentException, NumberFormatException /string:1+3*(2-1) int len = input.length();/len:9 char c, tempChar; Stack s1 = new Stack();/操作运算符 Stack s2 = new Stack();/中间结果 Stack expression = new Stack();/前缀

26、表达式 double number; int lastIndex = -1; for (int i = len - 1; i = 0; -i) /8 - 0 c = input.charAt(i);/ i:8 c:) if (Character.isDigit(c) / i:7 c:1 自右向左找到input中最后一个数的最后一位数字的下标 lastIndex = readDoubleReverse(input, i); / lastIndex(input中最后一个数的第一位数字的下标):7 number = Double.parseDouble(input.substring(lastInd

27、ex, i + 1); /找到input中最后一个数:number s2.push(number);/遇到操作数时,将其压入S2; i = lastIndex; /将前缀表达式压入expression栈 if (int) number = number) expression.push(int) number); else expression.push(number); else if (isOperator(c) / 遇到运算符时,比较其与S1栈顶运算符的优先级: /* * peek(): * Looks at the object at the top of this * stack without removing it from the stack. * Return the object at the top of this stack * (the last item of the Vector object). */ while (!s1.isEmpty() & s1.peek() != ) & priorityCompare(c, s1.peek() 0) expression.push(s1.peek(); /乘法和除法优先级较高

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1