兰州商学院陇桥学院
工学系课程设计报告
设 计 题 目:银行存取款管理系统
系 别:工学系
专 业 (方 向): 计算机科学与技术(网络工程)
年 级、 班:2011级计算机科学与技术班
* * * ****
学 生 学 号:***********
* * * ****
2013 年 7 月 1 日
学生综合测评系统
一系统开发的背景
在传统的银行帐户管理中,其过程往往是很复杂的,繁琐的,帐户管理以入帐和出帐两项内容为核心,在此过程中又需要经过若干道手续,因为整个过程都需要手工操作,效率十分低下,且由于他们之间关联复杂,统计和查询的方式各不相同;且会出现信息的重复传递问题,因此该过程需要进行信息化,以利用计算机进行帐目管理。
为了提高银行的办事效率,减低银行工作人员的办事效率,降低传统银行的出入账计算方式,因此急需开发一套信息化的方式,开发合适的系统就成为了解决这一问题的核心。
二、系统分析与设计
(一)系统功能要求
由于数据库系统还没有学习,所以只固定一账户,账户信息包括账户姓名与卡号。具体实现的功能主要有:
1.定、活期存款操作。
2.取款操作。
3.查询账户余额。
4.计算当前利息。
(二)系统模块结构设计
通过对系统功能的分析,学生综合测评系统功能如图一所示。
图一 银行存取款管理系统功能图
通过上图的功能分析,把整个系统划分为6个模块:
1、存款操作。该模块主要实现:现金的存放,余额的累加。借助内外层两个actionPerformed()函数实现;
2、取款操作。该模块主要实现:账户中现金的取出,余额的扣除。借助函数get()函数实现;
3、当前余额查询操作。该模块主要实现:当前账户现金加利息的查询以及输出,借助函数balance()实现;
4、当前利息查询操作。该模块只要实现:当前账户利息的查询机输出。借助函数lixid()与lixih()实现;
5、定活期的设置。该模块主要实现:定期与活期存款的设定;利息的计算。借助界面以及里层的actionPerformed()函数实现。
三、系统的设计与实现
(一)存款操作:
分析:首先判断输入的现金数是否为负数,不为负继续存入,为负不存入,主要是actionPerformed()函数实现,存款按钮与内层界面的确定按钮;
该模块的具体代码如下所示。
if(e.getSource()==button_queding)//单击确定按钮
{
double cunkuanzhi=Integer.parseInt(text_cunkuanshu.getText());//存款数文本框字符串强制转换双精度型
if (cunkuanzhi>0)//存款操作
{
balance+=cunkuanzhi; //存款操作使余额值增加
}
JOptionPane.showMessageDialog(this,"存款"+cunkuanzhi+"成功!");
if(radio_dingqi.isSelected())//定、活期单选框利息计算传送
rlixi=dlixi();
if(radio_huoqi.isSelected())
rlixi=hlixi();
}
if(e.getSource()==button_cunkuan)//单击存款按钮
{
String dingqis[]={"0.25","0.5","1","2","3","5"};//组合框内容数组
new MessageJDialog(dingqis);//新建MessageJDialog类对象
}
(二)取款操作:get()
分析:先输入取款数,如果取款数大于余额,则取出账户中全部余额,否则继续取款,余额减少。
该模块的具体代码如下所示。
public double get() //取款操作,参数为取款金额,返回实际取到金额
{
String password=JOptionPane.showInputDialog(this,"请输入取款数");
double qukuanzhi=Integer.parseInt(password);
if (qukuanzhi>0)
{
if (qukuanzhi<=this.balance)
this.balance-= qukuanzhi; //取款操作使余额值减少
else //账户余额不够所取时
{
qukuanzhi = this.balance+rlixi; //取走全部余额
this.balance = 0;
JOptionPane.showMessageDialog(this,"您的余额不足,已为您取出全部余额!");
}
return qukuanzhi; //返回实际取款额
}
return 0;
}
(三)查询余额:balance()
分析;余额变量为成员变量balance,直接返回balance。
该模块的具体代码如下所示。
public double balance() //查看账户余额
{
return balance+rlixi;
}
(四)查询利息:lixid();lixih()
分析;该模块主要实现利息的查询及输出。点击查询当前利息按钮,显示当前利息。主要方法是给出当前利息率,按订活期的不同选择不同的函数,用switch语句实现利息的选择计算。
该模块的具体代码如下所示。
public double dlixi()//成员方法:计算定期利息
{
double a=balance;
double c=dnianfeng;
switch((int)(c*4)){
case 1: return(a*0.0248*c);
case 2: return(a*0.02*c);
case 4: return(a*0.028*c);
case 8: return(a*0.0352*c);
case 12: return(a*0.04*c);
case 20: return(a*0.044*c);
default: return 0;
}
}
public double hlixi()//成员方法:计算活期利息方法
{
double hnianfeng=Double.parseDouble((text_huoqi.getText()));
double a=balance;
double c=hnianfeng;
double s=a*0.004*c;
return s;
}
(五)主界面的建立:bankJFame
分析:该模块主要是整个系统的主界面。实现图形用户界面的输出,使用户更直观地去操作本系统。主要的组件有:三块面板;文本框;标签;按钮;
该模块的具体代码如下所示。
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.FlowLayout;
public class bankJFrame extends JFrame implements ActionListener{
private JTextField text_zhanghao,text_kahao;//定义账号,卡号文本行
private JButton button_cunkuan,button_qukuan,button_yue,button_lixi;//定义存款,取款,查询余额按钮
private double balance;//成员变量--查看余额
private double rlixi;
public bankJFrame()
{
super("银行存取款管理系统");//主窗口标题
this.setBounds(300, 240, 400, 150);//窗口初弹出坐标及大小
this.setResizable(false);//窗口大小不能改变
this.setBackground(Color.lightGray);//颜色设置
this.setLayout(new java.awt.FlowLayout(FlowLayout.CENTER));//面板布局为居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel1=new JPanel();//新建第一个面板
this.getContentPane().add(panel1,"North");
panel1.add(new JLabel("账户"));
text_zhanghao=new JTextField("zj",6);
text_zhanghao.setEditable(false);//文本行不可编辑
panel1.add(text_zhanghao);
panel1.add(new JLabel("卡号"));//用户卡号标签及文本行
text_kahao=new JTextField("622627199310150612",15);
text_kahao.setEditable(false);//文本行不可编辑
panel1.add(text_kahao);
this.setVisible(true);//窗口可见
JPanel panel2=new JPanel();
this.getContentPane().add(panel2,"South");//面板布局及添加面板至主面板
button_cunkuan=new JButton("存款");//存款按钮
panel2.add(button_cunkuan);
button_cunkuan.addActionListener(this);
button_qukuan=new JButton("取款");//取款按钮
panel2.add(button_qukuan);
button_qukuan.addActionListener(this);
button_yue=new JButton("查询当前余额");//查询当前余额按钮
panel2.add(button_yue);
button_yue.addActionListener(this);
button_lixi=new JButton("当前利息");//当前利息按钮
panel2.add(button_lixi);
button_lixi.addActionListener(this);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e)//单击事件处理方法
{
if(e.getSource()==button_cunkuan)//单击存款按钮
{
String dingqis[]={"0.25","0.5","1","2","3","5"};//组合框内容数组
new MessageJDialog(dingqis);//新建MessageJDialog类对象
}
if(e.getSource()==button_yue)//单击查询余额按钮
{
double relixi=balance();
JOptionPane.showMessageDialog(this,"尊敬的zj先生,您的当前账户余额为:"+(relixi)+"元");
}
if(e.getSource()==button_qukuan)//单击取款按钮
{
double qk=get();
JOptionPane.showMessageDialog(this,"取款"+qk+"元成功!");
}
if(e.getSource()==button_lixi)//单击计算利息按钮
{
JOptionPane.showMessageDialog(this,"尊敬的zj先生,您的当前账户利息为:"+rlixi+"元");
}
}
(五)内层界面的建立:MessageJDialog
分析:该模块主要是为主界面而服务的一个子框架。在此框架中,可以是新的功能有:定期、活期的选择;定期,活期利息的计算,存款操作的实现;主要用到的组件及成员方法有:标签;文本框;单选框;组合框;按钮;
该模块的具体代码如下所示。
public class MessageJDialog extends JFrame implements ActionListener
{
JTextField text_cunkuanshu,text_huoqi;//存款数与活期存款年份的输入
JLabel jlabel_huoqi,jlabel_dingqi;//活期期限标签,定期期限标签
JButton button_queding;//确定按钮
JRadioButton radio_dingqi,radio_huoqi;//活、定期单选框
JComboBox box_dingqi;//定期年份组合框
double dnianfeng;//内部成员变量定期年份的声明
MessageJDialog(String dingqis[])
{
super("提示");
this.setBounds(350,290,300,220);
JPanel panel1=new JPanel();
panel1.add(new JLabel("请输入存款数(元):"));
panel1.add(text_cunkuanshu=new JTextField("100",6));
text_cunkuanshu.addActionListener(this);
this.getContentPane().add(panel1);
JPanel panel_rb=new JPanel(new GridLayout(1,2));
panel1.add(panel_rb);
this.setVisible(true);
ButtonGroup bgroup=new ButtonGroup();
radio_dingqi=new JRadioButton("定期存款");
bgroup.add(radio_dingqi);
panel_rb.add(radio_dingqi);
radio_dingqi.addActionListener(this);
radio_huoqi=new JRadioButton("活期存款");
bgroup.add(radio_huoqi);
panel_rb.add(radio_huoqi);
this.setVisible(true);
radio_huoqi.addActionListener(this);
JPanel panel_rm=new JPanel();
panel1.add(panel_rm);
panel_rm.add(jlabel_dingqi=new JLabel("请选择定期期限(年)"));
box_dingqi=new JComboBox(dingqis);
box_dingqi.setEditable(true);
box_dingqi.addActionListener(this);
panel_rm.add(box_dingqi);
this.setVisible(true);
JPanel panel_rn=new JPanel();
panel1.add(panel_rn);
panel_rn.add(jlabel_huoqi=new JLabel("请输入活期期限(年):"));
panel_rn.add(text_huoqi=new JTextField("1",7));
button_queding=new JButton("确定");
panel1.add(button_queding);
this.setVisible(true);
button_queding.addActionListener(this);//注册文本编辑事件
}
public String str()//成员方法:获取文本框输入存款数字符串
{
String str=text_cunkuanshu.getText();
return str;
}
public double dlixi()//成员方法:计算定期利息
{
double a=balance;
double c=dnianfeng;
switch((int)(c*4)){
case 1: return(a*0.0248*c);
case 2: return(a*0.02*c);
case 4: return(a*0.028*c);
case 8: return(a*0.0352*c);
case 12: return(a*0.04*c);
case 20: return(a*0.044*c);
default: return 0;
}
}
public double hlixi()//成员方法:计算活期利息方法
{
double hnianfeng=Double.parseDouble((text_huoqi.getText()));
double a=balance;
double c=hnianfeng;
double s=a*0.004*c;
return s;
}
public void actionPerformed(ActionEvent e)//内部对话框类单击事件处理方法
{
if(radio_dingqi.isSelected())//定期单选框选中
{
text_huoqi.setVisible(false);
jlabel_huoqi.setVisible(false);
jlabel_dingqi.setVisible(true);
box_dingqi.setVisible(true);
rlixi=dlixi();
}
else if(radio_huoqi.isSelected())//活期单选框选中
{
jlabel_dingqi.setVisible(false);
box_dingqi.setVisible(false);
text_huoqi.setVisible(true);
jlabel_huoqi.setVisible(true);
rlixi=hlixi();
}
if(e.getSource()==button_queding)//单击确定按钮
{
double cunkuanzhi=Integer.parseInt(text_cunkuanshu.getText());//存款数文本框字符串强制转换双精度型
if (cunkuanzhi>0)//存款操作
{
balance+=cunkuanzhi; //存款操作使余额值增加
}
JOptionPane.showMessageDialog(this,"存款"+cunkuanzhi+"成功!");
if(radio_dingqi.isSelected())//定、活期单选框利息计算传送
rlixi=dlixi();
if(radio_huoqi.isSelected())
rlixi=hlixi();
}
if(e.getSource()==box_dingqi)//定期组合框的选择
{
String nianfeng=(String) box_dingqi.getSelectedItem();
dnianfeng=Double.parseDouble(nianfeng);
}
}
}
四、系统测试
(一)测试main(String args[])函数
测试主界面,测试结果如下图所示:
图二 主界面
(二)测试内层界面(内层对话框)
测试内层界面,测试结果如下:
图三 内层界面
图四 内层界面对话框
图五 查询余额界面
图六 当前利息查询界面
图七 取款界面
图八 取款异常提示对话框
图九 取款成功对话框
到此,测试完成,无异常。
五、总结
本系统主要实现了银行普通业务的基本功能:存款;取款;查询余额;查询当前利息;这四个基本功能,同时利息中又加入了定期与活期存款,加大了程序难度,特别是界面与算法的结合中,遇到了许许多多的问题,列如在做利息算法与内层界面、主界面的结合中,许多变量无法再内层中调出,最后只能采取把算法放在内层界面中的方法了,基本上这块阻碍了课程设计的进程。还有,各种强制转换,使得程序更为繁琐、复杂。但通过我一步步的修改,最终还是解决了众多问题。
通过这次课程设计,使我对java这门课程了解的更深,更透彻。对面向对象程序设计的基本思想有理一个大体的了解,对以后的学习有很大的帮助。但程序中还是有很多不足,但我相信,在以后的慢慢的学习中,我会把这门语言掌握的更好,东西做的会更好。为以后学别的程序设计语言打下良好的基础。
六、附件(代码、部分图表)
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.FlowLayout;
public class bankJFrame extends JFrame implements ActionListener{
private JTextField text_zhanghao,text_kahao;//定义账号,卡号文本行
private JButton button_cunkuan,button_qukuan,button_yue,button_lixi;//定义存款,取款,查询余额按钮
private double balance;//成员变量--查看余额
private double rlixi;
public bankJFrame()
{
super("银行存取款管理系统");//主窗口标题
this.setBounds(300, 240, 400, 150);//窗口初弹出坐标及大小
this.setResizable(false);//窗口大小不能改变
this.setBackground(Color.lightGray);//颜色设置
this.setLayout(new java.awt.FlowLayout(FlowLayout.CENTER));//面板布局为居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel1=new JPanel();//新建第一个面板
this.getContentPane().add(panel1,"North");
panel1.add(new JLabel("账户"));
text_zhanghao=new JTextField("zj",6);
text_zhanghao.setEditable(false);//文本行不可编辑
panel1.add(text_zhanghao);
panel1.add(new JLabel("卡号"));//用户卡号标签及文本行
text_kahao=new JTextField("622627199310150612",15);
text_kahao.setEditable(false);//文本行不可编辑
panel1.add(text_kahao);
this.setVisible(true);//窗口可见
JPanel panel2=new JPanel();
this.getContentPane().add(panel2,"South");//面板布局及添加面板至主面板
button_cunkuan=new JButton("存款");//存款按钮
panel2.add(button_cunkuan);
button_cunkuan.addActionListener(this);
button_qukuan=new JButton("取款");//取款按钮
panel2.add(button_qukuan);
button_qukuan.addActionListener(this);
button_yue=new JButton("查询当前余额");//查询当前余额按钮
panel2.add(button_yue);
button_yue.addActionListener(this);
button_lixi=new JButton("当前利息");//当前利息按钮
panel2.add(button_lixi);
button_lixi.addActionListener(this);
this.setVisible(true);
}
public class MessageJDialog extends JFrame implements ActionListener
{
JTextField text_cunkuanshu,text_huoqi;//存款数与活期存款年份的输入
JLabel jlabel_huoqi,jlabel_dingqi;//活期期限标签,定期期限标签
JButton button_queding;//确定按钮
JRadioButton radio_dingqi,radio_huoqi;//活、定期单选框
JComboBox box_dingqi;//定期年份组合框
double dnianfeng;//内部成员变量定期年份的声明
MessageJDialog(String dingqis[])
{
super("提示");
this.setBounds(350,290,300,220);
JPanel panel1=new JPanel();
panel1.add(new JLabel("请输入存款数(元):"));
panel1.add(text_cunkuanshu=new JTextField("100",6));
text_cunkuanshu.addActionListener(this);
this.getContentPane().add(panel1);
JPanel panel_rb=new JPanel(new GridLayout(1,2));
panel1.add(panel_rb);
this.setVisible(true);
ButtonGroup bgroup=new ButtonGroup();
radio_dingqi=new JRadioButton("定期存款");
bgroup.add(radio_dingqi);
panel_rb.add(radio_dingqi);
radio_dingqi.addActionListener(this);
radio_huoqi=new JRadioButton("活期存款");
bgroup.add(radio_huoqi);
panel_rb.add(radio_huoqi);
this.setVisible(true);
radio_huoqi.addActionListener(this);
JPanel panel_rm=new JPanel();
panel1.add(panel_rm);
panel_rm.add(jlabel_dingqi=new JLabel("请选择定期期限(年)"));
box_dingqi=new JComboBox(dingqis);
box_dingqi.setEditable(true);
box_dingqi.addActionListener(this);
panel_rm.add(box_dingqi);
this.setVisible(true);
JPanel panel_rn=new JPanel();
panel1.add(panel_rn);
panel_rn.add(jlabel_huoqi=new JLabel("请输入活期期限(年):"));
panel_rn.add(text_huoqi=new JTextField("1",7));
button_queding=new JButton("确定");
panel1.add(button_queding);
this.setVisible(true);
button_queding.addActionListener(this);//注册文本编辑事件
}
public String str()//成员方法:获取文本框输入存款数字符串
{
String str=text_cunkuanshu.getText();
return str;
}
public double dlixi()//成员方法:计算定期利息
{
double a=balance;
double c=dnianfeng;
switch((int)(c*4)){
case 1: return(a*0.0248*c);
case 2: return(a*0.02*c);
case 4: return(a*0.028*c);
case 8: return(a*0.0352*c);
case 12: return(a*0.04*c);
case 20: return(a*0.044*c);
default: return 0;
}
}
public double hlixi()//成员方法:计算活期利息方法
{
double hnianfeng=Double.parseDouble((text_huoqi.getText()));
double a=balance;
double c=hnianfeng;
double s=a*0.004*c;
return s;
}
public void actionPerformed(ActionEvent e)//内部对话框类单击事件处理方法
{
if(radio_dingqi.isSelected())//定期单选框选中
{
text_huoqi.setVisible(false);
jlabel_huoqi.setVisible(false);
jlabel_dingqi.setVisible(true);
box_dingqi.setVisible(true);
rlixi=dlixi();
}
else if(radio_huoqi.isSelected())//活期单选框选中
{
jlabel_dingqi.setVisible(false);
box_dingqi.setVisible(false);
text_huoqi.setVisible(true);
jlabel_huoqi.setVisible(true);
rlixi=hlixi();
}
if(e.getSource()==button_queding)//单击确定按钮
{
double cunkuanzhi=Integer.parseInt(text_cunkuanshu.getText());//存款数文本框字符串强制转换双精度型
if (cunkuanzhi>0)//存款操作
{
balance+=cunkuanzhi; //存款操作使余额值增加
}
JOptionPane.showMessageDialog(this,"存款"+cunkuanzhi+"成功!");
if(radio_dingqi.isSelected())//定、活期单选框利息计算传送
rlixi=dlixi();
if(radio_huoqi.isSelected())
rlixi=hlixi();
}
if(e.getSource()==box_dingqi)//定期组合框的选择
{
String nianfeng=(String) box_dingqi.getSelectedItem();
dnianfeng=Double.parseDouble(nianfeng);
}
}
}
public double get() //取款操作,参数为取款金额,返回实际取到金额
{
String password=JOptionPane.showInputDialog(this,"请输入取款数");
double qukuanzhi=Integer.parseInt(password);
if (qukuanzhi>0)
{
if (qukuanzhi<=this.balance)
this.balance-= qukuanzhi; //取款操作使余额值减少
else //账户余额不够所取时
{
qukuanzhi = this.balance+rlixi; //取走全部余额
this.balance = 0;
JOptionPane.showMessageDialog(this,"您的余额不足,已为您取出全部余额!");
}
return qukuanzhi; //返回实际取款额
}
return 0;
}
public double balance() //查看账户余额
{
return balance+rlixi;
}
public void actionPerformed(ActionEvent e)//单击事件处理方法
{
if(e.getSource()==button_cunkuan)//单击存款按钮
{
String dingqis[]={"0.25
new MessageJDialog(dingqis);//新建MessageJDialog类对象
}
if(e.getSource()==button_yue)//单击查询余额按钮
{
double relixi=balance();
JOptionPane.showMessageDialog(this,"尊敬的zj先生,您的当前账户余额为:"+(relixi)+"元");
}
if(e.getSource()==button_qukuan)//单击取款按钮
{
double qk=get();
JOptionPane.showMessageDialog(this,"取款"+qk+"元成功!");
}
if(e.getSource()==button_lixi)//单击计算利息按钮
{
JOptionPane.showMessageDialog(this,"尊敬的zj先生,您的当前账户利息为:"+rlixi+"元");
}
}
public static void main(String args[])//框架bankJFrame主函数
{
new bankJFrame();
}
}