完整版java抽奖程序课程设计.docx
《完整版java抽奖程序课程设计.docx》由会员分享,可在线阅读,更多相关《完整版java抽奖程序课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
完整版java抽奖程序课程设计
兰州商学院陇桥学院
工学系课程设计报告
设
系
计
题
目:
抽奖程序
别:
工学系
专
业(方
向):
电子商务
年
级、
班
学
生
姓
名:
学
生
学
号:
指
导
教
师:
2013年12月5日
一、系统开发的背景3
二、系统分析与设计3
(一)系统功能要求3
(二)系统模块设计3
三、系统的设计4
四、系统测试5
五、总结5
六、程序代码6
抽奖程序
一、系统开发的背景
java语言的开发方法是当今世界最流行的开发方法,是当今流行的网络编程语言。
它具有面向对象、跨平台、分布应用等特点。
它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
很多程序开发人员得第一选择。
为了将课堂上得知识掌握得更加透彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。
让学生自己动手动脑,将书本上得知识运用到实践当中去,使知识能更好得融会贯通。
二、系统分析与设计
(一)系统功能要求
1)能够在电脑上抽奖,分别抽取4等奖、3等奖、2等奖、1等奖、特等奖,设定每种奖项的人数后分别一次抽取每个奖项。
2)按给定的总人数以序号或电话号码为抽奖依据。
(二)系统模块设计
通过对系统功能的分析,抽奖系统功能如图1所示
三、系统的设计
此小程序的基本流程是,在一个文本文件存放里面备选的数据,数据的格式是每行有姓名和手机号他们之间是用分隔符-来分隔的。
然后在自定义一个方法,通过分隔符来区分姓名和手机号,然后将他们分别存储进两个不同的可变向量当中。
自定义一个线程,此线程是
专门用来随机选取一个号码,并且每隔50毫秒就将一个不同的号码显示在号码框中,这样就实现了号码的快速滚动,实现了完全模拟电视当中抽奖的画面为了实现选取出的一个号码不能再被选种,实现的
方法是将他们从可变向量中清除出去。
此程序首先从四等奖开始抽取四人,三等奖抽取三人,二等奖抽取二人,一等奖一人,特等奖一人。
抽奖功能流程图
四、系统测试
程序测试如下图:
五、总结
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路。
在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长
的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
我们通过查阅大量有关资料,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力。
附件
六、程序代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.io.*;
importjava.util.*;
publicclassChooseAwardextendsJFrame{
/**
*
*/
//系统自动生成
longserialVersionUID
开始");
停止");
privatestaticfinal
7510608124693852355L;
JButtonb_start=newJButton("
JButtonb_stop=newJButton("
JPanelp_north=newJPanel();
JPanelp_center=newJPanel();
JPanelp_south=newJPanel();
//菜单栏
JMenuBarmenubar=newJMenuBar();
//菜单项
JMenufileMenu=newJMenu("文件");
JMenusetMenu=newJMenu("设置");
JMenuaboutMenu=newJMenu("关于");
/*
*菜单子项
*/
privateJMenuItem[]filem={newJMenuItem("选择文件"),new
JMenuItem("另存为.."),
newJMenuItem("保存"),newJMenuItem("退出
")
};
JTextFieldt_identNumber=newJTextField();//的文本域
身份证号
Vectorv_identNumber=newVector();//份证的号码
存放读取出来的身
Vectorv_name=newVector();//
Vectorv_printident=newVector();//号码
存放读取出来的人的姓名
存放中奖人的身份证
择器
JLabell_information=newJLabel();
JLabell_identNumber=newJLabel();
JLabell_sysinformation=newJLabel("
JFileChooserfilechooser=newJFileChooser();//
//选择随机数的线成publicChooseThreadawardThread=null;
系统信息:
");
文件选
intchooseTime=0;//
按下停止按钮的次数,也就是抽奖的次
publicChooseAward()
{
super("小型抽奖系统");t_identNumber.setEditable(false);
/*
*1.4以后的JDK可以不用Container
*/
ContainercontentPane=getContentPane();//BorderLayout布局管理器,东,南,西,北contentPane.setLayout(newBorderLayout());
/*
*给几个按钮和子菜单添加监听器
*/
filem[0].addActionListener(newActionListener(){
//注册加载事件的监听器
e)
publicvoidactionPerformed(ActionEvent{
b_loadident_ActionPerformed(e);
}
});
b_start.addActionListener(newActionListener(){
void
//注册开始事件的监听器public
actionPerformed(ActionEvente)
{
b_start_ActionPerformed(e);
}
});
b_stop.addActionListener(newActionListener()
{//注册停止事件的监听器
void
publicactionPerformed(ActionEvente)
{
b_stop_ActionPerformed(e);
}
});
filem[2].addActionListener(newActionListener()
{//注册打印事件的监听器publicactionPerformed(ActionEvente)
{
b_printaward_ActionPerformed(e);
}
});
addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
//将菜单子项加入菜单中
for(inti=0;i{
fileMenu.add(filem[i]);
//加入分隔线,为了美观
fileMenu.addSeparator();
}
//将菜单条加入frame中menubar.add(fileMenu);menubar.add(setMenu);menubar.add(aboutMenu);setJMenuBar(menubar);
/*将p_north设计为一个状态栏,显示的信息
*创建一个左对齐方式的流布局
*/
p_south.setLayout(new
FlowLayout(FlowLayout.LEFT));
l_information.setForeground(Color.blue);p_south.add(l_sysinformation);p_south.add(l_information);
void
些操作过程中
contentPane.add(p_south,BorderLayout.SOUTH);
/*
设置的一些显示方式,字体,大小等,为了尽量美观
一点
八、、
*/
Fontxuehao=newFont("null",Font.PLAIN,30);l_identNumber.setFont(xuehao);
//字体的居中对齐
l_identNumber.setHorizontalAlignment(0);l_identNumber.setText("手机号");
粗体
Fontnumber=newFont("null",Font.BOLD,30);//
t_identNumber.setFont(number);
//设置字体颜色t_identNumber.setForeground(Color.red);t_identNumber.setHorizontalAlignment(0);
//给上面的jpanel设置布局p_north.setLayout(newGridLayout(2,1));p_north.add(l_identNumber);p_north.add(t_identNumber);
contentPane.add(p_north,BorderLayout.NORTH);//给中间的jpanel设置布局p_center.setLayout(newGridLayout(1,2,10,0));
p_center.add(b_start);p_center.add(b_stop);
contentPane.add(p_center,BorderLayout.CENTER);
}
/*
加载按钮事件方法
*/
publicvoidb_loadident_ActionPerformed(ActionEvente)
{
intk=0;chooseTime=0;
//从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedReaderreader=null;
//此方法会返回一个int值
inti=filechooser.showOpenDialog(this);//显示
打开文件对话框
/*
*确实所选择的是对话框上的确定按钮
*/
if(i==JFileChooser.APPROVE_OPTION)
{//点击对话框中打开选项
Filef=filechooser.getSelectedFile();//得到所选择的文件try{
l_information.setText("数据加载
中,请稍等...");
//读取字符流reader=newBufferedReader(newFileReader(f));
//循环读取
while(true)
{
//
读取一个文本行
String
data
reader.readLine();
System.out.println(data);//开发时候测试用
读完了数据
通过“-”这个符号将字
v=this.apart(data,
//
if(data==null)
{
l_information.setText("数据加载完成!
");
break;
}
//
符串分离为两部分,再存放到向量里面
Vector
"-");
//System.out.println(data);//
开发时候测试用
if(v==null)
{
l_information.setText("数据格式不正确,请重新加载!
");return;
}/*
*分别将分离开来的手机
号码,和姓名分别放入两个可变向量当中
*这里应该使用泛型,由于
本人还没有熟练掌握泛型,姑且放之
*
*
*捕获异常,看是否出现了
格式错误,因为一般出现了格式错误
*这两条语句都会发生无
法取得元素的错误
*/
try
{
v_identNumber.add(k,
v.elementAt(0));
v_name.add(k,
v.elementAt
(1));
k++;
}catch(Exceptione4)
{
}
}catch(Exceptionex)
ex.printStackTrace();//
信息
}
}
}
/*
*启动按钮的事件
*/
publicvoidb_start_ActionPerformed(ActionEvente){
//判断存储两个标记的向量中是否为空if(v_identNumber.size()<=0||v_name.size()<=0)
{
l_information.setText("
载数据!
");
}
else
{
if(chooseTime>11)
{
l_information.setText("若要再进行一次须重新启动程序!
");
}
else//执行
{
awardThread
ChooseThread(this);awardThread.changeflag_start();l_information.setText("
(1名),一(1名),二(2名),三(3名)等奖,四(4名)等奖");l_identNumber.setText("
中...");
b_start.setEnabled(false);b_stop.setEnabled(true);
}
}
}
/*
输出出错
数据没有加载,请加
抽奖结束,
new
将产生:
特
选取
暂停按钮的事件
**/publicvoidb_stop_ActionPerformed(ActionEvente){
//将跳转的数字置于停止状态awardThread.changeflag_stop();Stringawardmessage="";
chooseTime++;//第几次按停止按钮
Stringstr_name="";
Stringmessage="";
/*
*根据第几次来按停止按钮来决定是产生几等奖
*/switch(chooseTime){case1:
case2:
case3:
case4:
//按前三次都是产生三等奖
//寻找停止在号码框中的数字,是对应的的存放号码的向量中的第几个
for(intk=0;k{
//找到了对应的号码if
((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
{
//取出这个号码对应的名字str_name=(String)v_name.elementAt(k);
//为防止下次抽的时候再抽到相同的号码,所以把它们从向量中移除掉
v_identNumber.removeElementAt(k);v_name.removeElementAt(k);
break;//跳出循环
}}l_identNumber.setText("四等奖");b_start.setText("继续");
//这是要输出到文本文件的信息awardmessage="四等奖"+t_identNumber.getText()+str_name+"\r\n";
//将要打印的文本信息先存放到一个可变向量中v_printident.addElement(awardmessage);
message="第"+chooseTime+"位四等奖得主为:
"+str_name;
JOptionPane.showMessageDialog(this,message);
break;
case5:
case6:
case7:
for(intk=0;k//找到了对应的号码if
((t_identNumber.getText()).equals(v_identNumber.elementAt(k)))
{
//取出这个号码对应的名字str_name=(String)v_name.elementAt(k);
//为防止下次抽的时候再抽到相同的号码,所以把它们从向量中移除掉
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);
break;//跳出循环
}
}
l_identNumber.setText("三等奖");b_start.setText("继续");
//这是要输出到文本文件的信息awardmessage="三等奖"+t_identNumber.getText()+str_name+"\r\n";
//将要打印的文本信息先存放到一个可变向量中v_printident.addElement(awardmessage);//系统提示说要使用泛型,本人不会用,以后再研究
intserial1=chooseTime-4;
message="第"+serial1+"位三等奖得主为:
"+str_name;
JOptionPane.showMessageDialog(this,message);
break;
case8:
case9:
for(intk=0;k{
if
(t_identNumber.getText().equals(v_identNumber.elementAt(k)))
{
v_name.elementAt(k);
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);
break;
}
}
l_identNumber.setText("二等奖");b_start.setText("继续");
awardmessage="二等奖"t_identNumber.getText()+str_name+"\r\n";
v_printident.addElement(awardmessage);
intserial=chooseTime-7;//第几位得主,排名序
号
message="第"+serial+"位二等奖得主为"+str_name;
JOptionPane.showMessageDialog(ChooseAward.this,message);
break;
case10:
for(intk=0;kif(t_identNumber.getText().equals(v_identNumber.elementAt(k)))
{str_name=(String)v_name.elementAt(k);
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);break;
}
}
l_identNumber.setText("一等奖");awardmessage="一等奖"t_identNumber.getText()+str_name+"\r\n";
v_printident.addElement(awardmessage);
/*
*第几位得主,排名序号,其实没必要这样写,因
为本来就这一名
*现在这样写的作用是为我以后改进这个程序(可
以自主选择产生几名得奖主)
的时候做好准备
*/
//serial=chooseTime-5;
//message="第"+serial+"位二等奖得主为:
"+str_name;
message="一等奖得主为:
"+str_name;
JOptionPane.showMessageDialog(ChooseAward.this,message);
break;
case11:
for(intk=0;kk++)
{
if(t_identNumber.getText().equals(v_identNumber.elementAt(k)))
{str_name=(String)v_name.elementAt(k);
v_identNumber.removeElementAt(k);
v_name.removeElementAt(k);
break;
}}l_identNumber.setText("特等奖");awardmessage="特等奖"+t_identNumber.getText()+str_name+"\r\n";
v_printident.addElement(awardmessage);message="特