C语言课程设计学生选课系统.docx
《C语言课程设计学生选课系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计学生选课系统.docx(32页珍藏版)》请在冰豆网上搜索。
C语言课程设计学生选课系统
题目一、学生选课管理系统
第一部分:
课程设计名称、目的、要求
名称:
学生选修课程系统设计
目的:
运用C语言提高解决实际问题的能力
实验环境:
MicrosoftVisualC++6.0
内容:
假定有n门课程,每门课程有课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。
【功能】
系统以菜单方式工作?
课程信息录入功能(课程信息用文件保存)--输入?
课程信息浏览功能--输出?
查询功能:
(至少一种查询方式)--算法?
按学分查询?
按课程性质查询?
学生选修课程(可选项)?
第二部分:
程序总体设计思路
由于C语言是面对过程的语言,故我的设计思路是根据目标程序运行的过程来编写的。
具体的设计思路如下:
程序的要求是设计学生选修课管理系统,对选修课程能够进行录入和修改操作等,要求有菜单界面和退出功能。
首先,考虑到程序的数据输入,可以设置一个管理员登陆选项,通过该选项进入管理员界面,进行选修课的录入和修改操作,最后将录入的课程保存到相应的文件中。
然后定义各种函数的功能包括查看,查询,删除等。
另一个为学生登陆界面,该界面学生可以进行课程选择和浏览查询等操作。
在进行该操作之前需要对管理员保存的文件进行读取,然后对其中的内容进行查询等,在学生选好课程以后,可以将其选好的课程保存于相应的文件中,以便下次进行修改。
通过函数的层层调用来实现程序的逻辑结构。
中间通过文件的打开和关闭实现对文件内部所包含的数据的操作。
整个程序的设计思路到此结束。
第三部分:
程序功能划分、图示及流程图
【功能模块划分及其流程图】
本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为6个部分分别编写,程序主体功能将由这9个部分来完成。
这9个部分依次是:
1.登录界面函数;voidlogin()
2.学生登录界面据函数:
voidstu_login()
3.管理员登录界面函数:
voidman_login()
4.退出界面函数:
voidbye_sys()
5.课程选择函数:
voidc_select()
6.课程浏览函数:
voidc_view()
7.课程查询函数:
voidc_search()
8.课程增加函数:
voidc_add()
9.课程删除函数:
voidc_delete()
10.菜单函数:
voidindex()
11.主函数部分;main()
总体设计:
系统功能模块图
部分函数流程图:
1、课程选择函数:
2、课程查询函数
3、课程增加函数
4、课程删除函数
第四部分:
程序设计数据、运行结果
本程序是一款应用软件,故数据设计、程序运行结果应在程序的运用中得以体现,现在通过一个程序的运用事例来对程序运行结果进行演示与实现。
【软件运用举例】
1、程序开始界面如下:
选择某个选项,如进行管理员登录,进行课程的增加
进入管理员界面:
2、再选择所要进行的操作,如进行课程增加,结果如下:
下面可以进行继续增加课程或者退出:
3、选择课程浏览,可以分页查看相应的课程信息:
第一页:
第二页:
4、课程查询
查找结果:
4、管理员课程删除操作:
删除后可以进行浏览,观察删除后的结果:
可见删除后只有一条记录。
删除操作完成正确。
下面进行学生操作的使用方法:
1、学生登陆界面:
2、选择学生选课选项:
3、学生登陆也可进行课程浏览和查询函数,其结果与管理员登陆相同,不再演示。
第五部分:
程序的优缺点
【程序的优点】
算法是程序的灵魂,程序的优点首先表现在算法上的优点,其次才是功能上的。
[算法上的优点]主要体现在以下三点:
1.程序采用main主函数方式设计,程序的主体的功能大都由该功能完成。
程序如此设计有利于程序的进一步改进及有助于程序执行效率的提高。
2.程序对文件数据的读写采用了fread和fwrite块读写函数,能够将文件中的数据完全读出,然后赋到定义的数组中,再在相应的数组中进行一系列操作,最终再写入文件。
3.插入操作在本程序中将课程信息直接插入数组最后一个节点,从而减少了数据的相互移动,节省了时间。
[功能上的优点]
主要体现在以下两点:
1.简洁明了的程序菜单。
程序主要采用了层次不同的菜单,相互独立又相互联系,巧妙相接,符合用户的使用习惯与思维。
2.人性化的程序提示语言,程序提示语言较人性化,不仅大多为祈使语句、疑问句,而且提示明确,具有较强的明确的指导作用。
程序提示不仅层次分明,提示方式多样,而且提示信息井然有序,更加有利于用户顺利、准确地看懂程序并进行操作。
【程序的缺点】
主要表现在以下两点:
1、本程序没有进行相应的密码操作,所以对于使用者来说可能存在比较大的不保密性。
需要改善。
2、本程序没有使用文本读写函数fscanf和fprintf,所以的到的课程文件和选课文件都是二进制形式。
第六部分:
心得体会
选课系统程序比起通讯录程序来讲好写一些,由于本程序用到了数组,对于数组的操作掌握的比较熟练,所以在编写程序的时候困难没有那么多。
本程序在编写的过程中用到了许多通讯录中的模块化设计和函数互相调用的思想,使得编写比较方便和好用。
通过该系统的课程设计分析,我掌握了模块化设计的方法,理解和运用了结构化程序设计的思想和方法,掌握和提高了运用C语言进行程序设计的能力。
程序设计的过程,实际上是确定解决问题的详细步骤,而这个步骤通常叫做流程,在程序设计过程中理清楚整个问题的流程很重要,然后采取逐步细化的方法实现整个程序。
对于一个较大的应用程序,一般不可能一次就设计出一个很完善的系统。
通常要先设计满足基本要求的系统,然后再测试或者在使用的过程中不断完善,慢慢地做成一个功能很完善选修课程管理系统。
所以在进行调试的时候需要对许多变量理解和掌握其变化规律等,这对于我更好的掌握visualC中调试的工具有很大的帮助。
总之经过这次课程设计,我对c语言的使用和理解都有了很大的加深,对于编程的思想也有了很多新的理解和感受。
第七部分:
附录
一、参考文献:
1、李丽娟主编,C语言程序设计教程(第二版),人民邮电出版社
2、严蔚敏主编,数据结构(C语言),清华大学出版社
3、崔单主编,C语言程序设计案例精粹,电子工业出版社
4、谭浩强主编,程序设计(第三版),清华大学出版社
二、源程序
#include"stdio.h"
#include"stdlib.h"
#include"windows.h"
#include"string.h"
voidindex();//首页
voidlogin();
voidbye_sys();//退出界面
voidstu_login();//学生登录菜单
voidc_select();
voidc_view();//课程浏览
voidc_add();//增加课程
voidc_delete();
voidc_searchs();//学生查询函数
voidc_searchm();//管理员查询函数
voidc_viewm();//管理员浏览函数
voidc_views();//学生浏览函数
structcourse//定义课程结构体
{
intc_num;
charc_name[20];
intc_score;
intc_nelepeo;//课程已选人数
intc_melepeo;//课程人数上限
};
structstudent
{
chars_number[10];
chars_password[10];
};
structmanager
{
charm_name[10];
charm_password[10];
};
voidindex()//首页
{
charinput;
printf("\n\n\t\t\t*****************************\n");
printf("\t\t\t湖南大学学生选课系统\n");
printf("\t\t\t*****************************\n\n\n");
printf("\t\t\t*****************************\n\n\n");
printf("\t\t\t*****************************\n\n\n");
printf("\t\t\t*****************************\n\n\n");
printf("\t\t\t**********设计者:
刘晓斌******\n\n\n");
input=getchar();
system("cls");
}
voidlogin()//登陆界面
{
voidstu_login();
voidman_login();
voidbye_sys();
intinput;
do
{
system("cls");
printf("\n\n\n\t1.学生登录\n");
printf("\t2.管理员登陆\n");
printf("\t3.退出本系统\n");
printf("\t请选择服务类别:
");
scanf("%d",&input);
if(input!
=1&&input!
=2&&input!
=3)//输入数不等于选项的时候打印画面
{
printf("\n\t输入出错!
请重新选择~\n");
printf("\n\t按任意键返回选择页面~\n\t");
getchar();getchar();
system("cls");
}
if(input==3)//如果输入3退出系统
{
bye_sys();
}
}while(input!
=1&&input!
=2&&input!
=3);
switch(input)
{
case1:
stu_login();break;
case2:
man_login();break;
}
}
voidbye_sys()//退出界面
{
exit(0);
}
voidman_login()
{
voidc_add();
voidc_delete();
voidc_view();
voidc_searchm();
intin;
do
{
system("cls");
printf("\n\n\t1.新增课程\n");
printf("\t2.删除课程\n");
printf("\t3.课程浏览\n");
printf("\t4.课程查询\n");
printf("\t5.退出\n");
printf("\n\n\t请选择服务种类:
");
scanf("%d",&in);
if(in!
=1&&in!
=2&&in!
=3&&in!
=4&&in!
=5)
{
printf("\n\t没有这项服务\t按任意重新选择");
getchar();getchar();
}
}while(in!
=1&&in!
=2&&in!
=3&&in!
=4&&in!
=5);
switch(in)
{
case1:
c_add();break;
case2:
c_delete();break;
case3:
c_viewm();break;
case4:
c_searchm();break;
case5:
login();break;
}
}
voidstu_login()//学生登录菜单
{
voidc_select();
voidc_view();
voidc_searchs();
voidlogin();
intinput;
do
{
system("cls");
printf("\n\n\n\t--学生登陆--");
printf("\n\n\t1.学生选课\n");
printf("\t2.课程浏览\n");
printf("\t3.课程查询\n");
printf("\t4.退出\n");
scanf("%d",&input);
if(input!
=1&&input!
=2&&input!
=3&&input!
=4)
{
printf("\n\t没有这项服务~\n");
printf("\t按任意键重新选择");
getchar();
getchar();
}
}while(input!
=1&&input!
=2&&input!
=3&&input!
=4);
switch(input)
{
case1:
c_select();break;
case2:
c_views();break;
case3:
c_searchs();break;
case4:
login();break;
}
}
voidc_select()
{
intn,in,i=0,j;intflag=0;
FILE*fp;
FILE*fp1;
charinput;
structcoursecourses[10];
if((fp=fopen("course.dat","rb"))==NULL)//判断是否存在课程
{
printf("\n\n\n\t课程不存在\n\n");
printf("\t<按任意键返回管理菜单>\n\t");
input=getchar();
input=getchar();
stu_login();//进入学生登陆菜单
}
else//存在的话循环读取文件中的信息直到文件指针到文件尾部
{
do
{
fread(&courses[i],sizeof(structcourse),1,fp);
i=i+1;
}
while(!
feof(fp));
fclose(fp);//文件读完后关闭
}
printf("\n\n\t\t请输入你要选课程的编号:
");
scanf("%d",&n);
if((fp1=fopen("courseselect.dat","rb"))==NULL)
{
fp1=fopen("courseselect.dat","wb");
}
else
{
fclose(fp1);
fp1=fopen("courseselect.dat","ab");
}
for(j=0;j
if(courses[j].c_num==n)
flag++;
if(flag==0)
{
printf("\n\n\t\t不存在对应课程\n");
printf("\n\n\t\t继续选课请按1,退出请按2:
\n");
scanf("%d",&in);
switch(in)
{
case1:
c_select();break;
case2:
stu_login();break;
default:
printf("输入错误,将返回登录界面!
\n");
login();break;
}
}
else
{
fwrite(&courses[j],sizeof(structcourse),1,fp1);
fclose(fp1);
printf("\n\n\t\t选课成功\t请选择:
");
printf("\n\n\t\t1.继续选课");
printf("\n\n\t\t2.退出,返回登录界面!
");
scanf("%d",&in);
switch(in)
{
case1:
c_select();break;
case2:
stu_login();break;
default:
break;
}
}
}
voidc_viewm()//课程浏览
{
voidstu_login();
voidc_view();
intinp,i=0,n=0;
FILE*fp;
charinput;
structcoursecourseview[10];
if((fp=fopen("course.dat","rb"))==NULL)//判断是否存在课程
{
system("cls");
printf("\n\n\n\t课程不存在\n\n");
printf("\t<按任意键返回管理菜单>\n\t");
getchar();getchar();
stu_login();//进入学生登陆菜单
}
else//存在的话循环读取文件中的信息直到文件指针到文件尾部
{
do
{
fread(&courseview[i],sizeof(structcourse),1,fp);
i=i+1;
}
while(!
feof(fp));
fclose(fp);//文件读完后关闭
do
{
system("cls");
if(i==1)
{
printf("\n\n\n\t\t\t没有记录!
\n");
getchar();getchar();
man_login();
}
else
{
printf("\n\t------共有%d条记录-------",i-1);
printf("\n\n\t课程编号:
%d\n",courseview[n].c_num);
printf("\n\n\t课程名字:
%s\n",courseview[n].c_name);
printf("\n\n\t课程学分:
%d\n",courseview[n].c_score);
printf("\n\n\t课程已选人数:
%d\n",courseview[n].c_nelepeo);
printf("\n\n\t课程人数上限:
%d\n",courseview[n].c_melepeo);
printf("\n\n\t1.上一页\t2.下一页\t3.回目录");
printf("\n请选择:
");
scanf("%d",&inp);
switch(inp)
{
case1:
{
if(n==0)
{
printf("\n\t已到达首页\t按任意键返回");
input=getchar();
input=getchar();
}
else
{
n=n-1;
}
break;
}
case2:
{
if(n==i-2)
{
printf("\n\t已到达尾页\t按人意见返回");
input=getchar();
input=getchar();
}
else
{
n=n+1;
}
break;
}
case3:
{man_login();break;}
default:
{
printf("\n\t操作错误\t按任意键返回");
getchar();getchar();
break;
}
}
}
}while(inp!
=3);
}
}
voidc_views()//课程浏览
{
voidstu_login();
voidc_view();
intinp,i=0,n=0;
FILE*fp;
charinput;
structcoursecourseview[10];
if((fp=fopen("course.dat","rb"))==NULL)//判断是否存在课程
{
system("cls");
printf("\n\n\n\t课程不存在\n\n");
printf("\t<按任意键返回管理菜单>\n\t");
getchar();getchar();
stu_login();//进入学生登陆菜单
}
else//存在的话循环读取文件中的信息直到文件指针到文件尾部
{
do
{
fread(&courseview[i],sizeof(structcourse),1,fp);
i=i+1;
}
while(!
feof(fp));
fclose(fp);//文件读完后关闭
do
{
system("cls");
if(i==1)
{
printf("\n\n\n\t\t\t没有记录!
\n");
getchar();getchar();
stu_login();
}
else
{
printf("\n\t------共有%d条记录-------",i-1);
printf("\n\n\t课程编号:
%d\n",courseview[n].c_num);
printf("\n\n\t课程名字:
%s\n",courseview[n].c_name);
printf("\n\n\t课程学分:
%d\n",courseview[n].c_score);
printf("\n\n\t课程已选人数:
%d\n",courseview[n].c_nelepeo);
printf("\n\n\t课程人数上限:
%d\n",courseview[n].c_melepeo);
printf("\n\n\t1.上一页\t2.下一页\t3.回目录");
printf("\n请选择:
");
scanf("%d",&inp);
switch(inp)
{
case1:
{
if(n==0)
{
printf("\n\t已到达首页\t按任意键返回");
input=getchar();
input=getchar();
}
else
{
n=n-1;
}
break;
}
case2:
{
if(n==i-2)
{
printf("\n\t已到达尾页\t按人意见返回");
input=getchar();
input=getchar();
}
else
{
n=n+1;
}
break;
}
case3:
{stu_login();break;}
default:
{
printf("\n\t操作错误\t按任意键返回");
getchar();getchar();
break;
}
}
}
}while(inp!
=3);
}
}
voidc_searchs()
{
voidstu_login();
voidc_searchs();
intid,i=0,j,inp,k;
intflag=0;
FILE*fp;
structcoursecours