1、兰州商学院陇桥学院 工学系课程设计报告 设 计 题 目:抽奖程序 系 别:工学系 专 业 (方 向):电子商务 年 级、 班 学 生 姓 名: 学 生 学 号: 指 导 教 师: 2013年 12 月 5 日 目录 一、系统开发的背景 3 二、系统分析与设计 3 (一)系统功能要求 3 (二)系统模块设计 3 三、系统的设计
2、4 四、系统测试 5 五、总结 5 六、程序代码 6 抽奖程序 一、系统开发的背景 java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。它具有面向对象、跨平台、分布应用等特点。它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。很多程序开发人员得第一选择。为了将课堂上得知识掌握得更加透彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。 二、系统分析与设计 (一)系统功能要
3、求 1)能够在电脑上抽奖,分别抽取4等奖、3等奖、2等奖、1等奖、特等奖,设定每种奖项的人数后分别一次抽取每个奖项。 2)按给定的总人数以序号或电话号码为抽奖依据。 (二)系统模块设计 通过对系统功能的分析,抽奖系统功能如图1所示 打开抽奖人员保存地址 开始抽奖 暂停抽奖 记录中奖号码中奖等级 产生中奖 显示抽奖结果 图1 抽奖系统业务流程图 三、系统的设计 此小程序的基本流程是,在一个文本文件存放里面备选的数据,数据的格式是每行有姓名和手机号他们之间是用分隔符-来分隔的。然后在自定义一个方法,通过分隔符来区分姓名和手机号,然后将他们分别存
4、储进两个不同的可变向量当中。自定义一个线程,此线程是专门用来随机选取一个号码, 并且每隔50毫秒就将一个不同的号码显示在号码框中,这样就实现了号码的快速滚动,实现了完全模拟电视当中抽奖的画面为了实现选取出的一个号码不能再被选种,实现的方法是将他们从可变向量中清除出去。此程序首先从四等奖开始抽取四人,三等奖抽取三人,二等奖抽取二人,一等奖一人,特等奖一人。 显示一等奖 显示二等奖 显示三等奖 显示四等奖 退出显示 打开人员文件 子界面 关闭人员文件 抽奖功能流程图 四、系统测试 程序测试如下图: 五、总结 在设计程序时,不能妄想一次就将整
5、个程序设计好,反复修改、不断改进是程序设计的必经之路。在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们通过查阅大量有关资料,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。通过这次课程设计我也发现了自身存在的不
6、足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力。 附件 六、程序代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; public class ChooseAward extends JFrame
7、 { /** * */ //系统自动生成 private static final long serialVersionUID = 7510608124693852355L; JButton b_start = new JButton("开始"); JButton b_stop = new JButton("停止"); JPanel p_north=new JPanel(); JP
8、anel p_center=new JPanel(); JPanel p_south=new JPanel(); //菜单栏 JMenuBar menubar=new JMenuBar(); //菜单项 JMenu fileMenu=new JMenu("文件"); JMenu setMenu=new JMenu("设置"); JMenu aboutMenu=new JMenu("关于"); /*
9、 * 菜单子项 */ private JMenuItem[] filem={new JMenuItem("选择文件"),new JMenuItem("另存为.."), new JMenuItem("保存"),new JMenuItem("退出") }; JTextField t_identNumber = new JTextField(); // 身份证号的文本域 Vector v_identNumbe
10、r = new Vector(); // 存放读取出来的身份证的号码 Vector v_name = new Vector(); // 存放读取出来的人的姓名 Vector v_printident = new Vector(); // 存放中奖人的身份证号码 JLabel l_information = new JLabel(); JLabel l_identNumber = new JLabel(); JLabel l_sysinformation = new JLabel("系统
11、信息:"); JFileChooser filechooser = new JFileChooser(); // 文件选择器 //选择随机数的线成 public ChooseThread awardThread = null; int chooseTime = 0; // 按下停止按钮的次数,也就是抽奖的次数 public ChooseAward() { super("小型抽奖系统"); t_identN
12、umber.setEditable(false); /* * 1.4以后的JDK可以不用Container */ Container contentPane = getContentPane(); //BorderLayout布局管理器,东,南,西,北 contentPane.setLayout(new BorderLayout()); /*
13、 * 给几个按钮和子菜单添加监听器 */ filem[0].addActionListener(new ActionListener() { // 注册加载事件的监听器 public void actionPerformed(ActionEvent e) {
14、 b_loadident_ActionPerformed(e); } }); b_start.addActionListener(new ActionListener() { // 注册开始事件的监听器 public void actionPerformed(Ac
15、tionEvent e) { b_start_ActionPerformed(e); } }); b_stop.addActionListener(new ActionListener() {// 注册停
16、止事件的监听器 public void actionPerformed(ActionEvent e) { b_stop_ActionPerformed(e); } });
17、 filem[2].addActionListener(new ActionListener() {// 注册打印事件的监听器 public void actionPerformed(ActionEvent e) { b_printaward_ActionPerformed(e);
18、 } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);
19、 }
});
//将菜单子项加入菜单中
for(int i=0;i 20、arator();
}
//将菜单条加入frame中
menubar.add(fileMenu);
menubar.add(setMenu);
menubar.add(aboutMenu);
setJMenuBar(menubar);
/*将p_north设计为一个状态栏,显示一些操作过程 21、中的信息
* 创建一个左对齐方式的流布局
*/
p_south.setLayout(new FlowLayout(FlowLayout.LEFT));
l_information.setForeground(Color.blue);
p_south.add(l_sysinformation);
p_south.add(l_information);
con 22、tentPane.add(p_south,BorderLayout.SOUTH);
/*
* 设置的一些显示方式,字体,大小等,为了尽量美观一点
*/
Font xuehao=new Font("null", 23、Font.PLAIN,30);
l_identNumber.setFont(xuehao);
//字体的居中对齐
l_identNumber.setHorizontalAlignment(0);
l_identNumber.setText("手机号");
Font number=new Font("null",Font.BOLD,30);//粗体
24、 t_identNumber.setFont(number);
//设置字体颜色
t_identNumber.setForeground(Color.red);
t_identNumber.setHorizontalAlignment(0);
//给上面的jpanel设置布局
p_north.se 25、tLayout(new GridLayout(2,1));
p_north.add(l_identNumber);
p_north.add(t_identNumber);
contentPane.add(p_north,BorderLayout.NORTH);
//给中间的jpanel 设置布局
p_center.setLayout(new GridLay 26、out(1,2,10,0));
p_center.add(b_start);
p_center.add(b_stop);
contentPane.add(p_center,BorderLayout.CENTER);
}
/*
* 加载按钮事件方法
27、 */
public void b_loadident_ActionPerformed(ActionEvent e)
{
int k = 0;
chooseTime = 0;
//从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedReader reader = null;
//此方法会返回一个int值
int i 28、 = filechooser.showOpenDialog(this); // 显示打开文件对话框
/*
* 确实所选择的是对话框上的确定按钮
*/
if (i == JFileChooser.APPROVE_OPTION)
{ // 点击对话框中打开选项
File f = filechooser.getSelectedFile(); // 得到所选择的文件
29、 try
{
l_information.setText("数据加载中,请稍等...");
//读取字符流
reader = new BufferedReader(new FileReader(f));
//循环读取
30、 while (true)
{
//读取一个文本行
String data = reader.readLine();
System.out.println(data);//开发时候测试用
// 31、 读完了数据
if (data == null)
{
l_information.setText("数据加载完成!");
break;
}
32、
//通过“-”这个符号将 字符串分离为两部分,再存放到向量里面
Vector v = this.apart(data, "-");
//System.out.println(data);//开发时候测试用
33、 if (v == null)
{
l_information.setText("数据格式不正确,请重新加载!");
return;
}
/*
34、 * 分别将分离开来的手机号码,和姓名分别放入两个可变向量当中
* 这里应该使用泛型,由于本人还没有熟练掌握泛型,姑且放之
*
*
* 捕获异常,看是否出现了格式错误,因为一般出现了格 35、式错误
* 这两条语句都会发生无法取得元素的错误
*/
try
{
v_identNumber.add(k, v.elementAt(0));
36、 v_name.add(k, v.elementAt(1));
k++;
}
catch(Exception e4)
{
37、 System.out.println("格式中没有分隔符号出现的错误");
//JOptionPane.showMessageDialog(this, "导入的数据格式错误!");
l_information.setText("导入的数据格式错误!");
38、 break;
}
}
} catch (Exception ex)
{
ex.printStackTrace(); // 输出出错信息
}
}
}
39、 /*
* 启动按钮的事件
*/
public void b_start_ActionPerformed(ActionEvent e)
{
//判断存储两个标记的向量中是否为空
if (v_identNumber.size() <= 0 || v_name.size() <= 0)
{
l_information.setText("数据没有加载,请加载数据! 40、");
}
else
{
if (chooseTime > 11)
{
l_information.setText("抽奖结束,若要再进行一次须重新启动程序!");
}
else//执行....
41、 {
awardThread = new ChooseThread(this);
awardThread.changeflag_start();
l_information.setText("将产生:特(1名),一(1名),二(2名),三(3名)等奖,四(4名)等奖");
l_identNumber.setText("选 42、取中...");
b_start.setEnabled(false);
b_stop.setEnabled(true);
}
}
}
/*
* 暂停按钮的事件
*/
public void b_stop_ActionPerformed(ActionEvent e)
{ 43、
//将跳转的数字置于停止状态
awardThread.changeflag_stop();
String awardmessage = "";
chooseTime++;//第几次按停止按钮
String str_name = "";
String message="";
/*
* 根据第几次来按停止按钮来决定是产生几等奖 44、
*/
switch (chooseTime)
{
case 1:
case 2:
case 3:
case 4://按前三次都是产生三等奖
//寻找停止在号码框中的数字,是对应的的存放号码的向量中的第几个
for (int k = 0; k 45、 < v_identNumber.size(); k++)
{
//找到了对应的号码
if ((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
{
//取出这个号码对应的名字
46、 str_name = (String) v_name.elementAt(k);
//为防止下次抽的时候再抽到相同的号码,所以把它们从向量中移除掉
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);
break;//跳出 47、循环
}
}
l_identNumber.setText("四等奖");
b_start.setText("继续");
//这是要输出到文本文件的信息
awardmessage = "四等奖 " + t_identNumber.getText() + str_name + "\r\n";
48、 //将要打印的文本信息先存放到一个可变向量中
v_printident.addElement(awardmessage);
message = "第"+chooseTime+"位四等奖得主为: "+str_name;
JOptionPane.showMessageDialog(this, message);
break;
case 5:
49、 case 6:
case 7:
for (int k = 0; k < v_identNumber.size(); k++)
{
//找到了对应的号码
if ((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
50、 {
//取出这个号码对应的名字
str_name = (String) v_name.elementAt(k);
//为防止下次抽的时候再抽到相同的号码,所以把它们从向量中移除掉
v_identNumber.removeElementAt(k);






