足球联赛管理系统.docx
《足球联赛管理系统.docx》由会员分享,可在线阅读,更多相关《足球联赛管理系统.docx(31页珍藏版)》请在冰豆网上搜索。
![足球联赛管理系统.docx](https://file1.bdocx.com/fileroot1/2022-11/24/76a10f8f-895e-4696-a565-31dfaced8d5a/76a10f8f-895e-4696-a565-31dfaced8d5a1.gif)
足球联赛管理系统
************************
实践教学
************************
兰州理工大学
计算机与通信学院
2010年春季学期
面向对象课程设计
题目:
足球联赛积分管理系统
专业班级:
信息与计算科学06班
姓名:
摆富有
学号:
********
*******
成绩:
前言
在面对对象方法中,对象和传递消息分别表现事物及事物间相互联系的概念。
类和继承是是适应人们一般思维方式的描述范式。
方法是允许作用于该类对象上的各种操作。
这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和类的继承性。
通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性,从而构成了面向对象的基本特征。
面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。
对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象。
而每继承性是对具有层次关系的类的属性和操作进行共享的一种方式。
所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
l决定你要的类;
2给每个类提供完整的一组操作;
3明确地使用继承来表现共同点。
由这个定义,我们可以看出:
面向对象设计就是“根据需求决定所需的类、类的操作以及类之间关联的过程。
本次面向对象设计采用JAVA实现足球积分管理系统的实现。
摘要
足球联赛采用主客场双循环赛制,胜一场得3分,平局各得1分,负一场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次(这在联赛结束后进行,联赛未结束则两队名次并列,本程序不做这方面要求)。
该设计以足球联赛为背景,设计足球联赛积分管理系统程序。
通过对该题目的具体设计分析,可以对面向对象程序设计的思想更加深入理解,可以达到熟练掌握Java语言的基本知识和技能,基本掌握面向对象程序设计的基本思路和方法,能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
同时对程序设计风格有全面的强调,提高解决实际问题的能力。
并且通过与数据库的连接,深化对数据库编程的理解和运用。
关键词:
双循环赛制;面向对象;java;数据库编程;数据库
一、概述
1.项目名称:
足球联赛积分管理系统
2.项目介绍:
该项目用于对一个年度的足球联赛的各种信息进行管理,通过制作的专门界面,可以对球队、球员、比赛情况、各种统计信息进行管理。
3.项目背景:
结合java面向对象程序设计和数据库编程中介绍的内容和以往所学的专业知识,开发一个足球联赛积分管理系统。
4.项目目的:
掌握数面向对象程序设计原理以及sqlsever2008的基本操作,知道并且熟练掌握java语言中的基本方法和基本内容的运用,并能熟练使用结构化查询语言SQL语句,能在一个或多个数据库管理系统进行开发和管理,并结合面向对象程序开发语言JAVA进行项目的开发。
5.开发环境:
面向对象程序开发语言采用JAVA,数据库管理系统采用SQLSEVER2008,集成开发环境使用myeclipse8.5。
二、需求分析
问题分析是程序设计的第一步,其目的是理解题目的要求,明确程序的运行环境和方式,以及相关的限制条件。
问题分析的基本内容包括确定程序的功能和性能、程序的输入输出数据的来源、去向、内容、范围及其格式,程序的使用者、调用方式、人机交互要求,与其他程序的关系和交互方式,对通用性的要求和扩展的可能,以及性能和其他对程序的特殊要求和限制,如程序所占用系统资源的数量、对输入命令的响应速度等。
在使用面向对象方法设计足球联赛积分管理系统时,除了对于具体问题具体分析之外,我们还应该理解系统主要元素之间的关系,所以,简要列举我们以下几点:
1、系统需求说明
a、要求利用面向对象的方法以及Java的编程思想来完成系统的设计;
b、要求在设计的过程中,建立清晰的类层次;
c、在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;
d、在系统的设计中,要求运用面向对象的机制(继承、派生及多态性)来实现系统功能。
足球联赛积分管理系统是一个以足球联赛为背景,设计足球联赛积分管理系统程序。
采用主客场双循环赛制,胜一场得3分,平局各得1分,负一场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次。
2、系统资源说明
面向对象程序开发语言采用JAVA,数据库管理系统采用SQLSEVER2008,集成开发环境使用myeclipse8.5。
3、系统可行性分析
该管理系统是以自主设计为主,通过对该系统的具体设计分析,可以对面向对象程序设计的思想更加深入理解,可以达到熟练掌握Java语言的基本知识和技能,基本掌握面向对象程序设计的基本思路和方法,能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
同时对程序设计风格有全面的强调,提高解决实际问题的能力。
并且通过与数据库的连接,深化对数据库编程的理解和运用。
三、总体设计
在对该系统有初步的规划之后,我们应该着手处理如何初步规划该系统的各主要模块以及基本的方法,前面已经提到,我们使用面向对象程序设计的思路,而且运用数据库编程的理论,所以我们应该按照具体的思路来设计相应的应用,以下简要概述该系统的具体设计:
1.球队的管理:
包括球队信息的添加、删除、修改和查询;
2.球员的管理:
包括球员信息的添加、删除、修改和查询;
3.比赛过程的管理:
包括一场比赛的基本信息的录入,如参赛双方的球队名称、比赛日期、比赛结果、进球情况等;
4.积分榜查询:
按照联赛的积分规则查询各个球队的名次;
5.射手榜查询:
按照进球多少查询进球队员的名次。
四、详细设计
针对系统的局部构思,可以设计该系统的功能模块如下所示
•项目设计
•数据库概念结构设计;
•数据库逻辑结构设计;
•数据库物理结构设计;
4.1项目设计
项目设计部分主要包括以下两部分:
1.系统模块设计
2.界面设计
4.1.1系统模块设计
图1系统模块设计
4.1.2界面设计
图2界面设计
4.2数据库概念结构设计
图20数据库概念结构设计
4.3数据库逻辑模型结构设计
4.3.1逻辑模型设计——球队表(Team)
字段名
数据类型
宽度
主码
非空
外码
描述
NAME
VARCHAR
20
是
是
否
球队名称
HOME
VARCHAR
30
否
否
否
球队主场
COACH
VARCHAR
20
否
否
否
主教练
表1球队表
4.3.2逻辑模型设计——球员表(Member)
表2球员表
4.3.3逻辑模型设计——比赛进程表(Course)
表3比赛进程表
4.3.4逻辑模型设计——进球表(Goal)
表4进球表
4.3.5逻辑模型设计——积分榜(Score)
字段名
数据类型
宽度
主码
非空
外码
描述
PLACE
INT
否
是
否
名次
NAME
VARCHAR
20
是
是
否
球队名称
TURN
INT
否
是
否
轮次
WON
INT
否
是
否
胜利场次
EVEN
INT
否
是
否
平局场次
BEATEN
INT
否
是
否
失败场次
GOAL
INT
否
是
否
总进球数
LOST
INT
否
是
否
总失球数
NET
INT
否
是
否
净剩球数
POINT
INT
否
是
否
积分
表5积分榜
4.3.6逻辑模型设计——射手榜(GoalScore)
字段名
数据类型
宽度
主码
非空
外码
描述
PLACE
INT
否
是
否
名次
NAME
VARCHAR
20
否
是
否
球员姓名
TEAMNAME
VARCHAR
20
是
是
是
球队名称,参照Team表的NAME字段
NUMBER
INT
是
是
是
球员球衣号码
GOALS
INT
否
是
否
进球数
表6射手榜
4.4物理结构模型设计
在这里主要介绍如何连接数据库的方法和创建触发器的部分功能。
由于方法比较多,现在采用jdbc驱动方式连接。
4.4.1用jdbc驱动方式:
1>.到微软官网上下载jdbc驱动包sqljdbc_3.0,解压后复制文件sqljdbc_3.0\enu\auth\x86\sqljdbc_auth.dll到C:
\Windows\System32,并将解压文件中的sqljdbc4.jar的路径添加系统环境变量的CLASSPATH里。
2>.设置并打开sqlserver的TCP/IP端口:
打开SQLServer配置管理器->SQLServer网络配置,MSSQLSERVER的协议,TCP/IP设为启用,并右击选择属性,将IP地址端口设为1433.SQLServer配置管理器->
SQLNativeClient10.0配置->客户端协议->右击TCP/IP协议->默认端口1433.
3>.在MyEclipse创建项目并为项目添加sqljdbc4.jar驱动包。
1.用windows验证方式连接数据库:
加载数据库驱动程序Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
连接数据库
Stringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=test1;integratedSecurity=TRUE;";
conn=DriverManager.getConnection(url);
完整代码:
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
publicclassTest{
publicstaticvoidmain(String[]args)
{
Connectionconn;
Statementstmt;
ResultSetrs;
try{
//加载数据库驱动程序,对于jdbc4版本可以不用写这段代码Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(ClassNotFoundExceptionex){
System.out.println("数据库驱动加载失败");
}
Stringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=test1;integratedSecurity=TRUE;";
Stringsql="select*fromexa";
try{
//连接数据库
conn=DriverManager.getConnection(url);
//建立Statement对象
stmt=conn.createStatement();
//执行数据库查询语句
rs=stmt.executeQuery(sql);
while(rs.next())
{
intid=rs.getInt("id");
Stringname=rs.getString("name");
intage=rs.getInt("age");
System.out.println("id:
"+id+"\tname:
"+name+"\tage:
"+age);
}
if(rs!
=null){rs.close();rs=null;}
if(stmt!
=null){stmt.close();stmt=null;}
if(conn!
=null){conn.close();conn=null;}
}
catch(SQLExceptione)
{
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
2.用sqlserver身份验证方式连接数据库:
加载数据库驱动程序Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
连接数据库
Stringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=test1;";
conn=DriverManager.getConnection(url,"sa","123456");
完整代码:
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
publicclassTest{
publicstaticvoidmain(String[]args)
{
Connectionconn;
Statementstmt;
ResultSetrs;
try{
//加载数据库驱动程序,对于jdbc4版本可以不用写这段代码Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(ClassNotFoundExceptionex){
System.out.println("数据库驱动加载失败");
}
Stringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=test1;";
Stringsql="select*fromexa";
try{
//连接数据库
conn=DriverManager.getConnection(url,"sa","123456");
//建立Statement对象
stmt=conn.createStatement();
//执行数据库查询语句
rs=stmt.executeQuery(sql);
while(rs.next())
{
intid=rs.getInt("id");
Stringname=rs.getString("name");
intage=rs.getInt("age");
System.out.println("id:
"+id+"\tname:
"+name+"\tage:
"+age);
}
if(rs!
=null){rs.close();rs=null;}
if(stmt!
=null){stmt.close();stmt=null;}
if(conn!
=null){conn.close();conn=null;}
}
catch(SQLExceptione)
{
e.printStackTrace();
System.out.println("数据库连接失败");
}
}
}
4.4.2创建触发器
触发器是一种数据库对象,它可以自动执行,当用户的操作影响到触发器保护的数据时,触发器就会被触发自动执行所定义的SQL语句,激活触发器的动作称为触发器激活条件,触发器活动后所做的操作称为触发器动作。
在触发器工作时,SQLServer2008会自动创建和管理两种特殊的表:
deleted
表和inserted表。
●创建触发器
-当添加一支新球队时,要把这支球队的名称一并插入到积分榜中,这样能够保证球队表与积分榜中的球队保持一致,在对积分榜进行统计时,不会遗漏球队;
-当删除一支球队时,要在积分榜、比赛过程、球员表、射手榜等表中先把包含这支球队的所有记录都删除,否则会因为外码参照联系导致删除球队失败;
-当修改球队时,要把积分榜、比赛过程、球员表、射手榜等表中与这支球队相关的所有记录都先做修改,否则也会因为外码参照联系导致修改球队失败;
-插入一场比赛详细信息时,将积分榜中的数据一起进行修改,并重新统计积分榜名次;
-插入进球信息时,将射手榜中的数据一起进行调整,并重新统计射手榜名次。
五、编码
1.主菜单界面代码:
packagecommon;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JButton;
importcalculate.CalculateFrame;
importmatchManage.MatchFrame;
importmemberManage.MemberFrame;
importteamManage.TeamFrame;
publicclassMainFrameextendscommon.CenterDialog{
JDBCAdapterjdbc;
privateJButtonteamBtn;
privateJButtonquitBtn;
privateJButtoncalBtn;
privateJButtonmatchBtn;
privateJButtonmemberBtn;
TeamFrametf;
MemberFramemf;
MatchFrameaf;
CalculateFramecf;
publicMainFrame(JDBCAdapterjdbc){
this.jdbc=jdbc;
initGUI();
}
privatevoidinitGUI(){
try{
{
this.setTitle("\u8DB3\u7403\u8054\u8D5B\u79EF"+
"\u5206\u7BA1\u7406\u7CFB\u7EDF");
/*足球联赛积分管理系统
*其中用十六进制进行,也可以直接用汉字进行编排性质一样,都是用的是unicode编码
*下面的编码方式都一样
*/
getContentPane().setLayout(null);
}
{
teamBtn=newJButton();
getContentPane().add(teamBtn);
teamBtn.setText("\u7403\u961f\u7ba1\u7406");//球队管理
teamBtn.setBounds(51,49,101,37);
teamBtn.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
tf=newTeamFrame(jdbc);
tf.setVisible(true);
}
});
}
{
memberBtn=newJButton();
getContentPane().add(memberBtn);
memberBtn.setText("\u7403\u5458\u7ba1\u7406");//球员管理
memberBtn.setBounds(221,51,104,35);
memberBtn.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
mf=newMemberFrame(jdbc);
mf.setVisible(true);
}
});
}
{
matchBtn=newJButton();
getContentPane().add(matchBtn);
matchBtn.setText("\u6bd4\u8d5b\u7ba1\u7406");//比赛管理
matchBtn.setBounds(51,135,91,35);
matchBtn.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
af=newMatchFrame(jdbc);
af.setVisible(true);
}
});
}
{
calBtn=newJButton();
getContentPane().add(calBtn);
calBtn.setText("\u7edf\u8ba1\u4fe1\u606f");//统计信息
calBtn.setBounds(226,137,99,32);
calBtn.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevt){
cf=newCalculateFrame(jdbc);
cf.setVisible(true);
}
});
}
{
quitBtn=newJButto