洛 阳 理 工 学 院
课 程 设 计 报 告
课程名称 高级语言C#课程设计
设计题目 学生信息管理系统
专 业 计算机科学与技术
班 级 B130506
学 号 B13050624
姓 名 张葵
完成日期 2015.12.31
|
设计题目: 学生信息管理系统 教务员可以输入学生、教师、班级、课程信息,一个班级只属于一个专业,一个学生只属于一个班级。教务员负责输入每个专业、每个班级需要学习哪些课程,指定课程的任课教师。一个教师可以教授多个班的多门课程。 教师可以查看学习该课程的学生名单。课程结束后,教师可以录入课程成绩。 课程分两类,必修课和选修课。学生可以选修课程,每学期几门。学生可以查看自己各门课程的成绩。学生还可以进行评教,给老师打分。 系统管理员可以输入教室信息,并结合班级、课程、教室信息实现自动排课。 指导教师: 张文学 2015 年 12 月 27 日 |
课 程 设 计 评 语 |
成绩: 指导教师:_______________ 2015 年 12 月 31 日 |
第 1 章 需求和可行性分析 3
1.1需求分析 3
1.1.1 功能需求 3
1.1.2性能需求 3
1.2可行性分析 4
1.2.1 技术可行性 4
1.2.2 经济可行性 4
第2章 系统设计概述 5
2.1 整体设计概述 5
2.1.1 设计流程 5
2.1.2 设计思路 6
2.2 功能模块介绍 6
2.2.1 学生信息模块 6
2.2.2 教师模块 7
2.2.3 教务员模块 8
2.2.4管理员登录 9
第3章 数据库的搭建和实现 10
3.1数据库设计概述 10
3.2 E-R图的设计 10
3.3 数据库表的创建 12
3.3.1学生表的创建 12
3.3.2 教师表的创建 13
3.3.3 课程表的创建 13
3.3.4成绩表的创建 14
3.4存储过程的创建 14
3.4.1 分配班级存储过程 14
3.4.2 班级信息的存储过程 15
3.4.3 学生课程的存储过程 15
3.4.4学生成绩存储过程 16
第4章 C#高级语言的实现 17
4.1概述 17
4.2数据库的连接 17
4.3 开始界面的设计 18
4.4系统管理员 18
4.4.1 登录功能和界面 18
4.4.2 管理员显示界面 21
4.5学生功能介绍和实现 26
4.5.1 登录界面和功能实现 26
4.5.2 学生用户界面 27
第5章 结论 29
第6 章 谢辞 30
参考文献 31
学生信息管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要。学校的管理人员可以通过电脑对学生信息进行有效的管理,避免了以往人工管理的复杂和耗时费力的劳动,也大大的能够减少管理人员的工作量,可以有效的节约学校的开支。
作为一个学生的信息管理系统,必须要有管理人员能够进行对学生的信息进
行有效的管理,因此,系统必须预留一个管理员的登录窗口和登录之后所能进行的操作,在学生信息管理系统中,管理员具有最高的权限,可以对学生、老师、班级、专业等等进行添加、删除、修改个查询。除了拥有管理员之外,还应该拥有教务处对学生进行管理,例如:对学生课程,成绩等等具有一定的权限。此外,还应该有老师的一个权限,老师在带完一门课之后可以对学生进行一个成绩录入和平时布置作业的功能。最后是学生自己拥有的功能,学生在考试结束后可以利用系统登录自己的账户对成绩进行查询。
在学生信息管理系统中,要明确各类用户所能拥有的最高权限,如果一旦权限的问题搞错以后,整个系统就会变得没有价值。例如:学生只有对成绩的查询功能,而不能对成绩拥有修改和删除以及插入的功能。老师只能够对学生进行成绩的录入和平时布置作业,而不能删除学生的个人信息等权限。
要设立不同的异常机制,这样不会因为用户的错误的操作而使得系统瞬时奔溃。我们要在代码中设置不同的异常抛出机制,这样就可以使得用户在进行了错误的或者违反规则的操作之后,系统不会出现突然的停止运转。
随着计算机语言和数据服务的不断发展,使得许多的现实问题都可以利用计算机来帮助人类实现轻巧,方便的管理。在教育上,学生是一个庞大的群体,因此技术人员早早就开始想办法解决这个问题,因此,目前对于学生信息的管理各种语言都能够编写出一套完整的、可用的学生信息管理系统。
在这套系统的开发中,采用的是开发语言是C#,软件是Visio Studio2010,C#是微软对问题的解决方案。C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft .NET平台的应用程序,Microsoft .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选--无论是高级的商业对象还是系统级的应用程序。使用简单的C#语言结构,这些组件可以方便的转化为XML 网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。
最重要的是,C#使得C++程序员可以高效的开发程序,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。
数据库采用的是SQL Server2008R2,这个SQL数据库版本是微软公司推出的针对微软用户的一种关系型数据库,语言简单,实用。与Visio Studio 2010结合相对简单实用。
现在随着互联网络、计算机技术的发展,数字城市成为当前热点话题。同时在国家政策给予大力支持的条件下,这些技术热点给社会产生了极大的影响,不仅给生活、学习和管理带来了新的体验,同时也带动了经济的增长。
学生管理系统使用比较简单的C#语言开发,而且目前中国的学校和教育机构众多,许多的地方都需要用到这套学生信息管理系统,因此学生信息管理系统具有广阔的市场前景和发展动力。
这套学生信息管理系统旨在为用户提供更加有效的、方便的和快捷的学生的管理系统。本套系统在结构上由数据库和高级语言两部分组成,数据库部分负责此套系统所要用到的所有的数据库的表的创建和所用到的存储过程的创建。C#部分是具体的设计UI界面和具体的逻辑实现,用户可以通过在自己电脑上点击UI上的控件进行操作。
图 1 整体设计思路图
这套学生信息管理系统是由数据库和业务逻辑层和UI层三部分构成,用户在UI层上进行操作,数据通过业务逻辑层数据传至数据库,对数据库中的数据进行修改,在用户需要用到数据库中的数据时,数据会从数据库中提出经过业务逻辑层上传至UI层,以供用户查阅和进行其他的操作。业务逻辑层主要负责的工作就是将UI传来的数据进行分析,并且做出判断,然后根据判断出的结果进行对数据库的访问。数据库的主要任务就是为系统提供数据的存储。
以下会对本套系统中的主要模块做一个简单的介绍与分析。
学生模块的主要功能是对自己的成绩能够有效的进行查询和能够对教师做出有效的评价在学期末。
每个学生只能够对自己的成绩进行有效的查询,在登录自己的账户之后,其他的同学的成绩是不可见的,这样也是起到了一种隐私的保护作用,而且学生在登录自己的账户之后没有成绩修改和添加以及删除的功能。
图2 学生用户登录
教师在使用该系统时,主要的任务是向学生下达作业任务和在期末考试结束之后给给学生录入成绩,使得学生能够通过自己的账户登录该系统之后能够看到自己的成绩。在录入成绩之后不能对学生的成绩进行修改。
图3 教师用户登录
教务员使用该套系统的主要目的是对教室进行管理,以及能够根据各个班级的具体课程情况对班级进行排课。
图 4 教务员登录
管理员是此套系统的拥有最高的权限,他可以添加学生、老师和教务员的信息,以及进行修改和删除等等。
图 5 管理员登录
数据库在现代的系统的开发中,起到了非常重要的作用。数据库可以对数据起到一种长期保存的效果,而且可以利用终端随时随地的通过网络来访问服务器,进而访问数据库,找到自己想要的数据和信息。
ER图在设计数据图的时候起到了非常关键的作用,可以从ER图中清晰的看到各个对象之间的关系和它具有的属性,因此,在创建数据库的时候会更加的方便和得心应手。
图 6 学生的ER图
图7 教师的ER图
图 8 教务员ER图
图 9管理员ER图
图 10 班级ER图
图 11 课程ER图
图12 成绩ER图
数据库中的数据都是通过表来进行存储的,因此,要将数据存储到数据库中,必须将表的结构进行合理化的设计,ER图为表的创建提供了良好的理论支撑,现在在建表的时候要考虑的是数据的存储大小,我们现在采用可以变换大小的varchar()类型进行存储,这样不会导致内存的无故浪费。
图 13 整体表的创建
学生表中主要是学生的一些属性,例如学生的学号,姓名,年龄和性别等等,在学生管理系统中,学号作为该表的主键,设计如下:
图14 学生表的创建
教师表中也是教师的一些属性,例如教工号、姓名和教室名等等,教工号为主键,设计如下:
图 15 教师表的创建
在课程表中,属性是关于课程的一些信息,例如课程号、课程名和该课程的学时和学分。课程号是主键,设计如下:
图16 课程表的创建
在创建完学生表和课程表之后,需要一个成绩表来显示学生的成绩信息,成绩要与学生个人和课程能够匹配上,在这里,需要设置学号和课程号为主键,而学生表中的学号和课程表中的课程号都是外键,设计如下:
图17 成绩表的创建
在使用数据库的时候有时候不是一个表所能完成的一项任务,我们往往会采用存储过程进行多表的结合使用,例如:要查询某个专业下的某个年级的某个班的一位同学的信息并且把这些信息显示出来,这样就会涉及到专业表、年级表、班级表和学生表。因此,在这个时候我们需要将多表进行结合使用,这里就会使用到存储过程。在本套系统中,我采用了几个存储过程来对学生的信息进行管理。
图18 整体的存储过程
在分配班级的时候要用到班级和专业两个表,因此要通过这两个表进行分配,从而确定某一个班是属于哪一个专业,代码如下:
USE [student_admin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CLASS_CHOOSE]
@pro varchar(20), @cla varchar(20)
as
select professional.专业名,class.班级号,course.课程名,course.课时数,course.学分
from professional,course,class
where professional.专业号 = class.专业号 and professional.专业名 = @pro and class.班级号 = @cla
查询某一个班级信息的功能,这个功能函数既可以在数据库中用存储过程实现也可以在C#中通过语言的逻辑来实现,在这套系统中,我采用的是利用在数据库中建立了一般班级信息的存储过程来实现的,在C#中通过调用该存储过程,然后向其中传递一个参数就可以实现。代码如下:
USE [student_admin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[class_message]
@classno varchar(20)
as
select 班级号,专业名,班主任,班长,人数
from class
where 班级号 = @classno
学生的课程信息不仅仅包含了学生类,而且还包含了课程类,我们需要将这两个表进行有效的结合进行使用,在这套系统中我采用的是利用在数据库中建立一个学生课程的存储过程来显示学生的课程信息,预留一个输入参数—学生的学号,可以利用学号就可以查询到该学生的课程信息。代码如下:
USE [student_admin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[student_course]
@courseno varchar(20)
as
select student.学号,student.姓名,student.班级号,course.课程名,grade.分数
from student,course,grade
where student.学号 = grade.学号 and course.课程号 = grade.课程号 and 课程名 = @courseno
在学生管理系统中,非常重要的一环就是学生可以查看自己的成绩,在这套系统中,采用的也是在数据库中建立一个关于学生的存储过程,是按照学号进行查询的,在C#中,调用该存储过程,输入一个学号的参数,便可以查询该学生的成绩信息,防止查询了其他人成绩,起到隐私保护的作用。代码如下:
USE [student_admin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[student_grade]
@student_id varchar(20)
as
select student.学号,student.姓名,course.课程名,grade.分数, choose.选课名,grade.选修分数
from student,course,grade,choose
where student.学号 = grade.学号 and choose.选课号 = grade.选课号 and student.学号 = @student_id
在数据库进行完设计之后,就要使用C#这种高级语言将他真正的能够和用户产生联系,用户接触到的是UI层面,因此我们的任务就是通过UI层进行数据传递到业务逻辑层然后进行数据的转化和业务逻辑的实现。
在本套系统中,连接数据库我采用的是利用数据源来连接数据库,这样就可以将连接数据库的字符串和commod都封装在数据源中,为每个表都创建好数据源和数据适配器,这样可以减少代码量,而且也会使得程序变得简洁明了,在使用一个数据库中的某一个表的时候只需要创建一个该表的数据适配器和一个共有的dataset即可。关系图如下:
图19 数据源图示
开始界面主要是让用户选择自己的身份类型进行系统的登录。如果用户选择的是系统管理员的登录方式,系统会自动的进行页面的跳转,跳转到系统管理员的登录界面。
图 20 登录类型选择
登录界面主要是让用户输入账号和密码进行登录,界面的风格是一致的,只是通过调用不同的数据库的信息进行不同的登录。
图21 登录界面
用户在输入账号和密码的时候,系统会调用数据中的相应的表进行查看是否与表中的数据匹配,如果匹配则能够登录成功,否则不成功。如果登录成功,该账号和密码会被记录到本地的文件中进行存储,以此达到下次登录时的快捷和方便,代码如下:
private void button1_Click(object sender, EventArgs e)
{
//登Ì?录?到Ì?管¨¹理¤¨ª员¡À的Ì?界?面?
string name = null;
string pass = null;
StringBuilder sname = new StringBuilder("管¨¹理¤¨ª账?号?='");
sname.Append(comboBox1.Text);
sname.Append("'");
if (comboBox1.Text != "")
{
try
{
DataRow[] row = table1.Select(sname.ToString());
row1 = row[0];
name = row1[0].ToString();
pass = row1[2].ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (name == comboBox1.Text)
{
// MessageBox.Show(name);
if (textBox1.Text == pass)
{
//进?入¨?管¨¹理¤¨ª员¡À的Ì?后¨®台¬¡§
admin_show a = new admin_show();
a.Show();
if (checkBox1.CanFocus)
{
if (File.Exists(txt))
{
String[] ss = { name, pass };
File.WriteAllLines(txt, ss);
}
else
{
File.Create(txt);
}
}
else
{
String[] ss = { "", "" };
File.WriteAllLines(txt, ss);
}
}
else
{
MessageBox.Show("没?有®D此ä?管¨¹理¤¨ª员¡À");
}
}
else //学¡ì生¦¨²进?入¨?
{
MessageBox.Show("账?号?和¨ª密¨¹码?不?匹£¤配?");
// label4.Text = "账?号?和¨ª密¨¹码?不?匹£¤配?,ê?请?重?新?输º?入¨?";
}
}
else
{
MessageBox.Show("请?输º?入¨?账?号?");
}
}
在管理员登录自己的账号之后,可以对学生、老师、课程和班级进行查询,添加、删除、修改和保存。这套系统中,可以根据学号和姓名进行查找,输入学号或者姓名,会进一步的调用数据库进行查询,如果数据库中有该成员的信息,则会被现实在右边的显示框中,在datagaridview中显示的是该类成员所有的数据信息。
在管理员查到成员信息之后,可以根据现在的情况进行对成员的信息进行相应的操作,例如:有一个学生退学,管理员可以查询到该生之后将该生信息进行删除。如果有一个老师的登录密码忘记了,管理员可以登录系统进行对该教师密码的一个重置。
图22 管理员查询学生信息
按照学号查询学生信息的代码如下:
private void button3_Click(object sender, EventArgs e)
{
//按ã¡ä学¡ì号?查¨¦找¨°
//StringBuilder stringBuilder = new StringBuilder();
if (comboBox1.Text.Length!=0)
{
DataRow[] row = dataset.Tables["student"].Select("学¡ì号?='" + comboBox1.Text.Trim()+"'");
try
{
datarow1 = row[0];
textBox5.Text = datarow1[0].ToString();
textBox6.Text = datarow1[1].ToString();
textBox7.Text = datarow1[2].ToString();
textBox8.Text = datarow1[3].ToString();
textBox9.Text = datarow1[4].ToString();
textBox10.Text = datarow1[5].ToString();
textBox11.Text = datarow1[6].ToString();
textBox12.Text = datarow1[7].ToString();
textBox13.Text = datarow1[8].ToString();
}catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
按照姓名查询学生信息的代码如下:
private void button4_Click(object sender, EventArgs e)
{
//按ã¡ä姓?名?查¨¦找¨°
if (textBox1.TextLength != 0)
{
StringBuilder name = new StringBuilder("姓?名?='");
name.Append(textBox1.Text);
name.Append("'");
DataRow[] row = st_table.Select(name.ToString());
try
{
String str = row[0].ToString();
// DataRow[] row = dataset.Tables["admin"].Select(("姓?名?=" + textBox8.Text).ToString());
datarow1 = row[0];
textBox5.Text = datarow1[0].ToString();
textBox6.Text = datarow1[1].ToString();
textBox7.Text = datarow1[2].ToString();
textBox8.Text = datarow1[3].ToString();
textBox9.Text = datarow1[4].ToString();
textBox10.Text = datarow1[5].ToString();
textBox11.Text = datarow1[6].ToString();
textBox12.Text = datarow1[7].ToString();
textBox13.Text = datarow1[8].ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
添加学生信息代码:
private void button5_Click(object sender, EventArgs e)
{
//添¬¨ª加¨®
DataRow row = st_table.NewRow();
if (textBox5.Text == "")
row[0] = DBNull.Value;
else
row[0] = textBox5.Text.Trim();
if (textBox6.Text == "")
row[1] = DBNull.Value;
else
row[1] = textBox6.Text.Trim();
if (textBox7.Text == "")
row[2] = DBNull.Value;
else
row[2] = textBox7.Text.Trim();
if (textBox8.Text == "")
row[3] = DBNull.Value;
else
row[3] = textBox8.Text.Trim();
if (textBox9.Text == "")
row[4] = DBNull.Value;
else
row[4] = textBox9.Text.Trim();
if (textBox10.Text == "")
row[5] = DBNull.Value;
else
row[5] = textBox10.Text.Trim();
if (textBox11.Text == "")
row[6] = DBNull.Value;
else
row[6] = textBox11.Text.Trim();
if (textBox12.Text == "")
row[7] = DBNull.Value;
else
row[7] = textBox12.Text.Trim();
if (textBox13.Text == "")
row[8] = DBNull.Value;
else
row[8] = textBox13.Text.Trim();
try
{
st_table.Rows.Add(row);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
修改学生信息代码如下:
private void button6_Click(object sender, EventArgs e)
{
//修T改?
try
{
if (textBox5.Text == "")
datarow1[0] = DBNull.Value;
else
datarow1[0] = textBox5.Text.Trim();
if (textBox6.Text == "")
datarow1[1] = DBNull.Value;
else
datarow1[1] = textBox6.Text.Trim();
if (textBox7.Text == "")
datarow1[2] = DBNull.Value;
else
datarow1[2] = textBox7.Text.Trim();
if (textBox8.Text == "")
datarow1[3] = DBNull.Value;
else
datarow1[3] = textBox8.Text.Trim();
if (textBox9.Text == "")
datarow1[4] = DBNull.Value;
else
datarow1[4] = textBox9.Text.Trim();
if (textBox10.Text == "")
datarow1[5] = DBNull.Value;
else
datarow1[5] = textBox10.Text.Trim();
if (textBox11.Text == "")
datarow1[6] = DBNull.Value;
else
datarow1[6] = textBox11.Text.Trim();
if (textBox12.Text == "")
datarow1[7] = DBNull.Value;
else
datarow1[7] = textBox12.Text.Trim();
if (textBox13.Text == "")
datarow1[8] = DBNull.Value;
else
datarow1[8] = textBox13.Text.Trim();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
删除学生信息代码如下:
private void button7_Click(object sender, EventArgs e)
{
//删¦?除y
DataView view = new DataView(dataset.Tables["student"]);
StringBuilder bulid = new StringBuilder("学¡ì号?='");
try
{
bulid.Append(datarow1[0]);
bulid.Append("'");
view.RowFilter = bulid.ToString();
view.Delete(0);
view.EndInit();
//ds1.Tables[0].Rows.Remove(row4);
}
catch (Exception ex)
{
MessageBox.Show("没?有®D此ä?学¡ì生¦¨²" + ex.Message, "提¬¨¢示º?", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
textBox5.Text = "";
textBox6.Text = "";
textBox7.Text = "";
textBox8.Text = "";
textBox9.Text = "";
textBox10.Text = "";
textBox11.Text = "";
textBox12.Text = "";
textBox13.Text = "";
// textBox14.Text = "";
}
保存学生信息代码如下:
private void button8_Click(object sender, EventArgs e)
{
//保À¡ê存ä?
try
{
student_ap.Update(dataset.student);
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);
}
登录界面主要是让用户输入账号和密码进行登录,界面的风格是一致的,只是通过调用不同的数据库的信息进行不同的登录。
图23 学生登录界面
用户在输入账号和密码的时候,系统会调用数据中的相应的表进行查看是否与表中的数据匹配,如果匹配则能够登录成功,否则不成功。如果登录成功,该账号和密码会被记录到本地的文件中进行存储,以此达到下次登录时的快捷和方便,代码如下:
private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
student st = new student();
st.Show();
//this.Visible = false;
}
学生用户在该系统的使用过程中只有对成绩的查询功能而没有修改功能,学生还可以在系统上进行选修课的选择,也可以查看自己的正选结果,同时可以在期末时对任课老师的教学进行打分。
图 24 学生用户界面
在这次的课设过程中,要求制作一个学生信息管理系统,这次的实验不同于以往的实验,以往的实验只是一个简单的本章节的内容,而这次的课程设计是综合一年的学习结果,跨学科的一次综合性的实验,使得我对这一个学期的知识有了一个整体的回顾和深入了解。
本套学生信息管理系统中,按照结构划分可以划分为数据库,业务逻辑层和UI层,按照功能划分主要分为管理员、教务员、教师和学生四大模块。每个模块中代表的成员在系统中又有不同的权限在系统中,这就要考虑到权限和安全问题。在数据库的制作中要考虑主键的问题,不同的表之间的关联问题,在C#程序设计的时候要考虑变量的全局和局部问题。
通过这次的课程设计实验,我掌握了高级语言和数据库以及服务器之间的联系和如何关联使用,这次的实验使我收获非常的多。
一个学期的学习马上就结束了,在这一年里,学到的东西也挺多的,在学习的过程中也得到了老师和同学们的帮助。在学习中遇到的困难也是通过不断的学习学习最后掌握,这些都离不开同学和老师们的帮助。
在这次的课程设计实验中,我得到了老师和同学们的大力帮助,在此我衷心的感谢每一位帮助我的老师和同学。在这里我想特别感谢一下姬晓辉老师和张文学老师,是你们从不同的角度为我们讲解了不同的学科在这次课设中的作用和使用方法,是你们的耐心讲解和辅导使得我这次的课设实验得以成功。
[1]郑宇军.C#面向对象程序设计[Z].人民邮电出版社,2013
[2] 斯蒂芬森. SQL入门经典(第5版)[Z].人民邮电出版社,2011
[3] 朱有明. 学生信息管理系统的设计与实现 [C]. 电子科技大学,2013
[4] 张昆. 学生信息管理系统的设计与实现 [C].吉林大学,2010
本文来源:https://www.2haoxitong.net/k/doc/3228ab48bbf3f90f76c66137ee06eff9aef84994.html
文档为doc格式