您的位置:首页 > 编程语言 > Java开发

Java仿windows自带的计算器-课程设计

2012-05-24 00:00 423 查看
一段尘封已久的代码,当年的课程设计。《java程序设计》课程设计报告

课题名称:GUI计算器设计

1.课程设计题目

基于GUI的计算器设计

2.课程设计目的

1.巩固和加深课堂所学知识;

2.将课本上的理论知识和实际应用有机的结合起来,培养同学们分析和解决实际问题的能力;

3.通过对java语言程序代码的阅读、修改、设计,理解和掌握复杂的java语言应用程序的编程,提高实践编程能力。

3.程序运行环境及开发工具

本程序在WindowsXP的PC机上利用Jbuilder9.0的软件开发实现,在WindowsXP平台上Jbuilder9.0及Eclipse环境中运行通过。

4.程序功能使用说明

运行该程序后,参与运算的操作数可有鼠标点击相应按钮输入,也可有键盘输入,但操作符应有鼠标点击相应的按钮,当:

1.在简易计算中可以按照常规输入计算,基本无bug,“%”未设置其用途;

2.简易计算中,可以进行+、-、*、/、乘方(^)、开方(√)及阶乘(!)运算;

3.科学计算中有许多功能为实现,主要能进行加、减、乘、除、乘方、开方、幂、开n次方、倒数、阶乘、ln、e的x次幂、三角函数等高级运算;

4.例如:

(1).1+9=10

(2).25+-8=17

(3).98-35=63

(4).96*2=192

(5).96/4=24

(6).4^3=64

(7).100√=10

(8).-9√=不能执行此操作!!

(9).20!=2432902008176640000

(10).-20!=不能执行此操作!!

(11).0!=1

(12).8ln=2.0794415416798357

(13).2Exp=7.38905609893065

(14).8x^y3=512

(15).20x^2=400

(16).100n!=93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

(17).30sin=0.49999999999999994(0.5)(求sin30度)

其他(cos,tan)依次类推;

(18).1/x计算有bug;

(19).3x√8=2(求8开3次方);

(20).95Mod10=5(95对10求余)

5.关键算法与技术:

1.大数阶乘;

2.界面切换;

3.GirdLayout布局管理器的使用;

4.事件响应;

5.匿名内部类的使用;

6.

6.设计思路:

本程序采用模块化设计,调试方便,程序的可读性好。在老师的指导下,由主程序启动简易计算器,根据使用者的需要可以在简易计算器中进行运算操作,若不能满足用户功能,可以选择使用科学计算器,具体操作与目前市面上的计算器差不多,用户还可以选择使用说明进行查看具体操作。由于时间及个人水平的问题,科学计算中还有很多功能未实现。

具体思路:用户输入(点击)某一数字或操作符,程序将自行判断是操作数还是操作符,

1.若为一操作数的首次输入,则将显示区的“0”替换,若该操作数不为首次输入则将显示区的数字串接上此次输入的数字;

2.若为操作符,将判断是否为带符号操作数,若是则保存符号,反之为纯操作符:若为二元操作符就将显示区的字符串转化为双精度数;若为等号就进行计算结果并显示结果;若为一目操作符就进行相应的一目运算并显示结果;

3.进行相应的初始化操作,为下一次输入做准备;

4.根据自己的理解画了下面的简单的流程图。



7.编码实现:

//package计算器;

viewsource
print
?

001packageorg.csmn.app;
002
003importjava.awt.*;
004importjava.awt.event.*;
005importjavax.swing.*;
006importjava.io.*;
007importjava.math.*;
008importjava.util.*;
009
010/**
011*<p>Title:用户应用界面计算器</p>
012*<p>Description:包含简易计算与功能更加强大的科学计算</p>
013*<p>Copyright:Copyright(c)2008</p>
014*<p>Company:</p>
015*<ahref="http://my.oschina.net/arthor"target="_blank"rel="nofollow">@author</a>车水码农
016*@version1.0
017*/
018publicclassCalculat{
019staticJTextFieldshow;//设置输入区,显示区
020staticdoubleopNum=0;//存放操作数
021staticStringopChar="=";//存放操作符
022staticbooleanflag=true;//设置标志
023
024publicstaticvoidmain(String[]args){
025newEasyFrame();//产生首界面——简易计算器
026}
027}
028
029classEasyFrame{//构建简易计算器框架界面
030staticJFrameframe;
031
032publicEasyFrame(){
033frame=newJFrame("简易计算器");
034Toolkitkit=Toolkit.getDefaultToolkit();//设置图标
035//下面这条语句不好,不具有可移植性
036Imageimage=kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
037frame.setIconImage(image);
038frame.addWindowListener(newWindowAdapter(){//响应关闭事件
039publicvoidwindowClosing(WindowEvente){
040System.exit(0);
041}
042});
043JMenuBarmb=newJMenuBar();//创建菜单栏
044JMenum1=newJMenu("编辑");//创建菜单
045JMenum2=newJMenu("操作");
046JMenum3=newJMenu("帮助");
047JMenuItemmi1c=newJMenuItem("复制",KeyEvent.VK_C);//创建菜单项
048JMenuItemmi1v=newJMenuItem("粘贴",KeyEvent.VK_V);
049JMenuItemmi21=newJMenuItem("基本计算");
050JMenuItemmi22=newJMenuItem("科学计算");
051JMenuItemmi31=newJMenuItem("使用说明");
052JMenuItemmi32=newJMenuItem("About...");
053frame.setJMenuBar(mb);//添加菜单到窗口
054mb.add(m1);
055mb.add(m2);
056mb.add(m3);
057m1.add(mi1c);
058m1.add(mi1v);
059m2.add(mi21);
060m2.add(mi22);
061m3.add(mi31);
062m3.add(mi32);
063/*菜单项监听事件*/
064mi1c.addActionListener(newMenuItemListener());//监听复制
065mi1v.addActionListener(newMenuItemListener());//监听粘贴
066mi22.addActionListener(newMenuItemListener());
067mi31.addActionListener(newMenuItemListener());
068mi32.addActionListener(newMenuItemListener());
069Containercp=frame.getContentPane();//获取内容窗格
070cp.add(neweasyCalPanel());//将简易计算器面板加入到框架中
071frame.setSize(280,250);
072//frame.pack();//将框架设置合适的大小
073frame.setVisible(true);//设置框架可见
074}
075}
076
077classAdvanceFrame{//构建高级计算器框架界面
078staticJFrameframe;
079
080publicAdvanceFrame(){
081frame=newJFrame("科学计算器");
082Toolkitkit=Toolkit.getDefaultToolkit();//设置图标
083Imageimage=kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg");
084frame.setIconImage(image);
085JMenuBarmb=newJMenuBar();//创建菜单栏
086JMenum1=newJMenu("编辑");
087JMenum2=newJMenu("操作");
088JMenum3=newJMenu("帮助");
089JMenuItemmi1c=newJMenuItem("复制",KeyEvent.VK_C);
090JMenuItemmi1v=newJMenuItem("粘贴",KeyEvent.VK_V);
091JMenuItemmi21=newJMenuItem("基本计算");
092JMenuItemmi22=newJMenuItem("科学计算");
093JMenuItemmi31=newJMenuItem("使用说明");
094JMenuItemmi32=newJMenuItem("About...");
095frame.setJMenuBar(mb);//添加菜单栏
096mb.add(m1);
097mb.add(m2);
098mb.add(m3);//添加菜单
099m1.add(mi1c);
100m1.add(mi1v);
101m2.add(mi21);
102m2.add(mi22);
103m3.add(mi31);
104m3.add(mi32);
105mi1c.addActionListener(newMenuItemListener());//监听复制
106mi1v.addActionListener(newMenuItemListener());//监听粘贴
107mi21.addActionListener(newMenuItemListener());//监听简易计算
108mi31.addActionListener(newMenuItemListener());//监听使用说明
109mi32.addActionListener(newMenuItemListener());//监听关于
110Containercp=frame.getContentPane();//获取框架的内容窗格
111cp.add(newAdvanceCalPanel());//添加高级计算面板
112frame.pack();//设置适当的大小
113frame.setVisible(true);//可见
114frame.addWindowListener(newWindowAdapter(){//响应关闭按钮
115publicvoidwindowClosing(WindowEvente){
116System.exit(0);
117}
118});
119}
120}
121
122classMenuItemListenerimplementsActionListener{//响应菜单事件
123publicvoidactionPerformed(ActionEvente){
124if("基本计算".equals(e.getActionCommand())){
125newEasyFrame();//切换到简易计算器窗口
126AdvanceFrame.frame.setVisible(false);
127}elseif("科学计算".equals(e.getActionCommand())){
128newAdvanceFrame();//切换到高级计算界面
129EasyFrame.frame.setVisible(false);
130}elseif("复制".equals(e.getActionCommand())){
131//
132}elseif("粘贴".equals(e.getActionCommand())){
133//
134}elseif("使用说明".equals(e.getActionCommand())){
135try{
136FileInputStreamfis=newFileInputStream("使用说明.txt");
137InputStreamReaderisr=newInputStreamReader(fis);
138BufferedReaderbr=newBufferedReader(isr);
139JTextAreahelpArea=newJTextArea(15,48);
140//helpArea.enable(false);
141helpArea.setEditable(false);
142helpArea.setDisabledTextColor(Color.black);
143JScrollPanescroll=newJScrollPane(helpArea);
144Strings;
145while((s=br.readLine())!=null){
146helpArea.append(s);
147helpArea.append("\n");
148}
149JOptionPane.showMessageDialog(null,scroll,"帮助主题",JOptionPane.PLAIN_MESSAGE);
150br.close();
151}catch(IOExceptionex){
152ex.printStackTrace();
153}
154//System.exit(0);//如果加上此句,当关掉JOptionPane时就会关掉JFrame;
155}elseif(e.getActionCommand().equals("About...")){
156JTextAreaaboutArea=newJTextArea();
157aboutArea.setText("版权拥有者:车水码农\n开发时间:2008-12-16\n");
158JOptionPane.showMessageDialog(null,aboutArea,"关于计算器",JOptionPane.PLAIN_MESSAGE);
159}
160}
161}
162
163classAdvanceCalPanelextendsJPanel{//创建高级计算面板
164privatestaticfinallongserialVersionUID=2696716054985506500L;
165
166publicAdvanceCalPanel(){
167setLayout(newBorderLayout());//设置布局方式
168Calculat.show=newJTextField("0",27);//显示文本区
169Calculat.show.setFont(newFont("Dialog",Font.PLAIN,16));//设置字体
170Calculat.show.setHorizontalAlignment(JTextField.RIGHT);//设置光标位置
171JPanelps=newJPanel();//创建面板加载显示区文本框
172ps.add(Calculat.show);
173JPanelpbl=newJPanel();//创建面板加载按钮
174pbl.setLayout(newGridLayout(10,5,1,1));//设置按钮面板的布局
175pbl.setBorder(BorderFactory.createEtchedBorder());//设置边框
176//pbr.setLayout(newGridLayout(5,6,1,2));
177//pbr.setBorder(BorderFactory.createEtchedBorder());
178String[]larr={//按钮
179"Sta","F-E","(",")","MC","clr","Avg","dms","Exp","ln","MR",
180"Dec","Sum","sin","x^y","log","MS","Bin","E(x)","cos",
181"x^2","n!","M+","Oct","D(x)","tan","x√","1/x","PI",
182"Hex","D","E","F","/","Mod","And","A","B","C","*",
183"Or","Xor","7","8","9","-","Lsh","Not","4","5","6",
184"+","Int","shift","1","2","3",".","0","="};
185for(inti=0;i<larr.length;i++){
186addButton(pbl,larr[i]);//创建按钮
187}
188setBorder(BorderFactory.createEtchedBorder());//设置边框
189add(pbl,BorderLayout.CENTER);//分别添加两面板到框架中
190add(ps,BorderLayout.NORTH);
191}
192
193privatevoidaddButton(Containerc,Strings){//创建按钮,加入到面板并监听按钮事件
194JButtonbt=newJButton(s);
195c.add(bt);
196bt.addActionListener(newbuttonListener());
197}
198}
199
200classeasyCalPanelextendsJPanel{//操作基本等同于创建高级计算面板
201privatestaticfinallongserialVersionUID=3224376138339105930L;
202
203publiceasyCalPanel(){
204setLayout(newBorderLayout());
205Calculat.show=newJTextField("0",17);
206Calculat.show.setFont(newFont("Dialog",Font.PLAIN,18));
207Calculat.show.setHorizontalAlignment(JTextField.RIGHT);
208JPanelps=newJPanel();
209ps.add(Calculat.show);
210JPanelpb=newJPanel();
211pb.setLayout(newGridLayout(5,4,1,1));
212pb.setBorder(BorderFactory.createEtchedBorder());
213Stringbts="%^√!789/456*123-0.=+";
214for(inti=0;i<bts.length();i++){
215addButton(pb,bts.substring(i,i+1));
216}
217add(pb,BorderLayout.CENTER);
218add(ps,BorderLayout.NORTH);
219}
220
221privatevoidaddButton(Containerc,Strings){
222JButtonbt=newJButton(s);
223bt.setFont(newFont("Dialog",Font.PLAIN,18));//设置字体
224c.add(bt);
225bt.addActionListener(newbuttonListener());
226}
227}
228
229classbuttonListenerimplementsActionListener{//响应按钮事件
230
231publicvoidactionPerformed(ActionEvente){
232Strings=e.getActionCommand();//获取命令
233if('0'<=s.charAt(0)&&s.charAt(0)<='9'||s.equals(".")){//该命令为正操作数
234if(Calculat.flag){//若初次输入该操作数(如:输入“123”中的“1”)
235Calculat.show.setText(s);
236}else{
237//(如:输入“123”中的"2"或"3")
238Calculat.show.setText(Calculat.show.getText()+s);
239}
240Calculat.flag=false;//修改标志
241}else{//命令为操作数为负数或操作符
242if(Calculat.flag){//初次输入
243if(s.equals("-")){//为负数
244Calculat.show.setText(s);
245Calculat.flag=false;
246}else{//连续输入几个操作符
247Calculat.opChar=s;///
248}
249}else{//为操作符
250calculatecal=newcalculate();//创建计算类实例
251doublex=Double.parseDouble(Calculat.show.getText());//将输入的操作数转换为double型
252cal.calopr1(x);//双目运算及处理单目运算的操作数
253Calculat.opChar=s;//保存运算符
254if(Calculat.opChar.equals("!")||Calculat.opChar.equals("√")//操作数必须为正的单目运算
255||Calculat.opChar.equals("n!")){
256if(Calculat.opNum<0){
257Calculat.show.setText("不能执行此操作!!");
258}else{
259cal.calopr2((int)Calculat.opNum,Calculat.opChar);//单目运算
260}
261Calculat.opChar="=";//保存符号为下一次运算做准备
262}elseif(Calculat.opChar.equals("1/x")
263||Calculat.opChar.equals("x^2")
264||Calculat.opChar.equals("ln")
265||Calculat.opChar.equals("log")
266||Calculat.opChar.equals("sin")
267||Calculat.opChar.equals("cos")
268||Calculat.opChar.equals("tan")
269||Calculat.opChar.equals("Exp")){//普通单目运算
270cal.calopr2((int)Calculat.opNum,Calculat.opChar);//单目运算
271Calculat.opChar="=";//保存符号为下一次运算做准备
272}
273Calculat.flag=true;//设置标志为下一次运算做准备
274}
275}
276}
277}
278
279classcalculate{//计算处理
280publicvoidcalopr1(doublen){//处理双目运算及单目运算的操作数
281Stringstr="";
282if(Calculat.opChar.equals("+")){
283Calculat.opNum+=n;
284}elseif(Calculat.opChar.equals("-")){
285Calculat.opNum-=n;
286}elseif(Calculat.opChar.equals("*")){
287Calculat.opNum*=n;
288}elseif(Calculat.opChar.equals("/")){
289if(n==0){
290str="除数为0!!!";
291}else{
292Calculat.opNum/=n;
293}
294}elseif(Calculat.opChar.equals("^")||Calculat.opChar.equals("x^y")){
295Calculat.opNum=Math.pow(Calculat.opNum,n);
296}elseif(Calculat.opChar.equals("x√")){
297Calculat.opNum=Math.pow(n,1/Calculat.opNum);
298}elseif(Calculat.opChar.equals("=")){
299Calculat.opNum=n;
300}elseif(Calculat.opChar.equals("Mod")){
301Calculat.opNum=Math.abs(Math.IEEEremainder(Calculat.opNum,n));
302}
303Calculat.show.setText(str+Calculat.opNum);
304}
305
306publicvoidcalopr2(intn,StringopChar){//处理单目运算
307if(opChar.equals("!")||opChar.equals("n!")){
308Calculat.show.setText(newFactorial().factorial((int)Calculat.opNum).toString());
309}elseif(opChar.equals("√")){
310Calculat.show.setText(""+Math.sqrt(n));
311}elseif(opChar.equals("1/x")){
312Calculat.show.setText(""+(1.0/n));
313}elseif(opChar.equals("x^2")){
314Calculat.show.setText(""+Math.pow(n,2));
315}elseif(opChar.equals("ln")){
316Calculat.show.setText(""+Math.log(n));
317}elseif(opChar.equals("log")){
318//Calculat.show.setText(""+Math.log10(n));
319}elseif(opChar.equals("sin")){
320Calculat.show.setText(""+Math.sin(Math.toRadians(n)));
321}elseif(opChar.equals("cos")){
322Calculat.show.setText(""+Math.cos(Math.toRadians(n)));
323}elseif(opChar.equals("tan")){
324Calculat.show.setText(""+Math.tan(Math.toRadians(n)));
325}elseif(opChar.equals("Exp")){
326Calculat.show.setText(""+Math.exp(n));
327}
328}
329}
330
331classFactorial{//计算大数阶乘
332protectedstaticArrayList<BigInteger>table=newArrayList<BigInteger>();
333static{
334table.add(BigInteger.valueOf(1));
335}
336
337/**Createsanewinstanceoffactorial*/
338publicstaticsynchronizedBigIntegerfactorial(intx){
339if(x<0){
340thrownewIllegalArgumentException("xmustbenon-negative.");
341}
342for(intsize=table.size();size<=x;size++){
343BigIntegerlastfact=(BigInteger)table.get(size-1);
344BigIntegernextfact=lastfact.multiply(BigInteger.valueOf(size));
345table.add(nextfact);
346}
347return(BigInteger)table.get(x);
348}
349}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: