学生选课系统.docx
《学生选课系统.docx》由会员分享,可在线阅读,更多相关《学生选课系统.docx(33页珍藏版)》请在冰豆网上搜索。
学生选课系统
数据结构课程设计报告
《学生选课系统》
目录
摘要3
第1章概述4
1.1系统实现的目标4
1.2系统实现方案4
1.3系统实现环境4
1.4具体的开发方法4
第2章系统设计5
2.1系统功能设计5
2.2数据库设计5
2.3界面的设计5
第3章系统实现6
参考文献7
摘要
随着课程改革的不断深入,学校规模不断扩大、课程项目不断增多,为解决学生选课管理上的复杂的人工操作,减轻重复工作,使学校管理以及学校管理人员能够有效方便的管理学生信息,我们设计开发了本学生选课系统。
本系统实现了对课程的基本信息以及学生选课、学生和教师用户进行管理。
我们通过课本与实际了解的知识,利用计算机软件,实现了该系统。
通过采用本系统可实现对所有的学生信息进行统一管理,使得操作简单、方便化。
关键词:
选课、JSP、B/S
第1章概述
1.1系统实现的目标
该学生选课系统需求分析报告的目的在于通过该报告,可以使系统实现如下功能:
学生选课,成绩录入,成绩查询,课程信息管理,用户信息管理,成绩信息管理。
使用户的需求能够清晰的呈现出来。
1.2系统实现方案
(1)登录与注销
(2)修改密码
(3)系统管理员功能
1.3系统实现环境
表1.3.1
硬件
处理器
AMD3000+或者更加高级
服务器
软件
内存:
512M或更高
硬盘:
80G或更高
MicrosoftWindowsxp
MicrosoftSQLServer2000
MicrosoftIIS6.0
客户机
硬件
连接互联网
软件
MicrosoftWindowsxp
MicrosoftIE6.0
1.4具体的开发方法
1.4.1JSP简介
JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。
网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。
JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。
插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。
JSP与JavaServlet一样,是在服务器端执行的,通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。
目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。
JSP页面由HTML代码和嵌入其中的Java代码所组成。
服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。
JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。
JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
自JSP推出后,众多大公司都支持JSP技术的服务器,如IBM、Oracle、Bea公司等,所以JSP迅速成为商业应用的服务器端语言。
JSP可用一种简单易懂的等式表示为:
HTML+Java=JSP。
1.4.2SQLServer2000简介
SQLServer是一个关系数据库管理系统,它最初是由MicrosoftSybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。
在WindowsNT推出后,Microsoft与Sybase在SQLServer的开发上就分道扬镳了。
Microsoft将SQLServer移植到WindowsNT系统上,专注于开发推广SQLServer的WindowsNT版本;Sybase则较专注于SQLServer在UNIX操作系统上的应用。
在本书中介绍的是MicrosoftSQLServer以后简称为SQLServer或MSSQLServer。
SQLServer2000是Microsoft公司推出的SQLServer数据库管理系统的一个版本。
该版本继承了SQLServer7.0版本的优点同时又比它增加了许多更先进的功能,具有使用方便,可伸缩性好与相关软件集成程度高等优点,可跨越从运行MicrosoftWindows98的膝上型电脑到运行MicrosoftWindows2000的大型多处理器的服务器等多种平台使用。
第2章系统设计
2.1系统功能设计
1、用户登录模块
提供用户登录界面,输入用户名,密码进行登录。
2、学生信息管理模块
学生信息管理模块,用于管理学生的基本信息,所包括的字段有:
学号、姓名、性别、年龄、班级,提供对学生信息的录入、查询、修改和删除的操作。
3、课程信息管理模块
课程信息管理模块用于管理课程的信息,所包含的字段有:
课程号、课程号、先行课和学分,提供对课程信息的录入、查询、修改和删除的操作。
4、选课功能管理模块
选课功能管理模块用于管理学生的选课与成绩,所包含的字段有:
学号、课程号和成绩,提供对选课成绩信息的录入、查询、修改和删除的操作。
2.2数据库设计
教学管理系统
学生管理员教师
选个人学生教师课程查看选课
课信息管理管理管理选课学生
查询情况名单
图2.2.1总系统对用功能图
(1)系统的模块划分为如图所示,分别为:
学生登录、管理员信息管理、教师信息管理3个模块。
每个模块负责相应的功能。
系统采用ADO.NET技术实现对数据库的访问操作,使用Server2000作为后台数据库。
2.1系统功能表
表单名
表单名
功能
student
学生信息表
储存学生个人信息
course
课程信息表
储存每科课程的信息
sc
选课成绩表
储存学生所选修的课程的成绩
useers
用户表
储存用户的账号与密码
2.3界面的设计
(1)学生登录模块:
(2)学生信息管理模块
选1:
进入学生信息浏览,先看是否有记录,无则退出到学生信息界面,有则显示出来。
选2:
进入学生信息录入,录入学生编号,先看是否重复,若
有重复,则提示错误,进行下次输入,无则输出一条记录,并添加记录到表。
选3:
进入学生信息修改,录入学生编号,看是否在表中有这条记录,无则提示错误,有则提示修改记录的相关信息。
选4:
进入学生信息删除,录入要删除的学生编号,看是否在表中有这条记录,无则提示错误,有则提示显示记录的相关信息,再提示是否确实要删除记录,要则删除。
选5:
进入学生信息查询,进行选择是按学号查询或学分查询,不管哪种方式,都查询一下表中有相关的记录,没有则重新选择,有刚显示相关记录.
选6:
退出学生信息界面。
(3)课程信息管理模块
选1:
进入课程信息浏览,先看是否有记录,无则退出到课程信息界面,有则显示出来。
选2:
进入课程信息录入,入课程编号,先看是否重复,若
有重复,则提示错误,进行下次输入,无则输出一条记录,并添加记录到表。
选3:
进入课程信息修改,录入课程编号,看是否在表中有这条记录,无则提示错误,有则提示修改记录的相关信息。
选4:
进入课程信息删除,录入要删除的课程编号,看是否在表中有这条记录,无则提示错误,有则提示显示记录的相关信息,再提示是否确实要删除记录,要则删除。
选5:
进入课程信息查询,进行选择是按学号查询或学分查询,不管哪种方式,都查询一下表中有相关的记录,没有则重新选择,有刚显示相关记录。
选6:
退出课程信息界面。
(4)选课功能管理模块
选1:
进入选课信息浏览,先看是否有记录,无则退出到选课信息界面,有则显示出来.
选2:
进入学生选课,录入学生编号,先看是否重复,若有重复,则提示错误,进行下次输入,无则进行选课提示,输入选课的编号,再看是否输入的编号是否存在,无则重新输入,有则看是否选了这门课,没有就选上,进行重复选择。
选3:
进入学生退选,录入学生编号,先看是否重复,若有重复,则提示错误,进行下次输入,无则进行选课提示,输入退选课程的编号,再看是否输入的编号是否存在,无则重新输入,有则看是否选了这门课,没有就提示错误信息,若有就进行退选.再进行重复选择.。
选4:
退出选课界面
第3章系统实现
(1)代码分析
structcouse
{
intnum1;
charname1[20];
intscore;
intnelepeo;
intMelepeo;
structcouse*next;
};
structstudent
{
intnum2;
charname2[20];
intnelenum[50];
intnelen;
structstudent*next;
};
在这个结构定义中,结构名为course,该结构由3个成员组成。
第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为score,实型变量。
在实际问题中,一组数据往往具有不同的数据类型。
例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。
显然不能用一个数组来存放这一组数据。
因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。
它相当于其它高级语言中的记录。
intmain()
{
inti;
start:
printf("\n\t\t\t欢迎使用学生选课系统!
\n");
printf("菜单:
\n");
printf("1.录入课程信息\n");
printf("2.课程管理\n");
printf("3.录入学生信息\n");
printf("4.学生信息管理\n");
printf("5.学生选课\n");
printf("6.系统信息查看及存储\n");
printf("7.退出系统\n");
printf("\n请输入菜单选项(1~7):
\n");
scanf("%d",&i);
if(i<1||i>7)
{
printf("输入错误,请重输:
\n");
gotostart;
}
本段代码为本系统的主函数。
main函数与用户自己定义的函数都是各自独立的模块,即函数不能嵌套定义,通俗的说,你不能在一个函数的函数体内定义另一个函数,即使在main函数中也不行。
但main函数可以对用户自己定义的函数进行调用(但main函数只能由系统调用)。
(2)运行结果
第四章总结
参考文献
1.黄建华等.《Delphi程序设计》.清华大学出版社。
2.[美]MarcoCantu.《Delphi7从入门到精通》.电子工业出版电子版本。
3.《Delphi7数据库开发技术与工程实践》.人民邮电出版社。
4.李维.《Delphi5.XADO/MTS/COM+高级程序设计篇》.机械工业出版社。
5.《Delphi7程序设计实例导航》.清华大学出版社。
6.王姗.陈红.《数据库系统原理教程》。
7.《最新Delphi7数据库开发指南》.清华大学出版社。
8.徐人凤.曾建华.《SQLServer2000数据库及应用基础》.高等教育出版.2004年。
附录代码
#include
#include
intN1,N2,kk1,kk2,kk3;
structcouse*head1;
structstudent*head2;
structcouse
{
intnum1;
charname1[20];
intscore;
intnelepeo;
intMelepeo;
structcouse*next;
};
structstudent
{
intnum2;
charname2[20];
intnelenum[50];
intnelen;
structstudent*next;
};
voidMs()
{
for(kk1=0;kk1<1100;kk1++)
for(kk2=0;kk2<1200;kk2++)
for(kk3=0;kk3<1200;kk3++);
}
voidkeyboardc()
{
structcouse*p1,*p2;
N1=0;
p1=p2=(structcouse*)malloc(sizeof(structcouse));
printf("课程编号\t课程名称\t学分\t课程人数上限\n");
scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo);
p1->nelepeo=0;
head1=NULL;
while(p1->num1!
=0)
{
N1=N1+1;
if(N1==1)head1=p1;
elsep2->next=p1;
p2=p1;
p1=(structcouse*)malloc(sizeof(structcouse));
scanf("%d%s%d%d",&p1->num1,p1->name1,&p1->score,&p1->Melepeo);
p1->nelepeo=0;
}
p2->next=NULL;
}
voidfilec()
{
FILE*fp;
charfilepath[20];
structcouse*p1,*p2;
N1=0;
printf("输入要读入的文件路径:
");
getchar();
gets(filepath);
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!
\n",filepath);
exit(0);
}
p1=p2=(structcouse*)malloc(sizeof(structcouse));
fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo);
head1=NULL;
while(!
feof(fp))
{
N1=N1+1;
if(N1==1)head1=p1;
elsep2->next=p1;
p2=p1;
p1=(structcouse*)malloc(sizeof(structcouse));
fscanf(fp,"%d%s%d%d%d",&p1->num1,p1->name1,&p1->score,&p1->nelepeo,&p1->Melepeo);
}
p2->next=NULL;
}
voidinputc()
{
inti;
printf("\t\t\t录入课程信息\n");
printf("\n1.从键盘录入\n");
printf("2.从文件录入\n");
printf("3.返回主菜单\n");
printf("请选择(1~3):
\n");
scanf("%d",&i);
switch(i)
{
case
(1):
keyboardc();break;
case
(2):
filec();break;
case(3):
break;
}
}
voidinsertc(structcouse*incouse)
{
structcouse*p0,*p1,*p2;
p1=head1;
p0=incouse;
if(head1==NULL)
{
head1=p0;
p0->next=NULL;
}
else
{
while((p0->num1>p1->num1)&&(p1->next!
=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num1<=p1->num1)
{
if(head1==p1)head1=p0;
elsep2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
N1=N1+1;
}
voiddelc(intnum1)
{
structcouse*p1,*p2;
if(head1==NULL)
{
printf("\n没有课程,无法删除!
\n");
gotoend;
}
p1=head1;
while(num1!
=p1->num1&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(num1==p1->num1)
{
if(p1==head1)head1=p1->next;
elsep2->next=p1->next;
printf("已删除该编号课程!
\n");
N1=N1-1;
}
elseprintf("无该编号的课程!
\n");
end:
;
}
voidmanagementc()
{
structcouse*incouse;
inti,num1;
printf("\t\t\t课程管理\n");
printf("1.新增课程\n");
printf("2.删除课程\n");
printf("3.返回主菜单\n");
printf("请选择(1~3):
\n");
scanf("%d",&i);
switch(i)
{
case
(1):
{
incouse=(structcouse*)malloc(sizeof(structcouse));
printf("课程编号\t课程名称\t学分\t课程人数上限\n");
scanf("%d%s%d%d",&incouse->num1,incouse->name1,&incouse->score,&incouse->Melepeo);
incouse->nelepeo=0;
insertc(incouse);
break;
}
case
(2):
{
printf("请输入要删除课程的编号:
\n");
scanf("%d",&num1);
delc(num1);
break;
}
case(3):
break;
}
}
voidkeyboards()
{
inti;
structstudent*p1,*p2;
N2=0;
p1=p2=(structstudent*)malloc(sizeof(structstudent));
printf("学生学号\t学生姓名\n");
scanf("%d%s",&p1->num2,p1->name2);
p1->nelen=0;
for(i=0;i<20;i++)p1->nelenum[i]=0;
head2=NULL;
while(p1->num2!
=0)
{
N2=N2+1;
if(N2==1)head2=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(sizeof(structstudent));
scanf("%d%s",&p1->num2,p1->name2);
p1->nelen=0;
for(i=0;i<20;i++)p1->nelenum[i]=0;
}
p2->next=NULL;
}
voidfiles()
{
inti=0;
FILE*fp;
charfilepath[20];
structstudent*p1,*p2;
N2=0;
printf("输入要读入的文件路径:
");
getchar();
gets(filepath);
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!
\n",filepath);
exit(0);
}
p1=p2=(structstudent*)malloc(sizeof(structstudent));
fread(p1,sizeof(structstudent),1,fp);
head2=NULL;
while(!
feof(fp))
{
i=0;
N2=N2+1;
if(N2==1)head2=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(sizeof(structstudent));
fread(p1,sizeof(structstudent),1,fp);
}
p2->next=NULL;
}
voidinputs()
{
inti;
printf("\t\t\t录入学生信息\n");
printf("\n1.从键盘录入\n");
printf("2.从文件录入\n");
printf("3.返回主菜单\n");
printf("请选择(1~3):
\n");
scanf("%d",&i);
switch(i)
{
case
(1):
keyboards();break;
case
(2):
files();break;
case(3):
break;
}
}
voidinserts(structstudent*incouse)
{
structstudent*p0,*p1,*p2;
p1=head2;
p0=incouse;
if(head2==NULL)
{
head2=p0;
p0->next=NULL;
}
else
{
while((p0->num2>p1->num2)&&(p1->next!
=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num2<=p1->num2)
{
if(head2==p1)head2=p0;
elsep2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
N2=N2+1;
}
voiddels(intnum2)
{
structstudent*p1,*p2;
if(head2==NULL)
{
printf("\n没有该学生信息,无法删除!
\n");
gotoend;
}
p1=head2;
while(num2!
=p1->num2&&p1->next!
=NULL)