java课程设计样例.docx
《java课程设计样例.docx》由会员分享,可在线阅读,更多相关《java课程设计样例.docx(20页珍藏版)》请在冰点文库上搜索。
java课程设计样例
《Java语言程序设计》
课程设计报告
题目:
Java计算器设计
专业:
数学与应用数学
学号:
1009401-25
姓名:
陈宁
指导教师:
李又良
成绩:
二○一一年十二月二十八日
目录
1.课程设计研究背景和意义………………………………………3
2.课程设计题目描述和详细功能要求…………………………………3
3.课程设计报告内容……………………………………………3
3.1题目求解的理论依据及算法……………………………3
3.2数据结构…………………………………………………4
3.3主要事件处理………………………………………4
3.4简要的操作流程………………………………………………6
3.5主要操作步骤(源代码)……………………………………6
3.6程序调试出错信息及解决方法……………………………15
3.7主要程序运行结果……………………………………………16
3.8心得体会………………………………………………………18
4.总结………………………………………………………………20
5.参考书目……………………………………………………………21
1.课程设计研究背景及意义
这次课程设计是通过JAVA编程来实现计算器的功能。
以前,人们用来计算的工具不管从方便的角度还是速度的角度来看都不及现代计算器,计算器的发明是人类进步的有力证明。
电子技术的不断发展使得计算器的功能不断的完善。
人们通过使用计算器来提高自己的工作效率,计算器是高科技的产物,是以往任何时代都无法比拟的。
在二十一世纪的今天,计算器依然是人们重要的计算工具,所以,对计算器的研究的课程设计具有重大意义。
本次课程设计题目主要应用到JAVA面向对象程序设计语言中Swing组件和GUI(图形用户界面)当中的一些知识,当然也用到JAVA中大部分基础知识,如JAVA的基本控制结构、数组、输入与输出等等。
2.课程设计题目描述和要求
通过JAVA中的Swing组件来制作一个计算器的界面包括0—9的十个数字按键,小数点键,+-*/开方百分比,倒数运算符键,=运行符键以及M组合键等。
以及实现计算器的一些基本的计算功能。
这个模拟计算器能进行连加,连减,连乘,连除,求二次平方根,求百分比,求倒数以及负数运算等操作。
要求界面逼真,按键布局美观,要求实现加、减、乘、除等基本计算功能。
组员分工:
组长(陈宁):
负责分配其他组员的任务,程序设计中负责运算符按钮部分代码编写及事件处理,模拟计算器的整体布局。
组员1(张华):
负责数字键按钮和文本输出框部分代码的编写及其事件的处理。
组员2(曹晏波):
负责sqrt、%、1/X、+/-四个运算功能键按钮部分的代码编写及事件处理(由于此功能实现要依赖组员1的功能实现,所以设计中加入了组员1的设计)。
3.课程设计报告内容
3.1题目求解的理论依据及算法
解题原理:
(1)界面布局。
创建一个面板,先将所有按钮:
所有数字键和运算符键等放在面板上,采用网格布局,具体设计为4行,5列的网格,二十个格子;接着添加一个1行3列的网格布局来放置三个功能键:
清零,检测,退格键;然后,再添加一个5行一列的网格布局来放置四个M组合功能键和一个空键,其目的在于美化界面,使其与现实中的计算器更接近,同时也是为了满足这次课程设计的要求。
最后,对以上三个面板,采用BorderLayout布局,将按键面板放在计算器的中部,功能键面板放北部,作为一个新的面板。
最后,将文本框放在界面的北部,新面板放在界面的中央,MKpanel放在界面的西部,采用边界布局管理器,做为界面的整体布局,这样界面布局就搞定了。
(2)输入数字、小数点、符号时按输入的顺序显示在单行文本框中,并按右对齐方式显示,且不允许修改文本行中的内容。
(3)输入运算符时,说明前一个数已经输入完毕,保存第一个数firstDigit,同时保存运算符,显示firstDigit。
(4)输入第二个数,按等号,保存第二数,根据输入的运算符进行相应的运算,文本行中显示运算结果resultNum。
(5)按退格键Backspace,将返回到前一次输入状态。
(6)按Check键,输入的数字第一个数字为零。
(7)按复位键键Again,归零。
(8)由于M组合键没有实现其功能,所以暂不能用,待更进一步研究。
(8)第三、四步可以重复操作。
3.2数据结构:
面板:
数字等按键面板calckeysPanel,功能键面板calmsPanel,M组合键面板MKpanel,组合面板panel1,整体布局:
top
第一个数firstDigit,运算结果resultNum,运算符operator,文本行组件result
3.3主要事件处理:
1、数字输入及小数点事件,输入后直接显示在文本行。
2、双目运算符输入事件:
输入后,保存第一个数,同时保存运算符。
3、单目运算符和等于符=输入事件:
保存第二个数,取出原有数据和运算符算出结果,并显示在文本行组件。
4、处理Backspace键被按下事件。
5、以上几类事件都归为行为类对象ActionListener.
负责部分的主要事件处理:
1、“+”,“-”,“*”,“/”四个双目运算符被按下,当前面没有输入第一个数时,或当按下双目运算符后没输入第二个数就按下“=”符,计算器不做任何反应。
只有等按规则输入数字时才按正确运算输出结果。
2、“sqrt”,“%”,“1/x”,“+/-”四个单目运算符被按下,只有当前面输入一个数后按下单目运算符键再按“=”,才输出正确结果。
而“+/-”第一次按下时执行,第二次按下时取消。
3.4简要的设计流程:
3.5、源代码:
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
importjavax.swing.JTextField;
publicclassCalulatorextendsJFrameimplementsActionListener{
privatestaticfinallongserialVersionUID=12345678L;
privatefinalString[]NBKEYS={"7","8","9","/","sqrt","4","5","6",
"*","%","1","2","3","-","1/x","0","+/-",".","+","="};
privatefinalString[]MK={"","MC","MR","MS","M+"};
privatefinalString[]CMKEYS={"Backspace","CHCEK","AGAIN"};
/**计算器上键的按钮*/
privateJButtonkeys[]=newJButton[NBKEYS.length];
/**计算器上的功能键的按钮*/
privateJButtoncmkeys[]=newJButton[CMKEYS.length];
/**计算器左边的M的按钮*/
privateJButtonmk[]=newJButton[MK.length];
/**计算结果文本框*/
privateJTextFieldresultText=newJTextField("0");
/**标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字*/
privatebooleanfirstDigit=true;
//计算的中间结果
privatedoubleresultNum=0.0;
//当前运算的运算符
privateStringoperator="=";
//操作是否合法
privatebooleanoperateValidFlag=true;
/**
构造方法
*/
publicCalulator(){
super();
//初始化计算器
init();
//this.setSize(400,300);
this.setBackground(Color.LIGHT_GRAY);
this.setTitle;
//在屏幕(500,200)坐标处显示计算器
this.setLocation(500,200);
//不许修改计算器的大小
this.setResizable(false);
//使计算器中各组件大小合适
this.pack();
}
/*
初始化计算器
*/
privatevoidinit(){
//文本框中的内容采用右对齐方式
resultText.setHorizontalAlignment(JTextField.RIGHT);
//不允许修改结果文本框
resultText.setEditable(false);
//设置文本框背景颜色为亮灰色
resultText.setBackground(Color.LIGHT_GRAY);
//初始化计算器上键的按钮,将键放在一个画板内
JPanelcalckeysPanel=newJPanel();//calckeysPanel
//用网格布局器,4行,5列的网络,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calckeysPanel.setLayout(newGridLayout(4,5,3,3));
for(inti=0;ikeys[i]=newJButton(NBKEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.BLACK);
}
//运算符键用红色标示,其他键用蓝色表示
keys[3].setForeground(Color.BLUE);
keys[8].setForeground(Color.BLUE);
keys[13].setForeground(Color.BLUE);
keys[18].setForeground(Color.BLUE);
keys[19].setForeground(Color.BLUE);
//初始化功能键,都用红色标示。
将功能键放在一个画板内
JPanelcommandsPanel=newJPanel();
//用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
commandsPanel.setLayout(newGridLayout(1,3,3,3));
for(inti=0;icmkeys[i]=newJButton(CMKEYS[i]);
commandsPanel.add(cmkeys[i]);
cmkeys[i].setForeground(Color.GREEN);
}
//初始化MK键,用红色标示,将MK键放在一个画板
JPanelcalmsPanel=newJPanel();
//用网络布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
calmsPanel.setLayout(newGridLayout(5,1,3,3));
for(inti=0;imk[i]=newJButton(MK[i]);
calmsPanel.add(mk[i]);
mk[i].setForeground(Color.red);
}
//下面进行计算器的整体布局,将calckeys和cmkeys画板放在计算机的中部,
//将文本框放在北部,将calms画板放在计算器的西部
//新建一个大的画板,将上面建立的cmkeys和calckeys画板放在该画板内
JPanelpanel1=newJPanel();
//画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素
panel1.setLayout(newBorderLayout(3,3));
panel1.add("North",commandsPanel);
panel1.add("Center",calckeysPanel);//
//建立一个画板放文本框
JPaneltop=newJPanel();
top.setLayout(newBorderLayout());
top.add("Center",resultText);
//整体布局
getContentPane().setLayout(newBorderLayout(3,5));
getContentPane().add("North",top);
getContentPane().add("Center",panel1);
getContentPane().add("West",calmsPanel);
//为各按钮添加事件侦听器
//都使用同一个事件侦听器,即本对象。
本类的声明中有implementsActionListener
for(inti=0;ikeys[i].addActionListener(this);
}
for(inti=0;icmkeys[i].addActionListener(this);
}
for(inti=0;imk[i].addActionListener(this);
}
}
publicvoidactionPerformed(ActionEvente){
//获取事件源的标签
Stringlabel=e.getActionCommand();
if(label.equals(CMKEYS[0])){
//用户按了"Backspace"键
handleBackspace();
}elseif(label.equals(CMKEYS[1])){
resultText.setText("0");
}elseif(label.equals(CMKEYS[2])){
handleC();
}elseif("0123456789.".indexOf(label)>=0){
handleNumber(label);
}else{
handleOperator(label);
}
}
//处理Backspace键被按下的事件
privatevoidhandleBackspace(){
Stringtext=resultText.getText();
inti=text.length();
if(i>0){
text=text.substring(0,i-1);
if(text.length()==0){
resultText.setText("0");
firstDigit=true;
operator="=";
}else{
resultText.setText(text);
}
}
}
//处理数字键被按下的事件
privatevoidhandleNumber(Stringkey){
if(firstDigit){
resultText.setText(key);
}elseif((key.equals("."))&&(resultText.getText().indexOf(".")<0)){
//输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
resultText.setText(resultText.getText()+".");
}elseif(!
key.equals(".")){
//如果输入的不是小数点,则将数字附在结果文本框的后面
resultText.setText(resultText.getText()+key);
}
firstDigit=false;
}
privatevoidhandleC(){
resultText.setText("0");
firstDigit=true;
operator="=";
}
privatevoidhandleOperator(Stringkey){
if(operator.equals("/")){
if(getNumberFromText()==0.0){
operateValidFlag=false;
resultText.setText("除数不能为零");
}else{
resultNum/=getNumberFromText();
}
}elseif(operator.equals("1/x")){
//倒数运算
if(resultNum==0.0){
operateValidFlag=false;
resultText.setText("零没有倒数");
}else{
resultNum=1/resultNum;
}
}elseif(operator.equals("+")){
resultNum+=getNumberFromText();
}elseif(operator.equals("-")){
resultNum-=getNumberFromText();
}elseif(operator.equals("*")){
resultNum*=getNumberFromText();
}elseif(operator.equals("sqrt")){
resultNum=Math.sqrt(resultNum);
}elseif(operator.equals("%")){
resultNum=resultNum/100;
}elseif(operator.equals("+/-")){
resultNum=resultNum*(-1);
}elseif(operator.equals("=")){
resultNum=getNumberFromText();
}
if(operateValidFlag){
longt1;
doublet2;
t1=(long)resultNum;
t2=resultNum-t1;
if(t2==0){
resultText.setText(String.valueOf(t1));
}else{
resultText.setText(String.valueOf(resultNum));
}
}
//运算符等于用户按的按钮
operator=key;
firstDigit=true;
operateValidFlag=true;
}
/*
*从结果文本框中获取数字
*/
privatedoublegetNumberFromText(){
doubleresult=0;
try{
result=Double.valueOf(resultText.getText()).doubleValue();
}catch(NumberFormatExceptione){
}
returnresult;
}
publicstaticvoidmain(Stringargs[]){
Calulatorcalculator1=newCalulator();
calculator1.setVisible(true);
calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
3.6程序调试出错信息及解决方法
程序在调试过程中碰到很多的错误,譬如说事件监听器与事件源没有关联、除数为零、数组下标越界等等。
(1)下面是缺返回值异常问题:
Exceptioninthread"AWT-EventQueue-0"java.lang.Error:
Unresolvedcompilationproblem:
Thismethodmustreturnaresultoftypedouble
at沈呈洁的计算器.Calulator.getNumberFromText(Calulator.java:
174)
at沈呈洁的计算器.Calulator.handleOperator(Calulator.java:
155)
at沈呈洁的计算器.Calulator.actionPerformed(Calulator.java:
91)
atjavax.swing.AbstractButton.fireActionPerformed(UnknownSource)
atjavax.swing.AbstractButton$