Java课程设计报告---设计一个多功能计算器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告书( 2010-- 2011年度第 2 学期)
所属课程名称 Java面向对象程序设计题目设计一个多功能计算器分院电信分院
专业班级 09信管<1>班
学号
指导教师
2011年06月23日
课程设计(论文)任务书
设计一个多功能计算器
二、课程设计(论文)工作:自 2011 年06 月 13日起至2011年 06 月 23日止。
三、课程设计(论文)的内容要求:
本应用程序继承自框架类(JFrame),此程序使用Frame布局管理器BorderLayout,将单行文本框加入到“North”区域,包含各种按钮的面板Panel p加入到”Center”区域。
包含各种按钮的面板Panel p 采用4行5列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。
同时注册按钮事件监听器。
如:Button b=new Button(); b.addActionListener(事件监听器);
事件监听器中的事件处理方法void actionPerformed(ActionEvent evt)完成主要的按钮事件的处理。
事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”…”8”,”9”)、运算符按钮事件(”+”,”-“,”*”,”/”,”%”)、正负号按钮事件(”+/-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”1/x”)、清零按钮事件(“C”)。
在事件处理触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计算中间触发的按钮事件。
计算器完成的是一个数学表达式,如:3+2,所以可以采用一个链表(LinkedList类)来存储数字或字符,如3,+,2分别存储在链表中,最后运算时,可以一一取出来进行运算。
学生签名: ( )
2011 年06 月 23 日
课程设计(论文)评阅意见
评阅人职称
20 年月日
目录
第1章课程设计(论文)任务书 (2)
第2章程序设计目的 (5)
第3章程序实现思路 (6)
第4章程序清单或正文 (7)
第5章调试与测试 (16)
第6章课程设计心得 (17)
第7章参考文献 (18)
第2章程序设计目的
1. 充分的将课本知识与实际应用相结合,做到理论联系实际,融会贯通所学知识。
2. 提高自身的实践能力,为以后做相关编程工作提供经验。
3. 通过对面向对象语言程序代码的阅读、修改、设计,理解和掌握复杂的面向对象如Java语言应用程序的编程,提高实践编程的能力。
4. 能够利用已有资源加工处理处好的程序设计,加强一定的综合处理能力。
5. 通过这次课设让我们更加理解编程工作是多么精细的工作,所以我们要保持良好的程序设计风格,以及学会面向对象程序设计的基本思想。
第3章程序实现思路
本程序首先创建了四个面板,每一个都有自己的相关按钮,按照各自的布局方式排列初步形成了一个计算器的图形模板,然后通过注册事件监听器即实现事件处理来完成整个
程序流程图
第4章程序清单或正文
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.text.DecimalFormat;
class Calucator extends JFrame {
private JTextField tfResult;
private JPanel panel1, panel2, panel3, panel4;
private JMenuBar myBar;
private JMenu menu1, menu2, menu3;
private JMenuItem editItem1, editItem2, editItem3,help1, help2, help3; private JRadioButtonMenuItem seeItem1, seeItem2;
private JCheckBoxMenuItem seeItem3;
private ButtonGroup bgb;
private String back;
private boolean IfResult = true, falg = false;
private String oper = "=";
private double result = 0;
private Num numActionListener;
private DecimalFormat df;
boolean isNew=true;
public Calucator(){
super("计算器");
df = new DecimalFormat("0.#######");
this.setLayout(new BorderLayout(10, 5));
panel1 = new JPanel(new GridLayout());
panel2 = new JPanel(new GridLayout(4, 5, 5, 5));
panel3 = new JPanel(new GridLayout(5, 1, 5, 5));
panel4 = new JPanel(new BorderLayout(5, 5));
myBar = new JMenuBar();
menu1 = new JMenu("编辑");
menu2 = new JMenu("查看");
menu3 = new JMenu("帮助");
menu1.setFont(new Font("宋体", Font.PLAIN, 12));
menu2.setFont(new Font("宋体", Font.PLAIN, 12));
menu3.setFont(new Font("宋体", Font.PLAIN, 12)); editItem1 = new JMenuItem("复制");
editItem2=new JMenuItem("粘贴"/);
editItem3=new JMenuItem( "退出");// 设置退出菜单项editItem3.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent event )
{
System.exit( 0 );
}} );
seeItem1 = new JRadioButtonMenuItem("科学型"); seeItem2 = new JRadioButtonMenuItem("标准型"); seeItem3 = new JCheckBoxMenuItem("数字分组");
help1 = new JMenuItem("帮助主题");
help2 = new JMenuItem("关于计算器(A)");
bgb = new ButtonGroup();
//做出来的效果图如下
menu1.add(editItem1);
menu1.addSeparator();//添加分隔线
menu1.add(editItem2);
menu1.addSeparator();//添加分隔线
menu1.add(editItem3);
menu2.add(seeItem1);
menu2.addSeparator();//添加分隔线
menu2.add(seeItem2);
menu2.addSeparator();//添加分隔线
menu2.add(seeItem3);
menu3.add(help1);
menu3.addSeparator();//添加分隔线
menu3.add(help2);
//添加菜单到菜单条
myBar.add(menu1);
myBar.add(menu2);
myBar.add(menu3);
this.setJMenuBar(myBar);
numActionListener = new Num();
tfResult = new JTextField();
tfResult.setEditable(false);//文本域不可编辑
tfResult.setBackground(Color.white);//文本域
tfResult.setHorizontalAlignment(JTextField.RIGHT); tfResult.setText("0");
tfResult.setBorder(BorderFactory.createLoweredBevelBorder()); init();
}
private void init(){
addButton(panel1, "CE", new Clear(), Color.red);
addButton(panel2, "7", numActionListener, Color.blue); addButton(panel2, "8", numActionListener, Color.blue); addButton(panel2, "9", numActionListener, Color.blue); addButton(panel2, "/", new Signs(), Color.red);
addButton(panel2, "sqrt", new Signs(), Color.blue);
addButton(panel2, "4", numActionListener, Color.blue); addButton(panel2, "5", numActionListener, Color.blue);
addButton(panel2, "6", numActionListener, Color.blue); addButton(panel2, "*", new Signs(), Color.red);
addButton(panel2, "%", new Signs(), Color.blue); addButton(panel2, "1", numActionListener, Color.blue); addButton(panel2, "2", numActionListener, Color.blue); addButton(panel2, "3", numActionListener, Color.blue); addButton(panel2, "-", new Signs(), Color.red);
addButton(panel2, "1/x", new Signs(), Color.blue); addButton(panel2, "0", numActionListener, Color.blue); addButton(panel2, "-/+", new Clear(), Color.blue); addButton(panel2, ".", new Dot(), Color.blue);
addButton(panel2, "+", new Signs(), Color.red);
addButton(panel2, "=", new Signs(), Color.red);
JButton btns = new JButton("calucator");
btns.setBorder(BorderFactory.createLoweredBevelBorder()); btns.setEnabled(false);
btns.setPreferredSize(new Dimension(20, 20));
//添加面板3
panel3.add(btns);
addButton(panel3, "sin", new Signs(), Color.red); addButton(panel3, "cos", new Signs(), Color.red); addButton(panel3, "tan", new Signs(), Color.red); addButton(panel3, "π", new Signs(), Color.red);
panel4.add(panel1, BorderLayout.NORTH);
panel4.add(panel2, BorderLayout.CENTER);
this.add(tfResult, BorderLayout.NORTH);
this.add(panel3, BorderLayout.WEST);
this.add(panel4);
pack();
this.setResizable(false);
this.setLocation(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
//加入按钮并注册监听者
private void addButton(JPanel panel, String name, ActionListener action, Color color){
JButton bt = new JButton(name);
panel.add(bt);
bt.setForeground(color);
bt.addActionListener(action);
}
//主方法
public static void main(String[] args) {
new Calucator().setVisible(true);
}
//获取结果显示在文本域
private void getResult (double x){
System.out.println("result"+result+" "+"x"+x);
if(oper == "+"){
result += x;
}else if(oper == "-"){
result -= x;
}else if(oper == "*"){
result *= x;
}else if(oper == "/"){
result /= x;
}else if(oper == "="){
result = x;
}
System.out.println("result"+result+" "+"x"+x);
tfResult.setText(df.format(result));
System.out.println(df.format(result));
}
//定义各种符号的类及相应触发后的处理代码
class Signs implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if(str.equals("sqrt")){
double i = Double.parseDouble(tfResult.getText());
if(i>0){
tfResult.setText(String.valueOf(df.format(Math.sqrt(i))));
}else{
tfResult.setText("负数不能开平方根");
}
}else if(str.equals("%")){
tfResult.setText(df.format(Double.parseDouble(tfResult.getText()) / 100));//计算%
}else if(str.equals("1/x")){
if(Double.parseDouble(tfResult.getText()) == 0){
tfResult.setText("除数不能为零");
}else{
tfResult.setText(df.format(1 / Double.parseDouble(tfResult.getText())));//计算1/x
}
}else{
if(falg){
IfResult = false;
}
if(IfResult){
oper = str;
System.out.println(oper);
}else{
getResult(Double.parseDouble(tfResult.getText()));
oper = str;
IfResult = true;
}
if(str.equals("π")){
tfResult.setText(""+Math.PI);
/*isNew=true;*/}
//定义三角函数运算
if(str.equals("sin")){//sin函数
String showstr=tfResult.getText();
if(showstr.equals(""))
return;
double ishow=0;
try{
ishow=Double.parseDouble(showstr);
}
catch(NumberFormatException ee){
System.out.println("输入数据不合法!");
tfResult.setText("输入数据不合法,请重新输入");
isNew=true;
return;
}
double rd=Math.sin(ishow*Math.PI/180); //转换为弧度进行计算int ri=(int)rd;
if(ri==rd)
tfResult.setText(""+ri);
else
tfResult.setText(""+rd);
isNew=true;
}
//cos函数
else if(str.equals("cos")){
String showstr=tfResult.getText();
if(showstr.equals(""))
return;
double ishow=0;
try{
ishow=Double.parseDouble(showstr);
}
catch(NumberFormatException ee){
System.out.println("输入数据不合法!");
tfResult.setText("输入数据不合法,请重新输入");
isNew=true;
return;
}
double rd=Math.cos(ishow*Math.PI/180);
int ri=(int)rd;
if(ri==rd)
tfResult.setText(""+ri);
else
tfResult.setText(""+rd);
isNew=true;
}
//tan函数
else if(str.equals("tan")){
String showstr=tfResult.getText();
if(showstr.equals(""))
return;
double ishow=0;
try{
ishow=Double.parseDouble(showstr);
}
catch(NumberFormatException ee){
System.out.println("输入数据不合法!");
tfResult.setText("输入数据不合法,请重新输入");
isNew=true;
return;
}
double rd=Math.tan(ishow*Math.PI/180);
int ri=(int)rd;
if(ri==rd)
tfResult.setText(""+ri);
else
tfResult.setText(""+rd);
isNew=true;
}
}
}
}
//定义清零类
class Clear implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
if(str == "CE"){
tfResult.setText("0");
IfResult = true;
result = 0;
}else if(str == "-/+"){
double i = 0 - Double.parseDouble(tfResult.getText().trim());
tfResult.setText(df.format(i));
}
}
}
}
//实现数字按钮功能
class Num implements ActionListener{
public void actionPerformed(ActionEvent e) {
String srt = e.getActionCommand();
if(IfResult){
tfResult.setText("");
IfResult = false;
}//trim()是去除字符串开头和末尾的空格或其他字符
tfResult.setText(tfResult.getText().trim() + srt); if(tfResult.getText().equals("0")){
tfResult.setText("0");
IfResult = true;
falg = true;
}
}
}
//实现数据加上小数点
class Dot implements ActionListener{
public void actionPerformed(ActionEvent e) {
IfResult = false;
if(tfResult.getText().trim().indexOf(".") == -1){
tfResult.setText(tfResult.getText() + ".");
}
}
}
}
第5章调试与测试
调试的方式主要是输入特定的数据然后触发相应的事件,运行计算器查看运行后的结果若是合理的就说明是正确的,主要测试四则运算,三角函数的运算,以及开根号的运算。
测试一:四则运算
经运行测试可以使用,在此过程没有什么问题。
测试二:开根号
取特定的数字如9,4等可以开根号是整数的数据进行验证,结论依然正确,可以得出结果是3,2。
测试三:三角函数的运算
主要是如何将实数转化为弧度数,问题出在有的数据输入可以得出正确结果,有的则不可以。
分析:主要是π的取值问题,这个暂时无法避免,可能是精确度的问题,毕竟程序类的东西是比较精准的可以忽略这点误差,基本没问题。
第6章课程设计心得
通过这学期的Java学习,我深刻的体会到编程语言的博大和精深,我还有好多要学习。
一个学期的学习,我对Java有了基本的理解,Java是面向对象的程序设计,更注重实际操作,只靠书本的知识还是不够的,经过这次的应用实践设计计算器,我更加觉得我们的只是还远远不够,我们要学的还有很多。
充分理解每一个知识点是做好一个程序设计的前提,这次的课程设计让我体会到了学以致用是十分有必要的,我发现自己还有很多没参透的地方,但还是艰难的完成了此次课设,在老师的帮助下和自己的努力下,终于完成了。
我要感谢老师的指导,在老师的指点下我完成了,真的感谢老师的指导以及感谢那些为我提供帮助的所有人谢谢你们的帮助。
最后我想说,这次课设真的很有意义,我第一次觉得我们的知识是可以用的了,学以致用真的太重要了,我会坚持的。
第7章参考文献
[1]: JAVA语言实用教程
[2]:/p-51976235602.html
[3]:/code/snippet_127825_4346 [4]:面向对象JAVA基础语言
[5]:/share/detail/17918076。