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

上传人:b****4 文档编号:6332734 上传时间:2023-05-06 格式:DOCX 页数:22 大小:85.98KB
下载 相关 举报
Java实验报告C语言实训支持表达式计算器文档格式.docx_第1页
第1页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第2页
第2页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第3页
第3页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第4页
第4页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第5页
第5页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第6页
第6页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第7页
第7页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第8页
第8页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第9页
第9页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第10页
第10页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第11页
第11页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第12页
第12页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第13页
第13页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第14页
第14页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第15页
第15页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第16页
第16页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第17页
第17页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第18页
第18页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第19页
第19页 / 共22页
Java实验报告C语言实训支持表达式计算器文档格式.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

《Java实验报告C语言实训支持表达式计算器文档格式.docx》由会员分享,可在线阅读,更多相关《Java实验报告C语言实训支持表达式计算器文档格式.docx(22页珍藏版)》请在冰点文库上搜索。

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

br/>

*

(1)初始化两个栈:

运算符栈S1和储存中间结果的栈S2;

*

(2)从右至左扫描中缀表达式;

*(3)遇到操作数时,将其压入S2;

*(4)遇到运算符时,比较其与S1栈顶运算符的优先级:

*(4-1)如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈;

*(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中的元素并输出,结果即为中缀表达式对应的前缀表达式。

例如,将中缀表达式“1+((2+3)×

4)-5”转换为前缀表达式的过程如下:

扫描到的元素

S2(栈底->

栈顶)

S1(栈底->

说明

5

数字,直接入栈

-

S1为空,运算符直接入栈

-)

右括号直接入栈

4

54

数字直接入栈

×

-)×

S1栈顶是右括号,直接入栈

3

543

数字

+

)+

2

5432

5432+

左括号,弹出运算符直至遇到右括号

5432+×

同上

-+

优先级与-相同,入栈

1

1

到达最左端

1+-

S1中剩余的运算符

运行截图:

6.本实训中遇到的关键问题及其解决方法:

中缀表达式(中缀记法)

中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。

中缀表达式是人们常用的算术表示方法。

虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。

对计算机来说,计算前缀或后缀表达式的值非常简单。

7.实训总结:

通过一个简单的计算器程序,让我对java编程及栈的操作有了进一步的认识。

认识到需要培养团队合作能力。

8.附录:

程序实现代码:

MainFrame.java

importjavax.swing.*;

importjavax.swing.border.Border;

importjava.awt.*;

importjava.awt.event.ActionListener;

importjava.awt.event.ActionEvent;

importjava.awt.event.KeyAdapter;

importjava.awt.event.KeyEvent;

/**

*我的计算器。

MainFrame继承于JFrame,是计算器的界面

*/

publicclassMainFrameextendsJFrame{

/**

*

privatestaticfinallongserialVersionUID=1L;

privateBorderborder=BorderFactory.createEmptyBorder(5,5,5,5);

privateJTextFieldtextbox=newJTextField("

0"

);

privateJTextFieldoldtextbox=newJTextField("

privateJTextFieldqz_textbox=newJTextField("

StringBuildersbBuilder=newStringBuilder("

"

//输入缓存

//按下=或回车得到结果

voidgetResult(){

if(!

sbBuilder.toString().equals(textbox.getText())){

intend=sbBuilder.length();

sbBuilder=sbBuilder.delete(0,end);

sbBuilder.append(textbox.getText());

}

Stringstring=null;

String[]results=null;

try{

string=sbBuilder.toString();

if(string.matches("

.*[=\\-*/]"

)){

thrownewException("

运算符格式不正确!

}elseif(string.matches("

[+\\-*/][0-9]*.*"

string=sbBuilder.insert(0,'

0'

).toString();

}

results=Calculator.toPolishNotation(string);

}catch(Exceptione){

string="

;

sbBuilder=newStringBuilder("

results=newString[]{"

"

};

JOptionPane.showMessageDialog(this,"

表达式格式错误。

+e.getMessage());

StringoResult=results[0];

//

oldtextbox.setText(string);

qz_textbox.setText(results[1]);

textbox.setText(oResult);

intend=sbBuilder.length();

//System.out.println(end);

sbBuilder.delete(0,end);

sbBuilder.append(oResult);

return;

}

privateActionListenerlistener=newActionListener(){

publicvoidactionPerformed(ActionEvente){

JButtonb=(JButton)e.getSource();

Stringlabel=b.getText();

if(label.equals("

="

getResult();

}elseif(label.equals("

DEL"

)){

intend=sbBuilder.length();

sbBuilder=sbBuilder.deleteCharAt(end-1);

textbox.setText(sbBuilder.toString());

C"

sbBuilder=sbBuilder.delete(0,end);

oldtextbox.setText("

CLEAR"

}

else{

sbBuilder.append(label);

////

};

publicMainFrame(Stringtitle)throwsHeadlessException{

super(title);

//调用父类构造方法

setupFrame();

//调整窗体属性

setupControls();

//创建控件

privatevoidsetupControls(){

setupDisplayPanel();

//创建文本面板

setupButtonsPanel();

//创建按钮面板

//创建按钮面板并添加按钮

privatevoidsetupButtonsPanel(){

JPanelpanel=newJPanel();

panel.setBorder(border);

panel.setLayout(newGridLayout(4,5,3,3));

createButtons(panel,newString[]{

"

7"

"

8"

9"

+"

4"

5"

6"

-"

1"

2"

3"

*"

("

//空字符串表示这个位置没有按钮

."

/"

)"

});

this.add(panel,BorderLayout.SOUTH);

*在指定的面板上创建按钮

*

*@parampanel

*要创建按钮的面板

*@paramlabels

*按钮文字

privatevoidcreateButtons(JPanelpanel,String[]labels){

for(Stringlabel:

labels){

//如果label为空,则表示创建一个空面板。

否则创建一个按钮。

panel.add(newJPanel());

}else{

JButtonb=newJButton(label);

b.setFont(newFont("

微软雅黑"

Font.PLAIN,20));

b.addActionListener(listener);

//为按钮添加侦听器

panel.add(b);

//设置显示面板,用一个文本框来作为计算器的显示部分。

privatevoidsetupDisplayPanel(){

JPanelpanel1=newJPanel();

panel.setLayout(newBorderLayout());

panel1.setLayout(newBorderLayout());

panel1.setBorder(border);

setupTextbox();

panel1.add(qz_textbox,BorderLayout.CENTER);

panel.add(oldtextbox,BorderLayout.NORTH);

panel.add(textbox,BorderLayout.CENTER);

this.add(panel1,BorderLayout.NORTH);

this.add(panel,BorderLayout.CENTER);

//调整文本框

privatevoidsetupTextbox(){

qz_textbox.setHorizontalAlignment(JTextField.RIGHT);

//文本右对齐

qz_textbox.setEditable(false);

textbox.setHorizontalAlignment(JTextField.RIGHT);

textbox.setEditable(true);

//文本框只读

//按下ENTER键得到结果

textbox.addKeyListener(newKeyAdapter(){

@Override

publicvoidkeyReleased(KeyEvente){

if(e.getKeyCode()==KeyEvent.VK_ENTER){

getResult();

}

});

textbox.setBackground(Color.white);

//文本框背景色为白色

qz_textbox.setBackground(Color.white);

oldtextbox.setHorizontalAlignment(JTextField.RIGHT);

oldtextbox.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(newFont("

Font.BOLD,20));

oldtextbox.setFont(newFont("

Font.PLAIN,16));

//TODO让文本框一进入程序就能获得输入焦点

//调整窗体

privatevoidsetupFrame(){

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

//当窗体关闭时程序结束

this.setLocation(100,50);

//设置窗体显示在桌面上的位置

this.setSize(400,300);

//设置窗体大小

this.setResizable(false);

//窗体大小固定

//程序入口

publicstaticvoidmain(String[]args)throwsException{

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

MainFrameframe=newMainFrame("

支持表达式求值的计算器的设计与实现"

frame.setVisible(true);

//在桌面上显示窗体

}

Calculator.java

importjava.util.Stack;

*利用栈实现中缀表达式计算

*@author

publicclassCalculator{

*转换成前缀表达式并计算.<

*将中缀表达式转换为前缀表达式:

*遵循以下步骤:

*

(1)初始化两个栈:

*(6)重复步骤

(2)至(5),直到表达式的最左边;

*(7)将S1中剩余的运算符依次弹出并压入S2;

*(8)依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。

*@param表达式字符串

*@return计算结果Object[2][0]:

Doubleresult[1]:

Stringexpression

*@throwsIllegalArgumentException

*@throwsNumberFormatException

publicstaticString[]toPolishNotation(Stringinput)

throwsIllegalArgumentException,NumberFormatException{

//string:

1+3*(2-1)

intlen=input.length();

//len:

9

charc,tempChar;

Stack<

Character>

s1=newStack<

();

//操作运算符

Double>

s2=newStack<

//中间结果

Object>

expression=newStack<

//前缀表达式

doublenumber;

intlastIndex=-1;

for(inti=len-1;

i>

=0;

--i){//8-0

c=input.charAt(i);

//i:

8c:

if(Character.isDigit(c)){

//i:

7c:

1自右向左找到input中最后一个数的最后一位数字的下标

lastIndex=readDoubleReverse(input,i);

//lastIndex(input中最后一个数的第一位数字的下标):

7

number=Double.parseDouble(input.substring(lastIndex,i+1));

//找到input中最后一个数:

number

s2.push(number);

//遇到操作数时,将其压入S2;

i=lastIndex;

//将前缀表达式压入expression栈

if((int)number==number)

expression.push((int)number);

else

expression.push(number);

}elseif(isOperator(c)){

//遇到运算符时,比较其与S1栈顶运算符的优先级:

/*

*peek():

*Looksattheobjectatthetopofthis

*stackwithoutremovingitfromthestack.

*Returntheobjectatthetopofthisstack

*(thelastitemoftheVectorobject).

*/

while(!

s1.isEmpty()&

&

s1.peek()!

='

)'

&

priorityCompare(c,s1.peek())<

0){

expression.push(s1.peek());

//乘法和除法优先级较高

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2