资源描述
[在此处键入]
《Java语言程序设计》课程设计
课设题目:
基于数据库实现的选手比赛评分系统
院 系:
计算机科学与技术学院
专 业:
物联网工程
学生姓名:
程念
学号:
20123921036
学生姓名:
张松青
学号:
20123921035
学生姓名:
施毅
学号:
20123921037
指导教师:
段善荣
2014 年 12 月
目录
1统概述 2
1.1背景与意义 2
1.2任务要求 2
2求分析 3
2.1程序功能 3
2.2系统主要功能图 5
2.3系统总流程图 5
3功能模块概述 6
3.1选择评委界面模块的概述 6
3.2显示最后结果功能描述: 7
3.3 数据库部分 7
3.3.l脚本语言 8
3.3.2 数据库连接部分 9
4类的设计 9
4.1主函数类的设计 9
4.2 主界面类设计 10
4.2.1 ScoreBoard类 10
4.2.2 ShowData类 14
4.3 从数据库读入数据的类的设计 16
4.4 评分统计类设计 17
5系统难点及实现 18
6.实验设计总结 18
附录 19
题目六:基于数据库实现的选手比赛计分系统
1统概述
1.1背景与意义
计分系统是比赛最基本的技术支持系统,担负着所有比赛成绩的采集和基本信息处理。它作为采集、处理、显示比赛成绩及赛事中计分的系统,对赛事的顺利进行至关重要。它主要分为数据采集部分、数据处理部分部分和显示部分,其中数据采集部分主要为采集裁判给出的选手成绩;数据处理部分通过计算机软件将比赛成绩进行统计、平均、存储;显示部分显示选手的得分信息。因此,要求能够快速、准确地进行数据处理。
1.2任务要求
对参赛结果分数进行处理:参赛选手n人(n>1),评委m人(m>2),评委给每一选手打一个分数score(分数score为小于等于10的一个正实数)。选手的最后得分lastScore计算方法为
(1)m<9时,去掉一个最高分和一个最低分后另m-2个得分的平均值。
(2)m≥9时,去掉两个最高分和两个最低分后另m-4个得分的平均值。
请设计比赛分数图形化界面,实现录入信息到数据库的功能,输入n个选手的编号(一个正整数)、姓名(一个字符串)以及m个评委给出的得分。
请编制程序,同时构建一个应用程序,显示选手的原始成绩以及最后成绩,原始成绩依次从数据库读入n个选手的有关信息,而后按上述规定方法计算出每一个选手的最后得分,而且存放到数据库中,并在屏幕上用表格方式输出每位选手的得分以及最后得分。
假设参赛选手人数n=5,评委人数m=7,录入的数据为:
1 zhangjin 8.8 9.3 7.9 8.7 8.9 9.7 9.2
2 lintao 8.9 8.2 8.6 8.8 8.5 9.1 9.3
3 guojian 8.9 8.4 8.7 8.6 8.6 8.4 8.6
4 maling 7.9 8.3 8.5 8.6 8.5 8.9 8.3
5 liuyifan 9.5 9.1 9.8 9.2 9.0 9.5 8.9
那么,程序执行后,屏幕显示为:
参赛号
姓 名
最高分
最低分
累积分
最后得分
1
zhangjin
9.7
7.9
44.9
8.98
2
lintao
9.3
8.4
42.9
8.58
3
guojian
8.9
8.4
42.2
8.44
4
maling
8.9
8.9
46.3
9.26
5
liuyifan
9.8
8.8
45.8
9.1
思考:可进一步考虑找出比赛的第1至第k名,也在屏幕同时输出相关的结果信息(k小于等于n,并规定若多个选手最后得分相同时,则有效分(即已删除原来的最高分后)中最高分高者名次优先)
2求分析
2.1程序功能
根据设计任务要求可以得出所涉及程序必须具有以下功能:
1.显示选手编号,计算选手得分;
2.根据选手的最后得分排序(本程序按照分数由高到低排列);
3.在输入评委人数后(如图2.1),能够按题目的要求来自动选择最后得分的计算方法,进入选手计分系统(如图2.2)。
图2.1 选择评委
4.系统主界面:
图2.2 选手计分系统
2.2系统主要功能图
1. 我们做的系统主要就是三个按钮的功能实现,因为评委人数是不定的,所以我们需要随时做出调整,所以在我们第一次输入评委人数是已经确定了评委人数,但是我们有需要修改,所以我们就有修改评委人数这一按钮。
2. 我们在确定评委人人数以后就要对我们所选取的评委所给的分数对每个选手的分数进行计算。排出名次,以便我们更方面的看出选手得比赛结果,所以显示最后成绩的按钮功能为:根据你所确定的评委打出的分数计算出所有选手的最高分、最低分、总分,最后得分,排名。
3. 我们需要把我们更新后的数据进行保存
2.3系统总流程图
流程图就是我们按照我们的想法一步步的实现我们所需要的功能的描述,能够清晰、快速的制动我们应该干什么,怎么做?比赛评分系统的流程图开始的时候我们需要确定我们的评委人数,在系统中输入评委人数,在输入时,我们需要判定评委人数输入是否合法,符合我们所设定的要求,热然后根据评委人数从文件中读取评委成绩。然后就是各个按钮的功能实现流程图的实现,在后面有具体描述。如图2.5所示:
开始
请输入参赛人数
输入评委人数
单击“统计结果”
单击“关闭”
单击“重新开始”
保存到数据库并关闭窗口
显示选手的最后结果
显示选择评委的界面
结束
图2.5 系统流程图
3功能模块概述
3.1选择评委界面模块的概述
这个界面我们用到了就是用来生成主界面的“选择评委EnterFrame”主类,它继承了JFrame,其中包括了程序运行的主方法段,主要是取得评委人数的具体值,然后进行参数传递到下个界面进行计算。
3.2显示最后结果功能描述:
这个功能模块主要是用于对选手最终成绩的评判进行实现的过程。我们接收到的数据存入到数据库,然后将计算结果显示到屏幕表格。
3.3 数据库部分
本系统使用MySQL数据库,首先在MySQL中建库建表,建立数据库score,dbUser="root",dbPassword="123456",并且在score数据库中建立三张表,result_data表存贮评委打分信息,即选手id,最高分(max),最低分(min),平均分(avg),总分和(sum。core表存储参赛选手最终得分。user表存储参赛选手信息,
结果如下图3.3:
图3.3
3.3.l MySQL脚本语言
if exists (select name from sysobjects where name='result_data')
drop table result_data
CREATE TABLE result_data (
id char(18) NOT NULL,
user_id char(18) DEFAULT NULL,
max char(5) DEFAULT NULL,
min char(5) DEFAULT NULL,
sum char(5) DEFAULT NULL,
avg char(5) DEFAULT NULL,
PRIMARY KEY (id)
)
if exists (select name from sysobjects where name='score')
drop table score
CREATE TABLE score (
id char(18) NOT NULL,
user_id char(18) NOT NULL,
score char(5) DEFAULT NULL,
PRIMARY KEY (id)
)
-- ----------------------------
if exists (select name from sysobjects where name='play')
drop table play
CREATE TABLE play (
id char(18) NOT NULL,
number char(18) DEFAULT NULL,
name varchar(30) DEFAULT NULL,
PRIMARY KEY (id)
)
3.3.2 数据库连接部分
package com.score.db;
import java.sql.*;
public class DBHelper {
private String dbUrl="jdbc:mysql://localhost:3306/score";
private String dbUser="root";
private String dbPassword="123456";
private String jdbcName="com.mysql.jdbc.Driver";
//获取数据库连接
public Connection getConn(){
Connection conn = null;
try{
Class.forName(jdbcName);
}
catch(Exception e){}
try{
conn=DriverManager.getConnection(dbUrl,dbUser,dbPassword);
}
catch(SQLException ex){}
return conn;
}
}
4类的设计
4.1主函数类的设计
这里设计了一个类。
表4.1 主函数类
类名
功能
EnterFrame
存放主函数
在选择评委界面我们定义了一个EnterFrame主类,然后来存放主函数,显示主界面。
public static void main(String[] args) {
new EnterFrame();
}
4.2 主界面类设计
这里设计了2个类。
表4.2主界面类
类名
功能
ScoreBoard
显示主界面
ShowData
显示统计结果
4.2.1 ScoreBoard类
创建ScoreBoard类属性
package com.score.ui;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.score.dao.ResultDataDao;
import com.score.dao.ScoreDao;
import com.score.dao.UserDao;
import com.score.model.ResultData;
import com.score.model.Score;
import com.score.model.User;
import com.score.tools.DataUtil;
public class ScoreBoard extends JFrame implements ActionListener {
JPanel jp1,jp2,jp2_1,jp2_2,jp3;
JLabel jp1_jlb1,jp2_jlb1,jp2_lib2,tiltes[];
JTextField jp2_jtf1,jp2_jtf2,scores[][];
JButton jb1;
private int n,m;
//n个选手,m个评委
public ScoreBoard(int n,int m){
this.n=n;
this.m=m;
jp1_jlb1=new JLabel("计分界面",JLabel.CENTER);
jp1=new JPanel();
jp1.add(jp1_jlb1);
jp2_2=new JPanel(new BorderLayout());
jp2_1=new JPanel(new GridLayout(1,m+2,20,20));
jp2=new JPanel(new GridLayout(n,m+2,20,20));
jp2_jlb1=new JLabel("参赛人编号:",JLabel.CENTER);
jp2_lib2=new JLabel("参赛人姓名:",JLabel.CENTER);
jp2_1.add(jp2_jlb1);
jp2_1.add(jp2_lib2);
tiltes=new JLabel[m];
for(int i=0;i<m;i++)
{
tiltes[i]=new JLabel("评委"+(i+1),JLabel.CENTER);
jp2_1.add(tiltes[i]);
}
scores=new JTextField[n][(m+2)];
for(int i=0;i<n;i++)
{
for(int j=0;j<m+2;j++)
{
scores[i][j]=new JTextField();
jp2.add(scores[i][j]);
}
}
jp2_2.add(jp2_1,"North");
jp2_2.add(jp2,"Center");
jb1=new JButton("统计结果");
jb1.addActionListener(this);
jp3=new JPanel();
jp3.add(jb1);
this.add(jp1,"North");
this.add(jp2_2,"Center");
this.add(jp3,"South");
this.setSize(200*m, 100*n);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb1){
//数据存入数据库,同时处理得分
for(int i=0;i<n;i++)
{
User user=new User();
List<Double> scoreList=new ArrayList<Double>();
int userId=-1;
for(int j=0;j<m+2;j++)
{
if(j==0){
user.setNumber(Integer.parseInt(scores[i][j].getText().trim().toString()));
}else if(j==1){
user.setName(scores[i][j].getText().trim().toString());
userId=new UserDao().AddUser(user);
}else{
Score score=new Score();
score.setUser_id(userId);
scoreList.add(Double.parseDouble(scores[i][j].getText().trim().toString()));
score.setScore(Double.parseDouble(scores[i][j].getText().trim().toString()));
new ScoreDao().AddScore(score);
}
}
Collections.sort(scoreList);
new ResultDataDao().AddResult(DataUtil.calculate(scoreList, userId, m));
this.dispose();
}
}
new ShowData(n);
}
}
4.2.2 ShowData类
创建ShowData类属性
package com.score.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import com.score.dao.CleanDao;
import com.score.dao.ResultDataDao;
import com.score.model.ResultData;
public class ShowData extends JFrame implements ActionListener{
JTable table;
JScrollPane jsp;
JPanel jp1;
JButton jb1,jb2;
String[] columnNames = {"参赛号", "姓名","最高分","最低分","累积分","最后得分","排名"};
public ShowData(int n){
List<ResultData> datas=new ResultDataDao().getDataList();
Object[][] datatable=new Object[n][7];
int i=0;
for(ResultData data:datas){
String[] arr=new String[7];
arr[0]=String.valueOf(data.getNumber());
arr[1]=data.getName();
arr[2]=data.getMaxScore().toString();
arr[3]=data.getMinScore().toString();
arr[4]=data.getSumScore().toString();
arr[5]=data.getAvgScore().toString();
arr[6]=String.valueOf(i+1);
datatable[i]=arr;
i++;
}
table=new JTable(datatable,columnNames);
table.setEnabled(false);
//jsp.add(table);
jsp=new JScrollPane();
jsp.setViewportView(table);
this.add(jsp,"Center");
jp1=new JPanel();
jb1=new JButton("重新开始");
jb2=new JButton("关闭");
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1.add(jb1);
jp1.add(jb2);
this.add(jp1,"South");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb1){
new EnterFrame();
CleanDao.deleteData();
this.dispose();
}else{
//CleanDao.deleteData();
this.dispose();
}
}
}
4.3 从数据库读入数据的类的设计
表4.3数据库读入数据类设计
类名
功能
CleanDao
清除选手信息
ResultDataDao
从result_data表读入数据
ScoreDao
显示选手id和score
UserDao
获取指定ID的实体Bean
4.4 评分统计类设计
表4.4 评分统计类
类名
功能
DataUtil
统计选手最终得分
package com.score.tools;
import java.util.List;
import com.score.model.ResultData;
public class DataUtil {
public static ResultData calculate(List<Double> list,int userId,int m){
ResultData data=new ResultData();
data.setMaxScore(list.get(list.size()-1));
data.setMinScore(list.get(0));
Double sum=0.0,lastScore=0.0;
int count=0;
if(m<9){
count=1;
}else{
count=2;
}
for(int i=count;i<list.size()-count;i++){
sum+=list.get(i);
}
if(m<9){
lastScore=sum/(m-2);//m<9时,去掉一个最高分和一个最低分后另m-2个得分的平均值
}else{
lastScore=sum/(m-4);//m≥9时,去掉两个最高分和两个最低分后另m-4个得分的平均值
}
data.setSumScore(sum);
data.setUserId(userId);
data.setAvgScore(lastScore);
return data;
}
}
5系统难点及实现
1.我们做了两个界面,需要把第一个界面的JTextfiled里输入的数字传递到第二个界面中使用,以判定评委人数,选择算法
解决方法: 把两个java文件放入同一包中。然后再第一个java界面中定义一个成员变量。然后把输入的值出入到成员变量中,在java文件中可以直接访问这一成员变量。
2.按钮的事件处理中.,读取出事成绩和显示最后成绩中需要调用同一方法。,但是在调用的过程中总是出现问题。
3.做这个系统时,我们刚开始的分析是错误的,我们刚开始时分析的时候把读取初始成绩分析为显示成绩的最高分最低分,然后显示最后成绩的时候是出现总分和平均分,所以在做的时候后就会出现问题,,鉴于我们已经做了一部分,所以就把读取初始成绩改为修改评委人数。
4.在此过程中我们遇到的问题是,界面总是新建,以前的没有办法释放掉,然后我们在按钮的事件处理前都先释放原有的界面来实现这一错误。
6.实验设计总结
通过这次的课程设计,我们深深体会到团队合作的重要性,每一部分的完成了,都是经过小组的一起努力实现,同时体会到做设计的艰辛,通过这个小小的系统的设计,深感自己需要学习的东西还很多,要走的路还很长,虽然本设计做的很简陋,但是我们感觉很欣慰,我们小组会再接再厉,共同进步!
附录
组员
任务分配
自评
最后得分
123921036 程念
负责总体程序编写
90
123921035 张松青
负责程序调试
85
123921037 施毅
负责实验报告文档撰写
85
展开阅读全文