学生选课系统说明书.docx
- 文档编号:10093807
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:43
- 大小:342.74KB
学生选课系统说明书.docx
《学生选课系统说明书.docx》由会员分享,可在线阅读,更多相关《学生选课系统说明书.docx(43页珍藏版)》请在冰点文库上搜索。
学生选课系统说明书
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2011年春季学期
算法与数据结构课程设计
题目:
学生选课系统
专业班级:
计算机(4)班
姓名:
杨国亮
学号:
09240415
指导教师:
张其文
成绩:
_______________
目录
摘要1
前言2
正文3
1.采用类c语言定义相关的数据类型3
2.各模块的伪码算法3
3.函数的调用关系图6
4.调试分析7
5.测试结果7
6.源程序(带注释)7
总结9
参考文献10
致谢11
附件Ⅰ部分源程序代码12
摘要
选课系统是针对在校学生和教师使用,从学生的角度来说,由于学校教学制度的改革,现在大部分高等院校开始实行的是学生的自主选课模式,传统的教学模式(学生按照学校安排好的课程上课)已经不能适应新型的教学手段,如果仍然通过纸上的方式选课,一方面浪费的大量的人力、物力资源,另一方面浪费时间以及在人为的统计过程中不可避免出现的差错等情况。
随着高校人数的增多,这种弊端会越来越多的暴露出来。
因此,学生只要在计算机前输入自己的个人选课信息即可完成原来几倍的作业量。
从教师的角度来说,同样是节省了大量的工作量,由于教师提出代课申请完成课程发布的工作较学生选课而言更加的复杂,因此通过进行课程发布能大幅度的减少教师的工作量,减少错误的发生几率。
作为教师,也只要通过自己的电脑来操作即可,不用再奔波于教务处和办公室之间。
选课管理系统,它是结构化的系统,它能更有效,更快速的实现学生选课的管理过程,而且管理的安全机制也更完善,这样就可以为学生的管理花费更少的人力和物力资源。
随着在校大学生人数的不断增加,教务系统的数据量也不断的上涨。
以往的选课方法是随堂报名。
这种方法虽然直接,但是造成选课的盲目性和教务处处理数据的繁重性。
为了减轻教务处工作,以及每个学生更好的选择自己所喜欢的科目。
针对学生选课这一环节,本系统从学生网上自主选课以及教师的课程发布两个大方面进行了设计,基本实现了学生的在线信息查询、选课功能以及教师对课程信息发布的管理等功能
本系统界面友好,操作简单明了,设计合理,功能比较齐全,考虑周到合理,对C语言学习者可以起到很好的借鉴作用,也可以为计算机软件的设计提供一定的参考,教学的管理主要就是让现代的教学管理员能更加方便的解决学校的管理。
本系统达到了他的要求也基本达到了课程设计的基本要求。
。
关键词:
学生选课系统;C语言;数据结构;线性表
前言
学生选课系统是一个学校不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生选课系统应该能够为用户提供充足的信息和快捷的查询手段。
但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:
效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
作为计算机应用的一部分,使用计算机对选课信息进行管理,有着手工管理所无法比拟的优点.例如:
检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高人事劳资管理的效率,也是企业的科学化、正规化管理,与世界接轨的重要条件。
因此,开发这样一套软件成为很有必要的事情,在下面的我将以开发一套学生选课系统为例,谈谈其开发过程和所涉及到的问题及解决方法。
正文
1.采用类c语言定义相关的数据类型
在本系统中最重要的两个数据就是课程信息结构和学生信息结构,下面依次介绍:
课程信息结构体:
structcouse//课程信息结构体
{
intnum1;
charname1[20];
intscore;
intnelepeo;//课程已选人数
intMelepeo;//课程人数上限
structcouse*next;
};
学生信息结构体:
structstudent//学生信息结构体
{
intnum2;
charname2[20];
intnelenum[50];//已选课程编号
intnelen;//已选课程数量
structstudent*next;
};
2.各模块的伪码算法
本系统主要的算法是信息的录入(从键盘和从文件)、信息的管理(增加和删除)、信息的查询和存储,下面依次用某一实例说明。
课程信息的键盘录入:
voidkeyboardc()
{
structcouse*p1,*p2;
p1=p2=(structcouse*)malloc(sizeof(structcouse));
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;
}
学生信息的增加:
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;
}
学生查询可选课程:
voidcheak()
{
chare;
structcouse*c;
structstudent*s;
intnum2,i,j=0,t=0;
s=head2;
while(s->num2!
=num2&&s->next!
=NULL)s=s->next;
c=head1;
printf("你的可选课程编号:
\n");
while(c!
=NULL)
{
for(t=0,i=0;s->nelenum[i]!
=0;i++)
{
if(c->num1==s->nelenum[i])t=1;
}
if(t==0&&(c->nelepeo!
=c->Melepeo))
{
printf("%d\n",c->num1);
j++;
}
c=c->next;
}printf("选课(y/n)?
:
\n");
getchar();
e=getchar();
i=0;
while(e=='y')
{
elect(s);
printf("继续选课(y/n)?
:
\n");
getchar();
e=getchar();
}
end:
;
}
存储课程信息:
voidintoc()
{
FILE*fp;
structcouse*p;
charfilepath[30];
printf("输入课程信息要保存的文件路径:
");
getchar();
gets(filepath);
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失败!
");
exit(0);
}
p=head1;
while(p!
=NULL)
{fprintf(fp,"%d%s%d%d%d\n",p->num1,p->name1,p->score,p->nelepeo,p->Melepeo);
p=p->next;
}
fclose(fp);
printf("课程信息已保存在%s中!
\n",filepath);
}
3.函数的调用关系图
总体调用关系图:
录入课程信息和录入学生信息模块相似:
课程信息管理和学生信息管理模块相似:
学生选课模块:
信息查看及存储模块:
4.调试分析
a、调试中遇到的问题及对问题的解决方法
在调试中遇到很多语法问题,大多都是因为粗心导致,细心查看就可以解决了,例如忘记分号结尾,输入法差异等等;下面主要介绍一个困惑很久的问题:
在VC中同时兼容C语言和C++语言,当两种语言和在一起时,某些语法存在优先级问题,例如最简单的输入与输出,都会因为优先级不同而是程序不按理论上的顺序进行执行。
解决此问题我花费了大量时间查阅资料,查看了好多相关论文,最终发现是优先级导致的问题。
b、算法的时间复杂度和空间复杂度
本系统中使用的都是链表,时间复杂度和空间复杂度都是n。
5.测试结果
6.源程序(带注释)
源程序在最后给出,所以在此给出各主要函数的功能以利于读者读懂程序:
structcouse//课程信息结构体
structstudent//学生信息结构体
voidkeyboardc()//录入课程子函数(从键盘录入)
voidfilec()//录入键盘子函数(从文件录入)
voidinputc()//录入课程主函数
voidinsertc(structcouse*incouse)//课程管理子函数(增加课程)
voiddelc(intnum1)//课程管理子函数(删除课程)
voidmanagementc()//课程管理主函数
voidkeyboards()//录入学生信息子函数(从键盘录入)
voidfiles()//录入学生信息子函数(从文件录入)
voidinputs()//录入学生信息主函数
voidinserts(structstudent*incouse)//学生信息管理子函数(填加学生信息)
voiddels(intnum2)//学生信息管理子函数(删除学生信息)
voidmanagements()//学生信息管理主函数
voidelect(structstudent*s)//选课
voidcheak()//学生选课子函数(查询可选课程)
voidback(structstudent*p)//退课
voidhcheak()//学生选课子函数(查询已选课程)
voidelective()//学生选课主函数
voidlistc()//输出课程信息
voidlists()//输出学生信息
voidintoc()//存储课程信息
voidintos()//存储学生信息
voidinto()//存储信息
voidstore()//信息主函数
intmain()//主函数
总结
经过本学期的学习,研究和开发,我选择的课题学生选课系统基本完成。
其功能基本符合网络上的用户要求,能够在线选课,在线添加课程,在线查询课程等。
虽然由于自己知识上的不足,有些地方有少许错误和容错性能比较低,但是还是可以基本完成选课系统应有的功能。
通过本次课程设计过程我会到了许多知识,这也是在大学里第一次比较完整的完成一个小项目,虽然过程中遇到了许多困难,在同学和老师的帮助下一一克服了。
通过不断的发现问题,总结问题和解决问题的过程,使我在此次毕业设计活动中不断的提高,和得到了宝贵的经验。
参考文献
【1】刘於勋邢文凯Visualbasic程序设计,北京:
北京理工大学出版社2009年
【2】王珊萨师煊数据库系统概论北京:
高等教育出版社2009年
【3】张俊兰王文发马乐荣冯伍软件工程西安:
西安交通大学出版社2009年
【4】吴晨,《ASP.NET+SQLServer-数据库开发与实例》,清华大学出版社出版,2006年7月
【5】(美)内格尔,《C#高级编程(第4版)》,清华大学出版社出版,2006年10月
【6】(美)solid,《SQLServer2005从入门与精通(应用技术基础)》,清华大学出版社出版,2006年09月
【7】(美)保罗《ASP.NET2.0经典教程C#篇》人民邮电出版社出版,2007年5月
致谢
由于以前对C语言的接触并不是很多,对它的开发环境也不是非常了解,所以在程序的开发过程中遇到了很多的困难,但经过同学和老师的帮助,逐渐克服了困难,并从中学到了很多编程方面的知识。
但是由于经验方面的原因,以及对物流配送方面的操作流程了解不够深刻,该系统还有许多不尽如人意的地方和功能上的缺陷,这些都有待于进一步改善。
论文完成的前提是老师给我提供了舒适的工作、学习环境,并给予我悉心的关怀与指导。
在些表示衷心地感谢。
老师认真负责的工作态度、严谨的治学风格,使我深受启发;开发的同时,和同学们之间的相互探讨也使我获益匪浅。
几个月的时间内,我除基本学会开发C语言应用程序外更重要的是学到了兢兢业业,奋发向上的精神,这种精神是我今后人生前进道路上的一种力量。
所以我再次感谢我的老师和我周围的同学们。
附件Ⅰ部分源程序代码
#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("输入要读入的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 选课 系统 说明书