一、课程设计的内容
背景简介:
学生成绩的手工录入及查询,是一项非常繁重而枯燥的劳动,耗费许多人力和物力,而且会因人的情绪烦躁而出现失误,因此在计算机飞速发展的今天,应用数据库技术实现学生成绩的计算机管理是可行而必要的工作。本系统旨在对学生成绩实现计算机管理,提高工作效率,提高管理水平。
系统目标:
建立学生成绩管理系统,采用计算机对学生成绩进行管理,进一步提高办学效益和现代化水平。
基本需求:
成绩管理系统是一个专门为成绩管理而设计的系统。
管理员对成绩管理系统有如下需求:
1)原始数据录入(包括学生信息、课程信息、和学生成绩的录入)。
2)课程查询、学生信息和成绩查询。
3)报表输出。主要包括学生成绩汇总表、需重修的学生统计报表、班级成绩报表等。
二、课程设计的要求与数据
需求分析:
(1)功能划分:用户通过身份验证后进入主界面。主界面为用户提供3项选择,学生信息管理,课程信息管理,成绩信息管理。
(2)功能描述:
- 学生信息管理:
可以进行对新、老生信息(包括学号、姓名、性别、籍贯等)的输入、修改、删除等工作。可以按照特定的信息进行查找,并按照特定的要求进行排序。
- 课程信息管理:
可以加入、修改、删除课程信息(包括课程编号、课程名称、学时、学分、先修课等)。可以按照特定的信息进行查找,并按照特定的要求进行排序。
- 成绩信息管理:
可以录入、修改、删除成绩信息。
成绩的查询,可以按学号、姓名等进行成绩查询。
成绩的综合统计功能,包括学生成绩按照不同条件进行排名,管理人员可以选择不同的排序条件,并可以将排序结果进行打印输出。
计算每个学生的平均成绩,所有学生单科的平均成绩,找出平均成绩最高的学生并输出。
计算各班的平均分,并按照平均分将各班成绩进行排序。
统计不及格考生的信息。
学生奖励统计,自动生成每班获得奖学金的同学的信息。
(3)
数据字典:
|
数据项名称 |
学号 |
|
别名 |
|
|
编号 |
E0 |
|
含义说明 |
每个学号必须是唯一编号 |
|
类型 |
Char |
|
长度 |
10B |
|
取值范围及含义 |
|
|
相关元素 |
学生 |
|
数据项名称 |
姓名 |
|
别名 |
|
|
编号 |
E1 |
|
含义说明 |
学生姓名 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
学生 |
|
数据项名称 |
性别 |
|
别名 |
|
|
编号 |
E2 |
|
含义说明 |
学生性别 |
|
类型 |
Char |
|
长度 |
1B |
|
取值范围及含义 |
0代表女,1代表男 |
|
相关元素 |
学生 |
|
数据项名称 |
籍贯 |
|
别名 |
|
|
编号 |
E3 |
|
含义说明 |
学生籍贯 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
学生 |
|
数据项名称 |
专业 |
|
别名 |
|
|
编号 |
E4 |
|
含义说明 |
学生专业 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
学生 |
|
数据项名称 |
班级 |
|
别名 |
|
|
编号 |
E5 |
|
含义说明 |
学生班级 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
学生 |
|
数据项名称 |
院系 |
|
别名 |
|
|
编号 |
E6 |
|
含义说明 |
学生院系 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
学生 |
|
数据项名称 |
课程编号 |
|
别名 |
|
|
编号 |
E7 |
|
含义说明 |
每个课程编号必须是唯一编号 |
|
类型 |
Char |
|
长度 |
10B |
|
取值范围及含义 |
|
|
相关元素 |
课程 |
|
数据项名称 |
课程名称 |
|
别名 |
|
|
编号 |
E8 |
|
含义说明 |
课程名称 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
课程 |
|
数据项名称 |
学时 |
|
别名 |
|
|
编号 |
E9 |
|
含义说明 |
课程学时 |
|
类型 |
Decimal |
|
长度 |
4,1 |
|
取值范围及含义 |
|
|
相关元素 |
课程 |
|
数据项名称 |
学分 |
|
别名 |
|
|
编号 |
E10 |
|
含义说明 |
课程学分 |
|
类型 |
Decimal |
|
长度 |
2,1 |
|
取值范围及含义 |
|
|
相关元素 |
课程 |
|
数据项名称 |
先修课 |
|
别名 |
|
|
编号 |
E11 |
|
含义说明 |
课程先修课的名称 |
|
类型 |
Varchar |
|
长度 |
50B |
|
取值范围及含义 |
可变长字符串,50字节以内 |
|
相关元素 |
课程 |
|
数据项名称 |
分数 |
|
别名 |
|
|
编号 |
E12 |
|
含义说明 |
学生的一门课程的成绩分数 |
|
类型 |
Decimal |
|
长度 |
4,1 |
|
取值范围及含义 |
范围是0~100,有一位小数 |
|
相关元素 |
学生,课程 |
|
数据结构名称 |
学生 |
|
别名 |
|
|
编号 |
S1 |
|
含义说明 |
|
|
组成 |
学号+姓名+性别+籍贯+专业+班级+院系 |
|
相关元素 |
学号,姓名,性别,籍贯,专业,班级,院系 |
|
数据结构名称 |
课程 |
|
别名 |
|
|
编号 |
S2 |
|
含义说明 |
|
|
组成 |
课程编号+课程名称+学时+学分+先修课 |
|
相关元素 |
课程编号,课程名称,学时,学分,先修课 |
|
数据结构名称 |
成绩 |
|
别名 |
|
|
编号 |
S3 |
|
含义说明 |
|
|
组成 |
学号+课程编号+分数 |
|
相关元素 |
学号,课程编号,分数 |
|
数据流名称 |
成绩 |
|
别名 |
|
|
编号 |
D1 |
|
说明 |
查询成绩时产生 |
|
数据流来源 |
|
|
数据流去向 |
|
|
组成 |
姓名+学号+课程名称+课程编号+成绩 |
|
相关元素 |
|
|
数据流名称 |
学生基本信息 |
|
别名 |
|
|
编号 |
D2 |
|
说明 |
录入,修改学生资料或查询成绩时产生 |
|
数据流来源 |
|
|
数据流去向 |
|
|
组成 |
学号+姓名+性别+籍贯+专业+班级+院系 |
|
相关元素 |
学号,姓名,性别,籍贯,专业,班级,院系 |
|
数据流名称 |
课程基本信息 |
|
别名 |
|
|
编号 |
D3 |
|
说明 |
录入,修改课程资料或查询成绩时产生 |
|
数据流来源 |
|
|
数据流去向 |
|
|
组成 |
课程编号+课程名称+学时+学分+先修课 |
|
相关元素 |
课程编号,课程名称,学时,学分,先修课 |
|
数据存储名称 |
学生信息 |
|
别名 |
|
|
编号 |
F1 |
|
说明 |
储存学生信息 |
|
输入数据流 |
学生基本信息 |
|
输出数据流 |
学生基本信息,成绩 |
|
组成 |
学号+姓名+性别+籍贯+专业+班级+院系 |
|
数据量 |
|
|
存取方式 |
|
|
相关元素 |
学号,姓名,性别,籍贯,专业,班级,院系 |
|
数据存储名称 |
课程信息 |
|
别名 |
|
|
编号 |
F2 |
|
说明 |
储存课程信息 |
|
输入数据流 |
课程基本信息 |
|
输出数据流 |
课程基本信息,成绩 |
|
组成 |
课程编号+课程名称+学时+学分+先修课 |
|
数据量 |
|
|
存取方式 |
|
|
相关元素 |
课程编号,课程名称,学时,学分,先修课 |
|
处理逻辑名称 |
生成学生成绩 |
|
别名 |
|
|
编号 |
L1 |
|
说明 |
|
|
输入数据流 |
学生基本信息 |
|
输出数据流 |
成绩 |
|
处理逻辑 |
|
|
相关元素 |
|
(4)E-R图

关系模型为:
学生(学号,姓名,性别,籍贯,专业,班级,院系)
课程(课程编号,课程名称,学时,学分,先修课)
成绩(学号,课程编号,分数)
主要代码:
连接数据库类
public class DBConn {
public static Connection conn;
static{
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn= DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=ResultsMS;","NT
SERVICE","NEVERGIVEUP");
System.out.println("Connection Succeeded");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return conn;
}
}
创建界面窗口类(节选其中一个简单的窗口,这里选择主界面)
public M1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 783, 484);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
JButton btnNewButton = new JButton("学生信息管理");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
}
});
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
S1.frames1.setVisible(true);
frame1.setVisible(false);
}
});
JButton btnNewButton_1 = new JButton("课程信息管理");
btnNewButton_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
C1.framec1.setVisible(true);
frame1.setVisible(false);
}
});
JButton btnNewButton_2 = new JButton("成绩信息管理");
btnNewButton_2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
M2.frame2.setVisible(true);
frame1.setVisible(false);
}
});
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(150)
.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)
.addComponent(btnNewButton_2, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
.addComponent(btnNewButton_1, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE)
.addComponent(btnNewButton, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE))
.addGap(150))
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(65)
.addComponent(btnNewButton, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
.addGap(80)
.addComponent(btnNewButton_1, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
.addGap(80)
.addComponent(btnNewButton_2, GroupLayout.PREFERRED_SIZE, 50, GroupLayout.PREFERRED_SIZE)
.addContainerGap(50, Short.MAX_VALUE))
);
contentPane.setLayout(gl_contentPane);
}
查询,更新等操作的实现方法(节选)
获取查询信息的按钮实现
JButton button = new JButton("查询");
button.setToolTipText("在左侧文本框中输入需要查询的数据项,点击查询");
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
DefaultTableModel model=new DefaultTableModel(columns,0);
table.setModel(model);
TableColumnModel columnModel=table.getColumnModel();
s1.set_student_num(textField.getText());
s1.set_student_name(textField_1.getText());
s1.set_sex(textField_2.getText());
s1.set_hometown(textField_3.getText());
s1.set_major(textField_4.getText());
s1.set_class_(textField_5.getText());
s1.set_department(textField_6.getText());
ResultSet rs = sql.search_stu(s1);
while (rs.next()) {
String s1=rs.getString("student_num");
String s2=rs.getString("student_name");
String s3=rs.getString("sex");
String s4=rs.getString("hometown");
String s5=rs.getString("major");
String s6=rs.getString("class");
String s7=rs.getString("department");
String[] ss=new String[]{s1,s2,s3,s4,s5,s6,s7};
model.addRow(ss);
}
succeedJframe.succeedJframe.setVisible(true);
}catch (SQLException throwable) {
throwable.printStackTrace();
}
}
});
获取查询条件并返回结果集
public ResultSet search_stu(Element_Stu s) {
try {
Connection conn=DBConn.getConnection();
String sql ="SELECT * FROM student WHERE student_num LIKE '%"+s.get_student_num()
+"%' AND student_name LIKE '%"+s.get_student_name()
+"%' AND sex LIKE '%"+s.get_sex()
+"%' AND hometown LIKE '%"+s.get_hometown()
+"%' AND major LIKE '%"+s.get_major()
+"%' AND class LIKE '%"+s.get_class_()
+"%' AND department LIKE '%"+s.get_department()+"%'";
PreparedStatement ptmt = conn.prepareStatement(sql);
ResultSet rst=ptmt.executeQuery();
return rst;
} catch (SQLException throwable) {
throwable.printStackTrace();
return null;
}
}
完整代码下载:链接:https://pan.baidu.com/s/1Y-q8UIFEgv6T-eJeHTeFYw
提取码:i0p7
浙公网安备 33010602011771号