一段尘封已久的代码,当年的课程设计。《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
?
004 | importjava.awt.event.*; |
011 | *<p>Title:用户应用界面计算器</p> |
012 | *<p>Description:包含简易计算与功能更加强大的科学计算</p> |
013 | *<p>Copyright:Copyright(c)2008</p> |
015 | *<ahref="http://my.oschina.net/arthor"target="_blank"rel="nofollow">@author</a>车水码农 |
019 | staticJTextFieldshow;//设置输入区,显示区 |
020 | staticdoubleopNum=0;//存放操作数 |
021 | staticStringopChar="=";//存放操作符 |
022 | staticbooleanflag=true;//设置标志 |
024 | publicstaticvoidmain(String[]args){ |
025 | newEasyFrame();//产生首界面——简易计算器 |
029 | classEasyFrame{//构建简易计算器框架界面 |
033 | frame=newJFrame("简易计算器"); |
034 | Toolkitkit=Toolkit.getDefaultToolkit();//设置图标 |
036 | Imageimage=kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg"); |
037 | frame.setIconImage(image); |
038 | frame.addWindowListener(newWindowAdapter(){//响应关闭事件 |
039 | publicvoidwindowClosing(WindowEvente){ |
043 | JMenuBarmb=newJMenuBar();//创建菜单栏 |
044 | JMenum1=newJMenu("编辑");//创建菜单 |
045 | JMenum2=newJMenu("操作"); |
046 | JMenum3=newJMenu("帮助"); |
047 | JMenuItemmi1c=newJMenuItem("复制",KeyEvent.VK_C);//创建菜单项 |
048 | JMenuItemmi1v=newJMenuItem("粘贴",KeyEvent.VK_V); |
049 | JMenuItemmi21=newJMenuItem("基本计算"); |
050 | JMenuItemmi22=newJMenuItem("科学计算"); |
051 | JMenuItemmi31=newJMenuItem("使用说明"); |
052 | JMenuItemmi32=newJMenuItem("About..."); |
053 | frame.setJMenuBar(mb);//添加菜单到窗口 |
064 | mi1c.addActionListener(newMenuItemListener());//监听复制 |
065 | mi1v.addActionListener(newMenuItemListener());//监听粘贴 |
066 | mi22.addActionListener(newMenuItemListener()); |
067 | mi31.addActionListener(newMenuItemListener()); |
068 | mi32.addActionListener(newMenuItemListener()); |
069 | Containercp=frame.getContentPane();//获取内容窗格 |
070 | cp.add(neweasyCalPanel());//将简易计算器面板加入到框架中 |
071 | frame.setSize(280,250); |
072 | //frame.pack();//将框架设置合适的大小 |
073 | frame.setVisible(true);//设置框架可见 |
077 | classAdvanceFrame{//构建高级计算器框架界面 |
081 | frame=newJFrame("科学计算器"); |
082 | Toolkitkit=Toolkit.getDefaultToolkit();//设置图标 |
083 | Imageimage=kit.getImage("D:\\jbproject\\netTest\\src\\nettest\\1471.jpg"); |
084 | frame.setIconImage(image); |
085 | JMenuBarmb=newJMenuBar();//创建菜单栏 |
086 | JMenum1=newJMenu("编辑"); |
087 | JMenum2=newJMenu("操作"); |
088 | JMenum3=newJMenu("帮助"); |
089 | JMenuItemmi1c=newJMenuItem("复制",KeyEvent.VK_C); |
090 | JMenuItemmi1v=newJMenuItem("粘贴",KeyEvent.VK_V); |
091 | JMenuItemmi21=newJMenuItem("基本计算"); |
092 | JMenuItemmi22=newJMenuItem("科学计算"); |
093 | JMenuItemmi31=newJMenuItem("使用说明"); |
094 | JMenuItemmi32=newJMenuItem("About..."); |
095 | frame.setJMenuBar(mb);//添加菜单栏 |
105 | mi1c.addActionListener(newMenuItemListener());//监听复制 |
106 | mi1v.addActionListener(newMenuItemListener());//监听粘贴 |
107 | mi21.addActionListener(newMenuItemListener());//监听简易计算 |
108 | mi31.addActionListener(newMenuItemListener());//监听使用说明 |
109 | mi32.addActionListener(newMenuItemListener());//监听关于 |
110 | Containercp=frame.getContentPane();//获取框架的内容窗格 |
111 | cp.add(newAdvanceCalPanel());//添加高级计算面板 |
112 | frame.pack();//设置适当的大小 |
113 | frame.setVisible(true);//可见 |
114 | frame.addWindowListener(newWindowAdapter(){//响应关闭按钮 |
115 | publicvoidwindowClosing(WindowEvente){ |
122 | classMenuItemListenerimplementsActionListener{//响应菜单事件 |
123 | publicvoidactionPerformed(ActionEvente){ |
124 | if("基本计算".equals(e.getActionCommand())){ |
125 | newEasyFrame();//切换到简易计算器窗口 |
126 | AdvanceFrame.frame.setVisible(false); |
127 | }elseif("科学计算".equals(e.getActionCommand())){ |
128 | newAdvanceFrame();//切换到高级计算界面 |
129 | EasyFrame.frame.setVisible(false); |
130 | }elseif("复制".equals(e.getActionCommand())){ |
132 | }elseif("粘贴".equals(e.getActionCommand())){ |
134 | }elseif("使用说明".equals(e.getActionCommand())){ |
136 | FileInputStreamfis=newFileInputStream("使用说明.txt"); |
137 | InputStreamReaderisr=newInputStreamReader(fis); |
138 | BufferedReaderbr=newBufferedReader(isr); |
139 | JTextAreahelpArea=newJTextArea(15,48); |
140 | //helpArea.enable(false); |
141 | helpArea.setEditable(false); |
142 | helpArea.setDisabledTextColor(Color.black); |
143 | JScrollPanescroll=newJScrollPane(helpArea); |
145 | while((s=br.readLine())!=null){ |
147 | helpArea.append("\n"); |
149 | JOptionPane.showMessageDialog(null,scroll,"帮助主题",JOptionPane.PLAIN_MESSAGE); |
151 | }catch(IOExceptionex){ |
154 | //System.exit(0);//如果加上此句,当关掉JOptionPane时就会关掉JFrame; |
155 | }elseif(e.getActionCommand().equals("About...")){ |
156 | JTextAreaaboutArea=newJTextArea(); |
157 | aboutArea.setText("版权拥有者:车水码农\n开发时间:2008-12-16\n"); |
158 | JOptionPane.showMessageDialog(null,aboutArea,"关于计算器",JOptionPane.PLAIN_MESSAGE); |
163 | classAdvanceCalPanelextendsJPanel{//创建高级计算面板 |
164 | privatestaticfinallongserialVersionUID=2696716054985506500L; |
166 | publicAdvanceCalPanel(){ |
167 | setLayout(newBorderLayout());//设置布局方式 |
168 | Calculat.show=newJTextField("0",27);//显示文本区 |
169 | Calculat.show.setFont(newFont("Dialog",Font.PLAIN,16));//设置字体 |
170 | Calculat.show.setHorizontalAlignment(JTextField.RIGHT);//设置光标位置 |
171 | JPanelps=newJPanel();//创建面板加载显示区文本框 |
172 | ps.add(Calculat.show); |
173 | JPanelpbl=newJPanel();//创建面板加载按钮 |
174 | pbl.setLayout(newGridLayout(10,5,1,1));//设置按钮面板的布局 |
175 | pbl.setBorder(BorderFactory.createEtchedBorder());//设置边框 |
176 | //pbr.setLayout(newGridLayout(5,6,1,2)); |
177 | //pbr.setBorder(BorderFactory.createEtchedBorder()); |
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","="}; |
185 | for(inti=0;i<larr.length;i++){ |
186 | addButton(pbl,larr[i]);//创建按钮 |
188 | setBorder(BorderFactory.createEtchedBorder());//设置边框 |
189 | add(pbl,BorderLayout.CENTER);//分别添加两面板到框架中 |
190 | add(ps,BorderLayout.NORTH); |
193 | privatevoidaddButton(Containerc,Strings){//创建按钮,加入到面板并监听按钮事件 |
194 | JButtonbt=newJButton(s); |
196 | bt.addActionListener(newbuttonListener()); |
200 | classeasyCalPanelextendsJPanel{//操作基本等同于创建高级计算面板 |
201 | privatestaticfinallongserialVersionUID=3224376138339105930L; |
204 | setLayout(newBorderLayout()); |
205 | Calculat.show=newJTextField("0",17); |
206 | Calculat.show.setFont(newFont("Dialog",Font.PLAIN,18)); |
207 | Calculat.show.setHorizontalAlignment(JTextField.RIGHT); |
209 | ps.add(Calculat.show); |
211 | pb.setLayout(newGridLayout(5,4,1,1)); |
212 | pb.setBorder(BorderFactory.createEtchedBorder()); |
213 | Stringbts="%^√!789/456*123-0.=+"; |
214 | for(inti=0;i<bts.length();i++){ |
215 | addButton(pb,bts.substring(i,i+1)); |
217 | add(pb,BorderLayout.CENTER); |
218 | add(ps,BorderLayout.NORTH); |
221 | privatevoidaddButton(Containerc,Strings){ |
222 | JButtonbt=newJButton(s); |
223 | bt.setFont(newFont("Dialog",Font.PLAIN,18));//设置字体 |
225 | bt.addActionListener(newbuttonListener()); |
229 | classbuttonListenerimplementsActionListener{//响应按钮事件 |
231 | publicvoidactionPerformed(ActionEvente){ |
232 | Strings=e.getActionCommand();//获取命令 |
233 | if('0'<=s.charAt(0)&&s.charAt(0)<='9'||s.equals(".")){//该命令为正操作数 |
234 | if(Calculat.flag){//若初次输入该操作数(如:输入“123”中的“1”) |
235 | Calculat.show.setText(s); |
237 | //(如:输入“123”中的"2"或"3") |
238 | Calculat.show.setText(Calculat.show.getText()+s); |
240 | Calculat.flag=false;//修改标志 |
242 | if(Calculat.flag){//初次输入 |
243 | if(s.equals("-")){//为负数 |
244 | Calculat.show.setText(s); |
250 | calculatecal=newcalculate();//创建计算类实例 |
251 | doublex=Double.parseDouble(Calculat.show.getText());//将输入的操作数转换为double型 |
252 | cal.calopr1(x);//双目运算及处理单目运算的操作数 |
253 | Calculat.opChar=s;//保存运算符 |
254 | if(Calculat.opChar.equals("!")||Calculat.opChar.equals("√")//操作数必须为正的单目运算 |
255 | ||Calculat.opChar.equals("n!")){ |
257 | Calculat.show.setText("不能执行此操作!!"); |
259 | cal.calopr2((int)Calculat.opNum,Calculat.opChar);//单目运算 |
261 | Calculat.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")){//普通单目运算 |
270 | cal.calopr2((int)Calculat.opNum,Calculat.opChar);//单目运算 |
271 | Calculat.opChar="=";//保存符号为下一次运算做准备 |
273 | Calculat.flag=true;//设置标志为下一次运算做准备 |
280 | publicvoidcalopr1(doublen){//处理双目运算及单目运算的操作数 |
282 | if(Calculat.opChar.equals("+")){ |
284 | }elseif(Calculat.opChar.equals("-")){ |
286 | }elseif(Calculat.opChar.equals("*")){ |
288 | }elseif(Calculat.opChar.equals("/")){ |
294 | }elseif(Calculat.opChar.equals("^")||Calculat.opChar.equals("x^y")){ |
295 | Calculat.opNum=Math.pow(Calculat.opNum,n); |
296 | }elseif(Calculat.opChar.equals("x√")){ |
297 | Calculat.opNum=Math.pow(n,1/Calculat.opNum); |
298 | }elseif(Calculat.opChar.equals("=")){ |
300 | }elseif(Calculat.opChar.equals("Mod")){ |
301 | Calculat.opNum=Math.abs(Math.IEEEremainder(Calculat.opNum,n)); |
303 | Calculat.show.setText(str+Calculat.opNum); |
306 | publicvoidcalopr2(intn,StringopChar){//处理单目运算 |
307 | if(opChar.equals("!")||opChar.equals("n!")){ |
308 | Calculat.show.setText(newFactorial().factorial((int)Calculat.opNum).toString()); |
309 | }elseif(opChar.equals("√")){ |
310 | Calculat.show.setText(""+Math.sqrt(n)); |
311 | }elseif(opChar.equals("1/x")){ |
312 | Calculat.show.setText(""+(1.0/n)); |
313 | }elseif(opChar.equals("x^2")){ |
314 | Calculat.show.setText(""+Math.pow(n,2)); |
315 | }elseif(opChar.equals("ln")){ |
316 | Calculat.show.setText(""+Math.log(n)); |
317 | }elseif(opChar.equals("log")){ |
318 | //Calculat.show.setText(""+Math.log10(n)); |
319 | }elseif(opChar.equals("sin")){ |
320 | Calculat.show.setText(""+Math.sin(Math.toRadians(n))); |
321 | }elseif(opChar.equals("cos")){ |
322 | Calculat.show.setText(""+Math.cos(Math.toRadians(n))); |
323 | }elseif(opChar.equals("tan")){ |
324 | Calculat.show.setText(""+Math.tan(Math.toRadians(n))); |
325 | }elseif(opChar.equals("Exp")){ |
326 | Calculat.show.setText(""+Math.exp(n)); |
331 | classFactorial{//计算大数阶乘 |
332 | protectedstaticArrayList<BigInteger>table=newArrayList<BigInteger>(); |
334 | table.add(BigInteger.valueOf(1)); |
337 | /**Createsanewinstanceoffactorial*/ |
338 | publicstaticsynchronizedBigIntegerfactorial(intx){ |
340 | thrownewIllegalArgumentException("xmustbenon-negative."); |
342 | for(intsize=table.size();size<=x;size++){ |
343 | BigIntegerlastfact=(BigInteger)table.get(size-1); |
344 | BigIntegernextfact=lastfact.multiply(BigInteger.valueOf(size)); |
347 | return(BigInteger)table.get(x); |