1、 淮海工学院计算机工程学院 实验报告书 课程名:《面向对象程序设计》 实验名称: Java深入面向对象编程 商品销售系统 班 级: ^ ^ 组 长: 组 员: ^ ^ 评语: 成绩: 指导教师: 批阅时间: 年
2、月 日 一.实验目的 1. 掌握Java面向对象编程的初步知识,理解类的定义和使用,会正确运用Java的非访问控制符和访问控制符来实现面向对象的编程思想;掌握Java类的修饰符、访问控制符的使用; 2. 培养团队合作精神和沟通能力。 二.实验题目 以与大学生学习、生活、娱乐相关的信息服务为例,各团队自选题目,用面向对象的方法进行需求分析,划分功能模块,每位成员负责其中某些模块的设计与实现。 首先练习类的定义和使用,包括类、属性和方法的各种修饰符的使用、方法与构造函数的定义与使用,练习修饰符的使用。 三.要求 1.
3、 采用Application图形界面显示,请注意用户界面的友好性; 2. 源程序中必需对程序功能、方法、属性等加适当的注释; 3. 每个人一个包(即用英文命名的文件夹),所有类的命名都要用设计者姓名拼音缩写加若干能表达功能意义的字符组成; 4. 每组有一个组长,组长除完成本身任务外,还要负责设计作为程序入口的主类、系统总的说明文档;每位成员负责编写自己每次的说明文档; 5. 作业由组长以团队形式提交到教学平台上,压缩包名为三个成员汉语名字合成,第一个为组长。 6. 提交时间: 四、实验步骤与源程序 1. 选题与团队分工 u 选题: 商品销售系统 u 分工: 角
4、色 姓名 承担的具体任务 组长 强余彬 程序的主入口、客户类、修改产品、修改客户、下单及一些界面类 组员 李宏志 产品类、销添加删除客户、产品的类 组员 谢超 初始化数据类、、查询客户、产品类、用户类 2. 系统需求分析 u 系统功能描述 商品销售系统 系统管理员:添加客户资料、删除客户资料、修改客户资料、查询客户资料、添加商品、删除商品、修改商品、查询商品、下单、取消下单、修改密码(包括销售人员) 销售人员:添加客户资料、修改客户资料、查询客户资料、修改商品、下单、取消下单、修改密码 u 系统用例图 3. 系统类图设计 系统类图 (
5、强余彬) 搜查实体类 异常类 (李宏志) (谢超) 4. 源程序 五、测试数据与实验结果 登陆界面 输入错误 系统管理员主界面 修改客户(失败) 修改客户(成功) 下单 下单失败 添加产品 删除产品 修改产品 修改密码(输入密码错误) 未输入修改密码 输入密码不一致 修改成功 修改销售人员密码(账号错误)
6、 修改销售人员密码成功 李宏志: 谢超 六、结果分析与实验体会 (强余彬)本次实验对系统的功能没有做修改,主要是优化了系统的结构。首先是本次实验大量运用了继承,尤其是界面,大多数的界面继承的是ReviseClientGUI这个界面,重复利用了界面上的布局以及标签,大大简化了工作量以及代码的长度,有些界面是继承的一些相似的界面,例如删除客户继承了删除产品的界面,而删除产品又是继承于修改客户这个界面。其次,本次实验添加了一个自定义异常类,当创建新用户的时候密码低于三
7、位数会自动派出此异常。本次试验还添加了一个Search类,里面有一些常用函数,例如查找客户、查找产品、比较字符串、删除客户等方法,在其他界面中要用可以调用此嘞的一些方法,实现了类的封装。此外,本次实验还将以前在输入一些非法数据会产生的异常给补上了,例如有NullPointerException、NumberFormatException等等。有一些界面只需要 接收一个用户输入的数据,所以就是用了JOPtionPane类中的showInputDialog函数用来接收数据,大大简化了代码量,优化了系统性能。本次实验画了整体系统的类图之间的关系,大大加深了我对此系统的了解,形成了一个严密的框架,对于
8、今后的学习会有很大的帮助。 老师的代码对于我们的学习是有很大的帮助的,学习是一件长期的事,实践着“痛并快乐着……”的感觉是非常好的,我会继续坚持下去的。 (李宏志)本次实验主要运用了属性以及函数的继承,隐藏,重载等操作。通过遮羞方法的运用,能够明显简化代码的复杂度,尤其是继承的运用,通过继承其他属性函数的操作,从而简化程序的复杂度,此外还需要运用文本域的隐藏操作,对于新的操作需要重新定义标签和文本域,另外在继承操作时需要注意继承的对象公共和私有,来避免错误。在编程时会出现一些异常,对于异常的处理,可以通过public void p(int x){ try{ } catch(E
9、xception e){ } finally{ } }语句来捕获异常,如果在try语句中出现异常,则会被抛出。对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。本次实验还练习了通过visio软件画系统类图和用例图,包括实体类、界面类,特性与操作的参数的输入,顶层包的加载等等。 (谢超)第三次试验是在第二次的基础上的拓展,在这次试验中我完成了我所有的包中的文件的测试,以及完成了相应的文件的类图的画图。在类图的画画过程中还是有一些不懂得地方,对于系统中的集体的操作和特性有的区分的不是很清楚,在画类图的时候参考了老师的类图的画法,还有同学的帮助。这次
10、试验掌握了类图的画法,和对继承的一些了解。 源代码 /* 一个简单的校园卡系统设计示例 版本:Ver 2.0 作者:强余彬 时间:2010.5.1 */ /*对用户商品进行查找操作的业务类*/ package SalesSystem.qyb; // 定义系统所属包名 import SalesSystem.xc.*; //引入实体类所在包 import SalesSystem.lhz.*; import java.util.*; import javax.swing.JOptionPane;
11、
public class Search //定义一个业务类,实现查找操作
{
//Client client;
public int clientflag;
public int goodsflag;
public Client findClient;
public Goods findGoods;
public Search()
{
clientflag=0;
goodsflag=0;
}
public Client searchClient(String name)
{
for(int i=0;i 12、th;i++)
{
try{if(Init.init.client[i].getId().equals(name))
findClient= Init.init.client[i];
clientflag=1;
}
catch(NullPointerException ee){}
}
if(clientflag==0)findClient= null;
return findClient;
}
public Goods searchGoods(String tmp)
{
for(int i= 13、0;i 14、
{
int flag=0;
for(int i=0;i 15、alog(null,"删除成功!");
flag=1;
}
}
if(flag==0)
{
JOptionPane.showMessageDialog(null,"不存在此顾客,无法删除","警告",JOptionPane.WARNING_MESSAGE);
JOptionPane.showInputDialog(null ,"输入客户的名字","删除客户",JOptionPane.PLAIN_MESSAGE);
}
}
public void deleteGoods(String 16、tmp)
{
int flag=0;
for(int i=0;i 17、[j]=null;
Goods.lth--;
JOptionPane.showMessageDialog(null,"删除商品成功!");
flag=1;
}
}
if(flag==0)
{
JOptionPane.showMessageDialog(null,"不存在此商品,无法删除");
tmp=JOptionPane.showInputDialog(null 18、"输入产品的名字","删除产品",JOptionPane.PLAIN_MESSAGE);
}
}
public static boolean isEmpty(String tmp)
{
try{
if(tmp.length()==0)
{
JOptionPane.showMessageDialog(null,"您未输入任何字符","错误",JOptionPane.ERROR_MESSAGE);
return false;
}
else return true;
}catch(NullP 19、ointerException ee){}
return false;
}
}
/* 一个简单的销售系统设计示例
版本:Ver 2.0
作者:强余彬
时间:2010.4.25
*/
/* 销售系统客户实体类 */
package SalesSystem.qyb;
import SalesSystem.xc.*;
public class Client extends User //继承了user实体类
{
private String Gender;
public String Goods[]=new String[15]; 20、//购买的商品名称
public int Price[]=new int[15];//相应的价格
public int Amount[]=new int[15];//买的数量
private int goodslth;
static
{
lth=0;
}
public Client(String id)
{
super(id);
Id=id;
Gender="男";
UserType="客户";
lth++;
goodslth=0;
}
public Client(String id, String s 21、ex) //构造用户1,默认身份为销售人员
{
super();
Id=id;
Gender=sex;
UserType="客户";
lth++;
goodslth=0;
}
public int getGoodslth()
{
return goodslth;
}
public void alterGoodslth(int tmp)
{
goodslth=tmp;
}
public String getGender()
{
return Gender;
}
pub 22、lic void alterGender(String sex)
{
Gender=sex;
}
public void buyGoods(String goods,int price,int amount)
{
Goods[goodslth]=goods;
Price[goodslth]=price;
Amount[goodslth]=amount;
goodslth++;
}
public String printGoods()
{
String tmp="产品:";
for(int i=0;i 23、odslth();i++)
{
tmp+=Goods[i]+"、";
}
return tmp;
}
public String printAmount()
{
String tmp="数量:";
for(int i=0;i 24、
*/
/* 销售系统产品实体类 */
package SalesSystem.lhz;
import SalesSystem.qyb.*;
import SalesSystem.xc.*;
public class Goods
{
private String Name;
private int Price;
private int TotalAmount;
private int Left;
public static int lth;
static
{
lth=0;
}
public Goods(String nam 25、e,int price,int total,int left)
{
Name=name;
Price=price;
TotalAmount=total;
Left=left;
lth++;
}
public Goods(String name,int price,int total)//初始化余量等于总量
{
Name=name;
Price=price;
TotalAmount=total;
Left=total;
lth++;
}
public String getName()
{
26、 return Name;
}
public void alterName(String tmp)
{
Name=tmp;
}
public int getPrice()
{
return Price;
}
public void alterPrice(int tmp)
{
Price=tmp;
}
public int getTotalAmount()
{
return TotalAmount;
}
public void alterTotalAmount(int tmp)
{
27、TotalAmount=tmp;
}
public int getLeft()
{
return Left;
}
public void alterLeft(int tmp)
{
Left=tmp;
}
public String tostring()
{
String s;
s="商品名:"+getName()+"\t价格:"+getPrice()+"\t总量:"+getTotalAmount()+"\t余量:"+getLeft();
return s;
}
}
/* 一个简单的销售系统设计示例
28、 版本:Ver 1.0
作者:谢超
时间:2010.4.7
*/
/* 销售系统初始化客户、商品信息类 */
package SalesSystem.xc;
import SalesSystem.lhz.*;
import SalesSystem.qyb.*;
public class Init
{
public User user1;
public User user2;public User user4;
public User user3;
public Client client[]=new Client[20];
29、 public Goods goods[]=new Goods[20];
public static Init init=new Init();
public Init()
{
try{
user1=new User("强余彬","0000","系统管理员");
user2=new User("谢超","0000","销售人员");
user3=new User("李宏志","0000","销售人员");
}
catch(UnexpectedCreat ee){System.out.println(ee.toStrin 30、g());}
client[0]=new Client("张三","男");
client[0].buyGoods("铅笔",1,50);
client[0].buyGoods("文具盒",10,2);
client[1]=new Client("李四","男");
client[1].buyGoods("铅笔",1,10);
client[1].buyGoods("本子",2,3);
client[2]=new Client("王五","男");
client[2].buyGoods("钢 31、笔",9,8);
client[2].buyGoods("文具盒",10,3);
client[3]=new Client("小红","女");
client[3].buyGoods("钢笔",9,8);
client[3].buyGoods("文具盒",10,3);
client[4]=new Client("小明","男");
client[4].buyGoods("本子",2,10);
client[4].buyGoods("铅笔",1,20);
client[4].buyGoods("钢笔",9,2);
32、 goods[0]=new Goods("铅笔",1,1000,800);
goods[1]=new Goods("钢笔",9,300,280);
goods[2]=new Goods("本子",2,600,590);
goods[3]=new Goods("文具盒",10,200,195);
goods[4]=new Goods("橡皮",1,200,200);
}
}
/* 一个简单的销售系统设计示例
版本:Ver 2.0
作者:强余彬
时间:2010.5.1
*/
/* 系统管理员图形界面类 */
33、
//自定义异常类,当创建新用户密码过短时产生
package SalesSystem.qyb;
import SalesSystem.xc.*;
public class UnexpectedCreat extends Exception
{
private User user; //产生当前错误的User对象的引用
private String IllegalPsd; //产生当前错误的非法的密码
public UnexpectedCreat(User tmp,String psd) //构造函数
{
super("不合法的 34、初始充值数额");//调用父类Exception的构造函数
user=tmp; //初始化两个属性
IllegalPsd=psd;
}
public String toString() //重载父类的方法,给出详细的错误信息
{
String s;
s="创建用户时出错:"+user.getId()
+" 该、用户的密码"
+IllegalPsd
+"不合规定";
return s;
}
35、}
/* 一个简单的销售系统设计示例
版本:Ver 2.0
作者:谢超
时间:2010.5.1
*/
/* 销售系统用户实体类 */
package SalesSystem.xc;
import SalesSystem.lhz.*;
import SalesSystem.qyb.*;
import javax.swing.*;
public class User
{
public static int lth;//存的个数
protected String Id;
private String Password;
protecte 36、d String UserType;//用户类型 管理员、普通用户
static
{
lth=0;
}
public User()
{
}
public User(String id)//构造用户,默认身份为销售人员,默认密码为0000
{
Id=id;
Password="0000";
UserType="销售人员";
lth++;
}
public User(String id, String psd)throws UnexpectedCreat//构造用户,默认身份为销售人员
{ 37、 //根据用户名和密码,声明了抛出异常
this(id);
if(psd.length()<4)
throw (new UnexpectedCreat(this,psd));
Password=psd;
UserType="销售人员";
lth++;
}
public User(String id,String psd,String type) throws UnexpectedCreat//构造用户
{
this(id,psd);
//Id=id;
//Password=psd 38、
UserType=type;
lth++;
}
public String getId()
{
return Id;
}
public void alterId(String id)
{
Id=id;
}
public String getPassword()
{
return Password;
}
public boolean alterPassword(String tmp)//密码新添了判断是否为空和限定密码长度不能太短的功能
{
if(tmp.length()==0)
39、{
JOptionPane.showMessageDialog(null,"您未输入任何字符","错误",JOptionPane.ERROR_MESSAGE);
return false;
}
else if(tmp.length()<=3)
{
JOptionPane.showMessageDialog(null,"您输入的密码过短","警告",JOptionPane.WARNING_MESSAGE);
return false;
}
else
{
Password=tmp;
JOptionPane.showMe 40、ssageDialog(null,"成功修改密码!");
return true;
}
}
public String getUserType()
{
return UserType;
}
public void alterUserType(String tmp)
{
UserType=tmp;
}
public boolean userTypeJudge(String name,String pwd,String type)
{
if(Id.equals(name) && Passwor 41、d.equals(pwd) && UserType.equals(type))
return true;
else
return false;
}
public boolean userPsdJudge(String tmp,String pwd)
{
if(tmp.equals(pwd))
return true;
else
return false;
}
42、
public String tostring()
{
String s;
s="用户名:"+getId()+" 密码:"+getPassword()+" 用户类型:"+getUserType();
return s;
}
}
/* 一个简单的销售系统设计示例
版本:Ver 1.0
作者:强余彬
时间:2010.4.7
*/
/* 销售系统主入口类 */
package SalesSystem;
import java.io.*;
import SalesSystem.xc.*;
public class Main
{
43、 public static void main (String args[])
{
System.out.println(Init.init.user1.tostring());
System.out.println(Init.init.user2.tostring());
System.out.println(Init.init.user3.tostring());
System.out.println(Init.init.goods[0].tostring());
System.out.println(Init.init.goods[1].tostri 44、ng());
System.out.println(Init.init.goods[2].tostring());
System.out.println(Init.init.goods[3].tostring());
System.out.println(Init.init.goods[4].tostring());
new GUI(); //构造一个新窗体对
}
}
/* 一个简单的销售系统设计示例
版本:Ver 1.0
作者:强余彬
时间:2010.4.7
*/
/* 销售系统主登陆窗口图形界面类 */
packa 45、ge SalesSystem;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import SalesSystem.lhz.*;
import SalesSystem.xc.*;
import SalesSystem.qyb.*;
public class GUI extends Frame implements ActionListener,ItemListener
{
TextField txId; //一定一个宽度为10个字符的文本框,用于答案输入
TextFiel 46、d txPassword;
Label lbTitle;
Label lbId;
Label lbPassword;
Button btOk;
Button btCancel;
Button btReset;
Label type;
Choice typeChoice;
Font myFont;
String chtype;
public User u;
GUI() //构造函数,用来初始化
{
super("主登陆界面"); //调用父类构造函数
btOk=new Button( 47、"确定");
btCancel=new Button("退出");
btReset=new Button("重置");
chtype="销售人员";
typeChoice=new Choice();
type=new Label("身份:");
lbTitle=new Label("商品销售系统 ");
lbTitle.setFont(myFont);
lbId=new Label("用户账号 ");
txId=new TextField(10);
lbPassword=new Label("用户密码 ");
txPasswo 48、rd=new TextField(10);
txPassword.setEchoChar('*');
myFont=new Font("黑体",Font.BOLD,20); //定义字体为黑体、加粗、字号18
GridBagLayout gbl=new GridBagLayout();
GridBagConstraints gbc=new GridBagConstraints();
setLayout(gbl );
// 设置标题控件的位置
gbc.anchor=GridBagConstraints.NORTH; 49、 //让标题顶部居中
gbc.gridwidth=GridBagConstraints.REMAINDER; //让标题成为所在行最后(也是唯一)一个组件
add(lbTitle,gbc);
//设置姓名控件的位置
gbc.anchor=GridBagConstraints.WEST; //让ID标签位于左侧
gbc.gridwidth=1; //占一个单元格
add(lbId,gbc);
gbc.gridwidth=GridBagConstraints.REMAINDER; //让ID输入框成为所在行最后一个 50、组件
add(txId,gbc);
//设置密码控件的位置
gbc.gridwidth=1;
add(lbPassword,gbc);
gbc.gridwidth=GridBagConstraints.REMAINDER;
add(txPassword,gbc);
//设置身份控件的位置
gbc.gridwidth=1;
add(type,gbc);
add(typeChoice,gbc);
typeChoice.add("销售人员");
typeChoice.add("系统管理员");
gb






